Doramagic 项目包 · 项目说明书
Upsonic 项目
使用 Python 构建可自主运行的 AI 代理。
概述、安装与快速入门
Upsonic 是一个面向生产环境的 AI 智能体(Agent)框架,主打"极简智能体(minimalist agent)+ MCP(Model Context Protocol)"的核心理念,覆盖从本地原型到分布式部署的完整工具链 README.md。框架通过一组统一的 Python API 与 CLI 工具,让开发者能够在不依赖云服务的前提下完成智能体的开发、测试、运行...
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
1. 项目概述
Upsonic 是一个面向生产环境的 AI 智能体(Agent)框架,主打"极简智能体(minimalist agent)+ MCP(Model Context Protocol)"的核心理念,覆盖从本地原型到分布式部署的完整工具链 README.md。框架通过一组统一的 Python API 与 CLI 工具,让开发者能够在不依赖云服务的前提下完成智能体的开发、测试、运行与打包。
核心项目括:智能体运行时(同步/异步双路径)、细粒度事件流(events)、多模态输入处理(文本、URL、二进制内容)、结构化输出(内置类型与 Pydantic 模型)以及基于 FastAPI + Swagger UI 的服务化能力。
社区动态:v0.75.0 引入KBState状态机管理知识库生命周期(UNINITIALIZED → CONNECTED → INDEXED → CLOSED);v0.76.0 起预置 Applied Scientist 等可直接使用的智能体;当前最新版本为 v0.77.3(2026-05-19),主要修复了集中化用量注册表 v0.77.3 Release。v0.77.1 起 CI 切换为uv publish,发布链路更稳定 v0.77.1 Release。
2. 安装方式
Upsonic 以 Python 包形式分发,可通过 uv(首选)或 pip 安装。CLI 子命令 upsonic install 会读取 upsonic_configs.json 中的依赖段并执行安装流程 src/upsonic/cli/printer.py。
# 直接安装库
pip install upsonic
# 通过 CLI 安装项目配置中声明的依赖
upsonic install # 安装 api 段(默认)
upsonic install streamlit # 安装 streamlit 段
upsonic install all # 一次性安装全部段
install 命令在执行时优先调用 uv,若不可用则回退到 pip src/upsonic/cli/commands/install/__init__.py。
3. CLI 快速入门
upsonic CLI 提供一组面向项目的脚手架与运行时命令,统一在 src/upsonic/cli/commands/__init__.py 中导出:
| 命令 | 作用 | 主要来源文件 |
|---|---|---|
upsonic init | 提示输入 agent 名称并生成 main.py / upsonic_configs.json 模板 | init/command.py |
upsonic add <lib> <section> | 往指定段(api/streamlit/development)追加依赖 | printer.py |
upsonic remove <lib> <section> | 从指定段移除依赖(剥离版本号/extras 后按包名匹配) | remove/command.py |
upsonic install [section] | 按段或 all 安装依赖 | printer.py |
upsonic run [--host --port] | 启动 FastAPI 服务并暴露 /docs Swagger UI | printer.py |
upsonic zip [filename] | 打包当前目录为 zip,便于备份分享 | printer.py |
3.1 项目初始化流程
flowchart LR
A[upsonic init] --> B{输入 agent 名称}
B --> C[生成 main.py]
B --> D[生成 upsonic_configs.json]
D --> E[upsonic add / install]
E --> F[upsonic run]
F --> G[FastAPI + Swagger UI /docs]初始化时若目标文件已存在,CLI 会提示是否覆盖;remove 命令在解析包名时会按 == / >= / <= / ~= / != / / ; 等分隔符拆分,剥离版本与 extras 后执行匹配 [src/upsonic/cli/commands/remove/command.py。
4. 配置文件与默认结构
upsonic_configs.json 是项目的中枢配置,由 init 命令生成,涵盖输入/输出 schema、机器规格、依赖段以及入口文件指针 src/upsonic/cli/commands/init/command.py。
- api 段(默认):
fastapi>=0.115.12、uvicorn>=0.34.2、celery>=5.5.2、sqlalchemy>=2.0.40、psycopg2-binary>=2.9.9、redis>=5.0.0、fire>=0.7.0等; - streamlit 段:固定为
streamlit==1.32.2、pandas==2.2.1、numpy==1.26.4; - development 段:
watchdog、pytest、ipdb、streamlit-autorefresh等。
CLI 还会基于 input/output schema 自动生成 OpenAPI 规范,类型映射规则定义于 src/upsonic/cli/commands/shared/openapi.py,常见映射如 files → JSON array<string> / Multipart array<string, format=binary>;file/binary → JSON string / Multipart string, format=binary。
5. 智能体运行与事件
运行时通过 events 模块暴露细粒度回调,包括文本增量(yield_text_delta_event)、工具调用(yield_tool_call_event / yield_tool_result_event)、缓存命中(yield_cache_hit_event)、策略校验(yield_policy_check_event)、反思与可靠性(yield_reflection_event / yield_reliability_event)等,每个事件均提供同步与异步(a* 前缀)两个版本 src/upsonic/utils/agent/events.py。
输入侧支持文本、ImageUrl / DocumentUrl(自动通过 httpx 下载并转换为 BinaryContent)以及本地二进制资源 src/upsonic/run/agent/input.py;输出侧可声明为内置 str 或任意 Pydantic 模型,通过 ModelResponsePartTypeAdapter 与 ModelProfile.from_dict 进行反序列化 src/upsonic/run/agent/output.py。
6. 常见问题与社区反馈
- 缺少 temperature 参数:社区 #333 反馈 Agent 配置类未暴露
temperature顶层字段,需通过底层模型客户端进行设置 Issue #333。 - MCP 集成位置:#244 中用户询问
add_mcp_server的环境变量与添加位置,建议参考 MCP server 注册文档 Issue #244。
参见
- CLI 命令索引:参见
src/upsonic/cli/commands/下各子模块 - 事件与可观测性:参见
src/upsonic/utils/agent/events.py - 输入/输出序列化:参见
src/upsonic/run/agent/input.py与output.py - 发布历史:参见 GitHub Releases
来源:https://github.com/Upsonic/Upsonic / 项目说明书
智能体、团队与图编排
Upsonic 定位为"在 Python 中构建自主 AI 智能体"的框架,其能力分三层堆叠:单个 Agent 负责与模型、工具和上下文进行单次或多次交互;Team 把多个 Agent 组合为协作单元;Graph 则以有向方式编排这些节点,使数据沿显式定义的控制流与数据流传递。README 强调框架支持"Autonomous AI Agents",并提供 OCR、多模态、M...
继续阅读本节完整说明和来源证据。
概述
Upsonic 定位为"在 Python 中构建自主 AI 智能体"的框架,其能力分三层堆叠:单个 Agent 负责与模型、工具和上下文进行单次或多次交互;Team 把多个 Agent 组合为协作单元;Graph 则以有向方式编排这些节点,使数据沿显式定义的控制流与数据流传递。README 强调框架支持"Autonomous AI Agents",并提供 OCR、多模态、MCP、KnowledgeBase、Mail Interface 等开箱即用能力,这些能力在不同编排层级中可被复用 README.md。
CLI 子系统为这三层提供统一的脚手架入口:init 创建 main.py 与 upsonic_configs.json,add/remove/install 维护依赖,run 把当前项目作为 FastAPI 服务暴露,从而在本地把任意 Agent、Team 或 Graph 节点变成可调用端点 src/upsonic/cli/printer.py:1-80、src/upsonic/cli/commands/__init__.py:1-22。
智能体运行时:事件驱动生命周期
单 Agent 的执行被建模为一系列可观测事件,这为 Team 与 Graph 编排提供了统一的追踪原语。src/upsonic/utils/agent/events.py 集中导出了一组同步/异步事件产出函数,覆盖文本、工具、缓存、模型、消息、运行、记忆、策略、反思、可靠性与执行结果等阶段 src/upsonic/utils/agent/events.py:1-80。
stateDiagram-v2
[*] --> RunStarted: yield_run_started_event
RunStarted --> ContextBuilt: yield_context_built_event
ContextBuilt --> MessagesBuilt: yield_messages_built_event
MessagesBuilt --> ModelRequest: yield_model_request_start_event
ModelRequest --> ModelResponse: yield_model_response_event
ModelResponse --> ToolsConfigured: yield_tools_configured_event
ToolsConfigured --> ToolCall: yield_tool_call_event
ToolCall --> ToolResult: yield_tool_result_event
ToolResult --> ModelRequest: 再次请求
ToolsConfigured --> FinalOutput: yield_final_output_event
FinalOutput --> [*]: yield_execution_complete_eventayield_* 与 yield_* 配对允许同一事件在同步与异步运行中保持语义一致,这是 Team 级 fan-out 与 Graph 级并行节点所依赖的基础 src/upsonic/utils/agent/events.py:1-40。
智能体输入与输出模型
编排系统要跨节点传递数据,必须用稳定的序列化协议。src/upsonic/run/agent/input.py 中的 to_dict 区分了四种 user_prompt 形态:普通字符串、ModelRequest 列表、单个 ModelRequest 以及任意 Pydantic BaseModel,后两者使用 ModelMessagesTypeAdapter 写入 JSON src/upsonic/run/agent/input.py:1-60。ImageUrl / DocumentUrl 会被 _convert_url_to_binary 同步或异步下载为 BinaryContent,保证编排图内部只流转"已落地"的字节数据 src/upsonic/run/agent/input.py:1-40。
src/upsonic/run/agent/output.py 处理反向序列化:支持从 __pydantic_type__ / __type__ / __builtin_type__ 三种字典标签反查类对象,thinking_parts 使用 ModelResponsePartTypeAdapter 还原,model_provider_profile 则通过 ModelProfile.from_dict 重建,这些机制让 Team 中间结果与 Graph 节点状态可以被持久化、迁移和跨进程传递 src/upsonic/run/agent/output.py:1-60。
CLI 脚手架:把编排产物变成可运行服务
upsonic init 会生成 main.py(包含 async main())与 upsonic_configs.json(含输入/输出 schema),这是把单个 Agent、Team 或 Graph 注册为标准工程项目的入口 src/upsonic/cli/printer.py:1-60、src/upsonic/cli/commands/init/__init__.py:1。
| 命令 | 作用 | 关键文件 |
|---|---|---|
upsonic init | 创建 Agent/编排项目骨架 | src/upsonic/cli/commands/init/__init__.py:1 |
upsonic add <lib> <section> | 写入 api / streamlit / development 依赖 | src/upsonic/cli/printer.py:1-60 |
upsonic remove <lib> <section> | 按包名(剥离版本符)从配置中移除 | src/upsonic/cli/commands/remove/command.py:1-20 |
upsonic install [section] | 优先使用 uv,回退 pip 安装依赖 | src/upsonic/cli/commands/install/__init__.py:1 |
upsonic run | 以 FastAPI 暴露编排节点,自动生成 OpenAPI | src/upsonic/cli/printer.py:1-60 |
upsonic run 强调"动态从 upsonic_configs.json 的输入/输出 schema 构建 API",这意味着同一套编排对象既能在脚本里直接调用,也能在进程间通过 HTTP 调用——这是 Team 与 Graph 跨进程编排的关键能力 src/upsonic/cli/printer.py:1-40。
团队与图编排的扩展点
社区反馈显示,典型编排痛点集中在三个方向:配置(例如 #333 关注 Agent 缺少 temperature 参数)、工具接入(#244 询问 MCP add_mcp_server 的环境变量与位置)、以及跨节点状态(v0.75.0 引入的 KBState 枚举把 UNINITIALIZED → CONNECTED → INDEXED → CLOSED 状态机强加给 KnowledgeBase,体现了"用显式状态机代替布尔标志"在编排一致性上的价值)。结合事件系统、序列化协议与 CLI 服务化,Upsonic 的 Team 通常把多个 Agent 包装为可订阅相同事件流的子运行,而 Graph 则把它们的 AgentRunOutput 沿声明式边连接,使一次图执行等价于对这些事件的统一编排 src/upsonic/utils/agent/events.py:1-80、src/upsonic/run/agent/output.py:1-60。
参见
- 智能体输入与输出序列化(同
run/agent子包) - CLI 命令参考(
src/upsonic/cli/commands/) - 知识库状态机(社区上下文: v0.75.0 发行说明)
- MCP 工具接入(社区上下文: issue #244)
来源:https://github.com/Upsonic/Upsonic / 项目说明书
工具、MCP 集成与技能系统
工具(Tools)、MCP(Model Context Protocol)集成与技能(Skills)系统共同构成 Upsonic 智能体(Agent)与外部世界交互的能力层。智能体在执行任务时可以声明式地挂载工具、连接 MCP 服务器,或者复用预置的技能(例如 AppliedScientist),从而把 LLM 的纯语言推理能力扩展为可观测、可治理、可中断的实际动作。src...
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
1. 概述与定位
工具(Tools)、MCP(Model Context Protocol)集成与技能(Skills)系统共同构成 Upsonic 智能体(Agent)与外部世界交互的能力层。智能体在执行任务时可以声明式地挂载工具、连接 MCP 服务器,或者复用预置的技能(例如 AppliedScientist),从而把 LLM 的纯语言推理能力扩展为可观测、可治理、可中断的实际动作。src/upsonic/tools/base.py 定义了工具的抽象基类,src/upsonic/tools/builtin_tools.py 提供了开箱即用的内建工具集,src/upsonic/tools/mcp.py 则负责与外部 MCP 服务器建立通道。
整体上,该系统遵循"声明 → 配置 → 执行 → 事件"四段式生命周期,相关运行事件集中定义在 src/upsonic/utils/agent/events.py 的 __all__ 列表中。
资料来源:src/upsonic/tools/base.py:1-1、src/upsonic/tools/mcp.py:1-1、src/upsonic/utils/agent/events.py:1-52
2. 工具抽象与执行事件
Upsonic 把工具视作一等公民。src/upsonic/tools/base.py 提供基类,支持同步与异步调用,并能挂载到 Agent 的 tools 列表中。执行过程通过统一事件流对外暴露,便于上层 UI、日志或审计系统订阅。
flowchart LR
A[Agent 运行] --> B[yield_tools_configured_event]
B --> C[LLM 决策调用]
C --> D[yield_tool_call_event]
D --> E[执行工具]
E --> F[yield_tool_result_event]
F --> G{需人工介入?}
G -- 是 --> H[yield_external_tool_pause_event]
H --> I[HITL 反馈]
G -- 否 --> J[继续推理]事件类型在 src/upsonic/utils/agent/events.py 中以字符串名称显式注册,主要包含 yield_tools_configured_event、yield_tool_call_event、yield_tool_result_event 与 yield_external_tool_pause_event(资料来源:src/upsonic/utils/agent/events.py:1-52)。其中 yield_external_tool_pause_event 专门用于标识工具需要 Human-in-the-Loop 介入的场景,对应 src/upsonic/tools/hitl.py 的实现。
2.1 输入与输出适配
工具的入参由 src/upsonic/run/agent/input.py 统一处理。该模块在序列化输入时会检测 ImageUrl 与 DocumentUrl 类型的字段,并通过 _convert_url_to_binary / _aconvert_url_to_binary 异步或同步地把远程资源下载并包装为 BinaryContent,再交给下游工具使用(资料来源:src/upsonic/run/agent/input.py:1-1)。
输出侧由 src/upsonic/run/agent/output.py 接管。它利用 ModelResponsePartTypeAdapter.validate_python 解析模型响应中的 thinking_parts,并结合 ModelProfile.from_dict 还原 model_provider_profile 等元数据,方便工具结果附带结构化上下文(资料来源:src/upsonic/run/agent/output.py:1-1)。
3. MCP 集成
src/upsonic/tools/mcp.py 是 MCP 客户端适配层。社区中常见的使用方式是直接调用客户端的 add_mcp_server 方法注册外部服务器:
instance.client.add_mcp_server(
"websearch",
"npx",
["-y", "@mzxrai/mcp-webresearch"],
)
该方法接受一个语义化名称、可执行命令(npx、uvx、python 等)以及参数列表,符合 MCP stdio 传输协议。社区议题 #244 反馈了关于环境变量与命令注入位置的困惑(资料来源:GitHub Issue #244),官方维护的"minimalist agent + MCP"路线则进一步强调通过统一注册中心来收敛这些细节(资料来源:GitHub Issue #609)。
4. 技能系统:预置与扩展
技能(Skills)是"工具 + 工作流 + 提示词"的更高层封装。src/upsonic/tools/registry.py 维护技能的全局注册表,src/upsonic/tools/policy_manager.py 则在执行前对工具/技能进行策略检查(policy check),相关事件为 yield_policy_check_event 与 yield_policy_feedback_event(资料来源:src/upsonic/utils/agent/events.py:1-52)。
内建技能持续扩展,典型代表包括:
| 技能 / 工具 | 简介 | 引入版本 |
|---|---|---|
AppliedScientist | 自动化测试新论文在当前 ML 模型上的效果 | v0.76.0 |
| Mail Interface | SMTP/IMAP 邮件收发与附件处理 | v0.74.4 |
| Memory 改进 | 增强 Agent 长期记忆 | v0.74.4 |
| KBState 状态机 | UNINITIALIZED → CONNECTED → INDEXED → CLOSED | v0.75.0 |
资料来源:GitHub Releases v0.76.0、GitHub Releases v0.74.4、GitHub Releases v0.75.0
5. 常见问题与失败模式
- 温度等推理参数:社区议题 #333 指出 Agent 配置类中没有直接的
temperature字段(资料来源:GitHub Issue #333),需通过模型层或model_provider_profile传递。 - MCP 注册位置:议题 #244 显示
add_mcp_server并不总是显式可见,建议参考src/upsonic/tools/mcp.py的最新方法签名。 - 工具参数容错:v0.77.2 修复了"tolerate trailing junk in tool args"问题,说明在重试任务时工具参数解析会重置(资料来源:GitHub Releases v0.77.2)。
- 安全建议:外部 SAST 工具反馈了
shell=True、pickle持久化等风险(资料来源:GitHub Issue #596),使用builtin_tools中的 shell 类工具时需要审慎配置policy_manager。
6. 总结
工具、MCP 集成与技能系统把 Upsonic Agent 从一个语言模型升级为可执行、可治理的运行时。开发者通过 base.py 自定义工具、通过 mcp.py 接入 MCP 服务、通过 registry.py 与 policy_manager.py 统一注册与治理;运行期产生的所有阶段事件(工具配置、调用、结果、暂停、策略反馈)均通过 events.py 的事件流对外暴露,便于观测和扩展。
See Also
- 智能体事件系统
- 知识库与状态机
- 预置智能体:AppliedScientist
- CLI 与 OpenAPI 服务化
资料来源:src/upsonic/tools/base.py:1-1、src/upsonic/tools/mcp.py:1-1、src/upsonic/utils/agent/events.py:1-52
数据、存储、知识库与外部接口
Upsonic 的「数据、存储、知识库与外部接口」子系统负责定义 Agent 运行时所接触的全部 I/O 形态:它规定了项目的初始化配置(输入/输出 schema 与依赖分组),负责将 URL 与二进制文档转写为可被模型消费的 BinaryContent,通过 ModelResponsePartTypeAdapter 完成输出反序列化,并以 OpenAPI 暴露服务,还通过...
继续阅读本节完整说明和来源证据。
概述
Upsonic 的「数据、存储、知识库与外部接口」子系统负责定义 Agent 运行时所接触的全部 I/O 形态:它规定了项目的初始化配置(输入/输出 schema 与依赖分组),负责将 URL 与二进制文档转写为可被模型消费的 BinaryContent,通过 ModelResponsePartTypeAdapter 完成输出反序列化,并以 OpenAPI 暴露服务,还通过统一的事件系统把数据流、缓存、记忆、策略与外部工具的副作用显式地广播出去。资料来源:src/upsonic/cli/commands/init/command.py:30-80、资料来源:src/upsonic/run/agent/input.py:60-100、资料来源:src/upsonic/run/agent/output.py:40-90。
初始化配置与依赖分组
upsonic init 命令会生成 upsonic_configs.json,作为数据与外部接口的「单一事实源」。该配置将依赖拆分为 api、streamlit、development 三个语义段,使运行时、UI 与开发工具链解耦:
{
"agent_name": "<user-supplied>",
"description": "Upsonic AI Agent",
"streamlit": false,
"proxy_agent": false,
"dependencies": {
"api": ["fastapi>=0.115.12", "uvicorn>=0.34.2", "sqlalchemy>=2.0.40", "redis>=5.0.0", ...],
"streamlit": ["streamlit==1.32.2", "pandas==2.2.1", "numpy==1.26.4"],
"development": ["watchdog", "ipdb", "pytest", "streamlit-autorefresh"]
},
"entrypoints": { "api_file": "main.py", "streamlit_file": "..." }
}
upsonic install [api|streamlit|development|all] 默认只安装 api 段;uv 优先,pip 兜底。资料来源:src/upsonic/cli/commands/init/command.py:50-95、资料来源:src/upsonic/cli/printer.py:200-300。机器规格字段(cpu、memory、storage)与 features 字典也保存在同一文件中,为部署侧提供静态画像。资料来源:src/upsonic/cli/commands/init/command.py:30-50。
输入处理:URL、二进制与多模态
run/agent/input.py 定义了 Agent 入参的统一规整逻辑。当 documents 中出现 ImageUrl 或 DocumentUrl 时,会触发同步或异步下载并转写为 BinaryContent:
- 同步路径:直接
httpx.get(url),包装为带media_type、identifier的BinaryContent。 - 异步路径:使用
httpx.AsyncClient上下文管理器,避免连接泄漏。 _is_url_type守卫确保只有 URL 类型才会触发网络 I/O。
资料来源:src/upsonic/run/agent/input.py:60-100to_dict() 进一步用 ModelMessagesTypeAdapter 序列化 ModelRequest,对 BaseModel 子类使用 model_dump,从而在多模态、字符串、Pydantic 模型三种入参之间保持一致的 JSON 表示。资料来源:src/upsonic/run/agent/input.py:110-150。
输出处理:Schema 还原与思考部分
run/agent/output.py 处理从持久化层恢复 AgentRunOutput 的反向序列化。关键项目括:
- 对
__pydantic_type__与__type__标记的 schema,通过importlib.import_module动态重建类型。 - 对
__builtin_type__=str的特殊路径直接还原为str。 - 使用
ModelResponsePartTypeAdapter.validate_python还原thinking_parts,保留推理痕迹。 - 使用
ModelProfile.from_dict将提供者画像反序列化为ModelProfile实例。
资料来源:src/upsonic/run/agent/output.py:40-90AgentRunOutput 的字段集合体现了完整的运行态:身份(run_id、agent_id、session_id、user_id、trace_id)、任务嵌入(task,作为 HITL 的单一事实源)、step_results、requirements、output_schema、聊天历史与「本轮新增消息」的分离等。资料来源:src/upsonic/run/agent/output.py:150-220。
外部接口:OpenAPI、Mail 与 MCP
cli/commands/shared/openapi.py 将 upsonic_configs.json 中的 inputs/output schema 动态映射为 OpenAPI 3 组件。map_inputs_props 同时产出 JSON 与 multipart/form-data 两份属性表,类型映射如下:
| 配置 type | JSON schema | multipart schema |
|---|---|---|
files | array<string> | array<string, format=binary> |
file / binary / string($binary) | string | string, format=binary |
number / integer / boolean / list | 对应原子类型 | 保持相同 |
object | 内联对象 / $ref | 同上 |
请求体先注册 multipart/form-data 再注册 application/json,并使用 $ref 指向 RequestModel,避免 schema 重复定义。POST /jobs 的 200 响应统一引用 JobStatus 组件。资料来源:src/upsonic/cli/commands/shared/openapi.py:20-140。
社区侧已记录的外部接口扩展包括:
- Mail Interface(v0.74.4):基于 SMTP/IMAP 的收发与附件处理,支持 Gmail/Outlook/Yahoo/Zoho 与自托管服务器,配合白名单与心跳轮询。资料来源:GitHub Releases v0.74.4。
- MCP 接入(社区问题 #244):通过
instance.client.add_mcp_server(name, command, args, env=...)注册外部工具,社区反馈了env与位置语义不清的问题,建议在客户端构造时显式声明环境变量与工作目录。 - Valkey Search 向量库(社区问题 #603):计划作为第 9 个向量库提供者,主打低延迟内存检索。
知识库生命周期与数据流事件
知识库(KnowledgeBase)在 v0.75.0 引入了 KBState 枚举状态机,把原先零散的布尔标志统一为 UNINITIALIZED → CONNECTED → INDEXED → CLOSED 四态,非法跃迁抛 RuntimeError;同步与异步内容管理 API(如 aadd_source、aadd_text、aremove_document)与状态机强绑定,确保连接、索引、清理顺序的确定性。资料来源:GitHub Releases v0.75.0。
utils/agent/events.py 暴露了与数据/存储/外部接口相关的全部可观测事件,按类别分组:文本增量与完成、工具调用与结果、缓存命中/未命中/写入、模型选择与请求、消息装配、运行启动/取消、记忆更新、策略检查与反馈、反思与可靠性、上下文与用户输入构建、聊天历史加载、存储连接、LLM 准备等。其同步与异步版本并列导出,便于上层消费者(CLI、Streamlit、外部服务)订阅同一信号源。资料来源:src/upsonic/utils/agent/events.py:30-200。
flowchart LR A[用户/外部系统] -->|JSON / multipart| B[OpenAPI Gateway] B --> C[AgentRunOutput 还原] C --> D[知识库 KBState] D --> E[向量检索/嵌入] E --> F[模型推理 + 工具/MCP/Mail] F --> G[事件总线] G --> H[持久化与流式输出]
常见失败模式与最佳实践
- Pickle 反序列化风险:社区问题 #596 指出,使用
pickle持久化AgentRunOutput存在注入风险,建议改用output.py已实现的ModelResponsePartTypeAdapter/ModelProfile.from_dict路径。资料来源:GitHub Issue #596。 - MCP 环境变量与工作目录:注册 MCP server 时必须显式传入
env与cwd,否则子进程将继承父进程环境,造成难以复现的行为差异。资料来源:GitHub Issue #244。 - SSL 上下文:当
BinaryContent通过自建 URL 拉取时,应在httpx.AsyncClient显式传入verify=参数,避免在企业代理环境下出现静默 TLS 失败。资料来源:GitHub Issue #596。 - schema 漂移:
upsonic_configs.json中的inputs/output与运行时代码的 Pydantic 模型若不一致,map_inputs_props仍会生成 OpenAPI,但实际请求会因 422 失败,建议在 CI 中加入 schema 一致性校验。
参见
资料来源:src/upsonic/run/agent/input.py:60-100to_dict() 进一步用 ModelMessagesTypeAdapter 序列化 ModelRequest,对 BaseModel 子类使用 model_dump,从而在多模态、字符串、Pydantic 模型三种入参之间保持一致的 JSON 表示。资料来源:src/upsonic/run/agent/input.py:110-150。
失败模式与踩坑日记
保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。
可能影响升级、迁移或版本选择。
安装可能改变本机 AI 工具行为,用户需要知道写入位置和回滚方法。
假设不成立时,用户拿不到承诺的能力。
新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
Pitfall Log / 踩坑日志
项目:Upsonic/Upsonic
摘要:发现 12 个潜在踩坑项,其中 0 个为 high/blocking;最高优先级:安装坑 - 来源证据:feat(vectordb): Add Valkey Search as a vector database provider。
1. 安装坑 · 来源证据:feat(vectordb): Add Valkey Search as a vector database provider
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:feat(vectordb): Add Valkey Search as a vector database provider
- 对用户的影响:可能影响升级、迁移或版本选择。
- 证据:community_evidence:github | https://github.com/Upsonic/Upsonic/issues/603 | 来源类型 github_issue 暴露的待验证使用条件。
2. 配置坑 · 可能修改宿主 AI 配置
- 严重度:medium
- 证据强度:source_linked
- 发现:项目面向 Claude/Cursor/Codex/Gemini/OpenCode 等宿主,或安装命令涉及用户配置目录。
- 对用户的影响:安装可能改变本机 AI 工具行为,用户需要知道写入位置和回滚方法。
- 证据:capability.host_targets | https://github.com/Upsonic/Upsonic | host_targets=mcp_host, claude, openclaw, cursor
3. 能力坑 · 能力判断依赖假设
- 严重度:medium
- 证据强度:source_linked
- 发现:README/documentation is current enough for a first validation pass.
- 对用户的影响:假设不成立时,用户拿不到承诺的能力。
- 证据:capability.assumptions | https://github.com/Upsonic/Upsonic | README/documentation is current enough for a first validation pass.
4. 维护坑 · 维护活跃度未知
- 严重度:medium
- 证据强度:source_linked
- 发现:未记录 last_activity_observed。
- 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
- 证据:evidence.maintainer_signals | https://github.com/Upsonic/Upsonic | last_activity_observed missing
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 证据:downstream_validation.risk_items | https://github.com/Upsonic/Upsonic | no_demo; severity=medium
6. 安全/权限坑 · 存在评分风险
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 对用户的影响:风险会影响是否适合普通用户安装。
- 证据:risks.scoring_risks | https://github.com/Upsonic/Upsonic | no_demo; severity=medium
7. 安全/权限坑 · 来源证据:Best-practice: SSL context, SQLAlchemy text(f''), agent shell=True comment, and pickle persistence
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:Best-practice: SSL context, SQLAlchemy text(f''), agent shell=True comment, and pickle persistence
- 对用户的影响:可能增加新用户试用和生产接入成本。
- 证据:community_evidence:github | https://github.com/Upsonic/Upsonic/issues/596 | 来源讨论提到 python 相关条件,需在安装/试用前复核。
8. 安全/权限坑 · 来源证据:OwnX Network's hackathon offer for Upsonic
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:OwnX Network's hackathon offer for Upsonic
- 对用户的影响:可能影响授权、密钥配置或安全边界。
- 证据:community_evidence:github | https://github.com/Upsonic/Upsonic/issues/619 | 来源类型 github_issue 暴露的待验证使用条件。
9. 安全/权限坑 · 来源证据:Possible collab: OpenxAI x Upsonic
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:Possible collab: OpenxAI x Upsonic
- 对用户的影响:可能影响授权、密钥配置或安全边界。
- 证据:community_evidence:github | https://github.com/Upsonic/Upsonic/issues/609 | 来源类型 github_issue 暴露的待验证使用条件。
10. 安全/权限坑 · 来源证据:Possible collab: OwnX x Upsonic
- 严重度:medium
- 证据强度:source_linked
- 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:Possible collab: OwnX x Upsonic
- 对用户的影响:可能影响授权、密钥配置或安全边界。
- 证据:community_evidence:github | https://github.com/Upsonic/Upsonic/issues/609 | 来源类型 github_issue 暴露的待验证使用条件。
11. 维护坑 · issue/PR 响应质量未知
- 严重度:low
- 证据强度:source_linked
- 发现:issue_or_pr_quality=unknown。
- 对用户的影响:用户无法判断遇到问题后是否有人维护。
- 证据:evidence.maintainer_signals | https://github.com/Upsonic/Upsonic | issue_or_pr_quality=unknown
12. 维护坑 · 发布节奏不明确
- 严重度:low
- 证据强度:source_linked
- 发现:release_recency=unknown。
- 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
- 证据:evidence.maintainer_signals | https://github.com/Upsonic/Upsonic | release_recency=unknown
来源:Doramagic 发现、验证与编译记录