Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/daemon/internal/agent/claudesdk/cancellation.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package claudesdk
import (
"context"
"errors"

"github.com/MiniMax-AI/OpenAgentCore/apps/daemon/internal/agent"

"github.com/MiniMax-AI/OpenAgentCore/internal/agentdaemon/proto"
Expand Down
8 changes: 4 additions & 4 deletions apps/daemon/internal/agent/claudesdk/cancellation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func TestCancellationWaitsForDrainAndPublishesOutcome(t *testing.T) {
if err := running.(*session).SteerWithReceipt(ctx, proto.PromptSteerPayload{InputID: "later", Input: proto.TextInput("later")}, func() {}); !errors.Is(err, agent.ErrSteeringInactive) {
t.Fatal("cancelled execution accepted steering", err)
}
if err := os.WriteFile(filepath.Join(config.StateDir, "release"), nil, 0o600); err != nil {
if err := os.WriteFile(filepath.Join(testState(config), "release"), nil, 0o600); err != nil {
t.Fatal(err)
}
if err := running.Cancel(ctx); err != nil {
Expand Down Expand Up @@ -133,7 +133,7 @@ func TestCancellationDrainsIntoReadyConsumer(t *testing.T) {
if event := <-out; event.Type != proto.TypeDelta {
t.Fatal("missing native readiness barrier")
}
if err := os.WriteFile(filepath.Join(config.StateDir, "release"), nil, 0o600); err != nil {
if err := os.WriteFile(filepath.Join(testState(config), "release"), nil, 0o600); err != nil {
t.Fatal(err)
}
if err := running.Cancel(ctx); err != nil {
Expand All @@ -159,11 +159,11 @@ func TestCancellationDrainsIntoReadyConsumer(t *testing.T) {
}

func cancellationConfig(root, mode string) Config {
return Config{Node: os.Args[0], Entrypoint: filepath.Join(root, "worker"), StateDir: filepath.Join(root, "state"), Env: []string{"GO_CLAUDE_SDK_HELPER=1", "SDK_HELPER_MODE=cancellation-" + mode, "GORACE=atexit_sleep_ms=0"}}
return Config{Node: os.Args[0], Entrypoint: filepath.Join(root, "worker"), StateRoot: filepath.Join(root, "state"), Env: []string{"GO_CLAUDE_SDK_HELPER=1", "SDK_HELPER_MODE=cancellation-" + mode, "GORACE=atexit_sleep_ms=0"}}
}

func cancellationRequest() proto.PromptRequestPayload {
return proto.PromptRequestPayload{RunID: "run", Input: proto.TextInput("hello"), AgentSessionID: "native-session", Turn: proto.TurnSettings{Model: "fake-model"}, AgentOptions: map[string]any{"system_prompt": "instructions"}}
return proto.PromptRequestPayload{AgentStateKey: testStateKey, RunID: "run", Input: proto.TextInput("hello"), AgentSessionID: "native-session", Turn: proto.TurnSettings{Model: "fake-model"}, AgentOptions: map[string]any{"system_prompt": "instructions"}}
}

func runCancellationHelper(request startRequest, mode string, scanner *bufio.Scanner, emit func(bridgeEvent)) {
Expand Down
4 changes: 2 additions & 2 deletions apps/daemon/internal/agent/claudesdk/commands_session_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func TestWorkspaceCommandsRequirePackagedFeature(t *testing.T) {
if _, err := NewExecutorFactory(config)(t.Context(), preparationRequest()); err == nil || !strings.Contains(err.Error(), "workspace preparation is unavailable") {
t.Fatal("old bridge accepted command observations", err)
}
if _, err := os.Stat(filepath.Join(config.StateDir, "launched")); !os.IsNotExist(err) {
if _, err := os.Stat(filepath.Join(testState(config), "launched")); !os.IsNotExist(err) {
t.Fatal("old bridge started execution before rejection")
}
}
Expand All @@ -33,7 +33,7 @@ func TestWorkspaceCommandFramesKeepStartIdentityAndObservedOutput(t *testing.T)
t.Fatal(err)
}
defer resource.Close(context.Background())
if _, err := os.Stat(filepath.Join(config.StateDir, "start.json")); !os.IsNotExist(err) {
if _, err := os.Stat(filepath.Join(testState(config), "start.json")); !os.IsNotExist(err) {
t.Fatal("preparation submitted a command")
}
out := make(chan proto.Envelope, 16)
Expand Down
10 changes: 3 additions & 7 deletions apps/daemon/internal/agent/claudesdk/declaration.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (

"github.com/MiniMax-AI/OpenAgentCore/apps/daemon/internal/agent"
"github.com/MiniMax-AI/OpenAgentCore/apps/daemon/internal/localworkspace"
"github.com/MiniMax-AI/OpenAgentCore/apps/daemon/internal/paths"
"github.com/MiniMax-AI/OpenAgentCore/internal/agentdaemon/proto"
declaration "github.com/MiniMax-AI/OpenAgentCore/internal/harnessconfig/claudesdk"
)
Expand Down Expand Up @@ -38,9 +37,6 @@ func discoverWithCheck(parent context.Context, options agent.DiscoveryOptions, d
if !filepath.IsAbs(entrypoint) {
return fail(fmt.Errorf("%s must be absolute", claudeSDKEntrypointEnv))
}
if err := paths.ValidateProfile(options.Profile); err != nil {
return fail(err)
}
if !filepath.IsAbs(options.RuntimeRoot) || filepath.Clean(options.RuntimeRoot) != options.RuntimeRoot {
return fail(fmt.Errorf("Claude SDK requires an explicit Runtime root"))
}
Expand All @@ -59,13 +55,13 @@ func discoverWithCheck(parent context.Context, options agent.DiscoveryOptions, d
if !filepath.IsAbs(options.StateRoot) || filepath.Clean(options.StateRoot) != options.StateRoot {
return fail(fmt.Errorf("Claude SDK requires an explicit state root"))
}
config = Config{Node: node, Entrypoint: entrypoint, StateDir: filepath.Join(options.StateRoot, "daemon", options.Profile, "runtime", "claude-sdk")}
config = Config{Node: node, Entrypoint: entrypoint, StateRoot: options.StateRoot, RuntimeRoot: options.RuntimeRoot}
if binding := localworkspace.Current(); binding != nil {
config.Node, err = filepath.EvalSymlinks(node)
if err != nil {
return fail(err)
}
config, err = ConfigureLocal(config, options.StateRoot, options.RuntimeRoot, binding.Workspace())
config, err = ConfigureLocal(config, binding.Workspace())
if err != nil {
return fail(err)
}
Expand All @@ -74,7 +70,7 @@ func discoverWithCheck(parent context.Context, options agent.DiscoveryOptions, d
if err != nil {
return fail(err)
}
local := config.Workspace != nil
local := config.Workspace != ""
if local && !info.SupportsLocalRuntime() {
return fail(fmt.Errorf("Claude SDK bundle does not support the local Runtime contract"))
}
Expand Down
10 changes: 5 additions & 5 deletions apps/daemon/internal/agent/claudesdk/declaration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func TestClaudeSDKInvalidPathsFailBeforeProbe(t *testing.T) {
} else {
root = "relative-home"
}
out := discoverWithCheck(t.Context(), agent.DiscoveryOptions{RuntimeRoot: root, StateRoot: t.TempDir(), Profile: "default", Stdout: &strings.Builder{}, Stderr: &strings.Builder{}}, Declaration.Info(), func(context.Context, Config) (RuntimeInfo, error) {
out := discoverWithCheck(t.Context(), agent.DiscoveryOptions{RuntimeRoot: root, StateRoot: t.TempDir(), Stdout: &strings.Builder{}, Stderr: &strings.Builder{}}, Declaration.Info(), func(context.Context, Config) (RuntimeInfo, error) {
t.Fatal("invalid paths reached runtime probe")
return RuntimeInfo{}, nil
})
Expand All @@ -47,7 +47,7 @@ func TestClaudeSDKFeatureDiscovery(t *testing.T) {
}
t.Setenv(claudeSDKNodeEnv, node)
for _, features := range [][]string{nil, {"mcp_http_tools"}, {"mcp_http_bearer_auth"}, {"mcp_http_tools", "mcp_http_bearer_auth"}, {"mcp_http_required"}, {"mcp_http_tools", "mcp_http_required"}, {"subagent_resources"}, {"structured_output"}} {
out := discoverWithCheck(t.Context(), agent.DiscoveryOptions{RuntimeRoot: root, StateRoot: t.TempDir(), Profile: "default", Stdout: &strings.Builder{}, Stderr: &strings.Builder{}}, Declaration.Info(), func(context.Context, Config) (RuntimeInfo, error) {
out := discoverWithCheck(t.Context(), agent.DiscoveryOptions{RuntimeRoot: root, StateRoot: t.TempDir(), Stdout: &strings.Builder{}, Stderr: &strings.Builder{}}, Declaration.Info(), func(context.Context, Config) (RuntimeInfo, error) {
info := RuntimeInfo{SDK: declaration.Declaration.Native.Version, Native: "native", Features: features}
return info, nil
})
Expand Down Expand Up @@ -75,7 +75,7 @@ func TestDiscoveryOnlyNarrowsDeclaration(t *testing.T) {
}
t.Setenv(claudeSDKNodeEnv, node)
features := []string{"message_images", "function_result_images", "tool_search", "structured_output", "subagent_resources", "mcp_http_tools", "mcp_http_bearer_auth", "mcp_http_required"}
out := discoverWithCheck(t.Context(), agent.DiscoveryOptions{RuntimeRoot: root, StateRoot: t.TempDir(), Profile: "default", Stdout: io.Discard, Stderr: io.Discard}, Declaration.Info(), func(context.Context, Config) (RuntimeInfo, error) {
out := discoverWithCheck(t.Context(), agent.DiscoveryOptions{RuntimeRoot: root, StateRoot: t.TempDir(), Stdout: io.Discard, Stderr: io.Discard}, Declaration.Info(), func(context.Context, Config) (RuntimeInfo, error) {
return RuntimeInfo{SDK: declaration.Declaration.Native.Version, Native: "native", Features: features}, nil
})
if out == nil || !out.Info.Available {
Expand All @@ -93,7 +93,7 @@ func TestRuntimeDiscoveryConfigurationAndRegistration(t *testing.T) {
}
t.Setenv(claudeSDKNodeEnv, node)
entrypoint := filepath.Join(root, "bundle", "main.js")
options := agent.DiscoveryOptions{RuntimeRoot: root, StateRoot: t.TempDir(), Profile: "test", Stdout: io.Discard, Stderr: io.Discard}
options := agent.DiscoveryOptions{RuntimeRoot: root, StateRoot: t.TempDir(), Stdout: io.Discard, Stderr: io.Discard}
for _, configured := range []bool{false, true} {
for _, ready := range []bool{false, true} {
t.Setenv(claudeSDKEntrypointEnv, "")
Expand All @@ -103,7 +103,7 @@ func TestRuntimeDiscoveryConfigurationAndRegistration(t *testing.T) {
calls := 0
runtime := discoverWithCheck(t.Context(), options, Declaration.Info(), func(_ context.Context, c Config) (RuntimeInfo, error) {
calls++
if c.Node != node || c.Entrypoint != entrypoint || c.StateDir != filepath.Join(options.StateRoot, "daemon", "test", "runtime", "claude-sdk") || c.Env != nil {
if c.Node != node || c.Entrypoint != entrypoint || c.StateRoot != options.StateRoot || c.RuntimeRoot != options.RuntimeRoot || c.Env != nil {
t.Fatalf("configuration: %+v", c)
}
if !ready {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ func TestClassifiedBridgeFailurePreservesTerminalEvidence(t *testing.T) {
t.Run(mode, func(t *testing.T) {
root := t.TempDir()
t.Setenv("OAC_RUNTIME_HOME", root)
config := Config{Node: os.Args[0], Entrypoint: filepath.Join(root, "worker"), StateDir: filepath.Join(root, "state"), Env: []string{"GO_CLAUDE_SDK_HELPER=1", "SDK_HELPER_MODE=classified-" + mode, "GORACE=atexit_sleep_ms=0"}}
req := proto.PromptRequestPayload{RunID: "run", Input: proto.TextInput("hello"), AgentSessionID: "native-session", Turn: proto.TurnSettings{Model: "fake-model"}, AgentOptions: map[string]any{"system_prompt": "instructions"}}
config := Config{Node: os.Args[0], Entrypoint: filepath.Join(root, "worker"), StateRoot: filepath.Join(root, "state"), Env: []string{"GO_CLAUDE_SDK_HELPER=1", "SDK_HELPER_MODE=classified-" + mode, "GORACE=atexit_sleep_ms=0"}}
req := proto.PromptRequestPayload{AgentStateKey: testStateKey, RunID: "run", Input: proto.TextInput("hello"), AgentSessionID: "native-session", Turn: proto.TurnSettings{Model: "fake-model"}, AgentOptions: map[string]any{"system_prompt": "instructions"}}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
out := make(chan proto.Envelope, 16)
Expand Down
34 changes: 17 additions & 17 deletions apps/daemon/internal/agent/claudesdk/execution_controls_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ import (
func TestExecutionControlsPreserveNativeDefaultsAndInstructions(t *testing.T) {
root := t.TempDir()
t.Setenv("OAC_RUNTIME_HOME", root)
config := Config{Entrypoint: filepath.Join(root, "worker"), StateDir: filepath.Join(root, "state")}
request := proto.PromptRequestPayload{RunID: "run", Input: proto.TextInput("Original input."), AgentSessionID: "native-session", Turn: proto.TurnSettings{Model: "native-model"}, AgentOptions: map[string]any{"system_prompt": "Keep these exact instructions.\nDo not replace them."}}
config := Config{Entrypoint: filepath.Join(root, "worker"), StateRoot: filepath.Join(root, "state")}
request := proto.PromptRequestPayload{AgentStateKey: testStateKey, RunID: "run", Input: proto.TextInput("Original input."), AgentSessionID: "native-session", Turn: proto.TurnSettings{Model: "native-model"}, AgentOptions: map[string]any{"system_prompt": "Keep these exact instructions.\nDo not replace them."}}
ordinary, _, err := prepareConfiguration(config, request)
if err != nil {
t.Fatal(err)
Expand Down Expand Up @@ -48,7 +48,7 @@ func TestLiveWebSearchReachesTheBridgeOnEveryPlacement(t *testing.T) {
live := &proto.ExecutionControls{WebSearch: &proto.WebSearchControl{Mode: "live", ContextSize: "medium"}, TextVerbosity: "medium"}
root := t.TempDir()
t.Setenv("OAC_RUNTIME_HOME", root)
none, _, err := prepareConfiguration(Config{Entrypoint: filepath.Join(root, "worker"), StateDir: filepath.Join(root, "state")}, proto.PromptRequestPayload{
none, _, err := prepareConfiguration(Config{Entrypoint: filepath.Join(root, "worker"), StateRoot: filepath.Join(root, "state")}, proto.PromptRequestPayload{AgentStateKey: testStateKey,
RunID: "run", Input: proto.TextInput("Search."), ExecutionControls: live, Turn: proto.TurnSettings{Model: "native-model"}, AgentOptions: map[string]any{}})
if err != nil || none.WebSearch != "live" {
t.Fatal("live search on environment none did not reach the bridge", err)
Expand Down Expand Up @@ -76,13 +76,13 @@ func TestExecutionControlsRejectUnsupportedProfilesBeforeLaunch(t *testing.T) {
t.Run(name, func(t *testing.T) {
root := t.TempDir()
t.Setenv("OAC_RUNTIME_HOME", root)
config := Config{Node: "must-not-run", Entrypoint: filepath.Join(root, "worker"), StateDir: filepath.Join(root, "state")}
request.RunID, request.Input = "run", proto.TextInput("Original input.")
config := Config{Node: "must-not-run", Entrypoint: filepath.Join(root, "worker"), StateRoot: filepath.Join(root, "state")}
request.RunID, request.Input, request.AgentStateKey = "run", proto.TextInput("Original input."), testStateKey
_, err := startSingleTurn(t.Context(), config, request, make(chan proto.Envelope, 1))
if err == nil || !strings.Contains(err.Error(), "not supported by this Harness") {
t.Fatal("unsupported controls did not fail at admission", err)
}
if _, err := os.Stat(config.StateDir); !os.IsNotExist(err) {
if _, err := os.Stat(testState(config)); !os.IsNotExist(err) {
t.Fatal("unsupported controls reached native setup", err)
}
})
Expand All @@ -92,9 +92,9 @@ func TestExecutionControlsRejectUnsupportedProfilesBeforeLaunch(t *testing.T) {
func TestReasoningEffortReachesNativeOptions(t *testing.T) {
root := t.TempDir()
t.Setenv("OAC_RUNTIME_HOME", root)
config := Config{Entrypoint: filepath.Join(root, "worker"), StateDir: filepath.Join(root, "state")}
config := Config{Entrypoint: filepath.Join(root, "worker"), StateRoot: filepath.Join(root, "state")}
for _, effort := range []string{"low", "medium", "high", "xhigh", "max"} {
request := proto.PromptRequestPayload{RunID: "run", Input: proto.TextInput("hello"), ExecutionControls: &proto.ExecutionControls{TextVerbosity: "medium"}, Turn: proto.TurnSettings{Model: "native-model", ReasoningEffort: effort}, AgentOptions: map[string]any{"harness_config": map[string]any{"thinking": map[string]any{"type": "adaptive"}}}}
request := proto.PromptRequestPayload{AgentStateKey: testStateKey, RunID: "run", Input: proto.TextInput("hello"), ExecutionControls: &proto.ExecutionControls{TextVerbosity: "medium"}, Turn: proto.TurnSettings{Model: "native-model", ReasoningEffort: effort}, AgentOptions: map[string]any{"harness_config": map[string]any{"thinking": map[string]any{"type": "adaptive"}}}}
start, _, err := prepareConfiguration(config, request)
if err != nil {
t.Fatal(effort, err)
Expand All @@ -108,24 +108,24 @@ func TestReasoningEffortReachesNativeOptions(t *testing.T) {
func TestMCPWithoutEnvironmentNoneRejectedBeforeSetup(t *testing.T) {
root := t.TempDir()
t.Setenv("OAC_RUNTIME_HOME", root)
config := Config{Node: "must-not-run", Entrypoint: filepath.Join(root, "worker"), StateDir: filepath.Join(root, "state")}
config := Config{Node: "must-not-run", Entrypoint: filepath.Join(root, "worker"), StateRoot: filepath.Join(root, "state")}
servers := []proto.MCPHTTPServer{{ConnectionOrigin: "service", ServerLabel: "remote", ServerURL: "https://example.test/mcp"}}
request := proto.PromptRequestPayload{RunID: "run", Input: proto.TextInput("Input"), MCPHTTPServers: &servers}
request := proto.PromptRequestPayload{AgentStateKey: testStateKey, RunID: "run", Input: proto.TextInput("Input"), MCPHTTPServers: &servers}
_, err := startSingleTurn(t.Context(), config, request, make(chan proto.Envelope, 1))
if err == nil || !strings.Contains(err.Error(), "service-origin MCP requires a service execution host") {
t.Fatal("MCP reached an unsupported environment", err)
}
if _, err := os.Stat(config.StateDir); !os.IsNotExist(err) {
if _, err := os.Stat(testState(config)); !os.IsNotExist(err) {
t.Fatal("MCP reached native setup", err)
}
}

func TestStructuredOutputConfigurationReachesNativeUnchanged(t *testing.T) {
root := t.TempDir()
t.Setenv("OAC_RUNTIME_HOME", root)
config := Config{Entrypoint: filepath.Join(root, "worker"), StateDir: filepath.Join(root, "state")}
config := Config{Entrypoint: filepath.Join(root, "worker"), StateRoot: filepath.Join(root, "state")}
schema := json.RawMessage(`{"type":"object","properties":{"n":{"const":9007199254740992}}}`)
request := proto.PromptRequestPayload{RunID: "run", Input: proto.TextInput("Original input."), DisableSubagents: true, Turn: proto.TurnSettings{Model: "model"}, AgentOptions: map[string]any{"system_prompt": "Original instructions."}, ExecutionControls: &proto.ExecutionControls{TextVerbosity: "medium", OutputFormat: &proto.OutputFormat{Type: "json_schema", Schema: schema}}}
request := proto.PromptRequestPayload{AgentStateKey: testStateKey, RunID: "run", Input: proto.TextInput("Original input."), DisableSubagents: true, Turn: proto.TurnSettings{Model: "model"}, AgentOptions: map[string]any{"system_prompt": "Original instructions."}, ExecutionControls: &proto.ExecutionControls{TextVerbosity: "medium", OutputFormat: &proto.OutputFormat{Type: "json_schema", Schema: schema}}}
start, _, err := prepareConfiguration(config, request)
if err != nil {
t.Fatal(err)
Expand All @@ -148,8 +148,8 @@ func TestStructuredOutputConfigurationReachesNativeUnchanged(t *testing.T) {
func TestToolDiscoveryPreservesFrozenFunctionsBesideOtherProfiles(t *testing.T) {
root := t.TempDir()
t.Setenv("OAC_RUNTIME_HOME", root)
config := Config{Entrypoint: filepath.Join(root, "worker"), StateDir: filepath.Join(root, "state")}
request := proto.PromptRequestPayload{RunID: "run", Input: proto.TextInput("Original input."), DisableSubagents: true, ToolSearch: true, Turn: proto.TurnSettings{Model: "model"}, AgentOptions: map[string]any{}, FunctionTools: []proto.FunctionTool{
config := Config{Entrypoint: filepath.Join(root, "worker"), StateRoot: filepath.Join(root, "state")}
request := proto.PromptRequestPayload{AgentStateKey: testStateKey, RunID: "run", Input: proto.TextInput("Original input."), DisableSubagents: true, ToolSearch: true, Turn: proto.TurnSettings{Model: "model"}, AgentOptions: map[string]any{}, FunctionTools: []proto.FunctionTool{
{Name: "lookup", Description: "Lookup", Parameters: json.RawMessage(`{"type":"object","properties":{"ticket":{"const":"original"}}}`), DeferLoading: true},
{Name: "clock", Description: "Clock", Parameters: json.RawMessage(`{"type":"object"}`)},
}}
Expand All @@ -171,8 +171,8 @@ func TestToolDiscoveryPreservesFrozenFunctionsBesideOtherProfiles(t *testing.T)
func TestReasoningSummaryReachesTheBridgeOnlyWhenRequested(t *testing.T) {
root := t.TempDir()
t.Setenv("OAC_RUNTIME_HOME", root)
config := Config{Entrypoint: filepath.Join(root, "worker"), StateDir: filepath.Join(root, "state")}
request := proto.PromptRequestPayload{RunID: "run", Input: proto.TextInput("Input."), Turn: proto.TurnSettings{Model: "native-model"}, AgentOptions: map[string]any{}}
config := Config{Entrypoint: filepath.Join(root, "worker"), StateRoot: filepath.Join(root, "state")}
request := proto.PromptRequestPayload{AgentStateKey: testStateKey, RunID: "run", Input: proto.TextInput("Input."), Turn: proto.TurnSettings{Model: "native-model"}, AgentOptions: map[string]any{}}
for _, summary := range []string{"", "auto"} {
request.ExecutionControls = &proto.ExecutionControls{TextVerbosity: "medium", ReasoningSummary: summary}
start, _, err := prepareConfiguration(config, request)
Expand Down
4 changes: 0 additions & 4 deletions apps/daemon/internal/agent/claudesdk/executor.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,6 @@ type executor struct {

func NewExecutorFactory(config Config) agent.ExecutorFactory {
config.Env = slices.Clone(config.Env)
if config.Workspace != nil {
workspace := *config.Workspace
config.Workspace = &workspace
}
checked := &runtimeCheckCache{}
return func(ctx context.Context, req proto.PromptRequestPayload) (agent.Executor, error) {
if ctx == nil {
Expand Down
Loading
Loading