feat: DSL→对话编译 — Eino 图用节点字段而非整段 JSON 喂模型
dispatcher 真正解析 DSL 图:input 节点文本=用户消息,agent 节点 system=系统提示词,
不再把整段 DSL JSON 当 prompt 丢给模型。
- dispatcher/internal/dsl: Compile(graph)→Plan{System,Query,Tools}
(input.text/agent.prompt→query, agent.system→system, tool.tool→tools, 兜底默认)
- eino/graph: recall 调 dsl.Compile,模板加 {system}(Agent 系统提示词+画像注入)
- eino/orchestrator: 写回历史落真实 query 而非 DSL 原文
- frontend nodeCatalog: input 节点改 text 字段(用户输入,必填),检查器可编辑
- 验证: 全模块+前端 build✓; 真实 DeepSeek——curl DSL(input '中国首都?')→'北京';
真实浏览器——加 input 节点输入'NATS是什么'→运行→DeepSeek 简洁正确作答
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"github.com/cloudwego/eino/compose"
|
||||
"github.com/cloudwego/eino/schema"
|
||||
|
||||
"github.com/sundynix/sundynix-dispatcher/internal/dsl"
|
||||
"github.com/sundynix/sundynix-dispatcher/internal/llm"
|
||||
"github.com/sundynix/sundynix-shared/contract"
|
||||
)
|
||||
@@ -27,28 +28,34 @@ func buildGraph(ctx context.Context, pool *llm.Pool, fetch memoryFetcher, fetchH
|
||||
compose.WithGenLocalState(func(context.Context) *AgentState { return &AgentState{} }),
|
||||
)
|
||||
|
||||
// 1) recall:取 user_id/session_id → 召回画像(memory_get)+历史(history_get) → 写 State,输出模板变量。
|
||||
// 1) recall:编译 DSL → 取系统提示词/用户输入 → 召回画像+历史 → 写 State,输出模板变量。
|
||||
if err := g.AddLambdaNode("recall", compose.InvokableLambda(
|
||||
func(ctx context.Context, t *contract.Task) (map[string]any, error) {
|
||||
uid, _ := t.Meta[contract.MetaUserID].(string)
|
||||
sid, _ := t.Meta[contract.MetaSessionID].(string)
|
||||
profile := fetch(ctx, uid, string(t.Graph))
|
||||
plan := dsl.Compile(t.Graph) // DSL→对话编译:抽取 system / query / tools
|
||||
profile := fetch(ctx, uid, plan.Query)
|
||||
hist := fetchHist(ctx, sid)
|
||||
_ = compose.ProcessState(ctx, func(_ context.Context, s *AgentState) error {
|
||||
s.UserID, s.SessionID, s.Profile, s.Input = uid, sid, profile, string(t.Graph)
|
||||
s.UserID, s.SessionID, s.Profile, s.Input = uid, sid, profile, plan.Query
|
||||
return nil
|
||||
})
|
||||
if profile == "" {
|
||||
profile = "(暂无该用户的偏好记忆)"
|
||||
}
|
||||
return map[string]any{"profile": profile, "query": string(t.Graph), "history": hist}, nil
|
||||
return map[string]any{
|
||||
"system": plan.System,
|
||||
"profile": profile,
|
||||
"query": plan.Query,
|
||||
"history": hist,
|
||||
}, nil
|
||||
})); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 2) prompt:画像注入 system,历史用占位符插入,用户输入作为 user message。
|
||||
// 2) prompt:Agent 节点系统提示词 + 画像注入 system,历史用占位符,用户输入作为 user message。
|
||||
tpl := prompt.FromMessages(schema.FString,
|
||||
schema.SystemMessage("你在与特定用户对话。关于该用户的已知信息:\n{profile}\n请据此个性化作答并保持其偏好。"),
|
||||
schema.SystemMessage("{system}\n\n关于当前用户的已知信息:\n{profile}\n请据此个性化作答并保持其偏好。"),
|
||||
schema.MessagesPlaceholder("history", true),
|
||||
schema.UserMessage("{query}"),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user