toolshared

package
v0.2.7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 21, 2026 License: MIT Imports: 5 Imported by: 0

Documentation

Index

Constants

View Source
const (
	HandledToolLLMNote   = "" /* 185-byte string literal not displayed */
	ArtifactPathsLLMNote = "" /* 132-byte string literal not displayed */
)

Variables

This section is empty.

Functions

func ToolAgentID

func ToolAgentID(ctx context.Context) string

ToolAgentID extracts the active turn's agent ID from ctx, or "" if unset.

func ToolChannel

func ToolChannel(ctx context.Context) string

ToolChannel extracts the channel from ctx, or "" if unset.

func ToolChatID

func ToolChatID(ctx context.Context) string

ToolChatID extracts the chatID from ctx, or "" if unset.

func ToolMessageID

func ToolMessageID(ctx context.Context) string

ToolMessageID extracts the current inbound message ID from ctx, or "" if unset.

func ToolReplyToMessageID

func ToolReplyToMessageID(ctx context.Context) string

ToolReplyToMessageID extracts the current inbound reply target from ctx, or "" if unset.

func ToolSessionKey

func ToolSessionKey(ctx context.Context) string

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 ToolToSchema(tool Tool) map[string]any

func WithToolContext

func WithToolContext(ctx context.Context, channel, chatID string) context.Context

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 ExecResponse struct {
	SessionID string        `json:"sessionId,omitempty"`
	Status    string        `json:"status,omitempty"`
	ExitCode  int           `json:"exitCode,omitempty"`
	Output    string        `json:"output,omitempty"`
	Error     string        `json:"error,omitempty"`
	Sessions  []SessionInfo `json:"sessions,omitempty"`
}

type FunctionCall

type FunctionCall struct {
	Name      string `json:"name"`
	Arguments string `json:"arguments"`
}

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 LLMResponse struct {
	Content      string     `json:"content"`
	ToolCalls    []ToolCall `json:"tool_calls,omitempty"`
	FinishReason string     `json:"finish_reason"`
	Usage        *UsageInfo `json:"usage,omitempty"`
}

type Message

type Message struct {
	Role       string     `json:"role"`
	Content    string     `json:"content"`
	ToolCalls  []ToolCall `json:"tool_calls,omitempty"`
	ToolCallID string     `json:"tool_call_id,omitempty"`
}

type SessionInfo

type SessionInfo struct {
	ID        string `json:"id"`
	Command   string `json:"command"`
	Status    string `json:"status"`
	PID       int    `json:"pid"`
	StartedAt int64  `json:"startedAt"`
}

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 ToolCall

type ToolCall struct {
	ID        string         `json:"id"`
	Type      string         `json:"type"`
	Function  *FunctionCall  `json:"function,omitempty"`
	Name      string         `json:"name,omitempty"`
	Arguments map[string]any `json:"arguments,omitempty"`
}

type ToolDefinition

type ToolDefinition struct {
	Type     string                 `json:"type"`
	Function ToolFunctionDefinition `json:"function"`
}

type ToolFunctionDefinition

type ToolFunctionDefinition struct {
	Name        string         `json:"name"`
	Description string         `json:"description"`
	Parameters  map[string]any `json:"parameters"`
}

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.

type UsageInfo

type UsageInfo struct {
	PromptTokens     int `json:"prompt_tokens"`
	CompletionTokens int `json:"completion_tokens"`
	TotalTokens      int `json:"total_tokens"`
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL