English | 中文
Eino['aino] is an LLM application development framework in Golang. It draws from LangChain, Google ADK, and other open-source frameworks, and is designed to follow Golang conventions.
Eino provides:
ChatModel, Tool, Retriever, and ChatTemplate, with official implementations for OpenAI, Ollama, and more.
Configure a ChatModel, optionally add tools, and you have a working agent:
chatModel, _ := openai.NewChatModel(ctx, &openai.ChatModelConfig{
Model: "gpt-4o",
APIKey: os.Getenv("OPENAI_API_KEY"),
})
agent, _ := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Model: chatModel,
})
runner := adk.NewRunner(ctx, adk.RunnerConfig{Agent: agent})
iter := runner.Query(ctx, "Hello, who are you?")
for {
event, ok := iter.Next()
if !ok {
break
}
fmt.Println(event.Message.Content)
}
Add tools to give the agent capabilities:
agent, _ := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{ Model: chatModel, ToolsConfig: adk.ToolsConfig{ ToolsNodeConfig: compose.ToolsNodeConfig{ Tools: []tool.BaseTool{weatherTool, calculatorTool}, }, }, })
The agent handles the ReAct loop internally — it decides when to call tools and when to respond.
→ ChatModelAgent examples · docs
For complex tasks, use DeepAgent. It breaks down problems into steps, delegates to sub-agents, and tracks progress:
deepAgent, _ := deep.New(ctx, &deep.Config{
ChatModel: chatModel,
SubAgents: []adk.Agent{researchAgent, codeAgent},
ToolsConfig: adk.ToolsConfig{
ToolsNodeConfig: compose.ToolsNodeConfig{
Tools: []tool.BaseTool{shellTool, pythonTool, webSearchTool},
},
},
})
runner := adk.NewRunner(ctx, adk.RunnerConfig{Agent: deepAgent})
iter := runner.Query(ctx, "Analyze the sales data in report.csv and generate a summary chart")
DeepAgent can be configured to coordinate multiple specialized agents, run shell commands, execute Python code, and search the web.
When you need precise control over execution flow, use compose to build graphs and workflows:
graph := compose.NewGraph[*Input, *Output]()
graph.AddLambdaNode("validate", validateFn)
graph.AddChatModelNode("generate", chatModel)
graph.AddLambdaNode("format", formatFn)
graph.AddEdge(compose.START, "validate")
graph.AddEdge("validate", "generate")
graph.AddEdge("generate", "format")
graph.AddEdge("format", compose.END)
runnable, _ := graph.Compile(ctx)
result, _ := runnable.Invoke(ctx, input)
Compositions can be exposed as tools for agents, bridging deterministic workflows with autonomous behavior:
tool, _ := graphtool.NewInvokableGraphTool(graph, "data_pipeline", "Process and validate data")
agent, _ := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Model: chatModel,
ToolsConfig: adk.ToolsConfig{
ToolsNodeConfig: compose.ToolsNodeConfig{
Tools: []tool.BaseTool{tool},
},
},
})
This lets you build domain-specific pipelines with exact control, then let agents decide when to use them.
→ GraphTool examples · compose docs
Eino defines component abstractions (ChatModel, Tool, Retriever, Embedding, etc.) with official implementations for OpenAI, Claude, Gemini, Ark, Ollama, Elasticsearch, and more.
→ eino-ext
Eino automatically handles streaming throughout orchestration: concatenating, boxing, merging, and copying streams as data flows between nodes. Components only implement the streaming paradigms that make sense for them; the framework handles the rest.
→ docs
Inject logging, tracing, and metrics at fixed points (OnStart, OnEnd, OnError, OnStartWithStreamInput, OnEndWithStreamOutput) across components, graphs, and agents.
→ docs
Any agent or tool can pause execution for human input and resume from checkpoint. The framework handles state persistence and routing.

The Eino framework consists of:
Eino (this repo): Type definitions, streaming mechanism, component abstractions, orchestration, agent implementations, aspect mechanisms
EinoExt: Component implementations, callback handlers, usage examples, evaluators, prompt optimizers
Eino Devops: Visualized development and debugging
EinoExamples: Example applications and best practices
This repo uses golangci-lint. Check locally with:
golangci-lint run ./...
Rules enforced:
gofmt -sgoimports (std -> third party -> local)If you discover a potential security issue, notify Bytedance Security via the security center or vulnerability reporting email.
Do not create a public GitHub issue.

This project is licensed under the Apache-2.0 License.