跳到主要内容

Upsonic 是什么 · 全景与阅读地图

30 秒导读: Upsonic 是一个 Python 的自主 agent 框架(pyproject.toml 里自称 "Agent Framework For Fintech")。你只用两个东西——Agent(谁来干)和 Task(干什么)——调一次 print_do/do 就能跑起来。它的价值不在"调用模型",而在把一次运行拆成一条 24 步的可插拔管线:记忆、系统提示、工具、安全策略、模型调用、可靠性校验、落库,每一步各司其职。本页是全库的门厅:先讲清它是什么、大概怎么转,再给一张"该读哪一章"的地图。


1. 这是什么(零基础也能懂)

一句话定义。 Upsonic 是一个用 Python 写 AI agent 的框架:你声明一个任务,交给一个 agent,它自己去调用大模型、(必要时)调用工具、把结果整理好还给你。

解决谁的什么问题。 假设你想让一个 AI "分析服务器日志、找出异常模式",或者"分析当前市场行情"。你不想手写"拼 prompt → 调 OpenAI → 解析返回 → 再调一次工具 → 校验结果"这一整套胶水代码。Upsonic 把这套胶水固化成一条标准管线,你只描述"要做什么",剩下的流程它替你跑完。

它对外提供的能力(顶层导出)。 包只在顶层暴露少数几个类,其余都要从子模块导入——这份"白名单"本身就是最好的功能清单:

顶层类白话职责相关章
Agent(别名 Clanker传统 agent:一次任务→一次(多轮工具)应答01
AutonomousAgent自主 agent:在受限工作区里持续用文件/shell 工具干活06
Task一次要做的事的声明式描述01
Team多智能体协作与委派代码地图 → team/
Graph把多个任务/agent 串成有向流程代码地图 → graph/
KnowledgeBaseRAG / 文档知识库代码地图 → knowledge_base/
Chat / Direct / Simulation / RalphLoop会话封装 / 裸模型直调 / 仿真 / 自主开发循环06

真源码:这份白名单在 src/upsonic/__init__.py:145-159__all__),且通过 __getattr__src/upsonic/__init__.py:105-143惰性加载——用到哪个类才 import 哪个,避免一上来就拖入重依赖。

用起来什么样(最小可用示例)

传统 agent —— 建 Agent、建 Taskprint_do 触发(源自 README):

from upsonic import Agent, Task

agent = Agent(model="anthropic/claude-sonnet-4-5", name="Stock Analyst Agent")
task = Task(description="Analyze the current market trends")

agent.print_do(task) # 跑一次并把结果打印出来

自主 agent —— 只多给一个 workspace,所有文件/shell 操作被限制在这个目录内(源自 README):

from upsonic import AutonomousAgent, Task

agent = AutonomousAgent(
model="anthropic/claude-sonnet-4-5",
workspace="/path/to/logs", # 文件/shell 操作只能落在这里,路径穿越与危险命令被拦
)
task = Task("Analyze server logs and detect anomaly patterns")

agent.print_do(task)

两段代码的形状一模一样:建 agent → 建 task → 一个动词触发。这就是 Upsonic 想给你的直觉。

触发动词有四个变体,区别只在"同步/异步"和"是否打印":

方法同步/异步是否打印结果源码
do同步否(返回内容)src/upsonic/agent/agent.py:4074
print_do同步src/upsonic/agent/agent.py:4129
do_async异步src/upsonic/agent/agent.py:3649
print_do_async异步src/upsonic/agent/agent.py:4176

同步版其实是异步版的薄封装:do 把字符串转成 Task 后,直接把 do_async(...) 丢进一个常驻后台事件循环里跑(src/upsonic/agent/agent.py:4118-4127,走 _run_in_bg_loop,见 agent.py:37)。所以真正的主线只有一条:do_async

一句话直觉。 把 Upsonic 想成"声明式 Task + 可插拔管线":Task 只说"做什么"(像一张工单),Agent 不亲自写流程,而是把这张工单送上一条固定的 24 步流水线(Pipeline),流水线每一站负责一件事,跑到终点就有结果。你能替换/开关某些站(记忆、可靠性、安全),但不用重写主流程。


2. 顶层全景(它大概怎么转)

怎么读这张图: 从上到下是一次 do_async 的数据流。Agent 是门面,真正干活的是中间那条 Pipeline;管线在需要时向右侧的三个横向子系统(模型层 / 工具 / 安全 & 记忆)借力。

你的代码
Agent(...).print_do(Task(...))


┌───────────────┐ 同步→异步的唯一入口
│ do / print_do │──► do_async() agent.py:3649
└───────────────┘ │ 建 run_id、开 OTel span、推 usage scope

_do_async_pipeline() agent.py:3898
│ 按 timeout/streaming 选管线,交给 PipelineManager

┌──────────────────────────────────────────┐
│ 24 步 Pipeline(主线) │ _create_direct_pipeline_steps
│ 初始化 → 存储 → 缓存 → 选模型 → 装工具 │ agent.py:4650-4675
│ → 载记忆 → 拼系统提示 → 建上下文(RAG) │
│ → 用户策略 → 拼消息 → ★调模型 → 处理响应 │
│ → 反思 → 可靠性校验 → agent 策略 → 落库 │
└───────┬───────────────┬──────────────┬────┘
│ │ │
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌──────────────────┐
│ 模型层 │ │ 工具系统 │ │ 安全 / 记忆 / 存储 │
│ 20+ 家 │ │ 自定义/MCP │ │ Policy / Memory │
│ infer_ │ │ /HITL/编排 │ │ / Storage │
│ model() │ │ │ │ │
└───────────┘ └───────────┘ └──────────────────┘
models/ tools/ safety_engine/
memory/ storage/

部件一句话职责:

部件干什么在哪(目录/符号)
Agent / Clanker门面:持有配置,暴露 do/print_do,不亲自写流程src/upsonic/agent/agent.py:150class Agent),agent.py:5424Clanker = Agent
Task声明式工单:描述、工具、响应格式、上下文、运行态src/upsonic/tasks/tasks.py:21class Task
do_async真正的运行入口:建 run_id、开 OTel、推 usage 作用域,再委派管线src/upsonic/agent/agent.py:3649
_do_async_pipelinetimeout/partial_on_timeout 选"直连/流式/带超时"三种管线之一src/upsonic/agent/agent.py:3898
PipelineManager顺序执行步骤列表,支持从某一步 resume(HITL)src/upsonic/agent/pipeline/manager.py:41execute:230
24 步 steps一次运行被拆成的原子站点,各司其职src/upsonic/agent/agent.py:4650-4675
模型层"provider/model" 字符串解析成可调用模型对象src/upsonic/models/__init__.py:2064infer_model

主线走一遍(高层,不进代码)

  1. 你调 agent.print_do(task) —— 同步入口把字符串转成 Task,把工作丢给 do_async
  2. do_async 为这次运行发一个 run_id、开一个 OpenTelemetry span、把 agent/task 的用量作用域压栈,然后调 _do_async_pipelineagent.py:3819)。
  3. _do_async_pipeline 看参数选管线:没超时走直连管线(24 步),要"超时返回已生成的部分"就走流式管线(agent.py:3911-4009)。
  4. PipelineManager.executestart_step_index 开始,逐站执行。第 14 站 ModelExecutionStep 才真正调模型;其前是准备(记忆/提示/工具/策略),其后是收尾(响应处理/反思/可靠性/落库)。
  5. 终点把结果写进 AgentRunOutputdo_async 收尾时打印指标、弹出作用域,把内容(或完整 output)还给你。

想看这 24 步逐站讲清楚,去 02 一次运行如何跑完 24 步管线

一个易错点: 直连管线是 24 步(索引 0–23,agent.py:4650-4675),流式管线是 22 步_create_streaming_pipeline_stepsagent.py:4724-4747,用 StreamModelExecutionStep 等替换掉直连版的若干步)。全景图与本页所说"24 步"均指默认的直连管线。


3. 阅读地图(该按什么顺序读)

本页是 Layer 0(这是什么)+ Layer 1(顶层全景)。再往下,每个子系统各有一章,按"由浅入深"排:

  1. 先建立主抽象的直觉01-agent-and-task.mdAgentTask 各自装了什么、边界在哪。读完你才知道那张工单和那个门面里到底有什么字段。
  2. 再读主线(核心,务必读)02-execution-pipeline.md:24 步管线逐站讲,PipelineManager 怎么调度、HITL 怎么从中间 resume。这是整个框架价值密度最高的一章。
  3. 然后按需下钻横向子系统:
    • 模型怎么来 → 03-model-layer.mdinfer_model 如何把字符串变成 20+ 家 provider 的可调用模型)。
    • 手脚怎么长 → 04-tools-system.md(自定义 @tool、MCP、人在环 HITL、工具编排)。
    • 护栏怎么设 → 05-safety-engine.mdPolicy/Rule/Action,用户侧与 agent 侧两道策略)。
  4. 最后看自主形态06-autonomous-and-ralph.mdAutonomousAgent 的受限工作区与 RalphLoop 自主开发循环。

如果你只有 10 分钟: 读本页 + 02 的管线总表即可讲清"Upsonic 是做什么的、核心原理是什么"。


4. 全库代码地图(导航索引)

按"先主线、后子系统"排。优先用符号名 grep(比行号抗上游漂移)。前 8 行是本组各章深讲的主题;后半是本页不展开、但你迟早会碰到的相邻子系统,作为广度索引点名指向对应目录。

4.1 主线与两个主抽象(本组各章深讲)

主题文件路径符号名
顶层公共导出(白名单 + 惰性加载)src/upsonic/__init__.py__all____getattr___lazy_import
Agent 门面(主 agent 类)src/upsonic/agent/agent.pyclass AgentClanker = Agent
同步触发(薄封装)src/upsonic/agent/agent.pydoprint_do_run_in_bg_loop
异步主入口src/upsonic/agent/agent.pydo_async
选管线并执行src/upsonic/agent/agent.py_do_async_pipeline
24 步 / 22 步管线装配src/upsonic/agent/agent.py_create_direct_pipeline_steps_create_streaming_pipeline_steps
管线调度器src/upsonic/agent/pipeline/manager.pyclass PipelineManagerexecuteexecute_stream
单步基类src/upsonic/agent/pipeline/step.pyPipelineStepexecuteexecute_stream
任务工单src/upsonic/tasks/tasks.pyclass Task
裸模型直调门面src/upsonic/direct.pyclass Direct

4.2 横向子系统(对应各深入章)

子系统目录入口符号 / 说明
模型层(20+ provider)src/upsonic/models/infer_model__init__.py)、model_registry.py、各家 openai.py/anthropic.py03
工具系统src/upsonic/tools/@tool(README 示例)、MCP、编排04
安全引擎src/upsonic/safety_engine/policies/base/models.pyllm/05
自主 agentsrc/upsonic/agent/autonomous_agent/autonomous_agent.pyfilesystem_toolkit.pyshell_toolkit.py06
Ralph 自主开发循环src/upsonic/ralph/loop.pyphases/state/config.py06

4.3 本页未展开的相邻子系统(广度索引,点名指向目录)

这些子系统在全景图右侧被管线"借力",但本组不各自开章深讲。需要时按目录进去看:

相邻子系统目录一句话
记忆 / 存储 / 会话src/upsonic/memory/src/upsonic/storage/src/upsonic/session/管线第 6/22 步载入与保存记忆;storage/ 有 in_memory/json/sqlite/redis/postgres/mongo/mem0 多后端;session/ 定义会话/agent 运行态
可靠性层src/upsonic/reliability_layer/第 18 步:验证/编辑 agent 迭代提升产出质量(reliability_layer.py
反思src/upsonic/reflection/第 16 步:processor.pymodels.py 对输出做自我反思
多智能体src/upsonic/team/src/upsonic/graph/src/upsonic/graphv2/Team 做委派协作;Graph/graphv2 把多个 agent/任务编成有向流程
OCRsrc/upsonic/ocr/分层 OCR 管线(Layer 0 文档预处理 + Layer 1 引擎:EasyOCR/RapidOCR/Tesseract/PaddleOCR…),供知识库摄取
知识库 / RAGsrc/upsonic/knowledge_base/vectordb/embeddings/loaders/text_splitter/KnowledgeBase 为主入口;向量库/嵌入/加载器/切分器分散在各目录

5. 边界与本页范围

  • 本页只做 Layer 0 + Layer 1 + 路由:讲清"是什么、怎么转、去哪读",不复述各章的深入实现。
  • "24 步"指默认的直连管线;流式管线为 22 步,仅在需要超时返回部分结果时启用(见 §2 末的易错点)。
  • 各横向子系统的真正机制(模型解析、工具编排、安全 Policy 判定、记忆读写)留给对应章;本页给的是"它们在主线的哪一步被用到"这层广度判断。
  • 代码引用均以 sourceCommit: 101f0313b0ddb96cd4078354879b2ff57005db29 为准;行号可能随上游漂移,优先按符号名定位