# 智能体开发指南

Yuxi 的智能体系统基于 LangGraph 构建，提供了灵活而强大的 Agent 开发能力。通过统一的 `AgentManager`，系统能够自动发现和管理所有智能体，让开发者能够专注于业务逻辑的实现。

## 智能体架构

### 核心概念

系统的智能体架构围绕几个核心组件展开：

- **BaseAgent**：所有智能体的基类，定义了统一的接口规范
- **AgentContext**：智能体的配置上下文，包含模型、提示词、工具等配置
- **Graph**：LangGraph 图结构，定义智能体的执行流程
- **Middleware**：中间件系统，用于扩展和定制智能体行为

### 自动发现机制

智能体采用自动发现模式。在 `backend/package/yuxi/agents/__init__.py` 中，系统会遍历 `backend/package/yuxi/agents` 目录，自动注册所有继承自 `BaseAgent` 的类。这意味着开发者只需要按照规范编写代码，智能体就会自动被系统识别，无需手动配置。

仓库预置了几个可以直接使用的智能体示例：

- **chatbot**：通用对话智能体，支持动态工具调度
- **reporter**：报表生成智能体，演示多工具协作
- **deep_agent**：深度分析智能体，支持复杂推理任务

这些示例展示了如何组织代码结构、如何定义上下文、如何组合中间件，新增智能体时可以作为参考。

## 创建自定义智能体

### 目录结构

在 `backend/package/yuxi/agents` 目录下创建新的智能体包，建议保持以下结构：

```
backend/package/yuxi/agents/
└── my_agent/
    ├── __init__.py          # 暴露主类
    ├── graph.py              # Graph 构造逻辑
    └── metadata.toml         # 元数据配置（可选）
```

### 基本实现

智能体类需要继承 `BaseAgent` 并实现异步的 `get_graph` 方法：

```python
from yuxi.agents.common import BaseAgent
from langgraph.prebuilt import create_agent

class MyAgent(BaseAgent):
    async def get_graph(self, **kwargs):
        # 获取配置上下文
        context = self.get_context()

        # 获取工具列表
        tools = await get_tools_from_context(context)

        # 构建 LangGraph 图
        graph = create_agent(
            model=load_chat_model(context.model),
            tools=tools,
            checkpointer=await self._get_checkpointer(),
        )

        return graph
```

### 能力配置

`capabilities` 属性用于声明智能体的前端能力，控制 UI 组件的显示：

```python
class MyAgent(BaseAgent):
    capabilities = ["file_upload", "files", "todo"]  # 支持文件上传、文件管理、待办事项
```

**可用能力：**

| capability | 说明 | 前端效果 |
|------------|------|----------|
| `file_upload` | 文件上传 | 显示上传按钮 |
| `files` | 文件管理 | 显示文件管理面板 |
| `todo` | 待办事项 | 显示待办组件 |

**示例：**

```python
# 只需要文件上传能力
capabilities = ["file_upload"]

# 需要文件上传和待办事项
capabilities = ["file_upload", "todo"]

# 全部能力
capabilities = ["file_upload", "files", "todo"]
```

注意：即使启用了能力，也需要在中间件中正确配置对应的处理逻辑，功能才能正常工作。例如启用 `file_upload` 需要配合 `inject_attachment_context` 中间件。

### 配置文件

可以通过 `metadata.toml` 定义智能体的元数据：

```toml
name = "我的智能体"
description = "这是一个示例智能体"
examples = [
    "帮我写一首诗",
    "解释一下量子计算",
]
```

这些信息会在前端界面展示，帮助用户了解每个智能体的用途。

## 相关主题

- [上下文配置](./context-config.md) - BaseContext 和自定义配置
- [工具系统](./tools-system.md) - 工具获取机制和 Skills 集成
- [中间件系统](./middleware.md) - 中间件开发与使用
- [MCP 集成](./mcp-integration.md) - MCP 服务器配置
- [SubAgents 管理](./subagents-management.md) - 子智能体配置、调用链和开发注意事项

## 开发建议

### 代码组织

- 将智能体的核心逻辑放在 `graph.py` 中
- 复杂的工具逻辑单独放在 `toolkits` 目录下
- 共享的组件放在 `common` 目录下

### 热重载

在容器环境中，修改代码后会自动触发热重载。如果需要强制刷新，可以调用：

```python
agent_manager.get_agent(<agent_id>, reload=True)
```

### 调试技巧

1. 使用前端的「调试面板」查看详细的请求和响应
2. 查看后端日志：`docker logs api-dev -f`
3. 利用 LangGraph 的可视化能力理解图结构

---

智能体系统的设计目标是让开发者能够快速构建和迭代 AI 应用。通过本文档介绍的概念和示例，你应该能够掌握创建自定义智能体的核心方法。遇到问题时，建议先参考预置智能体的实现，它们涵盖了大多数常见场景。
