Eino ADK: Overview
What is Eino ADK?
Eino ADK, inspired by Google ADK, is a flexible Go framework for building Agents and Multi‑Agent applications. It standardizes context passing, event streaming and conversion, task transfer, interrupts & resume, and cross‑cutting aspects. It is model‑agnostic and deployment‑agnostic, aiming to make Agent and Multi‑Agent development simpler and more robust while offering production‑grade governance capabilities.
Eino ADK helps developers build and manage agent applications, providing a resilient development environment to support conversational and non‑conversational agents, complex tasks, and workflows.
Architecture
Agent Interface
The core of ADK is the Agent abstraction. See the full details in Eino ADK: Agent Interface.
type Agent interface {
Name(ctx context.Context) string
Description(ctx context.Context) string
// Run runs the agent.
// The returned AgentEvent within the AsyncIterator must be safe to modify.
// If the returned AgentEvent within the AsyncIterator contains MessageStream,
// the MessageStream MUST be exclusive and safe to be received directly.
// NOTE: it's recommended to use SetAutomaticClose() on the MessageStream of AgentEvents emitted by AsyncIterator,
// so that even the events are not processed, the MessageStream can still be closed.
Run(ctx context.Context, input *AgentInput, options ...AgentRunOption) *AsyncIterator[*AgentEvent]
}
Agent.Run:
- Reads task details and related data from
AgentInput,AgentRunOption, and optional session context - Executes the task and writes progress/results into an
AgentEventiterator - Requires a future‑style asynchronous execution. In practice (see ChatModelAgent
Run):- Create a pair of Iterator/Generator
- Start the agent’s async task with the Generator, process
AgentInput(e.g., call LLM) and emit events into the Generator - Return the Iterator immediately to the caller
Collaboration
ADK provides rich composition primitives to build Multi‑Agent systems: Supervisor, Plan‑Execute, Group‑Chat, etc. See Eino ADK: Agent Collaboration.
Primitives:
| Collaboration | Description |
| Transfer | Directly transfer the task to another Agent; current Agent exits and does not track the transferred task |
| ToolCall (AgentAsTool) | Treat an Agent as a tool call, wait for its response, consume its output, and continue processing |
Context strategies:
| Context Strategy | Description |
| Upstream full dialogue | Provide the child Agent with the complete upstream conversation |
| New task description | Ignore upstream conversation and provide a fresh summarized task as the child Agent’s input |
Decision autonomy:
| Autonomy | Description |
| Autonomous | Inside the Agent, choose downstream Agents as needed (often via LLM). Even if decisions are based on preset logic, from the outside this is treated as autonomous. |
| Preset | Pre‑define the next Agent. Execution order is fixed and predictable. |
Compositions:
ChatModelAgent
ChatModelAgent is the key implementation of the agent abstraction. It wraps LLM interaction and implements a ReAct‑style control flow via Eino Graph, exporting events as AgentEvents. See Eino ADK: ChatModelAgent.
type ChatModelAgentConfig struct {
// Name of the agent. Better be unique across all agents.
Name string
// Description of the agent's capabilities.
// Helps other agents determine whether to transfer tasks to this agent.
Description string
// Instruction used as the system prompt for this agent.
// Optional. If empty, no system prompt will be used.
// Supports f-string placeholders for session values in default GenModelInput, for example:
// "You are a helpful assistant. The current time is {Time}. The current user is {User}."
// These placeholders will be replaced with session values for "Time" and "User".
Instruction string
Model model.ToolCallingChatModel
ToolsConfig ToolsConfig
// GenModelInput transforms instructions and input messages into the model's input format.
// Optional. Defaults to defaultGenModelInput which combines instruction and messages.
GenModelInput GenModelInput
// Exit defines the tool used to terminate the agent process.
// Optional. If nil, no Exit Action will be generated.
// You can use the provided 'ExitTool' implementation directly.
Exit tool.BaseTool
// OutputKey stores the agent's response in the session.
// Optional. When set, stores output via AddSessionValue(ctx, outputKey, msg.Content).
OutputKey string
// MaxIterations defines the upper limit of ChatModel generation cycles.
// The agent will terminate with an error if this limit is exceeded.
// Optional. Defaults to 20.
MaxIterations int
}
func NewChatModelAgent(_ context.Context, config *ChatModelAgentConfig) (*ChatModelAgent, error) {
// omit code
}
AgentRunner
Runner executes agents and enables advanced features. See Eino ADK: Agent Runner & Extensions.
Runner‑only capabilities:
- Interrupt & Resume
- Cross‑cutting hooks (coming)
- Context preprocessing
type RunnerConfig struct {
Agent Agent
EnableStreaming bool
CheckPointStore compose.CheckPointStore
}
func NewRunner(_ context.Context, conf RunnerConfig) *Runner {
// omit code
}





