Agents

Stateful agents with tool integration, state persistence, and multi-agent orchestration

Agents are stateful entities that use LLMs to reason, take actions via tools, and maintain context across interactions. The SDK provides a base Agent, specialized patterns (ReAct, Plan-Execute), and an orchestrator for multi-agent systems.

Base Agent

import sdk "github.com/xraph/ai-sdk"

agent, err := sdk.NewAgentBuilder().
    WithName("assistant").
    WithLLMManager(llmManager).
    WithSystemPrompt("You are a helpful assistant.").
    WithTools(calculatorTool, searchTool).
    WithStateStore(stateStore).
    Build()
if err != nil {
    return err
}

response, err := agent.Execute(ctx, "What is 42 * 17?")

Agent Builder

MethodDescription
WithName(string)Agent name
WithID(string)Unique agent ID
WithDescription(string)Agent description
WithLLMManager(LLMManager)LLM provider manager
WithProvider(string)Specific LLM provider
WithModel(string)Specific LLM model
WithSystemPrompt(string)System prompt
WithTools(...Tool)Available tools
WithStateStore(StateStore)State persistence backend
WithMemoryManager(*MemoryManager)Memory system
WithGuardrails(*GuardrailManager)Safety guardrails
WithMaxIterations(int)Maximum reasoning iterations
WithTemperature(float64)LLM temperature

Agent State

Agents persist their state between sessions:

// State is saved automatically after each execution
// Load a previous session:
state, err := stateStore.Load(ctx, "agent-id", "session-id")

// List all sessions for an agent:
sessions, err := stateStore.List(ctx, "agent-id")

The AgentState includes conversation history, tool results, metadata, and any custom data.

Step-Based Execution

Execute an agent step by step for fine-grained control:

execution, err := agent.ExecuteWithSteps(ctx, "Plan a trip to Tokyo")
if err != nil {
    return err
}

for _, step := range execution.Steps {
    fmt.Printf("Step %d: %s\n", step.Index, step.Type)
    if step.ToolCall != nil {
        fmt.Printf("  Tool: %s\n", step.ToolCall.Name)
    }
    if step.Output != "" {
        fmt.Printf("  Output: %s\n", step.Output)
    }
}

fmt.Println("Final answer:", execution.FinalAnswer)

Agent as Tool

Wrap an agent as a tool so other agents can delegate work:

researchAgent, _ := sdk.NewAgentBuilder().
    WithName("researcher").
    WithLLMManager(llmManager).
    WithSystemPrompt("You research topics thoroughly.").
    Build()

// Use as a tool in another agent
writerAgent, _ := sdk.NewAgentBuilder().
    WithName("writer").
    WithLLMManager(llmManager).
    WithSystemPrompt("You write articles based on research.").
    WithTools(researchAgent.AsTool("research", "Research a topic thoroughly")).
    Build()

Multi-Agent Orchestration

The AgentOrchestrator coordinates multiple agents:

orchestrator := sdk.NewAgentOrchestrator(logger, metrics)

orchestrator.RegisterAgent(researchAgent)
orchestrator.RegisterAgent(writerAgent)
orchestrator.RegisterAgent(editorAgent)

result, err := orchestrator.Execute(ctx, sdk.OrchestratorRequest{
    Input:     "Write an article about Go concurrency",
    Pipeline:  []string{"researcher", "writer", "editor"},
})

Agent Handoff

Transfer control between agents during execution:

agent, _ := sdk.NewAgentBuilder().
    WithName("triage").
    WithLLMManager(llmManager).
    WithSystemPrompt("Route requests to the right specialist.").
    WithHandoffs(
        sdk.Handoff{
            Agent:       billingAgent,
            Description: "Handle billing questions",
            Condition:   "User asks about billing, payments, or invoices",
        },
        sdk.Handoff{
            Agent:       technicalAgent,
            Description: "Handle technical support",
            Condition:   "User asks about technical issues or bugs",
        },
    ).
    Build()

AgentExecution Result

FieldTypeDescription
FinalAnswerstringThe agent's final response
Steps[]StepAll reasoning/action steps taken
TokensUsedintTotal tokens consumed
Durationtime.DurationTotal execution time
ToolCalls[]ToolCallAll tool invocations

How is this guide?

On this page