跳转到主要内容
智能体服务(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 与凭证类型集合,全部在边界处开放,可在不动框架代码的前提下替换。

能力概览

能力说明
智能体团队(Agent Team)Leader 智能体派生 worker 智能体,并通过内置 team 工具协调它们;详见 Agent Team 章节。
工作区管理可配置的工作区隔离粒度 —— per_agent(默认)、per_sessionper_user —— 管理智能体的文件系统、MCP client 与 skill。
知识库(RAG)可选的内置知识库服务,支持文档摄取、切片、embedding 与自然语言检索 —— 向 create_app 传入 knowledge_base_manager 即可启用。
后台任务卸载(Background Task Offloading)长耗时工具调用切到后台执行,完成时通过会话事件流回送结果。
Cron 调度按时间触发智能体执行,支持有状态或无状态会话;调度持久化保存,跨重启生效。
会话回放(Session Replay)后接入的客户端订阅按会话 SSE 流时,会先收到缓冲历史再接收实时事件,多 tab 或重连前端因此保持同步。
中断通过 POST /sessions/{id}/interrupt 可以从外部取消正在运行或处于 HITL 暂停的 chat run;智能体会干净展开并保持可接受下一次输入的状态。
协议适配(Protocol Adaptation)通过中间件(Middleware)在 AgentScope 原生事件流之上转换为外部协议(AG-UI、A2A 等)。
分布式部署 WIP全部共享状态保存在 Redis(存储 + 消息总线(Message Bus))中,多个 worker 进程 —— 或多台节点 —— 可以服务同一个逻辑服务。
本服务自带用户鉴权系统。它提供 X-User-ID header 占位依赖,由开发者替换为自己的鉴权中间件(JWT、OAuth、session token 等)。

快速上手

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

试用示例

examples/agent_service 目录启动一个开箱即用的服务,examples/web_ui 是与之配套的 React 前端。两者一起运行,几分钟就能体验上述全部能力。
后台工具卸载与唤醒演示
权限系统 bypass 模式演示
任务规划演示
智能体团队协作演示
1

克隆仓库

git clone https://github.com/agentscope-ai/agentscope.git
cd agentscope
2

启动示例后端

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

启动示例前端

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

嵌入到自己的代码

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

# Agent、session、credential、message、schedule 的持久化层。
# 连接池在应用启动时打开、关闭时关闭。
storage = RedisStorage(host="localhost", port=6379)

# Redis 支撑的消息总线:session 锁、回放日志、收件箱队列与
# 唤醒信号,将 chat 触发与事件投递解耦,
# 让多个 worker 进程能共享同一个逻辑 service。
message_bus = RedisMessageBus(host="localhost", port=6379)

# Workspace 生命周期 —— 工作目录、MCP client、skill。
# 内置 manager 按 agent 隔离:同一 agent 的所有 session 共享一个 workspace。
# 空闲 workspace 经过 `ttl` 秒后被淘汰。
workspace_manager = LocalWorkspaceManager(
    basedir="/data/workspaces",
    ttl=3600.0,
)

app = create_app(
    storage=storage,
    message_bus=message_bus,
    workspace_manager=workspace_manager,
)

uvicorn.run(app, host="0.0.0.0", port=8000)

create_app 参数

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

典型操作流程

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

创建智能体

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

创建并配置凭证

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

创建会话并选择模型

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

配置 MCP 与 skill(可选)

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

开始聊天

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

资源模型

智能体服务中的每次操作都归属于从请求中解析出的 user_id。在该边界之下,服务管理七类资源 —— 六类持久化资源(图左侧)加把它们运行时行为串起来的消息总线(图右侧):
资源说明
User从请求中解析出的不透明租户标识。服务自身不建模用户系统;通过 get_current_user_id 接入自己的实现。
Credential某个模型 provider 的连接配置 —— 一个 API key 加上 provider 特有设置。可在多个智能体与会话间复用。
Agent展示名、system prompt 与运行时配置(context、ReAct 循环)。可复用的模板 —— 身份属于智能体,运行时状态属于会话。
Workspace智能体的运行时环境 —— 工作目录、MCP client、skill、卸载的上下文。工作区如何映射到 user / agent / session 由工作区管理器决定。
Session用户与智能体之间一次正在进行的会话。承载智能体状态(工作记忆、未完成的 reply、permission context)、持久化消息记录,以及该会话运行所用的 LLM 配置。
Schedule按 cron 表达式触发智能体。每次触发都在一个会话内运行 —— 可以每次新建(无状态),也可以复用以让上下文跨次累积(有状态)。Schedule 可在重启后保留。
MessageBusRedis 支撑的运行时层 —— 会话锁、回放日志、收件箱队列、唤醒信号。是调度触发、团队消息与后台工具完成抵达空闲会话的唯一投递通道;也是支撑多进程运行的基础。
要记住的形态:智能体是可复用的模板,会话是运行时状态的承载单位,而消息总线则是当外部事件(调度、队友、后台工具)有话要说时把空闲会话唤醒的桥梁。

API 概览

服务把资源模型中的资源暴露为 REST 端点,外加流式聊天端点。下表按类别分组;完整请求与响应结构由服务的 OpenAPI 规格描述。
类别端点说明
ChatPOST /chat触发某会话的一次 chat 运行;返回 ChatTriggerResponse JSON。请求体可以是新的 Msglist[Msg]UserConfirmResultEvent / ExternalExecutionResultEvent(HITL 续接)或 None(继续当前状态)。事件通过按会话流异步投递。
Session streamGET /sessions/{id}/stream按会话的 AgentEvent SSE 流,支持后接入者的缓冲回放与多订阅者扇出。
Session controlPOST /sessions/{id}/interruptGET /sessions/{id}/status中断正在运行或处于 HITL 暂停的 chat run;探测统一的会话状态(running / parked / idle / gone)。
SessionsGET/POST/PATCH/DELETE /sessions创建与管理聊天会话,包括模型绑定与 permission level。
MessagesGET /sessions/{id}/messages分页拉取某会话的消息记录(offsetlimit)。
AgentsGET/POST/PATCH/DELETE /agent管理智能体记录 —— 展示名、system prompt、运行时配置。
Agent schemaGET /agent/schema/v2用于前端渲染智能体表单的完整 AgentData JSON Schema。(GET /agent/schema 保留作向后兼容但已弃用。)
CredentialsGET/POST/PATCH/DELETE /credential各 provider 的 API key 与连接配置 CRUD。
Credential schemasGET /credential/schemas发现已注册的全部凭证类型及其 JSON 参数 schema,用于表单渲染。
ModelsGET /model?provider=<name>列出某 provider 下的候选聊天模型,附带声明式 ModelCard(能力与参数 schema)。
TTS modelsGET /tts-model?provider=<name>列出某支持 TTS 的 provider 下的候选语音合成模型。
SchedulesGET/POST/PATCH/DELETE /scheduleGET /schedule/{id}/sessions管理 cron 触发的智能体执行,有状态或无状态。
Workspace MCPsGET/POST /workspace/mcpDELETE /workspace/mcp/{mcp_name}管理挂在会话工作区上的 MCP client。每条返回项包含实时的工具列表与健康状态。
Workspace skillsGET/POST /workspace/skillDELETE /workspace/skill/{skill_name}管理会话工作区中可用的 skill。
Knowledge basesGET/POST/PATCH/DELETE /knowledge_bases知识库的 CRUD。仅当向 create_app 传入 knowledge_base_manager 时启用。
KB documentsGET/POST /knowledge_bases/{id}/documentsGET /knowledge_bases/{id}/documents/statusDELETE /knowledge_bases/{id}/documents/{doc_id}在知识库中上传、列出、删除文档,并批量查询索引状态。
KB searchPOST /knowledge_bases/{id}/search对某个知识库执行自然语言检索。
KB discoveryGET /knowledge_bases/embedding_modelsGET /knowledge_bases/supported_content_typesGET /knowledge_bases/middleware/parameters_schema发现兼容的 embedding 模型、可摄取的文件类型,以及 KB 中间件的可调参数 schema,用于表单渲染。

自定义

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

智能体聊天协议

按会话流端点(GET /sessions/{id}/stream)通过 SSE 输出 AgentScope 原生的 AgentEvent 流。要让同一智能体服务于不同前端协议,安装协议中间件拦截 SSE 流并改写每帧。 AgentScope 内置 AGUIProtocolMiddleware 适配 AG-UI 协议。通过 extra_middlewares 装载:
from fastapi.middleware import Middleware
from agentscope.app import create_app
from agentscope.app.middleware import AGUIProtocolMiddleware

app = create_app(
    storage=storage,
    extra_middlewares=[
        Middleware(AGUIProtocolMiddleware),
    ],
)
新增协议时,继承 ProtocolMiddlewareBase 并实现 _convert_to_protocol
from agentscope.app.middleware import ProtocolMiddlewareBase
from agentscope.event import AgentEvent

class MyProtocolMiddleware(ProtocolMiddlewareBase):
    def _convert_to_protocol(self, event: AgentEvent) -> dict:
        # 把 AgentEvent 转换为目标协议的帧格式。
        return {"type": event.type, "data": event.model_dump()}
中间件自动拦截会话流端点返回的 StreamingResponse,把每条 SSE 帧反序列化回 AgentEvent,调用 _convert_to_protocol() 生成目标格式后重新序列化。

用户鉴权

内置的 get_current_user_id 依赖从请求 header X-User-ID 中读取调用者身份 —— 这是占位实现,不是真正的鉴权。用自己的依赖覆盖即可对接任何身份系统。 JWT bearer token:
from fastapi import Header, HTTPException, status

async def get_current_user_id(
    authorization: str = Header(...),
) -> str:
    try:
        payload = decode_jwt(authorization.removeprefix("Bearer "))
        return payload["sub"]
    except InvalidTokenError:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid authentication token.",
        )
OAuth2 password flow:
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

async def get_current_user_id(token: str = Depends(oauth2_scheme)) -> str:
    user = await verify_oauth_token(token)
    if user is None:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED)
    return user.id
通过 FastAPI 的依赖覆盖机制把自定义实现挂上去:
from agentscope.app.deps import get_current_user_id as default_dependency

app.dependency_overrides[default_dependency] = get_current_user_id
默认的 X-User-ID header 不提供鉴权。生产部署前请始终替换为安全机制。

工作区实现与隔离

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


class CustomWorkspaceManager(WorkspaceManagerBase):
    async def get_workspace(
        self,
        user_id: str,
        agent_id: str,
        session_id: str,
        workspace_id: str,
    ) -> WorkspaceBase:
        # 用自己的隔离策略取出已初始化的工作区。
        ...

    async def close(self, workspace_id: str) -> None:
        # 关闭并淘汰单个工作区。
        ...

    async def close_all(self) -> None:
        # 关闭全部缓存中的工作区;应用关闭时调用。
        ...

API 凭证

新增凭证类型由两类组成:一个 CredentialBase 子类负责描述连接配置(并发布 JSON schema 用于表单渲染),一个 ChatModelBase 子类实现针对该 provider API 的流式聊天协议。凭证类是入口 —— 它告诉服务该实例化哪个 chat model 类。
from agentscope.credential import CredentialBase
from agentscope.model import ChatModelBase

class MyProviderChatModel(ChatModelBase):
    # 针对 provider API 实现流式聊天接口。
    ...

class MyProviderCredential(CredentialBase):
    api_key: str
    endpoint: str = "https://api.my-provider.com"

    @classmethod
    def get_chat_model_class(cls):
        return MyProviderChatModel
把凭证类注册到 app 上,客户端立即可用:
app = create_app(
    storage=storage,
    extra_credentials=[MyProviderCredential],
)
服务自动通过 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 包含以下字段:
字段说明
nameprovider 侧的模型标识。
labelUI 中显示的名称。
statusactivedeprecatedsunset 之一。
deprecated_at弃用时间戳,如有。
input_types模型接收的 MIME 类型(例如 text/plainimage/pngvideo/mp4)。
output_types模型输出的 MIME 类型(例如 text/plainapplication/x-thinking)。
context_size上下文窗口的最大 token 数。
output_size最大输出 token 数。
parameter_schema请求参数的 JSON schema,自动与各模型 overrides 合并。
parameters_overrides叠加在基础参数 schema 之上的各模型差异。
下面的 YAML 示例描述一个接受文本、图像、视频,并输出文本与思考链路的多模态模型:
qwen3.6-plus.yaml
name: qwen3.6-plus
label: Qwen3.6-Plus
status: active

input_types:
  - text/plain
  - application/x-thinking
  - image/bmp
  - image/jpeg
  - image/png
  - image/tiff
  - image/webp
  - image/heic
  - video/mp4

output_types:
  - text/plain
  - application/x-thinking

context_size: 1000000
output_size: 65536

parameter_overrides:
  max_tokens: {"maximum": 65536}
要在已有 provider 下新增模型,把 YAML 文件丢进 provider 模型目录即可 —— loader 会自动拾取,新条目会出现在 GET /model?provider=<name> 中。

存储后端

StorageBase 抽象类定义了智能体、会话、凭证、消息、调度、团队与知识库记录的持久化契约。AgentScope 内置 RedisStorage 实现:
from agentscope.app.storage import RedisStorage

storage = RedisStorage(
    host="localhost",
    port=6379,
    db=0,
    password="your-password",
)
要换用其他数据库,实现同一接口即可:
from agentscope.app.storage import StorageBase


class PostgresStorage(StorageBase):
    async def __aenter__(self):
        # 打开连接池。
        ...

    async def __aexit__(self, exc_type, exc_val, exc_tb):
        # 关闭连接池。
        ...

    # 为每类记录实现 CRUD 方法:
    # agent、session、credential、message、schedule、team、
    # knowledge base、knowledge document。
    ...

app = create_app(
    storage=PostgresStorage(dsn="postgresql://..."),
    message_bus=message_bus,
    workspace_manager=workspace_manager,
)
存储层管理的记录类型:
记录说明
AgentRecord智能体配置(name、system prompt、context config、react config、invite config)。
SessionRecord会话状态,包含 AgentState、模型配置与工作区绑定。
CredentialRecord加密保存的模型 provider API key。
ScheduleRecordCron schedule 定义及执行历史。
TeamRecord团队身份、leader 绑定与 worker 成员列表。
KnowledgeBaseRecord知识库身份、embedding 模型绑定与中间件参数。仅在启用知识库功能时使用。
KnowledgeDocumentRecordKB 上传文档的元数据与索引状态。仅在启用知识库功能时使用。
Msg按会话持久化的消息,支持分页。

服务内部结构

如果开发者需要在 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 应用状态上,所有请求共享:
资源职责
MessageBusRedis 支撑的运行时原语(会话锁 + 回放日志、收件箱队列、唤醒信号)。是调度触发、团队消息与后台工具完成抵达空闲会话的唯一投递通道;也是支撑多进程运行的基础。
WakeupDispatcher每个进程一个。订阅唤醒信号,对每条入队的唤醒驱动 ChatService.run 处理目标会话。
BackgroundTaskManager纯 asyncio 任务注册表。ToolOffloadMiddleware 在此派生 watcher 任务;结果通过消息总线(inbox + wakeup)回送,而不是保留在该 manager 中。
ChatRunRegistry单进程注册表,为 POST /chat 强制“同一会话仅一次运行”规则。重复提交会以 HTTP 409 返回。
SchedulerManager基于 APScheduler 的 cron 执行。触发时,trigger 会向目标会话的收件箱推一个 HintBlock 并入队一个唤醒 —— 不直接调用 ChatService
WorkspaceManager工作区生命周期与 TTL 缓存;隔离粒度(per_agentper_sessionper_user)在管理器上配置。
ChatService运行或中断会话的唯一入口。加载记录、组装 toolkit、构建中间件、获取消息总线会话锁,并驱动智能体的 reply 流。
SessionService组合 storage 与 message bus,处理会话级操作:创建 / 更新 / 删除、探测统一的 SessionStatus,以及派发中断。
KnowledgeBaseService可选。向 create_app 传入 knowledge_base_manager 时启用,负责 /knowledge_bases 下的 CRUD、上传与检索端点。
IndexWorker / IndexSweeper可选。enable_index_worker=True 时在进程内启动;消费上传任务、回收孤立 blob。作为专用 worker 部署时可跳过。

中间件

两个独立的中间件层在不同作用域上运作。 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)如下:
依赖返回
get_current_user_id调用者的 user id —— 可被覆盖以对接任意鉴权系统。
get_storage绑定在 app 上的 StorageBase 实例。
get_message_bus绑定在 app 上的 MessageBus 实例。
get_workspace_manager由 lifespan 绑定的 WorkspaceManager
get_background_task_manager由 lifespan 绑定的 BackgroundTaskManager
get_scheduler_manager由 lifespan 绑定的 SchedulerManager
get_chat_run_registry单进程 ChatRunRegistry,用于强制“同一会话仅一次运行”规则。
get_chat_service由 lifespan 绑定的 ChatService
get_session_serviceSessionService,组合 storage 与 message bus 处理会话生命周期、状态探测与中断。
get_extra_agent_middlewares传入 create_app 的可选 AgentMiddlewareFactory
get_extra_agent_tools传入 create_app 的可选 AgentToolFactory
get_knowledge_base_managerKnowledgeBaseManagerBase(未启用 KB 功能时返回 503)。
get_knowledge_base_serviceKnowledgeBaseService(未启用 KB 功能时返回 503)。
get_blob_store支撑 KB 上传的 BlobStoreBase(未启用 KB 功能时返回 503)。
get_knowledge_parsers为 KB 上传配置的 parser 注册表(未启用 KB 功能时返回 503)。

延伸阅读

Agent

核心智能体抽象与 ReAct 循环

Message & Event

事件流与消息重建

Tool

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

Context

上下文压缩与工作区 offloading