Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion content/en/docs/eino/Cookbook.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
Description: ""
date: "2026-03-16"
date: "2026-05-19"
lastmod: ""
tags: []
title: Cookbook
Expand Down Expand Up @@ -63,6 +63,27 @@ This document serves as an example index for the eino-examples project, helping
<tr><td><a href="https://github.com/cloudwego/eino-examples/tree/main/adk/multiagent/integration-excel-agent">adk/multiagent/integration-excel-agent</a></td><td>Excel Agent (ADK Integration)</td><td>ADK integrated Excel Agent, including Planner, Executor, Replanner, Reporter</td></tr>
</table>

### Agent

<table>
<tr><td>Directory</td><td>Name</td><td>Description</td></tr>
<tr><td><a href="https://github.com/cloudwego/eino-examples/tree/main/adk/agent/ralph-loop">adk/agent/ralph-loop</a></td><td>Ralph Loop</td><td>Autonomous iteration pattern: external <pre>for</pre> loop with <pre>Runner.Run</pre> for single-round iteration, Agent perceives prior work through filesystem, validation gate checks BUG markers before accepting completion claims</td></tr>
</table>

### Cancel

<table>
<tr><td>Directory</td><td>Name</td><td>Description</td></tr>
<tr><td><a href="https://github.com/cloudwego/eino-examples/tree/main/adk/cancel/graceful-exit">adk/cancel/graceful-exit</a></td><td>Graceful Exit</td><td>Demonstrates Agent Cancel + Resume: captures terminal signals then cancels nested Agent with <pre>CancelAfterChatModel</pre> + <pre>WithRecursive</pre> mode, waits for safe point to save Checkpoint, then resumes execution</td></tr>
</table>

### Middlewares

<table>
<tr><td>Directory</td><td>Name</td><td>Description</td></tr>
<tr><td><a href="https://github.com/cloudwego/eino-examples/tree/main/adk/middlewares/skill">adk/middlewares/skill</a></td><td>Skill Middleware</td><td>Loads Agent skills from filesystem (e.g., log_analyzer), demonstrating skill middleware usage</td></tr>
</table>

### GraphTool

<table>
Expand Down
295 changes: 255 additions & 40 deletions content/en/docs/eino/FAQ.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
---
Description: ""
date: "2026-03-02"
date: "2026-05-17"
lastmod: ""
tags: []
title: 'Eino: Orchestration Design Principles'
title: Orchestration Design Principles
weight: 2
---

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ Description: ""
date: "2026-03-03"
lastmod: ""
tags: []
title: 'Eino: AgenticToolsNode & Tool User Guide [Beta]'
title: 'AgenticToolsNode & Tool User Guide [Beta]'
weight: 12
---

Expand Down Expand Up @@ -237,7 +237,7 @@ input := &schema.AgenticMessage{
FunctionToolCall: &schema.FunctionToolCall{
CallID: "1",
Name: "get_weather",
Arguments: `{"city": "Shenzhen", "date": "tomorrow"}`,
Arguments: `{"city": "深圳", "date": "tomorrow"}`,
},
},
},
Expand Down Expand Up @@ -371,8 +371,8 @@ In the tool function body and tool callback handler, you can use the `compose.Ge

There are multiple ways to implement tools. You can refer to the following approaches:

- HTTP API-based tool implementation: [How to create a tool/function call using OpenAPI?](/docs/eino/usage_guide/how_to_guide/openapi_tool_creation)
- gRPC-based tool implementation: [How to create a tool/function call using proto3?](/docs/eino/usage_guide/how_to_guide/proto3_tool_creation)
- Thrift-based tool implementation: [How to create a tool/function call using thrift IDL?](/docs/eino/usage_guide/how_to_guide/thrift_idl_tool_creation)
- HTTP API-based tool implementation: [How to create a tool/function call using OpenAPI?](https://bytedance.larkoffice.com/wiki/FjXzwf3exijtKyk2hh7cAmnZn1g)
- gRPC-based tool implementation: [How to create a tool/function call using proto3?](https://bytedance.larkoffice.com/wiki/EPkawUVbdiGwxCkWCJTcAMQonbh)
- Thrift-based tool implementation: [How to create a tool/function call using thrift IDL?](https://bytedance.larkoffice.com/wiki/PcHfwo6x0iOrXxkIjJecez8xnNg)
- Local function-based tool implementation: [How to create a tool?](/docs/eino/core_modules/components/tools_node_guide/how_to_create_a_tool)
- ……
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
---
Description: ""
date: "2025-07-21"
date: "2026-05-17"
lastmod: ""
tags: []
title: 'Eino: Document Transformer User Guide'
title: 'Document Transformer User Guide'
weight: 3
---

Expand Down Expand Up @@ -160,9 +160,11 @@ for idx, doc := range outDocs {

## **Existing Implementations**

1. Markdown Header Splitter: Document splitting based on Markdown headers [Splitter - markdown](/docs/eino/ecosystem_integration/document/splitter_markdown)
2. Text Splitter: Document splitting based on text length or delimiters [Splitter - semantic](/docs/eino/ecosystem_integration/document/splitter_semantic)
3. Document Filter: Filter document content based on rules [Splitter - recursive](/docs/eino/ecosystem_integration/document/splitter_recursive)
<table>
<tr><td>markdown</td><td><a href="https://github.com/cloudwego/eino-ext/blob/main/components/document/transformer/splitter/markdown/README_zh.md">README_zh.md</a></td><td><a href="https://github.com/cloudwego/eino-ext/blob/main/components/document/transformer/splitter/markdown/README.md">README.md</a></td></tr>
<tr><td>recursive</td><td><a href="https://github.com/cloudwego/eino-ext/blob/main/components/document/transformer/splitter/recursive/README_zh.md">README_zh.md</a></td><td><a href="https://github.com/cloudwego/eino-ext/blob/main/components/document/transformer/splitter/recursive/README.md">README.md</a></td></tr>
<tr><td>semantic</td><td><a href="https://github.com/cloudwego/eino-ext/blob/main/components/document/transformer/splitter/semantic/README_zh.md">README_zh.md</a></td><td><a href="https://github.com/cloudwego/eino-ext/blob/main/components/document/transformer/splitter/semantic/README.md">README.md</a></td></tr>
</table>

## **Implementation Reference**

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
---
Description: ""
date: "2025-07-21"
date: "2026-05-17"
lastmod: ""
tags: []
title: 'Eino: Embedding User Guide'
title: Embedding User Guide
weight: 2
---

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
---
Description: ""
date: "2026-03-03"
date: "2026-05-17"
lastmod: ""
tags: []
title: 'Eino: ToolsNode & Tool Guide'
title: ToolsNode & Tool Guide
weight: 9
---

Expand Down Expand Up @@ -282,6 +282,82 @@ type ToolInfo struct {

The Tool component uses ToolOption to define optional parameters. ToolsNode has no abstracted common options. Each specific implementation can define its own specific Options, wrapped into the unified ToolOption type using the WrapToolImplSpecificOptFn function.

## Tool Aliases 🏷️ alpha/09

The Tool Alias feature allows configuring **name aliases** and **argument aliases** for tools, so that when an LLM calls a tool using an alias, it is automatically resolved to the real tool and canonical parameters.

### Configuration Structure

```go
// ToolAliasConfig configures name and argument aliases for a single tool
type ToolAliasConfig struct {
// NameAliases is a list of alternative names for the tool
// If the model returns any of these names, it will be resolved to the canonical tool name
NameAliases []string

// ArgumentsAliases maps canonical argument keys to their alias lists
// key=canonical name, value=[]aliases
// e.g.: {"query": ["q", "search_term"], "limit": ["max_results", "count"]}
ArgumentsAliases map[string][]string
}
```

Configure via the `ToolAliases` field in `ToolsNodeConfig`:

```go
config := &compose.ToolsNodeConfig{
Tools: []tool.BaseTool{searchTool, weatherTool},
ToolAliases: map[string]ToolAliasConfig{
"search": {
NameAliases: []string{"find", "query", "search_v1"},
ArgumentsAliases: map[string][]string{
"query": {"q", "search_term"},
"limit": {"max_results", "count"},
},
},
},
}
toolsNode, err := compose.NewToolNode(ctx, config)
```

### Dynamic Override

Use the `WithToolAliases()` call option to override global alias configuration at runtime:

```go
// Override alias configuration (keeping original tool list)
result, err := toolsNode.Invoke(ctx, input,
compose.WithToolAliases(map[string]compose.ToolAliasConfig{
"search": {
NameAliases: []string{"new_alias"},
},
}),
)

// Override both tool list and aliases
result, err := toolsNode.Invoke(ctx, input,
compose.WithToolList(newSearchTool),
compose.WithToolAliases(map[string]compose.ToolAliasConfig{...}),
)
```

### Execution Flow

Processing order during tool invocation:

1. **Name Resolution**: The tool name returned by the LLM (which may be an alias) is resolved to the canonical tool name via index lookup
2. **Argument Remapping**: Alias keys in the JSON arguments are automatically replaced with canonical keys
3. **ToolArgumentsHandler** (if configured): Receives the canonical tool name and already-remapped arguments
4. **Tool Execution**: Calls the tool using canonical name and arguments

### Notes

- Name aliases **cannot** conflict with other tools' canonical names or already-registered aliases
- Argument aliases **cannot** conflict with existing property names in the tool's JSON Schema
- When both an alias key and canonical key are **present simultaneously** in argument JSON, the canonical key takes precedence and the alias key is left as-is
- Configuring aliases for non-existent tool names will be **silently ignored**
- The alias feature supports both **standard tools** and **enhanced tools**

## Usage

### Standard Tool Usage
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
---
Description: ""
date: "2025-11-20"
date: "2026-05-17"
lastmod: ""
tags: []
title: Eino Dev Visual Debugging Guide
title: Eino Dev Visual Debugging Plugin Guide
weight: 3
---

Expand Down Expand Up @@ -155,6 +155,7 @@ Because debugging starts an HTTP service in your main process to interact with t
> 1. Ensure the target orchestration has run `Compile()` at least once.
> 2. `devops.Init()` must run before calling `Compile()`.
> 3. Make sure the main process stays alive after `devops.Init()`.
> 4. Starting from v0.1.9, the debug service default listen address changed from `0.0.0.0` to `127.0.0.1` (local connections only). For remote debugging, explicitly specify the listen IP via `WithDevServerIP`, e.g.: `devops.Init(ctx, devops.WithDevServerIP("0.0.0.0"))`.

```go
// 1. Initialize debug service
Expand Down Expand Up @@ -201,10 +202,18 @@ func main() {

### Configure Address

- IP: `127.0.0.1` for local; remote server IP for remote (IPv4/IPv6).
- Port: default `52538`, configurable via `WithDevServerPort`.
- **IP**: IP address of the server where the user process is running.
- If the user process is running on local computer, enter `127.0.0.1`;
- If the user process is running on a remote server, enter the remote server's IP address, supporting both IPv4 and IPv6.
- **Port**: Port the debug service listens on, default is `52538`, configurable via the `WithDevServerPort` option method.

Allow network prompts locally; ensure remote ports are reachable. Once connected, the status indicator turns green.
> 💡
> Notes
>
> - Local debugging: The system may pop up a network access warning; allow access.
> - Remote debugging: Ensure the port is accessible. Additionally, starting from v0.1.9, the default listen address is `127.0.0.1` only; for remote debugging you must specify an accessible IP (e.g., `0.0.0.0`) via `WithDevServerIP` when calling `devops.Init()`.

Once IP and Port are configured, click confirm. The debug plugin will automatically connect to the target debug server. If successfully connected, the connection status indicator will turn green.

<a href="/img/eino/eino_debug_ip_port_show_page.png" target="_blank"><img src="/img/eino/eino_debug_ip_port_show_page.png" width="100%" /></a>

Expand All @@ -222,10 +231,22 @@ Ensure your target orchestration has been compiled at least once. Multiple `Comp

<a href="/img/eino/eino_debug_run_input_mock_data_2_page.png" target="_blank"><img src="/img/eino/eino_debug_run_input_mock_data_2_page.png" width="100%" /></a>

- From a specific node: click the run button on that node.
- From a specific node: click the run button on that node to start debugging from there.

<a href="/img/eino/eino_debug_button_run_code.png" target="_blank"><img src="/img/eino/eino_debug_button_run_code.png" width="100%" /></a>

<a href="/img/eino/eino_debug_run_of_mock_input_of_page.png" target="_blank"><img src="/img/eino/eino_debug_run_of_mock_input_of_page.png" width="100%" /></a>

### View Execution Results

Debugging from the START node: after clicking Test Run, view debug results in the plugin panel below.

<a href="/img/eino/eino_debug_test_run_result_page.png" target="_blank"><img src="/img/eino/eino_debug_test_run_result_page.png" width="100%" /></a>

Debugging from any operable node: view debug results in the plugin panel below.

<a href="/img/eino/eino_debug_results.png" target="_blank"><img src="/img/eino/eino_debug_results.png" width="100%" /></a>

## Advanced

### Specify Implementation Type for Interface Fields
Expand Down Expand Up @@ -290,11 +311,21 @@ func RegisterGraphOfInterfaceType(ctx context.Context) {
err := devops.Init(ctx, devops.AppendType(&graph.NodeInfo{}))
```

3) During Test Run, interface fields show `{}` by default. Type a space inside `{}` to view all built-in and custom types, select the concrete implementation, then fill `_value`.
3) During Test Run, interface fields show `{}` by default. Type a space inside `{}` to view all built-in and custom types, and select the concrete implementation type for that interface.

<a href="/img/eino/eino_debug_run_code.png" target="_blank"><img src="/img/eino/eino_debug_run_code.png" width="100%" /></a>

4) Fill in the debug node input in the `_value` field.

<a href="/img/eino/eino_debug_run_code_3.png" target="_blank"><img src="/img/eino/eino_debug_run_code_3.png" width="100%" /></a>

5) Click confirm to view the debug results.

<a href="/img/eino/eino_debug_panel_2.png" target="_blank"><img src="/img/eino/eino_debug_panel_2.png" width="100%" /></a>

### Debugging `map[string]any`
#### Debugging `map[string]any`

If a node input is `map[string]any`:
Here we explain how to debug when the input type is `map[string]any`. If a node's input type is `map[string]any`, as shown below:

```go
func RegisterAnyInputGraph(ctx context.Context) {
Expand Down Expand Up @@ -341,7 +372,7 @@ func RegisterAnyInputGraph(ctx context.Context) {
}
```

During debugging, in the Test Run JSON input box, use the following format to specify concrete types for values:
During debugging, in the Test Run JSON input box, you need to enter content in the following format:

```json
{
Expand Down
Loading
Loading