config

package
v0.1.11 Latest Latest
Warning

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

Go to latest
Published: May 24, 2026 License: Apache-2.0 Imports: 20 Imported by: 0

README

Examples

These programs exercise agent-sdk-go (github.com/agenticenv/agent-sdk-go). Agents run as Temporal workflows, so a running Temporal service is mandatory for every example below.

Prerequisite: These examples use agent-sdk-go on the Temporal runtime. A running Temporal server is required before you run them. See Temporal setup for Docker, Temporal CLI, ports, Cloud, and self-hosted options.

Default connection

The examples use TEMPORAL_HOST, TEMPORAL_PORT, and TEMPORAL_NAMESPACE from .env (default: localhost, 7233, default). Adjust if your Temporal runs elsewhere.

Examples overview

Example What it demonstrates
simple_agent Minimal agent, no tools — Temporal config, system prompt, LLM client, single Run(); prints AgentResponse.Usage (token counts) when the provider reports them
agent_with_temporal_client Caller-owned Temporal client — WithTemporalClient + WithTaskQueue; create and close client yourself (TLS, API key, Cloud)
agent_with_conversation In-memory conversation with WithConversation — multi-turn context, same conversationID for Run
agent_with_tools Built-in tools (echo, calculator, weather, wikipedia, search) with auto-approval
agent_with_stream Streaming with StreamTEXT_MESSAGE_*, TOOL_CALL_*, RUN_FINISHED; prints token usage from RUN_FINISHED result when present
agent_copilotkit Go POST /agui SSE + Next.js + CopilotKit (agent_copilotkit/README.md) — two processes: agent server, then ui/ dev server
agent_with_stream_conversation Stream + conversation; avoid printing the same text twice (TEXT_MESSAGE_CONTENT deltas vs RUN_FINISHED body)
agent_with_tools_approval Tools + WithApprovalHandler — user approves or rejects each tool run (Run only)
agent_with_run_async RunAsyncresultCh + approvalCh; use req.Respond (no WithApprovalHandler)
agent_with_custom_tools Custom tools via WithTools — implementing interfaces.Tool
agent_with_tool_authorizer Custom tool authorization via interfaces.ToolAuthorizer — denied calls surface as tool_result with denied status
multiple_agents Multiple agents with WithInstanceId — sequential or concurrent
agent_with_subagents Main agent + math specialist — WithSubAgents, separate task queues; prints STEP_STARTED / STEP_FINISHED (sub-agent name) around each child run when using Stream
agent_with_json_response Structured LLM output — WithResponseFormat + interfaces.JSONSchema (JSON with schema; no tools)
agent_with_reasoning Generic interfaces.LLMReasoning via WithLLMSamplingStream to observe thinking_delta (e.g. Anthropic)
agent_with_worker Agent and worker in separate processes — DisableLocalWorker + NewAgentWorker; agent uses Stream
durable_agent Same split-process layout — agent uses Stream (WithStream); durability scenarios: durable_agent/README.md
agent_with_mcp_config MCP via WithMCPConfig — transport from env; see env.sampleREADME (testing & sample servers)
agent_with_mcp_client Same as above via mcpclient.NewClient + WithMCPClientsREADME
agent_with_a2a_config Outbound A2A via WithA2AConfigA2A_URL etc.; README
agent_with_a2a_client Same env, explicit pkg/a2a/clientREADME
agent_with_a2a_server Inbound A2A server — A2A_SERVER_*; README (curl, a2a CLI, client example)
agent_with_observability OpenTelemetry OTLP exports — two runnable programs: config/ (WithObservabilityConfig) vs objects/ (pre-built pkg/observability tracer/metrics + WithTracer / WithMetrics); shared setup/ helper package — README (collector endpoint, ports 4317/4318)
agent_with_retriever Vector retrievers — weaviate/ or pgvector/ backends; shared common/; modes agentic, prefetch, hybrid via RETRIEVER_MODEREADME (Weaviate / Postgres setup in subfolder READMEs)

Setup

cp env.sample .env
# Edit .env: set LLM_APIKEY, LLM_MODEL (see LLM_PROVIDER: openai, anthropic, or gemini)

Run examples

Minimal agent (no tools)
go run ./simple_agent "Hello, what can you do?"
Agent with caller-owned Temporal client

Uses WithTemporalClient and WithTaskQueue. The example creates the Temporal client, passes it to the agent, and closes it when done. Use this pattern for TLS, Temporal Cloud API keys, or other connection options.

go run ./agent_with_temporal_client "Hello, what can you do?"
Agent with conversation (multi-turn)

Uses in-memory conversation. Run interactive mode (no args) for multi-turn in one process—history is shared across turns. With args, runs a single turn (useful for testing).

# Interactive: type prompts, get responses; history shared. Type 'exit' to end.
go run ./agent_with_conversation

# Single turn (new process each run; no shared history)
go run ./agent_with_conversation "Hello, remember I'm Alice"
Agent with tools
go run ./agent_with_tools "What's the weather in Tokyo?"
Streaming (partial content as tokens arrive)
go run ./agent_with_stream "What's the current time and what's 17 * 23?"
Structured JSON response (WithResponseFormat)

Uses agent.WithResponseFormat with interfaces.ResponseFormatJSON, Name, and interfaces.JSONSchema. No tools—keeps the run in structured-output mode. Prints validated, indented JSON.

go run ./agent_with_json_response
go run ./agent_with_json_response "What is the capital of Japan?"
Reasoning / thinking (WithLLMSampling + LLMReasoning)

Sets WithLLMSampling with Reasoning: &interfaces.LLMReasoning{Enabled, Effort, BudgetTokens} and uses Stream so you can see thinking_delta events when the provider emits them (e.g. Anthropic extended thinking). Pick a model that supports reasoning/thinking for your LLM_PROVIDER.

go run ./agent_with_reasoning
go run ./agent_with_reasoning "Why is the sky blue? One short paragraph."
Streaming + conversation (event handling pattern)

Interactive multi-turn with Stream. Uses AgentEventTypeTextMessageContent (deltas) and AgentEventTypeRunFinished (final body) so the same answer is not printed twice.

go run ./agent_with_stream_conversation
go run ./agent_with_stream_conversation "What is 5 * 8?"
Sub-agents (main agent + specialist)

Two agents in one process: main agent with a math specialist registered via WithSubAgents. Requires workers on both task queues (each NewAgent starts its own embedded worker). Main agent uses default tool approval (RequireAll): delegating to the specialist prompts on stdin (y / n). Specialist uses AutoToolApprovalPolicy so calculator does not prompt. Same stdin pattern as agent_with_tools_approval.

go run ./agent_with_subagents "What is 987 times 654?"
Tools + approval, custom tools, multiple agents, worker split
go run ./agent_with_tools_approval "What is 15 + 27?"
go run ./agent_with_run_async "What is 15 + 27?"
go run ./agent_with_custom_tools "Reverse 'hello world'"
go run ./agent_with_tool_authorizer "Get the protected note for roadmap."
go run ./multiple_agents "What is 7 times 8?"
go run ./multiple_agents concurrent "What is 7 times 8?"

# Agent and worker in separate processes: two terminals — worker in terminal 1,
# agent in terminal 2 (after the worker is up).
go run ./agent_with_worker/worker    # terminal 1: worker
go run ./agent_with_worker/agent "Hello from remote agent!"   # terminal 2: agent

# durable_agent: same two-terminal flow; streaming REPL. Scenarios:
# durable_agent/README.md
go run ./durable_agent/worker       # terminal 1
go run ./durable_agent/agent "Hello from remote agent!"   # terminal 2
MCP (agent_with_mcp_config, agent_with_mcp_client)

Same MCP_* env (see env.sample); differs only in WithMCPConfig vs mcpclient.NewClient + WithMCPClients.

go run ./agent_with_mcp_config
go run ./agent_with_mcp_config "List tools you can call."
go run ./agent_with_mcp_client
go run ./agent_with_mcp_client "List tools you can call."

Configure transports, test against real MCP servers (streamable HTTP walkthrough, stdio, links): agent_with_mcp_config/README.md.

A2A client (agent_with_a2a_config, agent_with_a2a_client)

Outbound A2A tools — set A2A_URL (and optional A2A_* in env.sample).

go run ./agent_with_a2a_config
go run ./agent_with_a2a_config "What tools do you have available?"
go run ./agent_with_a2a_client
go run ./agent_with_a2a_client "What tools do you have available?"

Run a sample remote agent (e.g. a2a-samples helloworld), curl checks: agent_with_a2a_config/README.md.

A2A server (agent_with_a2a_server)

Inbound JSON-RPC server — A2A_SERVER_*, optional bearer tokens.

go run ./agent_with_a2a_server

curl, a2a CLI, testing with agent_with_a2a_config: agent_with_a2a_server/README.md.

Observability OTLP (agent_with_observability)

Requires a reachable OTLP collector (OTEL_EXPORTER_OTLP_ENDPOINT, typically localhost:4317 for gRPC or localhost:4318 for HTTP — see env.sample). Same Temporal + LLM setup as other examples.

go run ./agent_with_observability/config/
go run ./agent_with_observability/objects/

go run ./agent_with_observability/config/ "Say hello in one sentence"
go run ./agent_with_observability/objects/ "Say hello in one sentence"

Details, env semantics, and collector notes: agent_with_observability/README.md.

Vector retriever (agent_with_retriever)

Requires a running vector store (Weaviate or Postgres with pgvector) plus Temporal and LLM env. Set backend-specific vars in env.sample (WEAVIATE_* or PGVECTOR_DSN).

# Weaviate (run ./agent_with_retriever/weaviate/setup.sh; ./cleanup.sh when done)
go run ./agent_with_retriever/weaviate "What is the return policy?"

# pgvector (run ./agent_with_retriever/pgvector/setup.sh; ./cleanup.sh when done)
go run ./agent_with_retriever/pgvector "What is the return policy?"

RETRIEVER_MODE=prefetch go run ./agent_with_retriever/weaviate "What are the return and shipping rules?"

Setup guides: agent_with_retriever/README.md, weaviate/README.md, pgvector/README.md.

Logging

Examples send conversation (user prompt, assistant response) to stdout and internal logs to stderr. By default only errors are logged.

  • See logs while evaluating: Set LOG_LEVEL=info or LOG_LEVEL=debug in .env, or run:
    LOG_LEVEL=debug go run ./simple_agent "Hello, what can you do?"
    
  • Save logs to a file: Redirect stderr to a file:
    LOG_LEVEL=info go run ./simple_agent "Hello" 2>debug.log
    
  • Suppress logs: Show only conversation output:
    go run ./simple_agent "Hello" 2>/dev/null
    

Env vars

Env var Description
TEMPORAL_HOST, TEMPORAL_PORT, TEMPORAL_NAMESPACE, TEMPORAL_TASKQUEUE Temporal connection
LLM_PROVIDER openai, anthropic, or gemini (see env.sample)
LLM_APIKEY API key
LLM_MODEL e.g. gpt-4o, claude-3-5-sonnet-20241022
LLM_BASEURL Optional (custom/proxy endpoints)
LOG_LEVEL error (default), warn, info, debug — logs go to stderr
SERPER_API_KEY For search tool
MCP_TRANSPORT Required for MCP examples: stdio or streamable_http (aliases: local, http, remote, …)
MCP_SERVER_NAME Optional server id for wiring (defaults: local for stdio, remote for HTTP)
MCP_STREAMABLE_HTTP_URL Remote MCP base URL (required for streamable_http)
MCP_STDIO_COMMAND Executable for local subprocess MCP (required for stdio)
MCP_STDIO_ARGS Optional JSON array of argv strings, e.g. ["-y","@scope/pkg","/dir"]
MCP_STDIO_ENV Optional JSON object of extra subprocess env vars
MCP_BEARER_TOKEN Optional static bearer for MCP HTTP; ignored when OAuth env trio is all set
MCP_TIMEOUT_SECONDS Optional; positive seconds cap MCP connect+RPC timeout
MCP_RETRY_ATTEMPTS Optional; max attempts per MCP operation when > 0
MCP_ALLOW_TOOLS, MCP_BLOCK_TOOLS Optional comma-separated allow/block tool lists (mutually exclusive)
MCP_CLIENT_ID, MCP_CLIENT_SECRET, MCP_TOKEN_URL Optional together: OAuth2 client credentials for MCP HTTP transport
MCP_SKIP_TLS_VERIFY Optional; set to true to skip TLS verify for MCP/token HTTP (dev only)
A2A_URL Required for A2A examples: remote agent base URL
A2A_SERVER_NAME Optional connection id (default: remote) — used in tool names
A2A_TIMEOUT_SECONDS Optional; positive seconds cap per A2A HTTP operation
A2A_TOKEN Optional static bearer for the A2A HTTP client
A2A_HEADERS Optional JSON object of extra HTTP headers
A2A_SKIP_TLS_VERIFY Optional; true skips TLS verification for A2A HTTP (dev only)
A2A_ALLOW_SKILLS, A2A_BLOCK_SKILLS Optional comma-separated allow/block skill ID lists (mutually exclusive)
A2A_SERVER_HOST Optional bind hostname for agent_with_a2a_server (empty → default localhost)
A2A_SERVER_PORT Optional TCP port for agent_with_a2a_server (0 → default 9999)
A2A_SERVER_BEARER_TOKENS Optional comma-separated bearer secrets for inbound JSON-RPC on agent_with_a2a_server
OTEL_EXPORTER_OTLP_ENDPOINT Required for agent_with_observability examples: OTLP collector host:port only (no http:// scheme), e.g. localhost:4317 (gRPC) or localhost:4318 (HTTP)
OTLP_PROTOCOL Optional for agent_with_observability: grpc (default) or http — must match how the collector listens
OTLP_INSECURE Optional: set to true for plaintext export (typical for local collectors without TLS)
RETRIEVER_MODE For agent_with_retriever: agentic (default), prefetch, or hybrid
WEAVIATE_HOST, WEAVIATE_SCHEME, WEAVIATE_CLASS, … Weaviate backend — see env.sample and agent_with_retriever/weaviate/README.md
PGVECTOR_DSN, PGVECTOR_TABLE, EMBEDDING_MODEL, … pgvector backend — PGVECTOR_DSN required; see agent_with_retriever/pgvector/README.md

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func A2ABuildAgentConfig added in v0.1.9

func A2ABuildAgentConfig(cfg *Config) (agent.A2AConfig, error)

A2ABuildAgentConfig builds agent.A2AConfig from env. Requires non-empty A2A_URL.

func A2ADefaultServerName added in v0.1.9

func A2ADefaultServerName(cfg *Config) string

A2ADefaultServerName returns A2A_SERVER_NAME or "remote".

func A2AInboundServerOption added in v0.1.9

func A2AInboundServerOption(cfg *Config) agent.Option

A2AInboundServerOption returns agent.WithA2ADefaultServer when no custom listen address or tokens are set; otherwise agent.WithA2AServer with hostname/port defaults applied by the agent.

func A2AServerDisplayURL added in v0.1.9

func A2AServerDisplayURL(cfg *Config) string

A2AServerDisplayURL returns the agent base URL (scheme + host + port) for logs and docs, using the same defaults as the SDK when env leaves host/port unset.

func ApplyMCPStreamableHTTPAuth added in v0.1.2

func ApplyMCPStreamableHTTPAuth(transport *mcp.MCPStreamableHTTP, m *MCPSettings)

ApplyMCPStreamableHTTPAuth sets optional auth on transport from m and process env. Unauthenticated MCP (URL only) is valid. When the OAuth trio is set, OAuth is used; otherwise m.BearerToken sets a bearer token when non-empty. MCP_SKIP_TLS_VERIFY=true sets SkipTLSVerify.

func FormatNewAgentError added in v0.1.3

func FormatNewAgentError(prefix string, err error) string

FormatNewAgentError formats errors from agent.NewAgent or agent.NewAgentWorker for log output when running examples from a clone of this repository. It appends a pointer to temporal-setup.md when the failure is a Temporal connection or namespace timeout from this SDK.

func MCPDefaultServerName added in v0.1.2

func MCPDefaultServerName(cfg *Config) string

MCPDefaultServerName returns MCP_SERVER_NAME or a default from transport (local / remote).

func MCPLoadTransport added in v0.1.2

func MCPLoadTransport(cfg *Config) (mcp.MCPTransportConfig, error)

MCPLoadTransport builds mcp.MCPStdio or mcp.MCPStreamableHTTP from cfg and process env. streamable_http requires MCP_STREAMABLE_HTTP_URL. stdio requires MCP_STDIO_COMMAND; optional MCP_STDIO_ARGS (JSON array) and MCP_STDIO_ENV (JSON object).

func MCPToolFilterFromConfig added in v0.1.2

func MCPToolFilterFromConfig(cfg *Config) (mcp.MCPToolFilter, error)

MCPToolFilterFromConfig returns allow/block lists from comma-separated MCP_ALLOW_TOOLS / MCP_BLOCK_TOOLS.

func MCPUsesOAuthFromEnv added in v0.1.2

func MCPUsesOAuthFromEnv() bool

MCPUsesOAuthFromEnv reports whether OAuth2 client-credentials env vars are all non-empty.

func NewLLMClientFromConfig

func NewLLMClientFromConfig(cfg *Config) (interfaces.LLMClient, error)

NewLLMClientFromConfig creates an LLM client from config using the new llm.Option-based API. BaseURL is applied only for OpenAI; set LLM_BASEURL when using a non-default OpenAI-compatible API.

func NewLoggerFromLogConfig

func NewLoggerFromLogConfig(cfg *Config) logger.Logger

NewLoggerFromLogConfig returns logger.Logger for use with the agent. Logs to stderr so conversation (stdout) stays separate; set LOG_LEVEL=info or debug to see logs.

Types

type A2AServerEnv added in v0.1.9

type A2AServerEnv struct {
	// Hostname is the bind address (empty with Port 0 and no tokens → use SDK defaults via [agent.WithA2ADefaultServer]).
	Hostname string
	// Port is the TCP listen port (0 means default 9999 when combined with [agent.WithA2AServer]).
	Port int
	// BearerTokens are accepted static Bearer tokens for JSON-RPC (comma-separated in env).
	BearerTokens []string
}

A2AServerEnv configures the built-in A2A HTTP server (listen address and optional bearer tokens). Used by A2AInboundServerOption and A2AServerDisplayURL.

type A2ASettings added in v0.1.9

type A2ASettings struct {
	// URL is the A2A agent base URL for card resolution (required for the A2A examples).
	URL string
	// Name is the stable connection id used as the server key in tool names (default: remote).
	Name string
	// TimeoutSeconds caps each A2A HTTP operation when > 0; zero uses the SDK default.
	TimeoutSeconds int
	// Token is an optional bearer token (Authorization: Bearer ...).
	Token string
	// HeadersRaw is optional JSON object of extra HTTP headers, e.g. {"X-Api-Key":"..."}.
	HeadersRaw string
	// SkipTLSVerify disables TLS verification for the A2A client (development only).
	SkipTLSVerify bool
	// AllowSkills is comma-separated skill IDs to expose (mutually exclusive with BlockSkills).
	AllowSkills string
	// BlockSkills is comma-separated skill IDs to hide (mutually exclusive with AllowSkills).
	BlockSkills string
}

A2ASettings holds env-driven settings for wiring agent.WithA2AConfig or pkg/a2a/client.NewClient.

type Config

type Config struct {
	Host      string
	Port      int
	Namespace string
	TaskQueue string
	LogLevel  string
	Provider  interfaces.LLMProvider
	APIKey    string
	Model     string
	// BaseURL is optional and only used for the OpenAI client (custom or Azure-compatible endpoints).
	// Ignored for Anthropic and Gemini.
	BaseURL string

	MCP MCPSettings

	// A2A holds A2A_* environment values for agent_with_a2a_* examples.
	A2A A2ASettings

	// A2AServer holds A2A_SERVER_* values for agent_with_a2a_server (inbound HTTP server).
	A2AServer A2AServerEnv
}

func LoadFromEnv

func LoadFromEnv() *Config

LoadFromEnv loads config from environment variables. .env is loaded on package init if present.

func (*Config) A2ATimeout added in v0.1.9

func (cfg *Config) A2ATimeout() time.Duration

A2ATimeout returns cfg.A2A.TimeoutSeconds as a duration, or zero if unset.

func (*Config) MCPTimeout added in v0.1.2

func (cfg *Config) MCPTimeout() time.Duration

MCPTimeout returns cfg.MCP.TimeoutSeconds as a duration, or zero if unset (applies to any MCP transport).

type MCPSettings added in v0.1.2

type MCPSettings struct {
	// Transport is required for MCPLoadTransport: stdio or streamable_http (aliases: local; http, remote, streamable).
	Transport string
	// StreamableHTTPURL is the remote MCP endpoint when transport is streamable_http.
	StreamableHTTPURL string
	// StdioCommand is the executable for MCP stdio transport (required when transport is stdio).
	StdioCommand string
	// StdioArgsRaw is JSON array of strings for subprocess argv, e.g. ["-y","@scope/mcp-server","/data"].
	StdioArgsRaw string
	// StdioEnvRaw is JSON object of extra env vars for the subprocess, e.g. {"API_KEY":"..."}.
	StdioEnvRaw string
	// BearerToken is an optional static bearer for MCP HTTP. Ignored when OAuth env trio is all set.
	BearerToken string
	// Name is the stable server id for this MCP connection (empty defaults to local for stdio, remote for HTTP).
	Name string
	// RetryAttempts is max connect+RPC attempts per operation when > 0; zero uses SDK default.
	RetryAttempts int
	// AllowTools is comma-separated tool names to allow-list (optional); mutually exclusive with BlockTools in validation.
	AllowTools string
	// BlockTools is comma-separated tool names to block-list (optional).
	BlockTools string
	// TimeoutSeconds caps each MCP connect+RPC attempt when > 0 (seconds). Zero uses SDK defaults.
	TimeoutSeconds int
}

MCPSettings holds MCP_* environment values for agent_with_mcp_* examples. This is not github.com/agenticenv/agent-sdk-go/pkg/agent.MCPConfig (per-server agent transport + filter).

Directories

Path Synopsis
agent_copilotkit
server command
agent_with_observability
config command
OTLP via agent.WithObservabilityConfig — the SDK constructs tracer, metrics, and logs (OTLP log export for the default SDK logger via the slog bridge; internal default batching/export timing).
OTLP via agent.WithObservabilityConfig — the SDK constructs tracer, metrics, and logs (OTLP log export for the default SDK logger via the slog bridge; internal default batching/export timing).
objects command
OTLP via pre-built observability.NewTracer, observability.NewMetrics, observability.NewLogs, then agent.WithTracer, agent.WithMetrics, agent.WithLogs.
OTLP via pre-built observability.NewTracer, observability.NewMetrics, observability.NewLogs, then agent.WithTracer, agent.WithMetrics, agent.WithLogs.
setup
Package setup shares OTLP env parsing and base agent options for the config/ and objects/ examples.
Package setup shares OTLP env parsing and base agent options for the config/ and objects/ examples.
agent_with_retriever
common
Package common holds shared configuration and agent options for the agent_with_retriever examples.
Package common holds shared configuration and agent options for the agent_with_retriever examples.
pgvector command
Example agent using a PostgreSQL pgvector retriever.
Example agent using a PostgreSQL pgvector retriever.
weaviate command
Example agent using a Weaviate vector retriever.
Example agent using a Weaviate vector retriever.
agent_with_run_async demonstrates RunAsync: result and approval channels without WithApprovalHandler or Stream.
agent_with_run_async demonstrates RunAsync: result and approval channels without WithApprovalHandler or Stream.
agent_with_temporal_client demonstrates using WithTemporalClient to pass a pre-configured Temporal client to the agent.
agent_with_temporal_client demonstrates using WithTemporalClient to pass a pre-configured Temporal client to the agent.
agent_with_worker
agent command
Interactive streaming REPL for the agent_with_worker example.
Interactive streaming REPL for the agent_with_worker example.
worker command
durable_agent
agent command
Interactive streaming REPL for the durable_agent example.
Interactive streaming REPL for the durable_agent example.
worker command

Jump to

Keyboard shortcuts

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