fix(identity): 名字检测从 memory extraction 解耦 — 502 不再阻断面板刷新
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled

agent/user name 检测之前放在 extractFromConversation().then() 回调里,
memory extractor 502 时整个 .then() 跳过,名字永远不会更新。
现在名字检测独立执行,memory extraction 失败不影响面板刷新。
This commit is contained in:
iven
2026-04-23 14:01:05 +08:00
parent 394cb66311
commit 0bb526509d

View File

@@ -366,44 +366,45 @@ function createCompleteHandler(
}); });
} }
// Async memory extraction // Detect name changes from last user message (independent of memory extraction)
const msgs = chat.getMessages() || []; const msgs = chat.getMessages() || [];
const filtered = msgs
.filter(m => m.role === 'user' || m.role === 'assistant')
.map(m => ({ role: m.role, content: m.content }));
const convId = useConversationStore.getState().currentConversationId;
getMemoryExtractor().extractFromConversation(filtered, agentId, convId ?? undefined)
.then(async () => {
// Detect name preference from last user message (e.g. "叫我小马")
const lastUserMsg = [...msgs].reverse().find(m => m.role === 'user'); const lastUserMsg = [...msgs].reverse().find(m => m.role === 'user');
const detectedName = lastUserMsg ? detectNameSuggestion(lastUserMsg.content) : undefined;
if (detectedName && agentId) {
try {
const { useAgentStore } = await import('../agentStore');
await useAgentStore.getState().updateClone(agentId, { userName: detectedName });
log.info(`Updated userName to "${detectedName}" from conversation`);
} catch (e) {
log.warn('Failed to persist detected userName:', e);
}
}
// Detect agent name change (e.g. "叫你小马", "以后叫你小马", "你就叫小马吧")
const lastContent = typeof lastUserMsg?.content === 'string' ? lastUserMsg.content : ''; const lastContent = typeof lastUserMsg?.content === 'string' ? lastUserMsg.content : '';
const detectedAgentName = lastContent ? detectAgentNameSuggestion(lastContent) : undefined;
if (detectedAgentName && agentId) { if (lastContent && agentId) {
try { // User name detection (e.g. "叫我小王")
const { useAgentStore } = await import('../agentStore'); const detectedName = detectNameSuggestion(lastContent);
await useAgentStore.getState().updateClone(agentId, { name: detectedAgentName }); if (detectedName) {
import('../agentStore').then(({ useAgentStore }) =>
useAgentStore.getState().updateClone(agentId, { userName: detectedName })
.then(() => log.info(`Updated userName to "${detectedName}" from conversation`))
.catch(e => log.warn('Failed to persist detected userName:', e))
);
}
// Agent name detection (e.g. "叫你小马", "名称改为小芳")
const detectedAgentName = detectAgentNameSuggestion(lastContent);
if (detectedAgentName) {
import('../agentStore').then(({ useAgentStore }) =>
useAgentStore.getState().updateClone(agentId, { name: detectedAgentName })
.then(() => {
log.info(`Updated agent name to "${detectedAgentName}" from conversation`); log.info(`Updated agent name to "${detectedAgentName}" from conversation`);
} catch (e) {
log.warn('Failed to persist detected agent name:', e);
}
}
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
window.dispatchEvent(new CustomEvent('zclaw:agent-profile-updated', { window.dispatchEvent(new CustomEvent('zclaw:agent-profile-updated', {
detail: { agentId } detail: { agentId }
})); }));
} }
}) })
.catch(e => log.warn('Failed to persist detected agent name:', e))
);
}
}
// Async memory extraction (independent — failures don't block name detection)
const filtered = msgs
.filter(m => m.role === 'user' || m.role === 'assistant')
.map(m => ({ role: m.role, content: m.content }));
const convId = useConversationStore.getState().currentConversationId;
getMemoryExtractor().extractFromConversation(filtered, agentId, convId ?? undefined)
.catch(err => log.warn('Memory extraction failed:', err)); .catch(err => log.warn('Memory extraction failed:', err));
intelligenceClient.reflection.recordConversation().catch(err => { intelligenceClient.reflection.recordConversation().catch(err => {