agents

package
v0.76.0 Latest Latest
Warning

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

Go to latest
Published: Mar 8, 2026 License: MIT Imports: 15 Imported by: 0

README

How Orchestrator works high level

sequenceDiagram
    participant Client
    participant Orchestrator
    participant Analyzer
    participant TaskParser
    participant PlanCreator
    participant Processor

    Client->>Orchestrator: Process(task, context)
    activate Orchestrator

    Note over Orchestrator,Analyzer: Phase 1: Task Analysis
    Orchestrator->>Analyzer: Analyze task breakdown
    activate Analyzer
    Analyzer-->>Orchestrator: Raw analysis output (XML format)
    deactivate Analyzer

    Note over Orchestrator,TaskParser: Phase 2: Task Parsing
    Orchestrator->>TaskParser: Parse(analyzerOutput)
    activate TaskParser
    TaskParser-->>Orchestrator: Structured Task objects
    deactivate TaskParser

    Note over Orchestrator,PlanCreator: Phase 3: Plan Creation
    Orchestrator->>PlanCreator: CreatePlan(tasks)
    activate PlanCreator
    PlanCreator-->>Orchestrator: Execution phases
    deactivate PlanCreator

    Note over Orchestrator,Processor: Phase 4: Execution
    loop For each phase
        loop For each task in phase (parallel)
            Orchestrator->>Processor: Process(task, context)
            activate Processor
            Processor-->>Orchestrator: Task result
            deactivate Processor
        end
    end

    Orchestrator-->>Client: OrchestratorResult
    deactivate Orchestrator

Task dependency resolution


graph TD
    subgraph Task Structure
        A[Task] --> B[ID]
        A --> C[Type]
        A --> D[ProcessorType]
        A --> E[Dependencies]
        A --> F[Priority]
        A --> G[Metadata]
    end

    subgraph Plan Creation
        H[Input Tasks] --> I[Build Dependency Graph]
        I --> J[Detect Cycles]
        J --> K[Create Phases]
        K --> L[Sort by Priority]
        L --> M[Apply Max Concurrent]
    end

    subgraph Execution
        N[Phase Execution] --> O[Parallel Task Pool]
        O --> P[Process Task 1]
        O --> Q[Process Task 2]
        O --> R[Process Task N]
        P --> S[Collect Results]
        Q --> S
        R --> S
    end

Error handling and retry flow explained

stateDiagram-v2
    [*] --> TaskReceived
    TaskReceived --> Analyzing

    state Analyzing {
        [*] --> AttemptAnalysis
        AttemptAnalysis --> AnalysisSuccess
        AttemptAnalysis --> AnalysisFailure
        AnalysisFailure --> RetryAnalysis: Retry < MaxAttempts
        RetryAnalysis --> AttemptAnalysis
        AnalysisFailure --> AnalysisFailed: Retry >= MaxAttempts
    }

    state Execution {
        [*] --> ExecuteTask
        ExecuteTask --> TaskSuccess
        ExecuteTask --> TaskFailure
        TaskFailure --> RetryTask: Retry < MaxAttempts
        RetryTask --> ExecuteTask
        TaskFailure --> TaskFailed: Retry >= MaxAttempts
    }

    Analyzing --> Execution: Analysis Success
    Analyzing --> [*]: Analysis Failed
    Execution --> [*]: All Tasks Complete/Failed

Documentation

Index

Constants

View Source
const (
	StopReasonFinish           = "finish"
	StopReasonMaxIterations    = "max_iterations"
	StopReasonError            = "error"
	StopReasonAborted          = "aborted"
	StopReasonBudgetExhausted  = "budget_exhausted"
	StopReasonFinishOverBudget = "finish_over_budget"
)

Variables

View Source
var (
	// ErrAgentFinished indicates the agent has completed execution.
	ErrAgentFinished = errors.New("agent has finished execution")

	// ErrMaxIterations indicates the agent hit the iteration limit.
	ErrMaxIterations = errors.New("max iterations reached")

	// ErrContextOverflow indicates the context window was exceeded.
	ErrContextOverflow = errors.New("context window overflow")

	// ErrAborted indicates the agent execution was aborted.
	ErrAborted = errors.New("agent execution aborted")
)

Functions

func IsContextOverflow added in v0.76.0

func IsContextOverflow(err error) bool

IsContextOverflow checks if an error is or wraps ErrContextOverflow.

Types

type Agent

type Agent interface {
	// Execute runs the agent's task with given input and returns output
	Execute(ctx context.Context, input map[string]interface{}) (map[string]interface{}, error)

	// GetCapabilities returns the tools/capabilities available to this agent
	GetCapabilities() []core.Tool

	// GetMemory returns the agent's memory store
	GetMemory() Memory
}

type AgentEvent added in v0.76.0

type AgentEvent struct {
	Type      string
	Data      map[string]any
	Timestamp time.Time
}

AgentEvent represents an event emitted during agent execution. This is intentionally minimal and will be extended by streaming/event work.

type AnalyzerConfig added in v0.12.0

type AnalyzerConfig struct {
	// The base instruction for task analysis
	BaseInstruction string
	// Additional formatting instructions specific to the implementation
	FormatInstructions string
	// Any extra considerations for task analysis
	Considerations []string
}

New type to encapsulate analyzer-specific configuration.

type DefaultPlanCreator added in v0.11.0

type DefaultPlanCreator struct{}

DefaultPlanCreator provides a simple implementation for testing.

func (*DefaultPlanCreator) CreatePlan added in v0.11.0

func (p *DefaultPlanCreator) CreatePlan(tasks []Task) ([][]Task, error)

type DefaultTaskParser added in v0.11.0

type DefaultTaskParser struct{}

DefaultTaskParser provides a simple implementation for testing.

func (*DefaultTaskParser) Parse added in v0.11.0

func (p *DefaultTaskParser) Parse(analyzerOutput map[string]interface{}) ([]Task, error)

type DependencyPlanCreator added in v0.14.0

type DependencyPlanCreator struct {
	// Optional configuration for planning
	MaxTasksPerPhase int
}

DependencyPlanCreator creates execution plans based on task dependencies.

func NewDependencyPlanCreator added in v0.14.0

func NewDependencyPlanCreator(maxTasksPerPhase int) *DependencyPlanCreator

func (*DependencyPlanCreator) CreatePlan added in v0.14.0

func (p *DependencyPlanCreator) CreatePlan(tasks []Task) ([][]Task, error)

type ErrorCode added in v0.16.1

type ErrorCode int

ErrorCode represents specific error conditions.

const (
	ErrNoTasksSection ErrorCode = iota
	ErrInvalidXML
	ErrMalformedTasks
)

type FlexibleOrchestrator added in v0.11.0

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

FlexibleOrchestrator coordinates intelligent task decomposition and execution.

func NewFlexibleOrchestrator added in v0.11.0

func NewFlexibleOrchestrator(memory Memory, config OrchestrationConfig) *FlexibleOrchestrator

NewFlexibleOrchestrator creates a new orchestrator instance.

func (*FlexibleOrchestrator) GetProcessor added in v0.16.2

func (f *FlexibleOrchestrator) GetProcessor(processorType string) (TaskProcessor, error)

getProcessor returns the registered processor for a task type.

func (*FlexibleOrchestrator) Process added in v0.11.0

func (f *FlexibleOrchestrator) Process(ctx context.Context, task string, context map[string]interface{}) (*OrchestratorResult, error)

Process handles complete orchestration workflow.

func (*FlexibleOrchestrator) RegisterProcessor added in v0.11.0

func (f *FlexibleOrchestrator) RegisterProcessor(processorType string, processor TaskProcessor)

RegisterProcessor adds a new task processor.

type InMemoryStore

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

Simple in-memory implementation.

func NewInMemoryStore

func NewInMemoryStore() *InMemoryStore

func (*InMemoryStore) Clear

func (s *InMemoryStore) Clear() error

func (*InMemoryStore) Delete added in v0.52.0

func (s *InMemoryStore) Delete(key string) error

func (*InMemoryStore) List

func (s *InMemoryStore) List() ([]string, error)

func (*InMemoryStore) Retrieve

func (s *InMemoryStore) Retrieve(key string) (interface{}, error)

func (*InMemoryStore) Store

func (s *InMemoryStore) Store(key string, value interface{}) error

type InterceptableAgent added in v0.47.0

type InterceptableAgent interface {
	Agent

	// ExecuteWithInterceptors runs the agent's task with interceptor support
	ExecuteWithInterceptors(ctx context.Context, input map[string]interface{}, interceptors []core.AgentInterceptor) (map[string]interface{}, error)

	// SetInterceptors sets the default interceptors for this agent instance
	SetInterceptors(interceptors []core.AgentInterceptor)

	// GetInterceptors returns the current interceptors for this agent
	GetInterceptors() []core.AgentInterceptor

	// ClearInterceptors removes all interceptors from this agent
	ClearInterceptors()

	// GetAgentID returns the unique identifier for this agent instance
	GetAgentID() string

	// GetAgentType returns the category/type of this agent
	GetAgentType() string
}

InterceptableAgent extends Agent with interceptor support. This interface provides backward-compatible enhancement for agents that support interceptors.

func WrapAgentWithInterceptors added in v0.47.0

func WrapAgentWithInterceptors(agent Agent, agentID, agentType string, interceptors ...core.AgentInterceptor) InterceptableAgent

WrapAgentWithInterceptors is a convenience function to wrap any agent with interceptor support.

type InterceptorAgentAdapter added in v0.47.0

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

InterceptorAgentAdapter wraps an existing Agent to provide interceptor support. This allows any existing agent to be used with interceptors without modifying its implementation.

func NewInterceptorAgentAdapter added in v0.47.0

func NewInterceptorAgentAdapter(agent Agent, agentID, agentType string) *InterceptorAgentAdapter

NewInterceptorAgentAdapter creates a new adapter that wraps an existing agent with interceptor support.

func (*InterceptorAgentAdapter) ClearInterceptors added in v0.47.0

func (iaa *InterceptorAgentAdapter) ClearInterceptors()

ClearInterceptors removes all interceptors from this adapter.

func (*InterceptorAgentAdapter) Execute added in v0.47.0

func (iaa *InterceptorAgentAdapter) Execute(ctx context.Context, input map[string]interface{}) (map[string]interface{}, error)

Execute implements the basic Agent interface by calling the wrapped agent.

func (*InterceptorAgentAdapter) ExecuteWithInterceptors added in v0.47.0

func (iaa *InterceptorAgentAdapter) ExecuteWithInterceptors(ctx context.Context, input map[string]interface{}, interceptors []core.AgentInterceptor) (map[string]interface{}, error)

ExecuteWithInterceptors runs the agent's task with interceptor support.

func (*InterceptorAgentAdapter) GetAgentID added in v0.47.0

func (iaa *InterceptorAgentAdapter) GetAgentID() string

GetAgentID returns the unique identifier for this agent instance.

func (*InterceptorAgentAdapter) GetAgentType added in v0.47.0

func (iaa *InterceptorAgentAdapter) GetAgentType() string

GetAgentType returns the category/type of this agent.

func (*InterceptorAgentAdapter) GetCapabilities added in v0.47.0

func (iaa *InterceptorAgentAdapter) GetCapabilities() []core.Tool

GetCapabilities returns the tools/capabilities from the wrapped agent.

func (*InterceptorAgentAdapter) GetInterceptors added in v0.47.0

func (iaa *InterceptorAgentAdapter) GetInterceptors() []core.AgentInterceptor

GetInterceptors returns the current interceptors for this adapter.

func (*InterceptorAgentAdapter) GetMemory added in v0.47.0

func (iaa *InterceptorAgentAdapter) GetMemory() Memory

GetMemory returns the memory store from the wrapped agent.

func (*InterceptorAgentAdapter) SetInterceptors added in v0.47.0

func (iaa *InterceptorAgentAdapter) SetInterceptors(interceptors []core.AgentInterceptor)

SetInterceptors sets the default interceptors for this adapter.

type LLMRequest added in v0.76.0

type LLMRequest struct {
	Prompt       string
	Content      []core.ContentBlock
	Functions    []map[string]interface{}
	ChatMessages []core.ChatMessage
	Options      []core.GenerateOption
}

LLMRequest is built by PrepareRequest for the strategy's CallLLM.

type LLMResult added in v0.76.0

type LLMResult struct {
	TextResponse     *core.LLMResponse
	FunctionResponse map[string]interface{}
	ModuleResponse   map[string]any
}

LLMResult is returned by CallLLM and consumed by ParseResponse.

type LoopAction added in v0.76.0

type LoopAction struct {
	ToolCalls  []core.ToolCall
	Thought    string
	Result     map[string]any
	StopReason string
}

LoopAction represents parsed LLM output — what the loop should do next.

type LoopConfig added in v0.76.0

type LoopConfig struct {
	LLM                core.LLM
	Tools              core.ToolRegistry
	Strategy           LoopStrategy
	MaxIterations      int
	TransformContext   func(ctx context.Context, messages []Message) ([]Message, error)
	OnEvent            func(AgentEvent)
	GenerateOpts       []core.GenerateOption
	ModuleOpts         []core.Option
	ParallelTools      bool
	MaxToolConcurrency int
	ToolTimeout        time.Duration
}

LoopConfig holds all configuration for a RunLoop execution.

type LoopEnv added in v0.76.0

type LoopEnv struct {
	LLM          core.LLM
	Tools        core.ToolRegistry
	GenerateOpts []core.GenerateOption
	ModuleOpts   []core.Option
}

LoopEnv holds the environment available to strategies during LLM calls.

type LoopResult added in v0.76.0

type LoopResult struct {
	Messages []Message
	Output   map[string]any
	// StopReason is one of the StopReason* constants.
	StopReason string
	Iterations int
	Usage      *core.TokenInfo
}

LoopResult holds the result of a RunLoop execution.

type LoopStrategy added in v0.76.0

type LoopStrategy interface {
	PrepareRequest(ctx context.Context, messages []Message, tools []core.Tool) (*LLMRequest, error)
	CallLLM(ctx context.Context, env *LoopEnv, req *LLMRequest) (*LLMResult, error)
	ParseResponse(ctx context.Context, response *LLMResult) (*LoopAction, error)
	ShouldContinue(ctx context.Context, action *LoopAction, iteration int) bool
	ToolUsePolicy() string
}

LoopStrategy defines how to interact with the LLM within the loop. Strategy owns the LLM call (via CallLLM), not RunLoop.

type Memory

type Memory interface {
	// Store saves a value with a given key
	Store(key string, value interface{}) error

	// Retrieve gets a value by key
	Retrieve(key string) (interface{}, error)

	// Delete removes a value by key
	Delete(key string) error

	// List returns all stored keys
	List() ([]string, error)

	// Clear removes all stored values
	Clear() error
}

Memory provides storage capabilities for agents.

type Message added in v0.76.0

type Message struct {
	ID         string              `json:"id"`
	Role       MessageRole         `json:"role"`
	Content    []core.ContentBlock `json:"content"`
	ToolCalls  []core.ToolCall     `json:"tool_calls,omitempty"`
	ToolResult *MessageToolResult  `json:"tool_result,omitempty"`
	Metadata   map[string]any      `json:"metadata,omitempty"`
}

Message represents a single message in the agent's conversation. This is the agent-level message type; use ToChatMessage() to convert to core.ChatMessage at the LLM boundary.

func NewTextMessage added in v0.76.0

func NewTextMessage(role MessageRole, text string) Message

NewTextMessage creates a message with a single text content block.

func NewToolResultMessage added in v0.76.0

func NewToolResultMessage(callID, toolName string, result core.ToolResult) Message

NewToolResultMessage creates a tool result message from a core.ToolResult.

func (Message) ShouldSendToLLM added in v0.76.0

func (m Message) ShouldSendToLLM() bool

ShouldSendToLLM reports whether this message should be included in provider-facing chat history.

func (Message) TextContent added in v0.76.0

func (m Message) TextContent() string

TextContent returns the concatenated text content of all text blocks in the message.

func (Message) ToChatMessage added in v0.76.0

func (m Message) ToChatMessage() core.ChatMessage

ToChatMessage converts an agent-level Message to a core.ChatMessage for the LLM boundary. Strips metadata and normalizes internal-only messages.

type MessageRole added in v0.76.0

type MessageRole string

MessageRole defines the role of a message in the conversation.

const (
	RoleUser      MessageRole = "user"
	RoleAssistant MessageRole = "assistant"
	RoleSystem    MessageRole = "system"
	RoleTool      MessageRole = "tool"
	RoleInternal  MessageRole = "internal" // never sent to LLM
)

type MessageToolResult added in v0.76.0

type MessageToolResult struct {
	ToolCallID string              `json:"tool_call_id"`
	Name       string              `json:"name"`
	Content    []core.ContentBlock `json:"content"`
	IsError    bool                `json:"is_error,omitempty"`
	Raw        map[string]any      `json:"raw,omitempty"`
}

MessageToolResult carries the result of a tool execution at the agent message level. Richer than core.ChatToolResult — includes raw result data for trajectory capture.

type NeedsLLM added in v0.76.0

type NeedsLLM interface {
	SetLLM(llm core.LLM)
}

NeedsLLM is an optional interface for strategies that need LLM propagation. RunLoop calls SetLLM before the first iteration if the strategy implements this.

type OrchestrationConfig added in v0.11.0

type OrchestrationConfig struct {
	// MaxConcurrent controls maximum parallel task execution
	MaxConcurrent int

	// DefaultTimeout for task execution
	DefaultTimeout time.Duration

	// RetryConfig specifies retry behavior for failed tasks
	RetryConfig *RetryConfig

	// CustomProcessors maps processor types to implementations
	CustomProcessors map[string]TaskProcessor
	TaskParser       TaskParser
	PlanCreator      PlanCreator

	AnalyzerConfig AnalyzerConfig
	Options        core.Option
}

OrchestrationConfig allows customizing orchestrator behavior.

type OrchestratorResult added in v0.11.0

type OrchestratorResult struct {
	// CompletedTasks holds results from successful tasks
	CompletedTasks map[string]interface{}

	// FailedTasks contains tasks that could not be completed
	FailedTasks map[string]error

	// Analysis contains orchestrator's task breakdown reasoning
	Analysis string

	// Metadata holds additional orchestration information
	Metadata map[string]interface{}
	// contains filtered or unexported fields
}

OrchestratorResult contains orchestration outputs.

type PlanCreator added in v0.11.0

type PlanCreator interface {
	// CreatePlan organizes tasks into execution phases
	CreatePlan(tasks []Task) ([][]Task, error)
}

PlanCreator defines how to create an execution plan from tasks.

type RetryConfig added in v0.11.0

type RetryConfig struct {
	MaxAttempts       int
	BackoffMultiplier float64
}

RetryConfig specifies retry behavior.

type SignatureStrategy added in v0.76.0

type SignatureStrategy interface {
	LoopStrategy
	Signature() core.Signature
	SetSignature(sig core.Signature)
	Demos() []core.Example
	SetDemos(demos []core.Example)
}

SignatureStrategy is an optional interface for strategies that carry a signature. Optimizers use this to access and modify the signature without knowing the concrete strategy type.

type Task added in v0.11.0

type Task struct {
	// ID uniquely identifies the task
	ID string

	// Type indicates the kind of task
	Type string

	// Metadata holds task-specific information
	Metadata map[string]interface{}

	// Dependencies lists task IDs that must complete before this task
	Dependencies []string

	// Priority indicates task importance (lower number = higher priority)
	Priority int

	// ProcessorType indicates which processor should handle this task
	ProcessorType string
}

Task represents a unit of work identified by the orchestrator.

type TaskParser added in v0.11.0

type TaskParser interface {
	// Parse converts analyzer output into a slice of tasks
	Parse(analyzerOutput map[string]interface{}) ([]Task, error)
}

TaskParser defines how to parse tasks from analyzer output.

type TaskProcessor added in v0.11.0

type TaskProcessor interface {
	// Process handles a single task execution
	Process(ctx context.Context, task Task, taskContext map[string]interface{}) (interface{}, error)
}

TaskProcessor defines how to process individual tasks.

type XMLError added in v0.16.1

type XMLError struct {
	Code    ErrorCode
	Message string
	Details map[string]interface{}
}

XMLError represents structured errors during XML processing.

func (*XMLError) Error added in v0.16.1

func (e *XMLError) Error() string

type XMLMetadata added in v0.14.0

type XMLMetadata struct {
	Items []XMLMetadataItem `xml:"item"`
}

type XMLMetadataItem added in v0.14.0

type XMLMetadataItem struct {
	Key   string `xml:"key,attr"`
	Value string `xml:",chardata"`
}

type XMLNormalizer added in v0.16.1

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

XMLNormalizer handles cleaning and standardization of XML content.

func NewXMLNormalizer added in v0.16.1

func NewXMLNormalizer() *XMLNormalizer

NewXMLNormalizer creates a new normalizer with compiled regex patterns.

func (*XMLNormalizer) NormalizeXML added in v0.16.1

func (n *XMLNormalizer) NormalizeXML(content string) (string, error)

NormalizeXML cleans and standardizes XML content for parsing.

type XMLTask added in v0.14.0

type XMLTask struct {
	XMLName       xml.Name    `xml:"task"`
	ID            string      `xml:"id,attr"`
	Type          string      `xml:"type,attr"`      // Make sure this maps to the type attribute
	ProcessorType string      `xml:"processor,attr"` // Make sure this maps to the processor attribute
	Priority      int         `xml:"priority,attr"`
	Description   string      `xml:"description"`
	Dependencies  []string    `xml:"dependencies>dep"` // This maps to the <dependencies><dep>...</dep></dependencies> structure
	Metadata      XMLMetadata `xml:"metadata"`
}

type XMLTaskParser added in v0.14.0

type XMLTaskParser struct {
	// Configuration for XML parsing
	RequiredFields []string
}

func (*XMLTaskParser) Parse added in v0.14.0

func (p *XMLTaskParser) Parse(analyzerOutput map[string]interface{}) ([]Task, error)

Directories

Path Synopsis
Package ace implements Agentic Context Engineering (ACE) for self-improving agents.
Package ace implements Agentic Context Engineering (ACE) for self-improving agents.
Package a2a implements Google's Agent-to-Agent (a2a) protocol for dspy-go.
Package a2a implements Google's Agent-to-Agent (a2a) protocol for dspy-go.

Jump to

Keyboard shortcuts

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