agent

package
v0.2.1 Latest Latest
Warning

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

Go to latest
Published: Jul 22, 2026 License: MIT Imports: 11 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func MarshalAgentEvent

func MarshalAgentEvent(event AgentEvent) ([]byte, error)

func SetDefaultStreamFn added in v0.1.2

func SetDefaultStreamFn(streamFn StreamFn)

SetDefaultStreamFn configures the fallback used when Agent or the low-level loop is called without a stream function. Passing nil clears the fallback.

func ToolExecutionModel

func ToolExecutionModel(ctx context.Context) *ai.Model

ToolExecutionModel returns the request model attached by the loop. Tools use it for behavior that depends on model capabilities, matching upstream's per-invocation tool context rather than startup-time configuration.

func WithToolExecutionModel

func WithToolExecutionModel(ctx context.Context, model *ai.Model) context.Context

WithToolExecutionModel supplies the model context for a direct tool invocation. The agent loop applies it automatically during normal runs.

Types

type AfterToolCallContext

type AfterToolCallContext struct {
	AssistantMessage *ai.AssistantMessage
	ToolCall         *ai.ToolCall
	Args             any
	Result           AgentToolResult
	IsError          bool
	Context          *AgentContext
}

type AfterToolCallFunc

type AfterToolCallFunc func(context.Context, AfterToolCallContext) (*AfterToolCallResult, error)

AfterToolCallFunc may be invoked concurrently for parallel tool calls.

type AfterToolCallResult

type AfterToolCallResult struct {
	Content    ai.ToolResultContent
	Details    any
	DetailsSet bool
	IsError    *bool
	Usage      *ai.Usage
	Terminate  *bool
}

type Agent

type Agent struct {
	// contains filtered or unexported fields
}

Agent is the stateful wrapper around RunLoop and RunLoopContinue.

func NewAgent

func NewAgent(stream StreamFn, option ...AgentOption) *Agent

func (*Agent) Abort

func (agent *Agent) Abort()

func (*Agent) AppendMessage

func (agent *Agent) AppendMessage(message AgentMessage)

func (*Agent) ClearAllQueues

func (agent *Agent) ClearAllQueues()

func (*Agent) ClearFollowUpQueue

func (agent *Agent) ClearFollowUpQueue()

func (*Agent) ClearSteeringQueue

func (agent *Agent) ClearSteeringQueue()

func (*Agent) Continue

func (agent *Agent) Continue(ctx context.Context) error

func (*Agent) FollowUp

func (agent *Agent) FollowUp(message AgentMessage)

func (*Agent) FollowUpMode

func (agent *Agent) FollowUpMode() QueueMode

func (*Agent) HasQueuedMessages

func (agent *Agent) HasQueuedMessages() bool

func (*Agent) IsIdle

func (agent *Agent) IsIdle() bool

func (*Agent) Prompt

func (agent *Agent) Prompt(ctx context.Context, input any, images ...*ai.ImageContent) error

Prompt starts a run from a string, one AgentMessage, or AgentMessages. String prompts accept optional images and are normalized to upstream content blocks.

func (*Agent) ReplaceLastMessage

func (agent *Agent) ReplaceLastMessage(replacement AgentMessage) bool

func (*Agent) Reset

func (agent *Agent) Reset()

func (*Agent) SetFollowUpMode

func (agent *Agent) SetFollowUpMode(mode QueueMode)

func (*Agent) SetMessages

func (agent *Agent) SetMessages(messages AgentMessages)

func (*Agent) SetModel

func (agent *Agent) SetModel(model *ai.Model)

func (*Agent) SetProviderHooks

func (agent *Agent) SetProviderHooks(payload ai.PayloadHook, headers ai.HeadersHook, response ai.ResponseHook)

func (*Agent) SetRequestResolvers

func (agent *Agent) SetRequestResolvers(apiKey GetAPIKeyFunc, auth GetRequestAuthFunc, headers GetModelHeadersFunc)

func (*Agent) SetSteeringMode

func (agent *Agent) SetSteeringMode(mode QueueMode)

func (*Agent) SetStreamFn

func (agent *Agent) SetStreamFn(stream StreamFn)

func (*Agent) SetStreamSessionID

func (agent *Agent) SetStreamSessionID(sessionID string)

SetStreamSessionID sets the per-request session id providers use for affinity and prompt-cache keys (upstream Agent's constructor sessionId).

func (*Agent) SetSystemPrompt

func (agent *Agent) SetSystemPrompt(prompt string)

func (*Agent) SetThinkingLevel

func (agent *Agent) SetThinkingLevel(level ThinkingLevel)

func (*Agent) SetToolCallHooks

func (agent *Agent) SetToolCallHooks(before BeforeToolCallFunc, after AfterToolCallFunc)

func (*Agent) SetTools

func (agent *Agent) SetTools(tools []AgentTool)

func (*Agent) SetTransformContext

func (agent *Agent) SetTransformContext(transform TransformContextFunc)

func (*Agent) SetTransport

func (agent *Agent) SetTransport(transport ai.Transport)

func (*Agent) Signal

func (agent *Agent) Signal() context.Context

Signal returns the active run context, matching upstream's abort signal exposure to extensions. It is nil while the agent is idle.

func (*Agent) State

func (agent *Agent) State() AgentState

func (*Agent) Steer

func (agent *Agent) Steer(message AgentMessage)

func (*Agent) SteeringMode

func (agent *Agent) SteeringMode() QueueMode

func (*Agent) StreamFn

func (agent *Agent) StreamFn() StreamFn

func (*Agent) Subscribe

func (agent *Agent) Subscribe(listener EventSink) func()

Subscribe adds a listener and returns its unsubscribe func. Listeners are awaited in subscription order for each event; overlapping upstream events may invoke the same listener concurrently.

func (*Agent) WaitForIdle

func (agent *Agent) WaitForIdle(ctx context.Context) error

type AgentContext

type AgentContext struct {
	SystemPrompt string
	Messages     AgentMessages
	Tools        []AgentTool
}

type AgentEndEvent

type AgentEndEvent struct {
	Messages AgentMessages
}

func (AgentEndEvent) MarshalJSON

func (event AgentEndEvent) MarshalJSON() ([]byte, error)

func (AgentEndEvent) Type

type AgentEvent

type AgentEvent interface {
	Type() AgentEventType
	// contains filtered or unexported methods
}

type AgentEventType

type AgentEventType string
const (
	EventAgentStart          AgentEventType = "agent_start"
	EventAgentEnd            AgentEventType = "agent_end"
	EventTurnStart           AgentEventType = "turn_start"
	EventTurnEnd             AgentEventType = "turn_end"
	EventMessageStart        AgentEventType = "message_start"
	EventMessageUpdate       AgentEventType = "message_update"
	EventMessageEnd          AgentEventType = "message_end"
	EventToolExecutionStart  AgentEventType = "tool_execution_start"
	EventToolExecutionUpdate AgentEventType = "tool_execution_update"
	EventToolExecutionEnd    AgentEventType = "tool_execution_end"
)

type AgentLoopConfig

type AgentLoopConfig struct {
	ai.SimpleStreamOptions
	Model               *ai.Model
	ConvertToLLM        ConvertToLLMFunc
	TransformContext    TransformContextFunc
	GetAPIKey           GetAPIKeyFunc
	GetRequestAuth      GetRequestAuthFunc
	GetModelHeaders     GetModelHeadersFunc
	ShouldStopAfterTurn ShouldStopAfterTurnFunc
	PrepareNextTurn     PrepareNextTurnFunc
	GetSteeringMessages GetQueuedMessagesFunc
	GetFollowUpMessages GetQueuedMessagesFunc
	ToolExecution       ToolExecutionMode
	BeforeToolCall      BeforeToolCallFunc
	AfterToolCall       AfterToolCallFunc
	Now                 func() int64
}

type AgentLoopTurnUpdate

type AgentLoopTurnUpdate struct {
	Context       *AgentContext
	Model         *ai.Model
	ThinkingLevel *ThinkingLevel
}

type AgentMessage

type AgentMessage = any

AgentMessage is an LLM message or an application-defined message. Standard messages are ai.Message values; any JSON-marshalable value may be carried so applications retain upstream's custom-message extension point.

type AgentMessages

type AgentMessages []AgentMessage

func RunLoop

func RunLoop(
	ctx context.Context,
	prompts AgentMessages,
	loopContext AgentContext,
	config AgentLoopConfig,
	sink EventSink,
	streamFn StreamFn,
) (AgentMessages, error)

RunLoop starts a loop with prompt messages and returns only messages created by this invocation. The caller-owned context is copied before it is changed.

func RunLoopContinue

func RunLoopContinue(
	ctx context.Context,
	loopContext *AgentContext,
	config AgentLoopConfig,
	sink EventSink,
	streamFn StreamFn,
) (AgentMessages, error)

RunLoopContinue resumes a non-assistant transcript without adding a prompt.

type AgentOption

type AgentOption func(*agentOptions)

func WithAPIKeyResolver

func WithAPIKeyResolver(resolve GetAPIKeyFunc) AgentOption

func WithAfterToolCall

func WithAfterToolCall(hook AfterToolCallFunc) AgentOption

func WithBeforeToolCall

func WithBeforeToolCall(hook BeforeToolCallFunc) AgentOption

func WithClock

func WithClock(now func() int64) AgentOption

WithClock supplies JavaScript Date.now-compatible milliseconds. It is useful for deterministic fixture runs and applications with an injected clock.

func WithConvertToLLM

func WithConvertToLLM(convert ConvertToLLMFunc) AgentOption

func WithFollowUpMode

func WithFollowUpMode(mode QueueMode) AgentOption

func WithGetFollowUpMessages

func WithGetFollowUpMessages(getter GetQueuedMessagesFunc) AgentOption

func WithGetSteeringMessages

func WithGetSteeringMessages(getter GetQueuedMessagesFunc) AgentOption

func WithInitialState

func WithInitialState(state AgentState) AgentOption

func WithModelHeadersResolver

func WithModelHeadersResolver(resolve GetModelHeadersFunc) AgentOption

func WithPrepareNextTurnContext

func WithPrepareNextTurnContext(hook PrepareNextTurnFunc) AgentOption

func WithRequestAuthResolver

func WithRequestAuthResolver(resolve GetRequestAuthFunc) AgentOption

func WithShouldStopAfterTurn

func WithShouldStopAfterTurn(hook ShouldStopAfterTurnFunc) AgentOption

func WithSimpleStreamOptions

func WithSimpleStreamOptions(streamOptions ai.SimpleStreamOptions) AgentOption

func WithSteeringMode

func WithSteeringMode(mode QueueMode) AgentOption

func WithToolExecution

func WithToolExecution(mode ToolExecutionMode) AgentOption

func WithTransformContext

func WithTransformContext(transform TransformContextFunc) AgentOption

type AgentStartEvent

type AgentStartEvent struct{}

func (AgentStartEvent) MarshalJSON

func (AgentStartEvent) MarshalJSON() ([]byte, error)

func (AgentStartEvent) Type

type AgentState

type AgentState struct {
	SystemPrompt     string
	Model            *ai.Model
	ThinkingLevel    ThinkingLevel
	Tools            []AgentTool
	Messages         AgentMessages
	IsStreaming      bool
	StreamingMessage AgentMessage
	PendingToolCalls map[string]struct{}
	ErrorMessage     *string
}

type AgentTool

type AgentTool interface {
	Spec() AgentToolSpec
	Execute(context.Context, string, any, AgentToolUpdateCallback) (AgentToolResult, error)
}

AgentTool is the execution seam shared by built-in, extension, and MCP tools. Spec returns immutable call metadata for a single loop decision.

type AgentToolFunc

type AgentToolFunc struct {
	AgentToolSpec
	Run ToolExecuteFunc
}

AgentToolFunc adapts a function to AgentTool without introducing a second implementation-specific interface.

func (AgentToolFunc) Execute

func (tool AgentToolFunc) Execute(
	ctx context.Context,
	toolCallID string,
	params any,
	onUpdate AgentToolUpdateCallback,
) (AgentToolResult, error)

func (AgentToolFunc) Spec

func (tool AgentToolFunc) Spec() AgentToolSpec

type AgentToolResult

type AgentToolResult struct {
	Content        ai.ToolResultContent
	Details        any
	Usage          *ai.Usage
	AddedToolNames *[]string
	Terminate      *bool
}

func (AgentToolResult) MarshalJSON

func (result AgentToolResult) MarshalJSON() ([]byte, error)

type AgentToolSpec

type AgentToolSpec struct {
	Name             string
	Label            string
	Description      string
	Parameters       ai.JSONSchema
	PrepareArguments PrepareArgumentsFunc
	ExecutionMode    ToolExecutionMode
}

type AgentToolUpdateCallback

type AgentToolUpdateCallback func(AgentToolResult)

AgentToolUpdateCallback snapshots accepted updates and returns before event listeners settle. It is scoped to Execute; calls after Execute returns, or racing with its return, may be ignored.

type BeforeToolCallContext

type BeforeToolCallContext struct {
	AssistantMessage *ai.AssistantMessage
	ToolCall         *ai.ToolCall
	Args             any
	Context          *AgentContext
}

type BeforeToolCallResult

type BeforeToolCallResult struct {
	Block  bool
	Reason string
}

type ConvertToLLMFunc

type ConvertToLLMFunc func(context.Context, AgentMessages) (ai.MessageList, error)

type EventSink

type EventSink func(ctx context.Context, event AgentEvent) error

EventSink handles one event. Parallel tool calls and successive tool updates may invoke the same sink concurrently, matching upstream's overlapping event promises, so implementations that mutate shared state must synchronize it.

type GetAPIKeyFunc

type GetAPIKeyFunc func(context.Context, ai.ProviderID) (*string, error)

type GetModelHeadersFunc

type GetModelHeadersFunc func(context.Context, *ai.Model, *string, ai.ProviderEnv) (*map[string]string, error)

type GetQueuedMessagesFunc

type GetQueuedMessagesFunc func(context.Context) (AgentMessages, error)

type GetRequestAuthFunc

type GetRequestAuthFunc func(context.Context, ai.ProviderID) (*RequestAuth, error)

type MessageEndEvent

type MessageEndEvent struct {
	Message AgentMessage
}

func (MessageEndEvent) MarshalJSON

func (event MessageEndEvent) MarshalJSON() ([]byte, error)

func (MessageEndEvent) Type

type MessageStartEvent

type MessageStartEvent struct {
	Message AgentMessage
}

func (MessageStartEvent) MarshalJSON

func (event MessageStartEvent) MarshalJSON() ([]byte, error)

func (MessageStartEvent) Type

type MessageUpdateEvent

type MessageUpdateEvent struct {
	// Upstream constructs this literal with assistantMessageEvent before message.
	AssistantMessageEvent ai.AssistantMessageEvent
	Message               AgentMessage
}

func (MessageUpdateEvent) MarshalJSON

func (event MessageUpdateEvent) MarshalJSON() ([]byte, error)

func (MessageUpdateEvent) Type

type ParallelExecutionPreparer

type ParallelExecutionPreparer interface {
	PrepareParallelExecution(context.Context, any) (context.Context, func(), error)
}

ParallelExecutionPreparer reserves invocation-ordered resources before a parallel batch is launched. The loop calls it in tool-call source order.

type PrepareArgumentsFunc

type PrepareArgumentsFunc func(args any) (any, error)

type PrepareNextTurnContext

type PrepareNextTurnContext = ShouldStopAfterTurnContext

type PrepareNextTurnWithoutContextFunc

type PrepareNextTurnWithoutContextFunc func(context.Context) (*AgentLoopTurnUpdate, error)

type QueueMode

type QueueMode string
const (
	QueueAll        QueueMode = "all"
	QueueOneAtATime QueueMode = "one-at-a-time"
)

type RequestAuth

type RequestAuth struct {
	APIKey  *string
	Headers ai.ProviderHeaders
	Env     ai.ProviderEnv
	BaseURL *string
}

type ShouldStopAfterTurnContext

type ShouldStopAfterTurnContext struct {
	Message     *ai.AssistantMessage
	ToolResults []*ai.ToolResultMessage
	Context     *AgentContext
	NewMessages AgentMessages
}

type ShouldStopAfterTurnFunc

type ShouldStopAfterTurnFunc func(context.Context, ShouldStopAfterTurnContext) (bool, error)

type StreamFn

type StreamFn func(
	ctx context.Context,
	model *ai.Model,
	requestContext ai.Context,
	options *ai.SimpleStreamOptions,
) (ai.AssistantMessageEventStream, error)

type ToolExecuteFunc

type ToolExecuteFunc func(
	ctx context.Context,
	toolCallID string,
	params any,
	onUpdate AgentToolUpdateCallback,
) (AgentToolResult, error)

type ToolExecutionEndEvent

type ToolExecutionEndEvent struct {
	ToolCallID string
	ToolName   string
	Result     AgentToolResult
	IsError    bool
}

func (ToolExecutionEndEvent) MarshalJSON

func (event ToolExecutionEndEvent) MarshalJSON() ([]byte, error)

func (ToolExecutionEndEvent) Type

type ToolExecutionMode

type ToolExecutionMode string
const (
	ToolExecutionSequential ToolExecutionMode = "sequential"
	ToolExecutionParallel   ToolExecutionMode = "parallel"
)

type ToolExecutionStartEvent

type ToolExecutionStartEvent struct {
	ToolCallID string
	ToolName   string
	Args       map[string]any
	// contains filtered or unexported fields
}

func NewToolExecutionStartEvent

func NewToolExecutionStartEvent(toolCall *ai.ToolCall) ToolExecutionStartEvent

func (ToolExecutionStartEvent) MarshalJSON

func (event ToolExecutionStartEvent) MarshalJSON() ([]byte, error)

func (ToolExecutionStartEvent) Type

type ToolExecutionUpdateEvent

type ToolExecutionUpdateEvent struct {
	ToolCallID    string
	ToolName      string
	Args          map[string]any
	PartialResult AgentToolResult
	// contains filtered or unexported fields
}

func NewToolExecutionUpdateEvent

func NewToolExecutionUpdateEvent(toolCall *ai.ToolCall, partial AgentToolResult) ToolExecutionUpdateEvent

func (ToolExecutionUpdateEvent) MarshalJSON

func (event ToolExecutionUpdateEvent) MarshalJSON() ([]byte, error)

func (ToolExecutionUpdateEvent) Type

type TransformContextFunc

type TransformContextFunc func(context.Context, AgentMessages) (AgentMessages, error)

type TurnEndEvent

type TurnEndEvent struct {
	Message     AgentMessage
	ToolResults []*ai.ToolResultMessage
}

func (TurnEndEvent) MarshalJSON

func (event TurnEndEvent) MarshalJSON() ([]byte, error)

func (TurnEndEvent) Type

type TurnStartEvent

type TurnStartEvent struct{}

func (TurnStartEvent) MarshalJSON

func (TurnStartEvent) MarshalJSON() ([]byte, error)

func (TurnStartEvent) Type

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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