Skip to main content
智能体服务(Agent Service)是基于 FastAPI 把 AgentScope 的智能体转化为多租户(Multi-tenant)、多会话(Multi-session)的 HTTP 服务。它接管智能体外围的全部职责 —— 请求路由、按用户的资源生命周期、会话(Session)状态、持久化、调度(Schedule),以及工具调用的卸载,让基于 Agent 编写的代码无需重写即可承接生产流量。 它的特点:
  • 生产级智能体框架 —— 智能体运行、后台任务、调度,以及工具 / MCP / skill / 工作区(Workspace)生命周期端到端纳管,会话事件流可扇出给多个订阅者,重连时还能从缓冲区中重放历史。
  • Schema 驱动的前端 —— 凭证(Credential)公开 JSON schema,模型暴露声明式卡片(输入 / 输出类型、上下文长度、参数 schema),前端无需绑死特定 provider 的代码即可渲染表单与能力标签。
  • 天然多租户 —— 凭证、智能体、会话、调度、消息都归属于请求的 user_id,所有权在路由层强制;一份部署即可服务多用户,无需为每个租户单独编写代码路径。
  • 模块化、可扩展 —— 鉴权(Authentication)、聊天协议、工作区隔离策略、存储后端,以及模型 provider 与凭证类型集合,全部在边界处开放,可在不动框架代码的前提下替换。

能力概览

本服务自带用户鉴权系统。它提供 X-User-ID header 占位依赖,由开发者替换为自己的鉴权中间件(JWT、OAuth、session token 等)。

快速上手

体验智能体服务最快的方法是同时运行随仓库附带的示例后端与示例前端 —— 两者都在 AgentScope 仓库内。

试用示例

examples/agent_service 目录启动一个开箱即用的服务,examples/web_ui 是与之配套的 React 前端。两者一起运行,几分钟就能体验上述全部能力。
后台工具卸载与唤醒演示

后台任务卸载 —— 长耗时工具被转入后台,结果到达后唤醒智能体,对话从中断处自然续上。

权限系统 bypass 模式演示

bypass 模式下的权限系统 —— 智能体端到端运行,不为工具调用暂停确认。

任务规划演示

任务规划 —— 智能体把复杂工作拆成可追踪的计划,并随执行不断更新。

智能体团队协作演示

智能体团队 —— Leader 智能体派生 worker,并通过内置 team 工具协调它们。

1

克隆仓库

2

启动示例后端

确保本地 Redis 可访问(示例期望 localhost:6379),然后启动服务:
服务在 http://localhost:8000 启动。
3

启动示例前端

在另一个终端中安装并运行 web UI:
打开 dev server 输出的 URL(通常是 http://localhost:5173),前端会连接到第 2 步启动的后端。
两者运行起来后,同一个 UI 即可演练服务自带的全部能力:
  • 权限控制 —— 触及系统的工具会暂停等待确认;explore 模式将智能体限定在只读操作。
  • 后台任务卸载 —— 长耗时工具调用转入后台,完成后结果流式返回,不阻塞对话。
  • 任务规划 —— 智能体把复杂工作拆成可追踪的计划并随执行更新。
  • 智能体团队 —— Leader 智能体派生 worker,并通过 team 工具协调他们。
  • 计划任务 —— Cron 驱动的智能体自行触发并把结果回报到同一会话流中。

嵌入到自己的代码

如果想把服务嵌入到自己的部署中而非运行示例,可使用 create_app 自行构造 FastAPI app。运行起一个服务至少需要存储后端、消息总线与工作区管理器(Workspace Manager)。下面的示例在 8000 端口启动一个由 Redis 支撑的服务 —— 选择匹配智能体工具执行位置的工作区后端即可。

create_app 参数

StorageBase
必填
持久化智能体、会话、凭证、消息、调度、团队与知识库记录的存储后端。其生命周期(__aenter__ / __aexit__)由应用 lifespan 管理。
MessageBus
必填
Redis 支撑的运行时原语 —— 会话锁、回放日志、收件箱队列、唤醒信号 —— 把 chat 触发与事件投递解耦。必填,因为所有把事件投递到前端的代码路径(POST /chat、调度触发、团队消息、后台工具完成)都经由它,且它是支撑多进程部署的关键。
WorkspaceManagerBase
必填
以 TTL 缓存方式管理工作区(文件存储、MCP server、skill)。内置 LocalWorkspaceManager 按智能体隔离;其他策略见工作区实现与隔离
KnowledgeBaseManagerBase | None
默认值:"None"
持有知识库生命周期的管理器,向 HTTP 端点与智能体代码提供 KnowledgeBase 运行时句柄。该管理器自带向量存储实例,__aenter__ / __aexit__ 会同时进入并释放向量存储。传入 None 会禁用所有 /knowledge_bases 端点。
list[ParserBase] | dict[str, ParserBase] | None
默认值:"None"
为知识库文档上传注册的 parser。传入列表时,服务按每个 parser 的 supported_media_types 路由(同类型下后注册者会覆盖前者并伴随警告);传入字典 media_type → parser 时按显式映射路由。设置了 knowledge_base_manager 时默认为 [TextParser()]
ChunkerBase | None
默认值:"None"
所有知识库共享的切片器。设置了 knowledge_base_manager 时默认为 ApproxTokenChunker()
BlobStoreBase | None
默认值:"None"
在上传端点与索引 worker 之间保存上传文档字节的后端。设置了 knowledge_base_manager 时必需;默认为 LocalBlobStore(root_dir="./blobs")。其生命周期由应用 lifespan 管理。
bool
默认值:"True"
True(嵌入式部署)时,API 进程会在其 lifespan 中启动一个 IndexWorkerIndexSweeper,并通过进程内队列派发索引任务。为 False(专用部署)时,API 进程不做索引 —— 需要由独立 worker 进程从消息总线消费任务。knowledge_base_managerNone 时该参数无效。
list[Type[CredentialBase]] | None
默认值:"None"
额外注册的凭证类型。每个类在应用启动前被注入 CredentialFactory
list[Middleware] | None
默认值:"None"
额外的 ASGI 中间件(例如协议适配器、CORS、鉴权)。
AgentMiddlewareFactory | None
默认值:"None"
异步工厂 (user_id, agent_id, session_id) -> Awaitable[list[MiddlewareBase]],在每次组装智能体(即每轮 chat 或每次 schedule 触发)时被调用一次。返回的中间件会在智能体运行前追加到框架自带的中间件(例如 ToolOffloadMiddleware)之后,可用于产出按用户 / 会话区分的中间件,比如审计日志、租户隔离或自定义鉴权逻辑。
AgentToolFactory | None
默认值:"None"
异步工厂 (user_id, agent_id, session_id) -> Awaitable[list[ToolBase]],在每次组装智能体时被调用一次。返回的工具会与工作区派生的工具一起合并到 toolkit 的 "basic" 分组里,便于按调用者动态决定可用工具(例如按租户接入、按用户使用各自凭证的工具)。
list[SubAgentTemplate] | None
默认值:"None"
团队中子智能体创建的可复用蓝图。每个模板定义了一个子智能体类型(例如 "researcher""coder"),预设了系统提示词、权限上下文与任务上下文。注册后,AgentCreate 工具会暴露 subagent_type 参数,使 leader 智能体可以路由到相应的模板。详见自定义子智能体类型
Type[Agent] | None
默认值:"None"
自定义的 Agent 子类,用于替代内置 Agent 在每轮 chat 中被实例化。适合在保留其他服务组件不变的前提下换用具有不同推理行为的智能体实现。
str
默认值:"AgentScope"
OpenAPI 文档界面中显示的标题。
str
默认值:"package version"
OpenAPI 文档界面中显示的 API 版本号。默认使用安装的 AgentScope 包版本。
默认的 X-User-ID header 不提供任何鉴权。生产部署前请替换为真实的鉴权方案 —— 见用户鉴权

典型操作流程

服务启动后,按资源模型中定义的资源驱动它即可。下面是一次聊天会话通常走过的路径 —— 每一步是一两次 REST 调用。
1

创建智能体

注册智能体身份 —— 展示名、system prompt 与运行时配置。同一智能体可以在不同模型下驱动多个会话。
2

创建并配置凭证

通过 GET /credential/schemas 发现各 provider 的表单字段,再保存 API key。一份凭证可以在多个会话与智能体中复用。
3

创建会话并选择模型

创建一个绑定到该智能体的会话,并附上模型配置 —— provider、模型名称、参数,以及调用所用的凭证。从此之后由会话拥有运行时状态。
4

配置 MCP 与 skill(可选)

若智能体需要超出内置范围的工具,向会话的工作区附加 MCP client 与 skill。开箱即用的情况下,每个智能体已经能访问工作区的内置工具(文件系统、shell、搜索……)、任务规划工具、调度与后台任务控制工具,以及 —— 当会话是团队 leader 或成员时 —— Agent Team 中描述的团队协调工具。通过 create_appextra_agent_tools 传入的工具也会一并合入。
5

开始聊天

/chat POST 一条用户 Msg 触发一次 chat 运行。该端点立刻返回 {"status": "started", "session_id": "..."} —— 事件通过按会话 SSE 流 GET /sessions/{id}/stream 异步投递;任意数量的客户端可订阅该流,后接入者可重放缓冲历史再接收实时事件。
触发一次运行:
并行订阅该会话的事件流(也可以在触发前订阅 —— 该流跨多次运行保持打开,并广播会话产出的所有事件,包括调度触发与后台工具完成):
对于计划任务,完成步骤 1 与 2 后创建一个指向智能体的 schedule —— scheduler 会按你给定的 cron 表达式创建会话(有状态或无状态)并触发执行。无需调用 /chat;cron 触发时智能体自动运行。
中断正在运行或处于 HITL 暂停的 chat run,可随时向会话的中断端点发起请求。智能体会干净展开并保持可接受下一次 /chat 调用的状态。

资源模型

智能体服务中的每次操作都归属于从请求中解析出的 user_id。在该边界之下,服务管理七类资源 —— 六类持久化资源(图左侧)加把它们运行时行为串起来的消息总线(图右侧)。若要让凭证、智能体或知识库跨越用户之间的这条边界,见资源共享
要记住的形态:智能体是可复用的模板,会话是运行时状态的承载单位,而消息总线则是当外部事件(调度、队友、后台工具)有话要说时把空闲会话唤醒的桥梁。

API 概览

服务把资源模型中的资源暴露为 REST 端点,外加流式聊天端点。下表按类别分组;完整请求与响应结构由服务的 OpenAPI 规格描述。

自定义

服务在每个基础设施边界上都开放扩展。下面分节说明哪些是内置的,以及如何插入自己的实现。

智能体聊天协议

按会话流端点(GET /sessions/{id}/stream)通过 SSE 输出 AgentScope 原生的 AgentEvent 流。要让同一智能体服务于不同前端协议,安装协议中间件拦截 SSE 流并改写每帧。 AgentScope 内置 AGUIProtocolMiddleware 适配 AG-UI 协议。通过 extra_middlewares 装载:
新增协议时,继承 ProtocolMiddlewareBase 并实现 _convert_to_protocol
中间件自动拦截会话流端点返回的 StreamingResponse,把每条 SSE 帧反序列化回 AgentEvent,调用 _convert_to_protocol() 生成目标格式后重新序列化。

用户鉴权

内置的 get_current_user_id 依赖从请求 header X-User-ID 中读取调用者身份 —— 这是占位实现,不是真正的鉴权。用自己的依赖覆盖即可对接任何身份系统。 JWT bearer token:
OAuth2 password flow:
通过 FastAPI 的依赖覆盖机制把自定义实现挂上去:
默认的 X-User-ID header 不提供鉴权。生产部署前请始终替换为安全机制。

工作区实现与隔离

可独立配置两条正交维度:
  • 工作区后端 —— 智能体实际运行所在的运行时环境。内置实现包括 LocalWorkspaceDockerWorkspaceE2BWorkspace。新增后端实现工作区接口即可,可包装容器镜像、沙箱或远端虚拟机。
  • 隔离策略 —— 工作区如何映射到 user、agent、session。内置 LocalWorkspaceManageragent_id 为键:同一智能体的所有会话共享一个工作区。要切换为按 user 或按 session 隔离,继承 WorkspaceManagerBase 并按自己的键策略覆写 get_workspace

API 凭证

新增凭证类型由两类组成:一个 CredentialBase 子类负责描述连接配置(并发布 JSON schema 用于表单渲染),一个 ChatModelBase 子类实现针对该 provider API 的流式聊天协议。凭证类是入口 —— 它告诉服务该实例化哪个 chat model 类。
把凭证类注册到 app 上,客户端立即可用:
服务自动通过 GET /credential/schemas 暴露该凭证的 JSON schema,GET /model?provider=<name> 路由到 get_chat_model_class() 返回的 chat model 类。

Provider 模型

GET /model?provider=<name> 返回的模型列表由 ModelCard 实例构成 —— 这是声明式元数据记录,告诉前端如何展示每个模型、哪些请求参数合法。每个 chat model 通过 list_models() 暴露自己的目录,默认从 provider 模型目录下的 YAML 文件中读取 ModelCard 项;ModelCard.from_yaml() 解析每份 YAML,并把其中的 overrides 合并进 chat model 参数类提供的基础参数 schema。 ModelCard 包含以下字段: 下面的 YAML 示例描述一个接受文本、图像、视频,并输出文本与思考链路的多模态模型:
qwen3.6-plus.yaml
要在已有 provider 下新增模型,把 YAML 文件丢进 provider 模型目录即可 —— loader 会自动拾取,新条目会出现在 GET /model?provider=<name> 中。

存储后端

StorageBase 抽象类定义了智能体、会话、凭证、消息、调度、团队与知识库记录的持久化契约。AgentScope 内置两种实现 —— RedisStorage(默认,上面所有示例都在用)与 AsyncSQLAlchemyStorage
AsyncSQLAlchemyStorage 可持久化到 SQLAlchemy async 引擎支持的任意数据库(SQLite、PostgreSQL、MySQL……)。它是懒加载的 —— 只要不引用这个类,import agentscope.app.storage 就依然轻量、不会触发 SQLAlchemy 导入;连接池在 __aenter__ 打开、在 shutdown 释放。 它位于可选的 sql extra 之后,该 extra 只引入 SQLAlchemy 与 Alembic,不含驱动 —— 请自行安装与所用数据库匹配的 async 驱动:
默认情况下(create_tables=True),后端会在启动时为缺失的表执行 CREATE TABLE IF NOT EXISTS —— 便于测试与单节点开发部署。生产环境请改用随包提供的 Alembic 迁移来管理 schema:
bool
默认值:"True"
__aenter__ 时创建缺失的表。幂等(已存在的表不受影响)。当由 Alembic 管理 schema 时关闭它。
bool
默认值:"False"
__aenter__ 时对随包提供的迁移脚本执行 alembic upgrade head。适合单节点或开发部署 —— 每次启动都会把 schema 升级到最新。不建议用于多副本生产 —— 两个副本同时抢跑同一迁移并不安全;此时请保持 False,并把 alembic upgrade head 作为独立的部署步骤执行。
AsyncEngine | None
默认值:"None"
外部托管、原样使用的 async 引擎。传入时它不会在 shutdown 时被释放 —— 由调用方负责其生命周期。省略时,引擎会在 __aenter__ 时依据 URL 构造,并在 shutdown 时释放。
dict | None
默认值:"None"
当引擎由内部构造时,转发给 create_async_engine 的额外关键字参数(如 pool_sizeecho)。
要换用以上两种后端都未覆盖的数据库,实现同一接口即可:
存储层管理的记录类型:

服务内部结构

如果开发者需要在 AgentScope 中扩展或嵌入智能体服务的实际实现,本节描述 FastAPI 应用是如何拼装起来的 —— 启动时跑哪些逻辑、由哪些 manager 持有运行时状态、中间件在请求路径中的位置,以及 router 如何拿到这些资源。

Lifespan

Lifespan context manager 每个进程仅运行一次。基于 AsyncExitStack 构建,启动时按顺序进入资源 —— storage → message bus → workspace manager → 可选的 blob store 与 knowledge base manager → background task manager → scheduler manager → chat run registry → chat / session / knowledge base 服务 → 可选的 index worker 与 sweeper → wakeup dispatcher —— 关闭时按相反顺序拆除。如果任何启动步骤抛错,已进入的资源仍会被妥善清理。Scheduler 在进入时会恢复持久化的 cron 任务以保证它们跨重启生效。

Manager

下列资源在 lifespan 期间被绑定到 FastAPI 应用状态上,所有请求共享:

中间件

两个独立的中间件层在不同作用域上运作。 ASGI 中间件包裹每次 HTTP 请求。实际场景中常见两类:协议中间件(例如 AGUIProtocolMiddleware),拦截会话流端点的 SSE 响应并把每帧改写为目标协议;可观测性中间件(例如 OpenTelemetry tracing)。两者都通过 extra_middlewares 安装。 智能体层中间件包裹 ChatService 内对智能体的每次调用,暴露在 agentscope.app.middleware 下;框架始终安装三个:
  • InboxMiddleware —— hint 注入的唯一所有者。每次推理步骤前会清空会话收件箱,并把队列中的 HintBlockHintBlockEvent 形式 yield 出来,让调度触发、团队消息与卸载工具结果都通过同一路径流入智能体上下文。
  • ToolOffloadMiddleware —— 工具调用超时后会被转入后台 watcher 任务,并向智能体 yield 一个合成占位结果。当 watcher 完成时,结果连同唤醒被推回会话收件箱,下一次运行时被取走。
  • StateChangeMiddleware —— 在智能体状态发生变化时(例如 tasks_contextpermission_context)发出 CustomEvent,让前端无需读取原始状态快照即可作出反应。
要添加自己的中间件(审计日志、租户隔离、自定义鉴权……),向 create_app 传入 extra_agent_middlewares 工厂。该工厂在每次组装智能体时被调用一次,其返回的中间件会追加到框架自带的之后。

依赖

Router 通过 FastAPI 的 Depends() 拿到应用状态。标准注入项(位于 agentscope.app.deps)如下:

延伸阅读

Agent

核心智能体抽象与 ReAct 循环

Message & Event

事件流与消息重建

Tool

内置与自定义工具,包括外部执行

Context

上下文压缩与工作区 offloading