参考: 完整部署样例

本教程演示了如何使用AgentScope Runtime与AgentScope框架创建和部署 “推理与行动”(ReAct) 智能体。

Note

ReAct(推理与行动)范式使智能体能够将推理轨迹与特定任务的行动交织在一起,使其在工具交互任务中特别有效。通过将AgentScope的ReActAgent与AgentScope Runtime的基础设施相结合,您可以同时获得智能决策和安全的工具执行。

前置要求

安装依赖

pip install agentscope-runtime

沙箱

Note

确保您的浏览器沙箱环境已准备好使用,详细信息请参见沙箱

确保浏览器沙箱镜像可用:

docker pull agentscope-registry.ap-southeast-1.cr.aliyuncs.com/agentscope/runtime-sandbox-browser:latest && docker tag agentscope-registry.ap-southeast-1.cr.aliyuncs.com/agentscope/runtime-sandbox-browser:latest agentscope/runtime-sandbox-browser:latest

API密钥配置

您需要为您选择的LLM提供商准备API密钥。此示例使用DashScope(Qwen),但您可以将其适配到其他提供商:

export DASHSCOPE_API_KEY="your_api_key_here"

分步实现

步骤 1:导入依赖

import os

from agentscope.agent import ReActAgent
from agentscope.model import DashScopeChatModel
from agentscope.formatter import DashScopeChatFormatter
from agentscope.tool import Toolkit, execute_python_code
from agentscope.pipeline import stream_printing_messages

from agentscope_runtime.engine import AgentApp
from agentscope_runtime.engine.schemas.agent_schemas import AgentRequest
from agentscope_runtime.adapters.agentscope.memory import AgentScopeSessionHistoryMemory
from agentscope_runtime.engine.services.agent_state import InMemoryStateService
from agentscope_runtime.engine.services.session_history import InMemorySessionHistoryService
from agentscope_runtime.engine.services.sandbox import SandboxService
from agentscope_runtime.sandbox import BrowserSandbox

步骤 2:准备浏览器沙箱工具

tests/sandbox/test_sandbox.py 相同,我们可以直接通过上下文管理器验证浏览器沙箱是否可用:

with BrowserSandbox() as box:
    print(box.list_tools())
    print(box.browser_navigate("https://www.example.com/"))
    print(box.browser_snapshot())

当需要在服务内长期复用沙箱时,参考 tests/sandbox/test_sandbox_service.py 使用 SandboxService 管理生命周期:

import asyncio

async def bootstrap_browser_sandbox():
    sandbox_service = SandboxService()
    await sandbox_service.start()

    session_id = "demo_session"
    user_id = "demo_user"

    sandboxes = sandbox_service.connect(
        session_id=session_id,
        user_id=user_id,
        sandbox_types=["browser"],
    )
    browser_box = sandboxes[0]
    browser_box.browser_navigate("https://www.example.com/")
    browser_box.browser_snapshot()

    await sandbox_service.stop()

asyncio.run(bootstrap_browser_sandbox())

这里的 sandbox_types=["browser"]tests/sandbox/test_sandbox_service.py 保持一致,可确保同一 session_id / user_id 复用同一个浏览器沙箱实例。

步骤 3:构建 AgentApp

Important

⚠️ 提示

此处的 Agent 构建(模型、工具、会话记忆、格式化器等)只是一个示例配置, 您需要根据实际需求替换为自己的模块实现。 关于可用的服务类型、适配器用法以及如何替换,请参考 服务与适配器

下面的逻辑与测试用例 run_app() 完全一致,包含状态服务初始化、会话记忆以及流式响应:

PORT = 8090

agent_app = AgentApp(
    app_name="Friday",
    app_description="A helpful assistant",
)


@agent_app.init
async def init_func(self):
    self.state_service = InMemoryStateService()
    self.session_service = InMemorySessionHistoryService()
    self.sandbox_service = SandboxService()

    await self.state_service.start()
    await self.session_service.start()
    await self.sandbox_service.start()


@agent_app.shutdown
async def shutdown_func(self):
    await self.state_service.stop()
    await self.session_service.stop()
    await self.sandbox_service.stop()


@agent_app.query(framework="agentscope")
async def query_func(self, msgs, request: AgentRequest = None, **kwargs):
    session_id = request.session_id
    user_id = request.user_id

    state = await self.state_service.export_state(
        session_id=session_id,
        user_id=user_id,
    )

    sandboxes = self.sandbox_service.connect(
        session_id=session_id,
        user_id=user_id,
        sandbox_types=["browser"],
    )
    browser_box = sandboxes[0]

    toolkit = Toolkit()
    for tool in (
        browser_box.browser_navigate,
        browser_box.browser_snapshot,
        browser_box.browser_take_screenshot,
        browser_box.browser_click,
        browser_box.browser_type,
    ):
        toolkit.register_tool_function(tool)
    toolkit.register_tool_function(execute_python_code)

    agent = ReActAgent(
        name="Friday",
        model=DashScopeChatModel(
            "qwen-turbo",
            api_key=os.getenv("DASHSCOPE_API_KEY"),
            enable_thinking=True,
            stream=True,
        ),
        sys_prompt="You're a helpful assistant named Friday.",
        toolkit=toolkit,
        memory=AgentScopeSessionHistoryMemory(
            service=self.session_service,
            session_id=session_id,
            user_id=user_id,
        ),
        formatter=DashScopeChatFormatter(),
    )
    agent.set_console_output_enabled(enabled=False)

    if state:
        agent.load_state_dict(state)

    async for msg, last in stream_printing_messages(
        agents=[agent],
        coroutine_task=agent(msgs),
    ):
        yield msg, last

    await self.state_service.save_state(
        user_id=user_id,
        session_id=session_id,
        state=agent.state_dict(),
    )

上述 query_func 会将 Agent 的输出通过 SSE 逐条返回,同时把最新 state 写回内存服务,实现多轮记忆。

借助 SandboxServicesandbox_types=["browser"]) ,浏览器沙箱会根据同一个 session_iduser_id 在多轮对话中复用,避免重复启动容器。

步骤 4:启动服务

if __name__ == "__main__":
    agent_app.run(host="127.0.0.1", port=PORT)

运行脚本后即可在 http://127.0.0.1:8090/process 收到流式响应。

步骤 5:测试 SSE 输出

curl -N \
  -X POST "http://127.0.0.1:8090/process" \
  -H "Content-Type: application/json" \
  -d '{
    "input": [
      {
        "role": "user",
        "content": [
          { "type": "text", "text": "What is the capital of France?" }
        ]
      }
    ]
  }'

你将看到多条 data: {...} 事件以及最终的 data: [DONE]。如果消息体中包含 “Paris” 即表示回答正确。

步骤 6:多轮记忆验证

要验证 AgentScopeSessionHistoryMemory 是否生效,可以复用测试中「两轮对话」的交互流程:第一次提交 “My name is Alice.” 并携带固定 session_id,第二次询问 “What is my name?”,若返回文本包含 “Alice” 即表示记忆成功。

步骤 7:OpenAI 兼容模式

AgentApp 同时暴露了 compatible-mode/v1 路径,可使用官方 openai SDK 验证:

from openai import OpenAI

client = OpenAI(base_url="http://127.0.0.1:8090/compatible-mode/v1")
resp = client.responses.create(
    model="any_name",
    input="Who are you?",
)

print(resp.response["output"][0]["content"][0]["text"])

正常情况下你会得到 “I’m Friday …” 之类的回答。

总结

通过本章节的内容,你可以快速获得一个带有流式响应、会话记忆以及 OpenAI 兼容接口的 ReAct 智能体服务。若需部署到远端或扩展更多工具,只需替换 DashScopeChatModel、状态服务或工具注册逻辑即可。