Skip to content

Commit 64e9502

Browse files
authored
Merge pull request #17 from Serverless-Devs/agentrun-agui
feat(server): 实现 AG-UI 协议和生命周期钩子系统
1 parent 3ee377f commit 64e9502

37 files changed

+19150
-1060
lines changed

AGENTS.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,8 +380,34 @@ async def deploy_multiple_agents():
380380

381381
# 运行
382382
agents = asyncio.run(deploy_multiple_agents())
383+
384+
### 8. 变更后的类型检查要求
385+
386+
所有由 AI(或自动化 agent)提交或修改的代码变更,必须在提交/合并前后执行静态类型检查,并在变更记录中包含检查结果摘要:
387+
388+
- **运行命令**:使用项目根目录的 mypy 配置运行:
389+
390+
```bash
391+
mypy --config-file mypy.ini .
392+
```
393+
394+
- **必需项**AI 在每次修改代码并准备提交时,必须:
395+
- 运行上述类型检查命令并等待完成;
396+
- 若检查通过,在提交消息或 PR 描述中写入简短摘要(例如:"类型检查通过,检查文件数 N");
397+
- 若检查失败,AI 应在 PR 描述中列出前 30 条错误(或最关键的若干条),并给出优先修复建议或自动修复方案。
398+
399+
- **CI 行为**:项目 CI 可根据仓库策略决定是否将类型检查失败作为阻断条件;AI 应遵从仓库当前 CI 策略并在 PR 中说明检查结果。
400+
401+
此要求旨在保证类型安全随代码变更持续得到验证,减少回归并提高编辑器与 Copilot 的诊断可靠性。
383402
```
384403

404+
### 9. 运行命令约定
405+
406+
请使用 `uv run ...` 执行所有 Python 相关命令,避免直接调用系统的 `python`。例如:
407+
408+
- `uv run mypy --config-file mypy.ini .`
409+
- `uv run python examples/quick_start.py`
410+
385411
## 常见问题
386412

387413
### Q: Agent Runtime 启动失败怎么办?

agentrun/__init__.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,8 @@
9090
# Server
9191
from agentrun.server import (
9292
AgentRequest,
93-
AgentResponse,
9493
AgentResult,
9594
AgentRunServer,
96-
AgentStreamIterator,
97-
AgentStreamResponse,
9895
AsyncInvokeAgentHandler,
9996
InvokeAgentHandler,
10097
Message,

agentrun/integration/langchain/__init__.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,29 @@
1-
"""LangChain 集成模块,提供 AgentRun 模型与沙箱的 LangChain 适配。 / LangChain 集成 Module"""
1+
"""LangChain 集成模块
2+
3+
使用 AgentRunConverter 将 LangChain 事件转换为 AG-UI 协议事件:
4+
5+
>>> from agentrun.integration.langchain import AgentRunConverter
6+
>>>
7+
>>> async def invoke_agent(request: AgentRequest):
8+
... converter = AgentRunConverter()
9+
... async for event in agent.astream_events(input_data, version="v2"):
10+
... for item in converter.convert(event):
11+
... yield item
12+
13+
支持多种调用方式:
14+
- agent.astream_events(input, version="v2") - 支持 token by token
15+
- agent.stream(input, stream_mode="updates") - 按节点输出
16+
- agent.astream(input, stream_mode="updates") - 异步按节点输出
17+
"""
18+
19+
from agentrun.integration.langgraph.agent_converter import (
20+
AgentRunConverter,
21+
) # 向后兼容
222

323
from .builtin import model, sandbox_toolset, toolset
424

525
__all__ = [
26+
"AgentRunConverter",
627
"model",
728
"toolset",
829
"sandbox_toolset",

agentrun/integration/langchain/model_adapter.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ def __init__(self):
2323

2424
def wrap_model(self, common_model: Any) -> Any:
2525
"""包装 CommonModel 为 LangChain BaseChatModel / LangChain Model Adapter"""
26-
from httpx import AsyncClient
2726
from langchain_openai import ChatOpenAI
2827

2928
info = common_model.get_model_info() # 确保模型可用
@@ -32,6 +31,7 @@ def wrap_model(self, common_model: Any) -> Any:
3231
api_key=info.api_key,
3332
model=info.model,
3433
base_url=info.base_url,
35-
async_client=AsyncClient(headers=info.headers),
34+
default_headers=info.headers,
3635
stream_usage=True,
36+
streaming=True, # 启用流式输出以支持 token by token
3737
)

agentrun/integration/langgraph/__init__.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,34 @@
1-
"""LangGraph 集成模块。 / LangGraph 集成 Module
1+
"""LangGraph 集成模块
22
3-
提供 AgentRun 模型与沙箱工具的 LangGraph 适配入口。 / 提供 AgentRun 模型with沙箱工具的 LangGraph 适配入口。
4-
LangGraph 与 LangChain 兼容,因此直接复用 LangChain 的转换逻辑。 / LangGraph with LangChain 兼容,因此直接复用 LangChain 的转换逻辑。
3+
使用 AgentRunConverter 将 LangGraph 事件转换为 AG-UI 协议事件:
4+
5+
>>> from agentrun.integration.langgraph import AgentRunConverter
6+
>>>
7+
>>> async def invoke_agent(request: AgentRequest):
8+
... converter = AgentRunConverter()
9+
... async for event in agent.astream_events(input_data, version="v2"):
10+
... for item in converter.convert(event):
11+
... yield item
12+
13+
或使用静态方法(无状态):
14+
15+
>>> from agentrun.integration.langgraph import AgentRunConverter
16+
>>>
17+
>>> async for event in agent.astream_events(input_data, version="v2"):
18+
... for item in AgentRunConverter.to_agui_events(event):
19+
... yield item
20+
21+
支持多种调用方式:
22+
- agent.astream_events(input, version="v2") - 支持 token by token
23+
- agent.stream(input, stream_mode="updates") - 按节点输出
24+
- agent.astream(input, stream_mode="updates") - 异步按节点输出
525
"""
626

27+
from .agent_converter import AgentRunConverter
728
from .builtin import model, sandbox_toolset, toolset
829

930
__all__ = [
31+
"AgentRunConverter",
1032
"model",
1133
"toolset",
1234
"sandbox_toolset",

0 commit comments

Comments
 (0)