fd145b5852
旧 compileFlow 把 DSL 图拍平成线性 init→tool…→prompt→model,连线/分支/ memory/aggregate/render 节点全被忽略——"画得出、跑不全"。改为纯 Go 图解释器 (graph.go),按真实拓扑与连线执行,每种节点 kind 有真实行为: - input 注入用户输入 - memory 按勾选注入画像/历史(无 memory 节点则沿用默认注入,不回归) - retriever kb 按 owner 作用域 → kb_search 累计参考资料 - tool 调 MCP 工具,产出进黑板,失败降级不阻断 - agent 据黑板拼消息 → pool 流式回流 token,累计成稿 - aggregate 按策略合并参考资料(拼接/去重合并/摘要) - render 把成稿经 report_render 渲染 docx - branch 求值条件 + active-set 剪枝下游(边序约定 [true,false]) - map 占位(fan-out 暂串行,路线图 Phase 2) - output 终端 全程逐节点点亮"运行·观测",token 流与记忆写回保持不变;报告 intent 走原专用 编排不动。compile.go 精简为只留 RunCtx/buildMessages/previewArgs。 实测(gateway+dispatcher+DeepSeek 实跑): - input→agent→output 真实流式答复 ✓ - branch 条件 2>1 走分支A、1>2 走分支B(下游真被剪枝)✓ - memory 节点按勾选注入;exec 事件按新节点名(agent:a 等)回流 ✓ - 桌面端 Studio 载示例→运行:4节点3连线校验通过,检索节点 mcp-go 不在时 优雅降级,agent 据空资料如实作答,输出/轨迹面板正常 ✓ 路线图 Phase 2:map 真并行 fan-out + aggregate reduce 接上 report 那套; 前端给 branch 的边打 true/false 标签,使条件分支完全精确(当前靠出边顺序约定)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
50 lines
1.6 KiB
Go
50 lines
1.6 KiB
Go
package eino
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"strings"
|
|
|
|
"github.com/cloudwego/eino/schema"
|
|
)
|
|
|
|
// RunCtx 是组装模型消息用的上下文:图解释器(graph.go)把黑板汇总到它,
|
|
// buildMessages 据此拼出发给模型的消息序列。用统一结构避免散落多处拼装。
|
|
type RunCtx struct {
|
|
UserID string
|
|
SessionID string
|
|
System string // Agent 节点系统提示词
|
|
Query string // 用户输入
|
|
Profile string // 召回的画像
|
|
History []*schema.Message // 短期历史
|
|
ToolOut []string // 工具/检索节点产出(含参考资料)
|
|
}
|
|
|
|
// buildMessages 把上下文组装为发给模型的消息序列(系统提示词 + 画像 + 工具产出 + 历史 + 用户输入)。
|
|
func buildMessages(_ context.Context, rc *RunCtx) ([]*schema.Message, error) {
|
|
var sys strings.Builder
|
|
sys.WriteString(rc.System)
|
|
if rc.Profile != "" {
|
|
sys.WriteString("\n\n关于当前用户的已知信息:\n")
|
|
sys.WriteString(rc.Profile)
|
|
sys.WriteString("\n请据此个性化作答并保持其偏好。")
|
|
}
|
|
if len(rc.ToolOut) > 0 {
|
|
sys.WriteString("\n\n以下是工具/检索得到的参考资料:\n")
|
|
sys.WriteString(strings.Join(rc.ToolOut, "\n---\n"))
|
|
}
|
|
msgs := make([]*schema.Message, 0, len(rc.History)+2)
|
|
msgs = append(msgs, schema.SystemMessage(sys.String()))
|
|
msgs = append(msgs, rc.History...)
|
|
msgs = append(msgs, schema.UserMessage(rc.Query))
|
|
return msgs, nil
|
|
}
|
|
|
|
// previewArgs 把工具入参压成一行短预览。
|
|
func previewArgs(args map[string]any) string {
|
|
if data, err := json.Marshal(args); err == nil {
|
|
return truncate(string(data), 120)
|
|
}
|
|
return ""
|
|
}
|