From 25e03dee84539a823f48827545bf962e1a2712ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E6=98=8E?= <83812544+Ed1s0nZ@users.noreply.github.com> Date: Sun, 28 Jun 2026 01:15:10 +0800 Subject: [PATCH] Add files via upload --- internal/multiagent/eino_single_runner.go | 1 + internal/multiagent/gen_model_input.go | 23 ++++++++++++++ internal/multiagent/gen_model_input_test.go | 33 +++++++++++++++++++++ internal/multiagent/runner.go | 10 ++++--- 4 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 internal/multiagent/gen_model_input.go create mode 100644 internal/multiagent/gen_model_input_test.go diff --git a/internal/multiagent/eino_single_runner.go b/internal/multiagent/eino_single_runner.go index 6f1005fb..198b4a7c 100644 --- a/internal/multiagent/eino_single_runner.go +++ b/internal/multiagent/eino_single_runner.go @@ -184,6 +184,7 @@ func RunEinoSingleChatModelAgent( Name: einoSingleAgentName, Description: "Eino ADK ChatModelAgent with MCP tools for authorized security testing.", Instruction: ins, + GenModelInput: literalInstructionGenModelInput, Model: mainModel, ToolsConfig: mainToolsCfg, MaxIterations: maxIter, diff --git a/internal/multiagent/gen_model_input.go b/internal/multiagent/gen_model_input.go new file mode 100644 index 00000000..2c7a9fe9 --- /dev/null +++ b/internal/multiagent/gen_model_input.go @@ -0,0 +1,23 @@ +package multiagent + +import ( + "context" + + "github.com/cloudwego/eino/adk" + "github.com/cloudwego/eino/schema" +) + +// literalInstructionGenModelInput passes Instruction through as a system message without +// FString template formatting. Eino defaultGenModelInput formats instruction whenever +// SessionValues exist; prompts with literal curly braces (project blackboard "{关系边: ...}", +// JSON examples, link syntax) then fail with "could not find key". +// +// Matches eino/adk/prebuilt/deep genModelInput — the supported fix per Eino docs. +func literalInstructionGenModelInput(ctx context.Context, instruction string, input *adk.AgentInput) ([]adk.Message, error) { + msgs := make([]adk.Message, 0, len(input.Messages)+1) + if instruction != "" { + msgs = append(msgs, schema.SystemMessage(instruction)) + } + msgs = append(msgs, input.Messages...) + return msgs, nil +} diff --git a/internal/multiagent/gen_model_input_test.go b/internal/multiagent/gen_model_input_test.go new file mode 100644 index 00000000..205746a7 --- /dev/null +++ b/internal/multiagent/gen_model_input_test.go @@ -0,0 +1,33 @@ +package multiagent + +import ( + "context" + "strings" + "testing" + + "github.com/cloudwego/eino/adk" + "github.com/cloudwego/eino/schema" +) + +func TestLiteralInstructionGenModelInput_PreservesLiteralCurlyBraces(t *testing.T) { + t.Parallel() + instruction := "- [finding/x] summary {关系边: discovered_on←target/dev}\n" + + "如 finding 上 {from:target/*, type:discovered_on}" + msgs, err := literalInstructionGenModelInput(context.Background(), instruction, &adk.AgentInput{ + Messages: []adk.Message{schema.UserMessage("继续")}, + }) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if len(msgs) != 2 { + t.Fatalf("expected 2 messages, got %d", len(msgs)) + } + if msgs[0].Role != schema.System { + t.Fatalf("first message must be system, got %s", msgs[0].Role) + } + for _, want := range []string{"{关系边:", "{from:target/*, type:discovered_on}"} { + if !strings.Contains(msgs[0].Content, want) { + t.Fatalf("system content missing %q: %q", want, msgs[0].Content) + } + } +} diff --git a/internal/multiagent/runner.go b/internal/multiagent/runner.go index aa6343db..db60db6c 100644 --- a/internal/multiagent/runner.go +++ b/internal/multiagent/runner.go @@ -254,10 +254,11 @@ func RunDeepAgent( ) } sa, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{ - Name: id, - Description: desc, - Instruction: subInstrFinal, - Model: subModel, + Name: id, + Description: desc, + Instruction: subInstrFinal, + GenModelInput: literalInstructionGenModelInput, + Model: subModel, ToolsConfig: adk.ToolsConfig{ ToolsNodeConfig: compose.ToolsNodeConfig{ Tools: subToolsForCfg, @@ -479,6 +480,7 @@ func RunDeepAgent( Name: orchestratorName, Description: orchDescription, Instruction: supInstr, + GenModelInput: literalInstructionGenModelInput, Model: mainModel, ToolsConfig: mainToolsCfg, MaxIterations: deepMaxIter,