diff --git a/cmd/root/new.go b/cmd/root/new.go index af17d6caf..189684795 100644 --- a/cmd/root/new.go +++ b/cmd/root/new.go @@ -63,7 +63,7 @@ func (f *newFlags) runNewCommand(cmd *cobra.Command, args []string) error { } if len(args) > 0 { arg := strings.Join(args, " ") - opts = append(opts, session.WithUserMessage("", arg)) + opts = append(opts, session.WithUserMessage(arg)) firstMessage = &arg } diff --git a/e2e/cagent_mcp_test.go b/e2e/cagent_mcp_test.go index affa73ed0..ecc5ffe02 100644 --- a/e2e/cagent_mcp_test.go +++ b/e2e/cagent_mcp_test.go @@ -22,7 +22,7 @@ func TestMCP_SingleAgent(t *testing.T) { require.NoError(t, team.StopToolSets(ctx)) }) - handler := mcp.CreateToolHandler(team, "root", "testdata/basic.yaml") + handler := mcp.CreateToolHandler(team, "root") _, output, err := handler(ctx, nil, mcp.ToolInput{ Message: "What is 2+2? Answer in one sentence.", }) @@ -43,7 +43,7 @@ func TestMCP_MultiAgent(t *testing.T) { require.NoError(t, team.StopToolSets(ctx)) }) - handler := mcp.CreateToolHandler(team, "web", "testdata/multi.yaml") + handler := mcp.CreateToolHandler(team, "web") _, output, err := handler(ctx, nil, mcp.ToolInput{ Message: "Say hello in one sentence.", }) diff --git a/e2e/runtime_test.go b/e2e/runtime_test.go index af70a6e60..2524ccc18 100644 --- a/e2e/runtime_test.go +++ b/e2e/runtime_test.go @@ -23,7 +23,7 @@ func TestRuntime_OpenAI_Basic(t *testing.T) { rt, err := runtime.New(team) require.NoError(t, err) - sess := session.New(session.WithUserMessage("", "What's 2+2?")) + sess := session.New(session.WithUserMessage("What's 2+2?")) _, err = rt.Run(ctx, sess) require.NoError(t, err) @@ -44,7 +44,7 @@ func TestRuntime_Mistral_Basic(t *testing.T) { rt, err := runtime.New(team) require.NoError(t, err) - sess := session.New(session.WithUserMessage("", "What's 2+2?")) + sess := session.New(session.WithUserMessage("What's 2+2?")) _, err = rt.Run(ctx, sess) require.NoError(t, err) diff --git a/examples/golibrary/builtintool/main.go b/examples/golibrary/builtintool/main.go index d547db885..f0583598f 100644 --- a/examples/golibrary/builtintool/main.go +++ b/examples/golibrary/builtintool/main.go @@ -56,7 +56,7 @@ func run(ctx context.Context) error { return err } - sess := session.New(session.WithUserMessage("", "Tell me a story about my current directory")) + sess := session.New(session.WithUserMessage("Tell me a story about my current directory")) messages, err := rt.Run(ctx, sess) if err != nil { diff --git a/examples/golibrary/multi/main.go b/examples/golibrary/multi/main.go index 08196ec96..63dffb390 100644 --- a/examples/golibrary/multi/main.go +++ b/examples/golibrary/multi/main.go @@ -56,7 +56,7 @@ func run(ctx context.Context) error { return err } - sess := session.New(session.WithUserMessage("", "Ask your child how they are doing and tell me what they said")) + sess := session.New(session.WithUserMessage("Ask your child how they are doing and tell me what they said")) messages, err := rt.Run(ctx, sess) if err != nil { diff --git a/examples/golibrary/simple/main.go b/examples/golibrary/simple/main.go index 8608325cd..9561e9c83 100644 --- a/examples/golibrary/simple/main.go +++ b/examples/golibrary/simple/main.go @@ -52,7 +52,7 @@ func run(ctx context.Context) error { return err } - sess := session.New(session.WithUserMessage("", "How are you doing?")) + sess := session.New(session.WithUserMessage("How are you doing?")) messages, err := rt.Run(ctx, sess) if err != nil { diff --git a/examples/golibrary/stream/main.go b/examples/golibrary/stream/main.go index 1d54d26a3..059a24bb6 100644 --- a/examples/golibrary/stream/main.go +++ b/examples/golibrary/stream/main.go @@ -51,7 +51,7 @@ func run(ctx context.Context) error { return err } - sess := session.New(session.WithUserMessage("", "How are you doing?")) + sess := session.New(session.WithUserMessage("How are you doing?")) events := rt.RunStream(ctx, sess) for event := range events { diff --git a/examples/golibrary/tool/main.go b/examples/golibrary/tool/main.go index 2ffa2a86f..96b211fbd 100644 --- a/examples/golibrary/tool/main.go +++ b/examples/golibrary/tool/main.go @@ -80,7 +80,7 @@ func run(ctx context.Context) error { return err } - sess := session.New(session.WithUserMessage("", "What is 1 + 2?")) + sess := session.New(session.WithUserMessage("What is 1 + 2?")) messages, err := rt.Run(ctx, sess) if err != nil { diff --git a/pkg/a2a/adapter.go b/pkg/a2a/adapter.go index 3b4868d62..8fd7c15a2 100644 --- a/pkg/a2a/adapter.go +++ b/pkg/a2a/adapter.go @@ -46,7 +46,7 @@ func runCAgent(ctx agent.InvocationContext, t *team.Team, agentName string, a *c // Create a cagent session sess := session.New( - session.WithUserMessage("", message), + session.WithUserMessage(message), session.WithMaxIterations(a.MaxIterations()), session.WithToolsApproved(true), ) diff --git a/pkg/a2a/server.go b/pkg/a2a/server.go index 0efddb48d..2882ab5b2 100644 --- a/pkg/a2a/server.go +++ b/pkg/a2a/server.go @@ -23,7 +23,7 @@ import ( ) func Start(ctx context.Context, out *cli.Printer, agentFilename, agentName string, runConfig *config.RuntimeConfig, ln net.Listener) error { - slog.Debug("Starting A2A server", "agent", agentFilename, "addr", ln.Addr().String()) + slog.Debug("Starting A2A server", "agent", agentName, "addr", ln.Addr().String()) t, err := teamloader.Load(ctx, agentFilename, runConfig) if err != nil { diff --git a/pkg/acp/agent.go b/pkg/acp/agent.go index 8c5db9120..5b43e8b9e 100644 --- a/pkg/acp/agent.go +++ b/pkg/acp/agent.go @@ -69,7 +69,6 @@ func (a *Agent) Initialize(ctx context.Context, params acp.InitializeRequest) (a a.mu.Lock() defer a.mu.Unlock() - slog.Debug("Loading teams", "agent_file", a.agentFilename) t, err := teamloader.Load(ctx, a.agentFilename, a.runtimeConfig, teamloader.WithToolsetRegistry(createToolsetRegistry(a))) if err != nil { return acp.InitializeResponse{}, fmt.Errorf("failed to load teams: %w", err) diff --git a/pkg/app/transcript_test.go b/pkg/app/transcript_test.go index 3b5608f75..22092e404 100644 --- a/pkg/app/transcript_test.go +++ b/pkg/app/transcript_test.go @@ -11,14 +11,14 @@ import ( ) func TestSimple(t *testing.T) { - sess := session.New(session.WithUserMessage("", "Hello")) + sess := session.New(session.WithUserMessage("Hello")) content := transcript(sess) golden.Assert(t, content, "simple.golden") } func TestAssistantMessage(t *testing.T) { sess := session.New( - session.WithUserMessage("", "Hello"), + session.WithUserMessage("Hello"), ) sess.AddMessage(&session.Message{ AgentName: "root", @@ -33,7 +33,7 @@ func TestAssistantMessage(t *testing.T) { func TestAssistantMessageWithReasoning(t *testing.T) { sess := session.New( - session.WithUserMessage("", "Hello"), + session.WithUserMessage("Hello"), ) sess.AddMessage(&session.Message{ AgentName: "root", @@ -49,7 +49,7 @@ func TestAssistantMessageWithReasoning(t *testing.T) { func TestToolCalls(t *testing.T) { sess := session.New( - session.WithUserMessage("", "Hello"), + session.WithUserMessage("Hello"), ) sess.AddMessage(&session.Message{ AgentName: "root", diff --git a/pkg/creator/agent.go b/pkg/creator/agent.go index c0b695959..919f73780 100644 --- a/pkg/creator/agent.go +++ b/pkg/creator/agent.go @@ -114,7 +114,7 @@ func CreateAgent(ctx context.Context, baseDir, prompt string, runConfig *config. } sess := session.New( - session.WithUserMessage("", prompt), + session.WithUserMessage(prompt), session.WithToolsApproved(true), ) diff --git a/pkg/mcp/server.go b/pkg/mcp/server.go index 2f3f9da3e..be9c29a92 100644 --- a/pkg/mcp/server.go +++ b/pkg/mcp/server.go @@ -8,7 +8,6 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/docker/cagent/pkg/agent" - "github.com/docker/cagent/pkg/agentfile" "github.com/docker/cagent/pkg/cli" "github.com/docker/cagent/pkg/config" "github.com/docker/cagent/pkg/runtime" @@ -30,11 +29,6 @@ type ToolOutput struct { func StartMCPServer(ctx context.Context, out *cli.Printer, agentFilename string, runConfig *config.RuntimeConfig) error { slog.Debug("Starting MCP server", "agent", agentFilename) - agentFilename, err := agentfile.Resolve(ctx, out, agentFilename) - if err != nil { - return err - } - t, err := teamloader.Load(ctx, agentFilename, runConfig) if err != nil { return fmt.Errorf("failed to load agents: %w", err) @@ -82,7 +76,7 @@ func StartMCPServer(ctx context.Context, out *cli.Printer, agentFilename string, OutputSchema: tools.MustSchemaFor[ToolOutput](), } - mcp.AddTool(server, toolDef, CreateToolHandler(t, agentName, agentFilename)) + mcp.AddTool(server, toolDef, CreateToolHandler(t, agentName)) } slog.Debug("MCP server starting with stdio transport") @@ -94,7 +88,7 @@ func StartMCPServer(ctx context.Context, out *cli.Printer, agentFilename string, return nil } -func CreateToolHandler(t *team.Team, agentName, agentFilename string) func(context.Context, *mcp.CallToolRequest, ToolInput) (*mcp.CallToolResult, ToolOutput, error) { +func CreateToolHandler(t *team.Team, agentName string) func(context.Context, *mcp.CallToolRequest, ToolInput) (*mcp.CallToolResult, ToolOutput, error) { return func(ctx context.Context, req *mcp.CallToolRequest, input ToolInput) (*mcp.CallToolResult, ToolOutput, error) { slog.Debug("MCP tool called", "agent", agentName, "message", input.Message) @@ -106,7 +100,7 @@ func CreateToolHandler(t *team.Team, agentName, agentFilename string) func(conte sess := session.New( session.WithTitle("MCP tool call"), session.WithMaxIterations(ag.MaxIterations()), - session.WithUserMessage(agentFilename, input.Message), + session.WithUserMessage(input.Message), session.WithToolsApproved(true), ) diff --git a/pkg/oci/build.go b/pkg/oci/build.go index 1607ae1b8..45dde6579 100644 --- a/pkg/oci/build.go +++ b/pkg/oci/build.go @@ -28,8 +28,8 @@ type Options struct { Pull bool } -func BuildDockerImage(ctx context.Context, out *cli.Printer, agentFilePath string, fs filesystem.FS, dockerImageName string, opts Options) error { - cfg, err := config.LoadConfig(ctx, agentFilePath, fs) +func BuildDockerImage(ctx context.Context, out *cli.Printer, agentFilename string, fs filesystem.FS, dockerImageName string, opts Options) error { + cfg, err := config.LoadConfig(ctx, agentFilename, fs) if err != nil { return err } diff --git a/pkg/runtime/runtime.go b/pkg/runtime/runtime.go index 0991a393d..73420e59e 100644 --- a/pkg/runtime/runtime.go +++ b/pkg/runtime/runtime.go @@ -1424,7 +1424,7 @@ func (r *LocalRuntime) generateSessionTitle(ctx context.Context, sess *session.S team.WithAgents(agent.New("root", systemPrompt, agent.WithModel(titleModel))), ) titleSession := session.New( - session.WithUserMessage("", userPrompt), + session.WithUserMessage(userPrompt), session.WithTitle("Generating title..."), ) diff --git a/pkg/runtime/runtime_response_api_test.go b/pkg/runtime/runtime_response_api_test.go index 26184a983..0df7fdbd2 100644 --- a/pkg/runtime/runtime_response_api_test.go +++ b/pkg/runtime/runtime_response_api_test.go @@ -22,7 +22,7 @@ func TestResponseAPIToolCallHandling(t *testing.T) { AddStopWithUsage(10, 15). Build() - sess := session.New(session.WithUserMessage("", "Search for test")) + sess := session.New(session.WithUserMessage("Search for test")) events := runSession(t, sess, stream) @@ -55,7 +55,7 @@ func TestResponseAPIMultipleToolCalls(t *testing.T) { AddStopWithUsage(20, 30). Build() - sess := session.New(session.WithUserMessage("", "Search and calculate")) + sess := session.New(session.WithUserMessage("Search and calculate")) events := runSession(t, sess, stream) diff --git a/pkg/runtime/runtime_test.go b/pkg/runtime/runtime_test.go index 746653b18..078d484af 100644 --- a/pkg/runtime/runtime_test.go +++ b/pkg/runtime/runtime_test.go @@ -212,7 +212,7 @@ func TestSimple(t *testing.T) { AddStopWithUsage(3, 2). Build() - sess := session.New(session.WithUserMessage("", "Hi")) + sess := session.New(session.WithUserMessage("Hi")) events := runSession(t, sess, stream) @@ -240,7 +240,7 @@ func TestMultipleContentChunks(t *testing.T) { AddStopWithUsage(8, 12). Build() - sess := session.New(session.WithUserMessage("", "Please greet me")) + sess := session.New(session.WithUserMessage("Please greet me")) events := runSession(t, sess, stream) @@ -270,7 +270,7 @@ func TestWithReasoning(t *testing.T) { AddStopWithUsage(10, 15). Build() - sess := session.New(session.WithUserMessage("", "Hi")) + sess := session.New(session.WithUserMessage("Hi")) events := runSession(t, sess, stream) @@ -299,7 +299,7 @@ func TestMixedContentAndReasoning(t *testing.T) { AddStopWithUsage(15, 20). Build() - sess := session.New(session.WithUserMessage("", "Hi there")) + sess := session.New(session.WithUserMessage("Hi there")) events := runSession(t, sess, stream) @@ -327,7 +327,7 @@ func TestToolCallSequence(t *testing.T) { AddStopWithUsage(5, 8). Build() - sess := session.New(session.WithUserMessage("", "Please use the test tool")) + sess := session.New(session.WithUserMessage("Please use the test tool")) events := runSession(t, sess, stream) @@ -346,7 +346,7 @@ func TestErrorEvent(t *testing.T) { rt, err := New(tm, WithSessionCompaction(false), WithModelStore(mockModelStore{})) require.NoError(t, err) - sess := session.New(session.WithUserMessage("", "Hi")) + sess := session.New(session.WithUserMessage("Hi")) sess.Title = "Unit Test" evCh := rt.RunStream(t.Context(), sess) @@ -382,7 +382,7 @@ func TestContextCancellation(t *testing.T) { rt, err := New(tm, WithSessionCompaction(false), WithModelStore(mockModelStore{})) require.NoError(t, err) - sess := session.New(session.WithUserMessage("", "Hi")) + sess := session.New(session.WithUserMessage("Hi")) sess.Title = "Unit Test" ctx, cancel := context.WithCancel(t.Context()) @@ -547,7 +547,7 @@ func TestToolCallVariations(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { stream := tt.streamBuilder().Build() - sess := session.New(session.WithUserMessage("", "Use tools")) + sess := session.New(session.WithUserMessage("Use tools")) events := runSession(t, sess, stream) require.True(t, hasEventType(t, events, &PartialToolCallEvent{}), "Expected PartialToolCallEvent for %s", tt.description) @@ -621,7 +621,7 @@ func TestCompactionOccursAfterToolResultsWhenToolUsePresent(t *testing.T) { rt, err := New(tm, WithSessionCompaction(true), WithModelStore(mockModelStoreWithLimit{limit: 100})) require.NoError(t, err) - sess := session.New(session.WithUserMessage("", "Start")) + sess := session.New(session.WithUserMessage("Start")) events := rt.RunStream(t.Context(), sess) // Collect events @@ -801,7 +801,7 @@ func TestProcessToolCalls_UnknownTool_NoToolResultMessage(t *testing.T) { // Register default tools (contains only transfer_task) to ensure unknown tool isn't matched rt.registerDefaultTools() - sess := session.New(session.WithUserMessage("", "Start")) + sess := session.New(session.WithUserMessage("Start")) // Simulate a model-issued tool call to a non-existent tool calls := []tools.ToolCall{{ diff --git a/pkg/session/session.go b/pkg/session/session.go index 651a1506c..b5affcc1e 100644 --- a/pkg/session/session.go +++ b/pkg/session/session.go @@ -209,9 +209,9 @@ func (s *Session) GetLastUserMessageContent() string { type Opt func(s *Session) -func WithUserMessage(agentFilename, content string) Opt { +func WithUserMessage(content string) Opt { return func(s *Session) { - s.AddMessage(UserMessage(agentFilename, content)) + s.AddMessage(UserMessage("", content)) } } diff --git a/pkg/teamloader/teamloader.go b/pkg/teamloader/teamloader.go index 953591fc1..93b0c1783 100644 --- a/pkg/teamloader/teamloader.go +++ b/pkg/teamloader/teamloader.go @@ -107,8 +107,8 @@ func WithID(id string) Opt { // Load loads an agent team from the given file path. // Prefers LoadFrom for more control over the source. -func Load(ctx context.Context, p string, runtimeConfig *config.RuntimeConfig, opts ...Opt) (*team.Team, error) { - return LoadFrom(ctx, NewFileSource(p), runtimeConfig, opts...) +func Load(ctx context.Context, agentFilename string, runtimeConfig *config.RuntimeConfig, opts ...Opt) (*team.Team, error) { + return LoadFrom(ctx, NewFileSource(agentFilename), runtimeConfig, opts...) } // LoadFrom loads an agent team from the given source