# Enio 与 VeADK-Go 对应规则

你可以通过下面的介绍,来了解 Enio 与 VeADK-Go 对应规则。具体的 VeADK-Go 定义方法可以参照 `references/samples/` 目录中的内容。

## Enio 常用类型

- ReAct Agent 和 ChatModel 节点:对应 VeADK-Go的 LLM Agent,请参照 `references/common/agent.md`
- RetrieverNode: 对应VeADK-Go的KnowledgeBase,请参照 `references/common/knowledgebase.md` 中的知识库定义和使用方法
- 工具节点/ToolsNode:对应VeADK-Go的工具,请参照 `references/common/tools.md`
- Chain和Graph的固定流程编排:直接用 Go 代码实现。
    - 其中不包含大模型的逻辑节点,按照该节点与模型调用以及工具调用的相对位置,封装于 callBack
      函数中,VeADK-Go的callBack函数,请参照 `references/common/callback.md`

## Enio 与 VeADK-Go 代码映射示例

### 1、Agent

Enio 代码实现

React Agent 代码实现
```go
func main() {
    // 先初始化所需的 chatModel
    toolableChatModel, err := openai.NewChatModel(...)
    
    // 初始化所需的 tools
    tools := compose.ToolsNodeConfig{
        InvokableTools:  []tool.InvokableTool{mytool},
        StreamableTools: []tool.StreamableTool{myStreamTool},
    }
    
    // 创建 agent
    agent, err := react.NewAgent(ctx, &react.AgentConfig{
        ToolCallingModel: toolableChatModel,
        ToolsConfig: tools,
        ...
    }
}
```

基于chain编排的Agent实现

```go
func main() {
    // 初始化 tools
    todoTools := []tool.BaseTool{
        getAddTodoTool(),                               // NewTool 构建
    }

    // 创建并配置 ChatModel
    chatModel, err := openai.NewChatModel(context.Background(), &openai.ChatModelConfig{
        Model:       "...",
        APIKey:      os.Getenv("OPENAI_API_KEY"),
    })
    if err != nil {
        log.Fatal(err)
    }
    // 获取工具信息并绑定到 ChatModel
    toolInfos := make([]*schema.ToolInfo, 0, len(todoTools))
    for _, tool := range todoTools {
        info, err := tool.Info(ctx)
        if err != nil {
            log.Fatal(err)
        }
        toolInfos = append(toolInfos, info)
    }
    err = chatModel.BindTools(toolInfos)
    if err != nil {
        log.Fatal(err)
    }


    // 创建 tools 节点
    todoToolsNode, err := compose.NewToolNode(context.Background(), &compose.ToolsNodeConfig{
        Tools: todoTools,
    })
    if err != nil {
        log.Fatal(err)
    }

    // 构建完整的处理链
    chain := compose.NewChain[[]*schema.Message, []*schema.Message]()
    chain.
        AppendChatModel(chatModel, compose.WithNodeName("chat_model")).
        AppendToolsNode(todoToolsNode, compose.WithNodeName("tools"))

    // 编译并生成 agent
    agent, err := chain.Compile(ctx)
    if err != nil {
        log.Fatal(err)
    }

}

```

VeADK-Go 代码实现

```go
func main() {
	ctx := context.Background()
	rootAgent, err := veagent.New(&veagent.Config{
		Config: llmagent.Config{
			Tools: []tool.Tool{utils.Must(AddTodoTool())},
		},
		ModelName:   "...",
		ModelAPIKey: os.Getenv("OPENAI_API_KEY"),
	})

	if err != nil {
		log.Fatalf("Failed to create agent: %v", err)
	}
}

```

### 2、Tool

Enio 代码实现
- 请注意:VeADK-Go的函数工具参数中,jsonschema标签下的说明,禁止包含'describr=' 或者任何 '***=' 的说明样式。

```go
// 处理函数
func AddTodoFunc(_ context.Context, params *TodoAddParams) (string, error) {
    // Mock处理逻辑
    return `{"msg": "add todo success"}`, nil
}

func getAddTodoTool() tool.InvokableTool {
    // 工具信息
    info := &schema.ToolInfo{
        Name: "add_todo",
        Desc: "Add a todo item",
        ParamsOneOf: schema.NewParamsOneOfByParams(map[string]*schema.ParameterInfo{
            "content": {
                Desc:     "The content of the todo item",
                Type:     schema.String,
                Required: true,
            },
            "started_at": {
                Desc: "The started time of the todo item, in unix timestamp",
                Type: schema.Integer,
            },
            "deadline": {
                Desc: "The deadline of the todo item, in unix timestamp",
                Type: schema.Integer,
            },
        }),
    }

    // 使用NewTool创建工具
    return utils.NewTool(info, AddTodoFunc)
}
```

VeADK-Go 代码实现

```go
// AddTodoParams 定义加法工具的入参。使用静态类型,便于 LLM 以 JSON 方式调用。
type AddTodoParams struct {
	Content   string `json:"content" jsonschema:"The content of the todo item"`
	StartedAt int64  `json:"started_at" jsonschema:"The started time of the todo item, in unix timestamp"`
	Deadline  int64  `json:"deadline" jsonschema:"The deadline of the todo item, in unix timestamp"`
}

// AddTodoTool 返回一个符合 ADK functiontool 规范的工具。
func AddTodoTool() (tool.Tool, error) {
	handler := func(ctx tool.Context, args AddTodoParams) (map[string]any, error) {
		return map[string]any{
			"msg": "add todo success",
		}, nil
	}

	return functiontool.New(
		functiontool.Config{
			Name:        "add_todo",
			Description: "Add a todo item",
		},
		handler,
	)
}
```