mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-06-11 09:55:59 +00:00
f88970985a
* fix(frontend): replace invalid "context" select field with "metadata" in threads.search
The LangGraph API server does not support "context" as a select field for
threads/search, causing a 422 Unprocessable Entity error introduced by
commit 60e0abf (#1771).
- Replace "context" with "metadata" in the default select list
- Persist agent_name into thread metadata on creation so search results
carry the agent identity
- Update pathOfThread() to fall back to metadata.agent_name when
context is unavailable from search results
- Add regression tests for metadata-based agent routing
Fixes #2037
Made-with: Cursor
* fix: apply Copilot suggestions
* style: fix the lint error
52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
import type { Message } from "@langchain/langgraph-sdk";
|
|
|
|
import type { AgentThread, AgentThreadContext } from "./types";
|
|
|
|
type ThreadRouteTarget =
|
|
| string
|
|
| {
|
|
thread_id: string;
|
|
context?: Pick<AgentThreadContext, "agent_name"> | null;
|
|
metadata?: Record<string, unknown> | null;
|
|
};
|
|
|
|
export function pathOfThread(
|
|
thread: ThreadRouteTarget,
|
|
context?: Pick<AgentThreadContext, "agent_name"> | null,
|
|
) {
|
|
const threadId = typeof thread === "string" ? thread : thread.thread_id;
|
|
let agentName: string | undefined;
|
|
if (typeof thread === "string") {
|
|
agentName = context?.agent_name;
|
|
} else {
|
|
agentName = thread.context?.agent_name;
|
|
if (!agentName) {
|
|
const metaAgent = thread.metadata?.agent_name;
|
|
if (typeof metaAgent === "string") {
|
|
agentName = metaAgent;
|
|
}
|
|
}
|
|
}
|
|
|
|
return agentName
|
|
? `/workspace/agents/${encodeURIComponent(agentName)}/chats/${threadId}`
|
|
: `/workspace/chats/${threadId}`;
|
|
}
|
|
|
|
export function textOfMessage(message: Message) {
|
|
if (typeof message.content === "string") {
|
|
return message.content;
|
|
} else if (Array.isArray(message.content)) {
|
|
for (const part of message.content) {
|
|
if (part.type === "text") {
|
|
return part.text;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
export function titleOfThread(thread: AgentThread) {
|
|
return thread.values?.title ?? "Untitled";
|
|
}
|