Documentation
¶
Index ¶
- Constants
- func ToolAgentID(ctx context.Context) string
- func ToolChannel(ctx context.Context) string
- func ToolChatID(ctx context.Context) string
- func ToolMessageID(ctx context.Context) string
- func ToolReplyToMessageID(ctx context.Context) string
- func ToolSessionKey(ctx context.Context) string
- func ToolSessionScope(ctx context.Context) *session.SessionScope
- func ToolToSchema(tool Tool) map[string]any
- func WithToolContext(ctx context.Context, channel, chatID string) context.Context
- func WithToolInboundContext(ctx context.Context, channel, chatID, messageID, replyToMessageID string) context.Context
- func WithToolMessageContext(ctx context.Context, messageID, replyToMessageID string) context.Context
- func WithToolSessionContext(ctx context.Context, agentID, sessionKey string, scope *session.SessionScope) context.Context
- type AsyncCallback
- type AsyncExecutor
- type ExecRequest
- type ExecResponse
- type FunctionCall
- type LLMProvider
- type LLMResponse
- type Message
- type SessionInfo
- type Tool
- type ToolCall
- type ToolDefinition
- type ToolFunctionDefinition
- type ToolResult
- type UsageInfo
Constants ¶
const ( HandledToolLLMNote = "" /* 185-byte string literal not displayed */ ArtifactPathsLLMNote = "" /* 132-byte string literal not displayed */ )
Variables ¶
This section is empty.
Functions ¶
func ToolAgentID ¶
ToolAgentID extracts the active turn's agent ID from ctx, or "" if unset.
func ToolChannel ¶
ToolChannel extracts the channel from ctx, or "" if unset.
func ToolChatID ¶
ToolChatID extracts the chatID from ctx, or "" if unset.
func ToolMessageID ¶
ToolMessageID extracts the current inbound message ID from ctx, or "" if unset.
func ToolReplyToMessageID ¶
ToolReplyToMessageID extracts the current inbound reply target from ctx, or "" if unset.
func ToolSessionKey ¶
ToolSessionKey extracts the active turn's session key from ctx, or "" if unset.
func ToolSessionScope ¶
func ToolSessionScope(ctx context.Context) *session.SessionScope
ToolSessionScope extracts the active turn's structured session scope from ctx.
func ToolToSchema ¶
func WithToolContext ¶
WithToolContext returns a child context carrying channel and chatID.
func WithToolInboundContext ¶
func WithToolInboundContext( ctx context.Context, channel, chatID, messageID, replyToMessageID string, ) context.Context
WithToolInboundContext returns a child context carrying channel/chat and inbound IDs.
func WithToolMessageContext ¶
func WithToolMessageContext(ctx context.Context, messageID, replyToMessageID string) context.Context
WithToolMessageContext returns a child context carrying inbound message IDs.
func WithToolSessionContext ¶
func WithToolSessionContext( ctx context.Context, agentID, sessionKey string, scope *session.SessionScope, ) context.Context
WithToolSessionContext returns a child context carrying turn-scoped session metadata.
Types ¶
type AsyncCallback ¶
type AsyncCallback func(ctx context.Context, result *ToolResult)
AsyncCallback is a function type that async tools use to notify completion. When an async tool finishes its work, it calls this callback with the result.
The ctx parameter allows the callback to be canceled if the agent is shutting down. The result parameter contains the tool's execution result.
type AsyncExecutor ¶
type AsyncExecutor interface {
Tool
// ExecuteAsync runs the tool asynchronously. The callback cb will be
// invoked (possibly from another goroutine) when the async operation
// completes. cb is guaranteed to be non-nil by the caller (registry).
ExecuteAsync(ctx context.Context, args map[string]any, cb AsyncCallback) *ToolResult
}
AsyncExecutor is an optional interface that tools can implement to support asynchronous execution with completion callbacks.
Unlike the old AsyncTool pattern (SetCallback + Execute), AsyncExecutor receives the callback as a parameter of ExecuteAsync. This eliminates the data race where concurrent calls could overwrite each other's callbacks on a shared tool instance.
This is useful for:
- Long-running operations that shouldn't block the agent loop
- Subagent spawns that complete independently
- Background tasks that need to report results later
Example:
func (t *SpawnTool) ExecuteAsync(ctx context.Context, args map[string]any, cb AsyncCallback) *ToolResult {
go func() {
result := t.runSubagent(ctx, args)
if cb != nil { cb(ctx, result) }
}()
return AsyncResult("Subagent spawned, will report back")
}
type ExecRequest ¶
type ExecRequest struct {
Action string `json:"action"`
Command string `json:"command,omitempty"`
PTY bool `json:"pty,omitempty"`
Background bool `json:"background,omitempty"`
Timeout int `json:"timeout,omitempty"`
Env map[string]string `json:"env,omitempty"`
Cwd string `json:"cwd,omitempty"`
SessionID string `json:"sessionId,omitempty"`
Data string `json:"data,omitempty"`
}
type ExecResponse ¶
type FunctionCall ¶
type LLMProvider ¶
type LLMProvider interface {
Chat(
ctx context.Context,
messages []Message,
tools []ToolDefinition,
model string,
options map[string]any,
) (*LLMResponse, error)
GetDefaultModel() string
}
type LLMResponse ¶
type SessionInfo ¶
type Tool ¶
type Tool interface {
Name() string
Description() string
Parameters() map[string]any
Execute(ctx context.Context, args map[string]any) *ToolResult
}
Tool is the interface that all tools must implement.
type ToolDefinition ¶
type ToolDefinition struct {
Type string `json:"type"`
Function ToolFunctionDefinition `json:"function"`
}
type ToolFunctionDefinition ¶
type ToolResult ¶
type ToolResult struct {
// ForLLM is the content sent to the LLM for context.
// Required for all results.
ForLLM string `json:"for_llm"`
// ForUser is the content sent directly to the user.
// If empty, no user message is sent.
// Silent=true overrides this field.
ForUser string `json:"for_user,omitempty"`
// Silent suppresses sending any message to the user.
// When true, ForUser is ignored even if set.
Silent bool `json:"silent"`
// IsError indicates whether the tool execution failed.
// When true, the result should be treated as an error.
IsError bool `json:"is_error"`
// Async indicates whether the tool is running asynchronously.
// When true, the tool will complete later and notify via callback.
Async bool `json:"async"`
// Err is the underlying error (not JSON serialized).
// Used for internal error handling and logging.
Err error `json:"-"`
// Media contains media store refs produced by this tool.
// When non-empty, the agent will publish these as OutboundMediaMessage.
Media []string `json:"media,omitempty"`
// Messages holds the ephemeral session history after execution.
// Only populated by SubTurn executions; used by evaluator_optimizer
// to carry stateful worker context across evaluation iterations.
Messages []providers.Message `json:"-"`
// ArtifactTags exposes local artifact paths back to the LLM in a structured
// form, e.g. "[file:/tmp/example.png]". This is used when a tool produced a
// reusable local artifact but did not deliver it to the user yet.
ArtifactTags []string `json:"artifact_tags,omitempty"`
// ResponseHandled indicates that this tool execution already satisfied the
// user's request at the channel/output level, so the agent loop can stop
// without a follow-up assistant response.
ResponseHandled bool `json:"response_handled,omitempty"`
}
ToolResult represents the structured return value from tool execution. It provides clear semantics for different types of results and supports async operations, user-facing messages, and error handling.
func AsyncResult ¶
func AsyncResult(forLLM string) *ToolResult
AsyncResult creates a ToolResult for async operations. The task will run in the background and complete later.
Use this for long-running operations like: - Subagent spawns - Background processing - External API calls with callbacks
Example:
result := AsyncResult("Subagent spawned, will report back")
func ErrorResult ¶
func ErrorResult(message string) *ToolResult
ErrorResult creates a ToolResult representing an error. Sets IsError=true and includes the error message.
Example:
result := ErrorResult("Failed to connect to database: connection refused")
func MediaResult ¶
func MediaResult(forLLM string, mediaRefs []string) *ToolResult
MediaResult creates a ToolResult with media refs for the user. The agent will publish these refs as OutboundMediaMessage.
Example:
result := MediaResult("Image generated successfully", []string{"media://abc123"})
func NewToolResult ¶
func NewToolResult(forLLM string) *ToolResult
NewToolResult creates a basic ToolResult with content for the LLM. Use this when you need a simple result with default behavior.
Example:
result := NewToolResult("File updated successfully")
func SilentResult ¶
func SilentResult(forLLM string) *ToolResult
SilentResult creates a ToolResult that is silent (no user message). The content is only sent to the LLM for context.
Use this for operations that should not spam the user, such as: - File reads/writes - Status updates - Background operations
Example:
result := SilentResult("Config file saved")
func UserResult ¶
func UserResult(content string) *ToolResult
UserResult creates a ToolResult with content for both LLM and user. Both ForLLM and ForUser are set to the same content.
Use this when the user needs to see the result directly: - Command execution output - Fetched web content - Query results
Example:
result := UserResult("Total files found: 42")
func (*ToolResult) ContentForLLM ¶
func (tr *ToolResult) ContentForLLM() string
ContentForLLM returns the normalized textual content to append to the conversation after a tool call. Errors fall back to Err when ForLLM is empty.
func (*ToolResult) MarshalJSON ¶
func (tr *ToolResult) MarshalJSON() ([]byte, error)
MarshalJSON implements custom JSON serialization. The Err field is excluded from JSON output via the json:"-" tag.
func (*ToolResult) WithError ¶
func (tr *ToolResult) WithError(err error) *ToolResult
WithError sets the Err field and returns the result for chaining. This preserves the error for logging while keeping it out of JSON.
Example:
result := ErrorResult("Operation failed").WithError(err)
func (*ToolResult) WithResponseHandled ¶
func (tr *ToolResult) WithResponseHandled() *ToolResult
WithResponseHandled marks the tool result as already delivered to the user.