Cyrene 是什么

Cyrene 是一个持续运行的 AI 代理。它拥有可自我重写的人格文件(SOUL.md),能在不同会话之间保持记忆,可以生成并行子代理协同工作,还能通过定时任务主动发起行动。

一切都在单一的 Python 进程中运行:

  • 一个进程托管代理循环、FastAPI Web 服务器、调度器和内置搜索引擎
  • 两个 UI:以项目为中心的 Workbench(默认)和经典 Legacy Agent UI
  • 任意 OpenAI 兼容 API(默认 DeepSeek;Claude、GPT、Qwen、本地模型都可以)
  • 零外部依赖:没有 Docker、没有 Redis、没有向量数据库服务

你也可以通过 Telegram BotWeChat Bot 与 Cyrene 交互。

核心特性

Agent Core

推理循环和让 Cyrene 不像无状态聊天机器人的核心机制。

  • 双阶段代理循环——每次交互先判断是纯聊天(一次 LLM 调用,无工具开销)还是需要行动。简单对话保持快速,真正的工作使用完整工具集。详见架构
  • SOUL.md 人格系统——Cyrene 维护一个可以自行重写的人格文档。它学习你的偏好、语气和项目,随着时间推移自行编辑 SOUL.md,人格不会在每次会话时重置。
  • 深度研究(Deep Research)——多轮研究管道:规划子问题 → 搜索和阅读 → 导出结构化 PDF 报告。
  • 深度反思(Deep Reflection)——面对复杂或模糊请求时,在内部多轮重构问题后再回答,以少量延迟换取更精准的回复。
  • 行为学习(Behavior Learning)——从过去的对话中提取可复用的行动模式,让重复工作流越来越高效。

记忆与知识

  • 三层记忆——上下文窗口 → 短期跨会话摘要 → 长期 SOUL.md。短期记忆带情感权重和提及次数追踪,高频条目自动保留。过时条目可"退休"而不被删除。详见记忆系统
  • 知识库——上传文档、PDF 和图片;Cyrene 自动分块、嵌入和索引(包括图片视觉索引),代理可在任务中搜索和引用。无嵌入端点时自动降级到全文搜索。
  • 实体系统——跟踪结构化的项目实体(人员、系统、事项),提供创建、查询、更新、删除操作,可限定到 Workbench 项目范围。

工具与自动化

  • 文件操作——Read / Write / Edit / Glob / Grep,配合工作区范围守卫确保安全。
  • Shell 执行——执行 Bash 命令,支持持久 Shell 会话跨步骤复用。
  • Web 搜索与获取——内置 SimpleXNG 搜索引擎(基于 SearXNG)搜索 Web,WebFetch 获取页面内容。无需 Docker 或外部搜索 API。
  • 知识库检索——SearchKnowledge 工具在工作区知识库中执行语义或关键词搜索。
  • 浏览器自动化——10 个浏览器工具(navigate / screenshot / click / type / scroll / 标签页管理 / 登录接管),持久 Playwright 会话,实时 CDP 画面推送。详见浏览器实况
  • 并行子代理——生成独立代理并行执行任务,通过文件收件箱协调,支持 running → waiting → resumed → done 生命周期。详见子代理系统
  • MCP 协议——连接 stdio 或 SSE 的 MCP 服务器扩展工具集,无需重启。详见MCP 协议
  • 任务调度——Cron、间隔和一次性任务;抽奖系统让代理主动发起行动;管家代理维护 SOUL.md。详见任务调度
  • 代码工具——代码库索引、符号搜索、调用链分析、Git 操作(diff / blame / log / status)。
  • 技能系统——在运行时安装 .md / .zip 提示技能,管理启用和卸载,无需重新部署。
  • Claude Code 桥接——检测现有 Claude Code tmux 会话,启动新会话,发送提示并读取输出。

界面与渠道

  • Workbench UI(默认)——项目中心化桌面体验:项目隔离、意图分流、逐步执行。每个项目独立的工作区、知识库、记忆和聊天。
  • Legacy Agent UI——经典界面:实时聊天、Agent Flow SVG 时间线、记忆面板、设置页、实体管理、地图视图。
  • Context Debugger——每次 LLM 调用标记 _ctx 来源元数据,精确追溯上下文每个块的来源。
  • Electron 桌面应用——CI 自动构建 macOS、Windows(x64 + ARM64)和 Linux 包。凭据存在 OS 钥匙串。
  • 引导向导——首次启动自动运行,引导配置 API 密钥、模型和人格,无需手动编辑文件。
  • 地图引擎——AMap / Leaflet 交互式地图,支持标注点和路线。
  • Telegram / WeChat Bot——从聊天软件访问完整代理能力,支持双阶段循环和全部工具。

快速开始

1

获取 Cyrene

Releases 页面 下载预构建包,或源码安装:pip install -e .

2

启动

python -m cyrene --workbench

首次启动运行引导向导,配置 API 密钥和人格。

3

开始聊天

打开 http://localhost:4242,开始你的第一次对话。

完整安装步骤见安装

技术栈

层次技术
运行时Python 3.12+, FastAPI, Uvicorn, SQLite
包管理器uv(锁定文件已提交,pip 也支持)
LLMOpenAI 兼容 API(默认 DeepSeek;支持 Claude/GPT/Qwen)
搜索SimpleXNG(基于 SearXNG,内置)
浏览器Playwright(有头/无头),CDP WebSocket 画面推送
桌面Electron + electron-builder,OS 钥匙串存储凭据
渠道python-telegram-bot, itchat
代码检查Ruff(行长 180)
加密Fernet(cryptography)配置仓库加密

Cyrene is a continuously running AI agent with a self-rewriting personality file (SOUL.md), cross-session memory, parallel sub-agents, and proactive scheduled tasks.

Everything runs in a single Python process:

  • One process hosts the agent loop, FastAPI web server, scheduler, and bundled search engine
  • Two UIs: project-centric Workbench (default) and classic Legacy Agent UI
  • Any OpenAI-compatible API (DeepSeek by default; Claude, GPT, Qwen, local models all work)
  • Zero external dependencies: no Docker, no Redis, no vector database

Core Features

Agent Core

  • Two-phase agent loop — determines whether to answer directly (one LLM call, no tool overhead) or escalate to the full toolset. Keeps simple chat fast. See Architecture.
  • SOUL.md personality — a self-rewriting personality document maintained by a steward agent. Learns your preferences and evolves across sessions instead of resetting.
  • Deep Research — multi-round pipeline: sub-question planning, parallel search, source reading, and structured PDF report export.
  • Deep Reflection — reframes ambiguous or complex requests over several internal rounds before responding, trading latency for accuracy.
  • Behavior Learning — distills reusable action patterns from past conversations, making recurring workflows faster over time.

Memory & Knowledge

  • Three-layer memory — context window, short-term cross-session summaries (with valence tracking, mention counting), long-term SOUL.md. High-frequency entries auto-preserve; stale entries can be retired without deletion. See Memory.
  • Knowledge base — upload documents, PDFs, images; Cyrene chunks, embeds, and indexes them (including vision indexing for images). Falls back to full-text search without an embedding endpoint.
  • Entity system — track structured project entities (people, systems, items) with create/query/update/delete operations.

Tools & Automation

  • File operations — Read / Write / Edit / Glob / Grep, scoped by workspace guard.
  • Shell execution — run Bash commands with persistent shell sessions across rounds.
  • Web search & fetch — built-in SimpleXNG (SearXNG) for web search, WebFetch for URL content. No Docker or external API key.
  • Knowledge search — SearchKnowledge tool for semantic/keyword search over the workspace knowledge base.
  • Browser automation — 10 tools (navigate, screenshot, click, type, scroll, tab management, login takeover), persistent Playwright session, live CDP screencast over WebSocket. See Browser.
  • Parallel sub-agents — spawn independent agents with full tool access, coordinated via a file-based inbox. Lifecycle: running → waiting → resumed → done. See Sub-agents.
  • MCP protocol — connect stdio or SSE MCP servers to extend the toolset without restarting. See MCP.
  • Task scheduler — cron, interval, and one-shot tasks. Proactive lottery system for agent-initiated actions. Steward agent for SOUL.md maintenance. See Scheduler.
  • Code tools — codebase indexing, symbol search, call-chain analysis, git operations (diff, blame, log, status).
  • Skill system — install .md / .zip prompt skills at runtime, enable/disable and uninstall — no redeploy needed.
  • Claude Code bridge — detect existing Claude Code tmux sessions, start new ones, send prompts and read output.

Interfaces & Channels

  • Workbench UI (default) — project-centric experience: project isolation, intent dispatch, step-by-step execution, independent workspace/knowledge/memory per project.
  • Legacy Agent UI — classic interface with real-time chat, Agent Flow SVG timeline, memory panel, settings, entity management, and map view.
  • Context Debugger — every LLM call is tagged with _ctx provenance metadata for precise context tracing.
  • Electron desktop app — CI-built packages for macOS, Windows (x64+ARM64), Linux. OS keyring credential storage.
  • Onboarding wizard — runs on first launch, guides API key, model, and personality setup — no manual file editing.
  • Map engine — AMap / Leaflet interactive map with pins and routes.
  • Telegram / WeChat Bot — full agent capability from messaging apps.

Quick Start

1

Get Cyrene

Download from GitHub Releases or pip install -e .

2

Launch

python -m cyrene --workbench. First run starts the onboarding wizard.

3

Chat

Open http://localhost:4242 and start chatting.

Tech Stack

LayerTechnology
RuntimePython 3.12+, FastAPI, Uvicorn, SQLite
Package manageruv (lockfile committed; pip also supported)
LLMOpenAI-compatible API (default DeepSeek)
SearchSimpleXNG (built-in SearXNG)
BrowserPlaywright, CDP WebSocket screencast
DesktopElectron + electron-builder, OS keyring
Channelspython-telegram-bot, itchat
EncryptionFernet (cryptography) for config store

前置要求

  • Python 3.12+——使用 python --version 检查
  • conda(推荐)或 venv
  • Git——从源码安装时需要
  • Node.js 20+(可选)——源码运行需要预编译 WebUI JSX
提示:如果你不想安装 Node.js,可以从 Releases 下载预构建包——WebUI 已预先编译好。

选项 A:预构建包(推荐,开箱即用)

GitHub Releases 下载适用于你平台的安装包,下载后直接打开即可使用。无需安装 Python、Node.js 或任何依赖。

  • macOS——.dmg 安装包(Apple Silicon / Intel)
  • Windows——ARM64 和 x64 安装程序分别提供
  • Linux——.AppImage

首次启动会运行引导向导,配置 API 密钥和人格。之后就可以开始使用了。

选项 B:从源码安装

如果希望自行构建或修改源码,按以下步骤操作。

Linux / macOS

# 1. 创建虚拟环境
conda create -n cyrene python=3.12 -y
conda activate cyrene

# 2. 安装 Cyrene(推荐使用 uv)
uv sync
# 或使用 pip:
# pip install -e .

# 3. 预编译 WebUI JSX(仅源码运行需要)
cd src/webui && npm install && node build-jsx.mjs && cd ../..

# 4. 启动
python -m cyrene --workbench
无需 .env 文件:Cyrene 使用加密配置仓库(data/config.enc)。首次运行的引导向导会引导你配置 API 密钥和人格。.env.example 仅为向后兼容保留。

Windows(从源码)

Windows 需要额外步骤,因为 uvloop(内置 SimpleXNG 使用)是 Unix-only 的。

步骤 1:创建环境

conda create -n cyrene python=3.12 -y
conda activate cyrene

步骤 2:安装依赖

pip install aiosqlite apscheduler croniter fastapi httpx jinja2 python-dotenv python-telegram-bot requests sniffio uvicorn "mcp>=1.27.0"
pip install winloop  # uvloop 的 Windows 替代
pip install simplexng --no-deps
pip install babel brotli clideps flask flask-babel httpx-socks isodate lxml markdown-it-py msgspec platformdirs pyyaml rich setproctitle typer-slim valkey whitenoise
pip install -e . --no-build-isolation

中国用户:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

步骤 3:Windows 兼容性补丁

SimpleXNG 的 vendored 代码需要以下手工修补:

补丁 1:uvloop → winloop
编辑 Lib/site-packages/simplexng/_vendor/searx/network/client.py

# 替换:
import uvloop
uvloop.install()
# 为:
import sys
if sys.platform == 'win32':
    import winloop as uvloop
else:
    import uvloop
uvloop.install()

补丁 2:fork → spawn
编辑 Lib/site-packages/simplexng/_vendor/searx/plugins/calculator.py

# 替换:
mp_fork = multiprocessing.get_context("fork")
# 为:
import sys
mp_fork = multiprocessing.get_context("fork" if sys.platform != "win32" else "spawn")

补丁 3:创建 pwd 存根
创建 Lib/site-packages/pwd.py

"""pwd stub for Windows — SearXNG compatibility."""
import os
def getpwuid(uid):
    name = os.environ.get("USERNAME", "unknown")
    return type("pw", (), {"pw_name": name, "pw_uid": uid})()

补丁 4:启用 JSON API
编辑 Lib/site-packages/simplexng/settings/settings_template.yml,在 search.formats 中添加 json

替代方案:如果不想打补丁,设置 SEARXNG_URL 指向外部 SearXNG 实例,并设置 SEARXNG_AUTO_START=0 禁用内置搜索启动。

步骤 4:启动

python -m cyrene --workbench

验证安装

conda activate cyrene
cd /path/to/Cyrene
python -m cyrene --workbench

打开 http://localhost:4242。首次启动将显示引导向导,指导你:

  1. 配置 API 密钥(DeepSeek/Claude/GPT 等)
  2. 设置代理名称和人格
  3. 选择默认模型

不用 Web 服务器的测试方式:

python -m cyrene.local_cli

可选扩展

扩展安装命令说明
浏览器实况pip install -e ".[browser]"
playwright install chromium
Playwright 浏览器自动化、实时画面、登录接管
开发工具pip install -e ".[dev]"pytest 测试框架和其他开发依赖

故障排除

启动问题?试试 python -m cyrene.local_cli --verbose 查看详细日志。详细模式下,调试日志写入 data/debug_*.jsonl

相关文档

Prerequisites

  • Python 3.12+ — check with python --version
  • conda (recommended) or venv
  • Git — for source installation
  • Node.js 20+ (optional) — for JSX precompilation from source
Tip: Pre-built releases include precompiled WebUI. No Node.js needed.

Option A: Pre-built Package (Recommended)

Download from GitHub Releases — open and use immediately. No Python, Node.js, or any dependencies required.

  • macOS — .dmg (Apple Silicon / Intel)
  • Windows — ARM64 and x64 installers
  • Linux — .AppImage

First launch runs the onboarding wizard for API key and personality setup.

Option B: From Source

Linux / macOS

conda create -n cyrene python=3.12 -y
conda activate cyrene
pip install -e .
cd src/webui && npm install && node build-jsx.mjs && cd ../..
Note: You do not need a .env file. Configuration is stored in an encrypted store.

Verify Installation

python -m cyrene --workbench

Open http://localhost:4242. The first launch will run the onboarding wizard.

To test without the web server:

python -m cyrene.local_cli

配置架构

Cyrene 使用 Fernet 加密的 JSON 配置存储(data/config.enc)。这意味着:

  • API 密钥等敏感信息在磁盘上加密
  • 不需要创建或维护 .env 文件
  • 首次运行的引导向导会写入所有必需值
  • Web UI 设置页面可以在运行时更新配置

.env.example 仅为向后兼容保留,新安装应使用加密仓库方式。

环境变量

以下变量在启动时读取。多数字段可通过 Web UI 在运行时编辑,无需重启。

LLM

变量说明默认值
OPENAI_API_KEYAPI 密钥(OpenAI / DeepSeek / 兼容 API)
OPENAI_BASE_URLAPI 端点 URLhttps://api.deepseek.com/v1
OPENAI_MODEL模型 IDdeepseek-v4-flash

Agent 行为

变量说明默认值
ASSISTANT_NAME代理显示名称Cyrene
MAX_TOOL_ROUNDS每次用户消息的最大工具轮次15
MAX_HISTORY_MESSAGES上下文窗口保留的消息条数40
MAX_TOOL_OUTPUT_CHARS工具结果发送给 LLM 的字符上限12000

调度与管家

变量说明默认值
SCHEDULER_INTERVAL遗留心跳间隔(秒)60
HEARTBEAT_INTERVAL心跳检查间隔(秒)300
HEARTBEAT_LOTTERY_INTERVAL主动消息抽奖间隔(秒)1800
LOTTERY_DELTA抽奖概率每次增量0.15
LOTTERY_MAX抽奖概率上限0.85
DAYTIME_START日间开始小时6
DAYTIME_END日间结束小时22
STEWARD_INTERVALSOUL.md 管家代理运行间隔(秒)1800

搜索

变量说明默认值
SEARXNG_AUTO_START自动启动 SimpleXNG 搜索1(启用)
SEARXNG_PORTSimpleXNG 监听端口8888
SEARXNG_HOSTSimpleXNG 绑定地址127.0.0.1
SEARXNG_URL外部 SearXNG URL(覆盖自动启动)
SEARCH_PROXY搜索 HTTP 代理

知识库 / 嵌入(可选)

变量说明默认值
EMBEDDING_BASE_URLOpenAI 兼容的嵌入端点 URL
EMBEDDING_API_KEY嵌入端点 API 密钥
EMBEDDING_MODEL嵌入模型名称
提示:如果未配置嵌入端点,知识库自动降级到全文搜索(FTS),仍然可用但语义搜索精度降低。

浏览器

变量说明默认值
CYRENE_BROWSER_HEADLESS无头模式(0=始终有头)1
CYRENE_BROWSER_SCREENCAST_QUALITYJPEG 画面质量(1-100)60
CYRENE_BROWSER_WIDTH视口/画面宽度(px)1280
CYRENE_BROWSER_HEIGHT视口/画面高度(px)800
CYRENE_BROWSER_LOCALE浏览器区域设置zh-CN
CYRENE_BROWSER_ACCEPT_LANGUAGEAccept-Language 头zh-CN,zh;q=0.9,en;q=0.8

渠道(可选)

变量说明默认值
TELEGRAM_BOT_TOKENTelegram Bot 令牌
OWNER_ID你的 Telegram 用户 ID
WECHAT_BOT_TOKENWeChat Bot 令牌
WECHAT_OWNER_IDWeChat 所有者 ID
AMAP_API_KEY高德地图 API 密钥

运行时设置

通过 Web UI 设置页面可以在不重启的情况下修改大部分设置:

设置类别可修改项
API 密钥OPENAI_API_KEYOPENAI_BASE_URLOPENAI_MODEL、Telegram/WeChat 令牌、嵌入凭据
模型添加/删除模型配置
工具启用/禁用特定工具
MCP 服务器添加、删除和重启 MCP 连接(无需重启进程
SOUL.md直接编辑人格文档
搜索内置 SimpleXNG 配置
外观主题、文字大小、密度

模型定价参考

Cyrene 跟踪 token 用量并为已知模型估算成本。如果供应商价格变动,请在设置 UI 中更新。

模型输入(每百万 token)输出(每百万 token)
DeepSeek Chat$0.14$0.28
Claude Haiku 4.5$0.25$1.25
Claude Sonnet 4.6$3.00$15.00
Claude Opus 4.7$15.00$75.00

Config Architecture

Cyrene uses a Fernet-encrypted JSON config store (data/config.enc). API keys are encrypted on disk. The first-run wizard writes required values, and the Web UI Settings page can update them at runtime.

Environment Variables

The following variables are read at startup. Most can be edited at runtime through the Web UI.

LLM

VariableDescriptionDefault
OPENAI_API_KEYAPI key
OPENAI_BASE_URLAPI endpoint URLhttps://api.deepseek.com/v1
OPENAI_MODELModel IDdeepseek-v4-flash

Agent Settings

VariableDescriptionDefault
ASSISTANT_NAMEAgent display nameCyrene
MAX_TOOL_ROUNDSMax tool rounds per message15
MAX_HISTORY_MESSAGESContext window size40
MAX_TOOL_OUTPUT_CHARSTool output char limit12000

Runtime Settings

Most settings can be modified at runtime through the Web UI Settings page without restarting:

  • API Keys — update OPENAI_API_KEY, OPENAI_BASE_URL, etc.
  • Models — add or remove model configurations
  • Tools — enable or disable specific tools
  • MCP Servers — add, remove, and restart MCP connections
  • SOUL.md — edit the personality document directly

启动

Release 桌面应用

Releases 页面 下载安装包后,直接打开应用即可。首次启动会运行引导向导,配置 API 密钥和人格。Workbench UI 是默认界面,启动后自动加载。

macOS 注意:首次打开可能被 Gatekeeper 拦截,前往 系统设置 → 隐私与安全性,点击"仍要打开"。

源码运行

python -m cyrene --workbench

打开 http://localhost:4242。首次运行也会启动引导向导。

--workbench 标志可以省略——python -m cyrene 等价于 python -m cyrene --workbench

页面一览

页面功能
欢迎 / 项目创建和切换项目。每个项目拥有独立的工作区、知识库、记忆和聊天历史。
仪表盘系统概览:活动任务数、最近会话、知识库统计、LLM 状态。
聊天项目范围的实时聊天。详见下文"意图分流"。
调度查看和管理定时任务、cron 作业和截止日期。
知识上传文档、浏览知识库、运行语义搜索。
记忆查看和管理项目/代理记忆。按工作区隔离。
模型选择 LLM 模型,管理 API 端点。
帮助入门提示、快捷键参考和文档链接。

意图分流(Intent Dispatch)

聊天输入不是简单地全部交给 LLM。系统会自动分类意图:

  • 回答模式——直接交给 LLM 回答,不会触发工具调用或不必要的规划
  • 指令模式——需要调用工具执行的命令(如搜索、文件操作),交给代理执行
  • 任务模式——需要多步操作的复杂请求,生成执行计划逐步执行
  • 收尾——你说"任务完成"或"可以验收"时,代理汇总成果,状态标记为 review

你始终可以自由对话,不会无条件生成计划。

逐步执行

当代理进入任务模式时:

  1. Agent 规划需要执行的步骤
  2. 决定步骤的执行顺序(不必按计划顺序)
  3. 每步执行时你可以在聊天中实时看到进度
  4. 你可以随时发送消息引导、调整或中止当前步
  5. 任务完成时,Agent 汇总成果,产物(文件、报告等)可在线查看或下载

项目隔离

Workbench 的核心设计理念是项目隔离。每个项目拥有:

  • 独立的 workspacePath 限定工作区
  • 独立的知识库(文档和嵌入向量)
  • 独立的记忆空间
  • 独立的聊天历史和会话

这意味着你可以在"工作"项目中讨论代码,在"个人"项目中讨论生活,两者互不干扰。

相关文档

Launching

Release Desktop App

Download from GitHub Releases and open the app directly. First launch runs the onboarding wizard. Workbench UI is the default interface.

macOS: If Gatekeeper blocks it, go to System Settings → Privacy & Security and click "Open Anyway".

From Source

python -m cyrene --workbench

Open http://localhost:4242. The --workbench flag can be omitted.

Intent Dispatch

Chat input is automatically classified into intents:

  • Answer mode — direct LLM reply, no tool calls
  • Command mode — tool execution (search, file operations)
  • Task mode — multi-step plan with step-by-step execution
  • Finalize — when you say "done", agent summarizes results

Project Isolation

Each project has its own workspace path, knowledge base, memory space, and chat history — completely isolated.

启动

Release 桌面应用

Releases 页面 下载安装包后,直接打开应用。如果你偏好经典界面,需要在应用内设置中切换,或在启动时使用 --agent 模式启动。

源码运行

python -m cyrene --agent

打开 http://localhost:4242

页面功能详解

聊天

  • 主面板——Markdown 渲染的消息区域,发送消息,实时查看流式响应
  • 引导(Guidance)——当代理正在执行多轮操作时,你可以向它发送引导指令,影响当前轮次的行为
  • 浏览器面板——当代理使用浏览器时自动显示实时画面

Agent Flow

SVG 画布可视化代理执行的每一个步骤:LLM 调用、工具执行、子代理通信、消息路由。每个节点可点击查看详情。

会话管理

  • 列表——浏览、搜索历史会话,查看消息数和 token 用量
  • 详情——查看完整消息记录、每个子代理的运行轨迹

记忆面板

  • SOUL.md——浏览和在线编辑人格文档
  • 短期记忆——查看压缩后的短期记忆条目,每条带情感权重标签(正面/负面/中性)
  • 上下文——监控上下文窗口使用量

状态与调试

  • 指标——子代理数、会话数、记忆条目数、任务数
  • 工作者——主代理和每个子代理的运行状态
  • 服务健康——LLM 端点可用性、SOUL.md 状态、MCP 服务器连接状态
  • Context Debugger——检查最近 LLM 调用的完整上下文溯源元数据(_ctx

与传统聊天的区别

相比 Workbench UI,Legacy UI 更适合:

  • 需要全面监控代理内部运行状态的场景
  • 深入调试工具调用和 LLM 行为
  • 不需要项目隔离的简单使用场景

Launching

Release Desktop App

Download from GitHub Releases. To use Legacy UI, launch with --agent mode or switch in-app settings.

From Source

python -m cyrene --agent

Open http://localhost:4242.

Interface

  • Chat — Markdown-rendered messages, live streaming, browser panel
  • Agent Flow — SVG canvas visualizing every step of execution
  • Sessions — browse, search, and inspect session history
  • Memory — SOUL.md, short-term memory with valence, context usage
  • Context Debugger — inspect provenance metadata for LLM calls

cyrene 命令(HTTP 客户端)

cyrene 命令是一个瘦 HTTP 客户端,与运行在 http://localhost:4242 的守护进程通信。使用 --json 获取机器可读输出。

# 后台启动守护进程
cyrene start

# 查看状态
cyrene status

# 发送消息
cyrene do "搜索今天的科技新闻" --session run_live

# 停止守护进程
cyrene stop
命令说明
cyrene start后台启动守护进程
cyrene stop停止守护进程
cyrene do <text> --session <id>向代理会话发送消息
cyrene session list列出所有会话(活动 + 存档)
cyrene session status --session <id>显示会话详情
cyrene session delete --session <id>删除会话
cyrene flow --session <id>列出代理轮次
cyrene flow --session <id> --round <r>显示轮次执行追踪
cyrene flow --session <id> --round <r> --id <e>检查特定事件(LLM 调用或工具调用)
cyrene status系统状态和指标
cyrene mcp list列出 MCP 服务器及其工具
cyrene mcp add <name> stdio <cmd> [args...]添加 stdio MCP 服务器
cyrene mcp add <name> sse <url>添加 SSE MCP 服务器
cyrene mcp remove <name>移除 MCP 服务器
cyrene mcp toggle <name>启用/禁用 MCP 服务器

交互式本地 CLI

不需要启动 Web 服务器,直接运行代理的交互模式。适合快速测试和无头环境:

python -m cyrene.local_cli

可用命令:

命令功能
/h帮助菜单——清除上下文、重置人格、系统状态
/mcpMCP 服务器管理(list/add/remove/toggle/test)
/mcp list列出已配置的 MCP 服务器
/clear重置当前会话上下文
/deep-reflect [focus]对给定主题运行深度反思
quit退出交互式 CLI

聊天的斜杠命令

Workbench UI、Legacy UI 和交互式 CLI 都支持的斜杠命令:

命令说明
/deep-reflect [focus]触发多轮内部重构,适合模糊或复杂的请求。以少量延迟换取更精准的回答。
/clear重置当前会话的上下文窗口。注意这会清除所有历史消息。

完成的工作流示例

# 1. 启动守护进程
cyrene start

# 2. 创建一个会话并发送消息
cyrene do "分析当前目录的项目架构" --session analysis

# 3. 查看代理的推理轮次
cyrene flow --session analysis

# 4. 查看特定轮次的详细信息
cyrene flow --session analysis --round round_1

# 5. 获取系统状态
cyrene status

# 6. 完成后停止守护进程
cyrene stop

cyrene Command (HTTP Client)

The cyrene command communicates with the daemon at http://localhost:4242.

cyrene start
cyrene status
cyrene do "search today news" --session daily
cyrene stop
CommandDescription
cyrene startStart daemon in background
cyrene stopStop daemon
cyrene do <text> --session <id>Send message to agent
cyrene statusSystem status and metrics

Interactive Local CLI

python -m cyrene.local_cli

Slash commands: /h, /mcp, /clear, /deep-reflect [focus], quit.

双阶段决策循环

这是 Cyrene 最核心的设计决策。传统的 AI Agent 在每次交互中都加载完整工具集,这在简单对话时造成不必要的开销(更大的系统提示 = 更多 token)。

Cyrene 的做法是将交互分为两个阶段:

用户消息
阶段 1(轻量:use_tools / ask_user / quit)
纯聊天 → 直接回复
1 次 LLM 调用(quit / ask_user)
需要工具 → 阶段 2
阶段 2(完整工具集 + 多轮)
回复用户

阶段 1(快速通道)

每次用户交互都从阶段 1 开始。此阶段 LLM 可以在 use_toolsask_userquit 三个工具中选择:

  • 如果用户只是在聊天或问简单问题,代理选择 quit 直接回复——仅一次 LLM 调用
  • 如果用户请求涉及工具操作,代理选择 use_tools 进入阶段 2
  • 如果代理需要向用户提问(如确认意图),选择 ask_user——也是一种纯聊天交互

这意味着简单的对话保持轻量和快速,而真正的工作仍然可以获得完整工具集的支持。出于提示缓存优化,完整的工具集定义实际上在阶段 1 就已经传递给 LLM,但只有上述三个工具可在阶段 1 调用。

阶段 2(完整工具集)

此阶段加载完整的工具集,包括:

文件读写 Bash Shell Web 搜索 知识库检索 实体管理 浏览器操作 代码分析 Git 操作 子代理生成 MCP 工具 任务调度 技能管理 Claude Code

代理在多轮之间保持状态,直到调用 quit 结束交互。最大轮次由 MAX_TOOL_ROUNDS 控制(默认 15)。

项目结构

src/
├── cyrene/                           # 核心引擎
│   ├── agent/                        # 双阶段循环、会话、轮次
│   │   ├── agent.py                  # 主代理编排
│   │   ├── coordinator.py            # 阶段路由、上下文组装
│   │   ├── session.py                # 会话持久化
│   │   ├── round.py                  # 工具轮次生命周期
│   │   ├── prompts.py                # 系统提示和阶段提示
│   │   └── deep_reflection.py        # 深度反思
│   ├── tool_impl/                    # 每个原生工具一个文件
│   ├── code_tools/                   # 代码索引、分析、Git
│   ├── knowledge/                    # 文档摄取、嵌入、检索
│   ├── channels/                     # Telegram、WeChat Bot
│   ├── modules/                      # 深度研究等管道
│   ├── registry_tools.py             # 中心工具注册表
│   ├── mcp_manager.py                # MCP 服务器生命周期
│   ├── search.py                     # 搜索管道
│   ├── searxng_manager.py            # SimpleXNG 进程管理
│   ├── scheduler.py                  # 心跳、cron、抽奖、管家
│   ├── soul.py                       # SOUL.md 读写
│   ├── short_term.py                 # 短期记忆压缩
│   ├── memory.py                     # 记忆上下文组装
│   ├── shells.py                     # 持久 Shell 会话
│   ├── browser.py                    # 持久浏览器
│   ├── cc_bridge.py / cc_terminal.py # Claude Code 集成
│   ├── behavior_learning.py          # 行为模式学习
│   ├── skills_registry.py            # 技能存储
│   ├── context_trace.py              # 上下文溯源标记
│   └── context_debug.py              # 调试日志查看器
├── webui/                            # FastAPI 后端 + SPA
│   ├── server.py                     # FastAPI 应用工厂
│   ├── routes.py                     # REST API + SSE
│   ├── routes_knowledge.py           # 知识库 API
│   ├── routes_workbench.py           # Workbench API
│   └── static/app/                   # JSX 前端组件
├── workbench-webui/                  # Workbench 前端资源
├── tests/                            # 测试套件
├── data/                             # 运行时数据、调试日志
├── workspace/                        # SOUL.md、模式、会话
└── store/                            # SQLite 数据库

安全模型

  • 网络层——Web UI 只绑定 127.0.0.1,不暴露到网络。Electron 桌面构建在 OS 钥匙串中存储随机令牌,每次请求验证。
  • 工作区守卫——文件读写和 Shell 操作有工作区范围守卫。在 Workbench 中,代理工作区被限定到项目的 workspacePath
  • 权限升降级——跨越工作区的读写操作需要权限提升请求。

Two-Phase Decision Loop

Each interaction starts in Phase 1 with only use_tools, ask_user, and quit available. Pure chat costs one LLM call. Tool-requiring requests escalate to Phase 2 with the full toolset.

Security

  • Network — Web UI binds to 127.0.0.1 only. Electron adds keyring-based auth.
  • Workspace guard — file/shell operations are scoped to the workspace.
  • Permission elevation — cross-workspace ops require user approval.

三层架构

Cyrene 的记忆分为三个层级,随着时间从短期向长期流动:

层级存储位置容量维护机制
上下文窗口data/state.jsonMAX_HISTORY_MESSAGES(默认 40 条)自动裁剪(FIFO)
短期记忆data/short_term.json压缩摘要(带情感权重和类型标签)后台压缩器定期运行
长期记忆workspace/SOUL.md结构化的自由格式文档管家代理按间隔审查和更新

记忆流动过程

  1. 每轮对话保存在上下文窗口中。超过 MAX_HISTORY_MESSAGES 条时,最早的条目被裁剪——但不会丢失,因为后台压缩器会处理。
  2. 后台压缩器定期将上下文窗口中的旧对话压缩为摘要,存入短期记忆。每条短期记忆包括:
    • 情感权重(Valence)——正面/中性/负面评分
    • 提及次数——同一主题被提到的频率
    • 条目类型——事实 / 模式 / 偏好 / 情感
  3. 自动保留规则——高频条目(≥3 次提及)和极端情感条目自动保留,不会被压缩器淘汰
  4. 管家代理STEWARD_INTERVAL(默认 30 分钟)运行,审查短期记忆和最近对话,通过 APPEND/ERASE/MERGE 命令更新 SOUL.md

记忆退休(Memory Retirement)

过时或被取代的短期记忆可以退休(retire)。退休意味着:

  • 该记忆停止被注入到上下文窗口中
  • 它不再被回忆或引用
  • 但文件本身不被破坏性删除

这比直接删除更安全——如果后续发现需要这个信息,仍然可以恢复。退休机制也避免了"已删除的记忆被重新学习"的问题。

SOUL.md 人格系统

workspace/SOUL.md 是 Cyrene 的长期记忆载体,也是一个可自进化的人格文档。其结构如下:

## SELF:IDENTITY
- I am Cyrene, a personal AI companion.
- My purpose is to be a friend and companion.

## SELF:BELIEFS


## RELATIONSHIP:USER
- Trust level: neutral
- Communication style: casual, direct

## MEMORY:HIGH_IMPACT


## PATTERN:USER


## TEMPORARY

管家代理的工作方式:

  • 运行时,AI 模型审查最近的对话记录
  • 判断哪些信息值得写入 SOUL.md
  • 使用结构化命令更新:APPEND 添加、ERASE 删除、MERGE 合并
  • TEMPORARY 部分的条目 24 小时后自动过期

SOUL.md 在每次交互时注入到系统提示中。由于启用了提示缓存,未变化的内容不会重新注入,缓存命中率高。

Workbench 记忆集成

Workbench UI 中的记忆页面按 workspace 隔离

  • 文件名为 wb_memory_<workspace>.json,不同项目的记忆互不干扰
  • 对话自动沉淀到记忆
  • Agent 可以通过 save_project_memory 工具主动写入记忆
  • 反思(reflection)结果也落地到记忆库

Three-Layer Architecture

LayerStorageCapacityMaintained by
Context Windowdata/state.jsonMAX_HISTORY_MESSAGES (40)Auto-trimmed
Short-Termdata/short_term.jsonCompressed summariesBackground compressor
Long-Termworkspace/SOUL.mdStructured documentSteward agent (every 30 min)

Memory Flow

  1. Conversations stay in context window, auto-trimmed at the limit
  2. Background compressor creates summaries with valence, mention count, type
  3. High-frequency (>=3 mentions) and extreme-valence entries auto-preserve
  4. Steward agent reviews and updates SOUL.md via APPEND/ERASE/MERGE

Outdated memories can be retired — stopped from injection without destructive deletion.

知识库

文档(PDF、文本、图片、代码)放入工作区后,会被哈希、分块、嵌入,并存储在工作区特定的 SQLite 数据库(store/kb_<workspace>.db)中。代理可以通过 SearchKnowledge 工具搜索语料库。

支持的类型

  • 文本文件(.md.txt.py 等)
  • PDF 文档
  • 图片(通过视觉模型描述)

摄取流程

  1. 提取文本——PDF 用 pypdf,图片用视觉模型,文本用 UTF-8
  2. 过滤——跳过二进制文件和大于 10 MB 的文件
  3. 分块和存储——存入 store/kb_<workspace>.db
  4. 嵌入——如果配置了嵌入端点,生成向量嵌入

实体系统

结构化项目实体可以通过工具跟踪和查询:

  • track_entity——创建实体
  • query_entities——搜索实体
  • update_entity——更新实体
  • delete_entity——删除实体

实体存储在主 SQLite 数据库中,可限定到 Workbench 项目范围。

Knowledge Base

Documents (PDF, text, images, code) in the workspace are hashed, chunked, embedded, and stored in a workspace-specific SQLite database (store/kb_<workspace>.db). The agent can search via SearchKnowledge.

Supported Types

  • Text files (.md, .txt, .py, etc.)
  • PDF documents
  • Images (described via vision model)

Ingestion Pipeline

  1. Extract text (pypdf for PDF, vision for images, UTF-8 for text)
  2. Filter — skip binaries >10 MB
  3. Chunk and store in store/kb_<workspace>.db
  4. Embed — vector index if embedding endpoint is configured

Entity System

Structured project entities can be tracked via tools:

  • track_entity — create an entity
  • query_entities — search entities
  • update_entity — update an entity
  • delete_entity — delete an entity

概述

子代理是主代理动态生成的独立代理实例。每个子代理:

  • 拥有完整的工具访问权限(除了一小部分主代理专属黑名单如调度器)
  • 通过基于文件的收件箱(inbox)系统与兄弟代理通信
  • 拥有独立的思考过程和工具调用链
  • 超时后自动终止

子代理特别适合:同时搜索多个来源、并行分析多个文件、执行可分解的子任务。

生命周期

running
waiting
resumed
done / timeout
  1. running——子代理启动,开始执行任务
  2. waiting——等待兄弟代理的结果或收件箱消息
  3. resumed——收到消息后继续执行
  4. done / timeout——正常完成或超时终止

主代理收集所有子代理的结果,综合为最终回复。

通信机制

子代理之间的通信使用文件基收件箱(inbox)系统

  • 每个子代理有一个专属收件箱目录
  • 代理通过 send_agent_message 工具向兄弟的收件箱写入消息
  • 收件箱中的消息在下一次思考循环中被读取和处理

典型使用场景

  • 并行研究——同时搜索多个来源,合并结果
  • 多文件分析——并行读取多个代码文件,分别分析后汇总
  • 分解任务——"搜索资料"和"分析数据"两个子代理并行执行
  • 竞争实验——多个子代理用不同方法解决问题,主代理取最优

注意事项

提示:子代理的 token 消耗是独立的。大量使用子代理会增加整体 LLM 调用成本。建议只在确实需要并行处理时使用。

Sub-agents are independently spawned agents with full tool access (except a small main-agent blocklist). Communication uses a file-based inbox system.

Lifecycle

running → waiting → resumed → done / timeout

  1. running — sub-agent starts executing
  2. waiting — waiting for sibling results or inbox messages
  3. resumed — continues after receiving a message
  4. done / timeout — completed or timed out

特性

当代理使用浏览器工具时,聊天 UI 实时显示页面的画面——你能看到代理看到了什么和正在做什么。遇到登录墙时,代理可以把浏览器的控制权交给你

  • 持续浏览器上下文——懒惰启动,跨所有浏览器操作重用。配置文件在磁盘上持久化(<DATA_DIR>/browser_profile),cookies/登录状态跨运行保留
  • 实时画面——CDP screencast 通过 /ws/browser WebSocket 持续推送 JPEG 帧。
  • 登录接管——代理遇到登录墙时请求接管 → 真实浏览器窗口打开 → 你登录 → 代理在已验证会话中继续。

设置

浏览器工具无需额外依赖的基本功能:browser_navigate 在没有 Playwright 时会降级为纯文本 HTTP 获取。

完整功能(浏览器自动化、实时画面、登录接管):

pip install -e ".[browser]"
playwright install chromium
注意:如果 Playwright 或 Chromium 运行时缺失,实时画面面板会显示设置提示;browser_click/browser_type/browser_request_takeover 会报告 Playwright 未安装。

工作流程

1
代理浏览——调用 browser_navigate 打开 URL。每次操作后后端发布 SSE 事件(URL、标题、操作类型)。实时画面持续推送。
2
遇到登录墙——代理检测到登录页面/CAPTCHA/2FA,调用 browser_request_takeover。画面暂停,面板显示"接管中"卡片。你的登录凭据不会被流式传输
3
你进行登录——浏览器使用相同配置文件以有头窗口重启。你在真实浏览器窗口中完成登录。窗口关闭。
4
代理继续——浏览器以无头模式在同一配置(已认证)上重启。代理自动恢复轮次。

因为配置文件是持久化的,对于大多数网站,接管只需要在首次登录时出现一次。

配置

浏览器配置通过加密配置仓库设置(环境变量键名在括号中):

配置项默认值说明
CYRENE_BROWSER_HEADLESS1设为 0 则持久有头模式。接管流程忽略此设置强制有头。
CYRENE_BROWSER_SCREENCAST_QUALITY60JPEG 画质(1-100)。
CYRENE_BROWSER_WIDTH1280视口/画面宽度(px)。
CYRENE_BROWSER_HEIGHT800视口/画面高度(px)。
CYRENE_BROWSER_USER_AGENT自动默认自动去除 HeadlessChrome 标记,伪装为桌面 Chrome。
CYRENE_BROWSER_LOCALEzh-CN传递给 Playwright 的区域设置。
CYRENE_BROWSER_ACCEPT_LANGUAGEzh-CN,zh;q=0.9,en;q=0.8浏览器发送的 Accept-Language 头。

工具列表

工具用途
browser_navigate打开 URL,返回可读文本
browser_screenshot截取当前页面为临时 PNG
browser_click按 CSS 选择器点击元素
browser_type在输入框中输入文本(可选按回车提交)
browser_scroll滚动页面
browser_tab_list列出所有打开的标签页
browser_tab_new打开新标签页
browser_tab_select切换到指定标签页
browser_tab_close关闭指定标签页
browser_request_takeover打开真实窗口,让用户手动登录
  • Persistent context — browser profile on disk, cookies survive restarts
  • Live screencast — CDP JPEG frames via WebSocket
  • Login takeover — agent hits login wall → real window opens → you log in → agent resumes authenticated

Setup

pip install -e ".[browser]"
playwright install chromium

概述

MCP(Model Context Protocol)是一个开放协议,允许 AI 应用通过标准化接口连接外部工具和服务。Cyrene 支持两种 MCP 传输方式:

  • stdio——启动一个子进程,通过标准输入/输出通信。适用于本地工具和脚本。
  • SSE(Server-Sent Events)——通过 HTTP 连接远程 MCP 服务器。适用于远程工具和 API。

添加 MCP 服务器

Stdio 服务器

# 文件系统工具(通过 npm)
cyrene mcp add filesystem stdio npx -y @modelcontextprotocol/server-filesystem /path/to/workspace

# 自定义 Python MCP 服务器
cyrene mcp add marp-deck stdio python /path/to/mcp_server.py

SSE 服务器

cyrene mcp add my-api sse http://localhost:3000/mcp

管理命令

命令说明
cyrene mcp list列出所有 MCP 服务器及每个服务器的工具列表
cyrene mcp add <name> stdio <cmd> [args...]添加 stdio 传输的 MCP 服务器
cyrene mcp add <name> sse <url>添加 SSE 传输的 MCP 服务器
cyrene mcp remove <name>移除 MCP 服务器
cyrene mcp toggle <name>启用或禁用 MCP 服务器

示例输出

$ cyrene mcp list
Name              Transport    Status         Tools    Endpoint
filesystem        stdio        connected      3        npx -y @modelcontextprotocol/server-filesystem .
marp-deck         stdio        connected      4        python mcp_server.py

运行时管理

MCP 服务器也可以通过 Web UI(设置 → MCP 服务器)管理。添加、删除、启用/禁用 MCP 服务器无需重启 Cyrene 进程——MCP 工具会自动出现在内置工具旁边。

Supports stdio (subprocess) and SSE (HTTP) transports. Connected MCP servers expose tools alongside built-in ones.

cyrene mcp add filesystem stdio npx -y @modelcontextprotocol/server-filesystem /path
cyrene mcp add my-api sse http://localhost:3000/mcp

任务类型

通过 schedule_task 工具创建三种类型的任务:

类型说明示例
Cron按 cron 表达式定期执行每天早上 8 点检查天气
间隔按固定间隔重复每 30 分钟检查一次邮箱
一次性在指定时间执行一次2 小时后提醒我

调度机制

调度器的工作方式:

  • 通过 schedule_task 工具创建任务(也可以在 Web UI 调度页面管理)
  • 心跳按 HEARTBEAT_INTERVAL 秒(默认 300 = 5 分钟)运行,检查到期任务
  • 任务持久化在 SQLite 中,带有完整执行历史
  • 可以使用 list_taskspause_taskresume_taskcancel_task 工具管理

抽奖系统(Proactive Lottery)

抽奖系统是 Cyrene 的一个独特功能——它让代理可以在没有用户输入时主动发起行动

  • 每个心跳周期,代理有一定概率"中奖"
  • 未中奖时,LOTTERY_DELTA(默认 0.15)加到累积概率上
  • 概率上限为 LOTTERY_MAX(默认 0.85)
  • 中奖后概率重置
  • 只在 DAYTIME_STARTDAYTIME_END 之间触发(避免半夜打扰)

这个机制让 Cyrene 能够"主动"关心你,而不是只能被动响应你的提问。

管家代理(Steward)

管家代理不是用户可调度的任务,而是一个特殊的内置代理,按 STEWARD_INTERVAL(默认 30 分钟)运行:

  • 回顾最近的对话历史
  • 判断需要更新 SOUL.md 的哪些内容
  • 使用 APPEND/ERASE/MERGE 命令修改 SOUL.md
  • 清理过期的 TEMPORARY 条目(24 小时过期)
  • Cron — schedule by cron expression
  • Interval — repeat at fixed intervals
  • One-shot — execute once at a specified time

Lottery System

Each heartbeat cycle, the agent has a chance to "win" and send proactive messages. Probability accumulates until it hits the cap or wins, then resets.

概述

Quick Chat 是 Cyrene 的全局快捷对话功能。无论你在做什么,按下 Ctrl/Cmd+Shift+Space 即可呼出一个浮动聊天窗口,与 Cyrene 对话。

功能

  • 全局快捷键——Ctrl/Cmd+Shift+Space 从任意界面呼出浮动窗口
  • 截图粘贴——呼出时自动截取当前活跃窗口,作为图片发送给代理
  • 独立窗口复用——关闭后固定到系统托盘,下次唤醒复用同一窗口
  • 完整对话体验——与主聊天页共享运行管理器:工具调用轨迹、生成附件、实时思考卡片
  • 后台继续——关窗后 Agent 仍在后台运行,结果持久化到服务端
  • 系统托盘常驻——应用关闭到托盘,后台持续运行,随时唤醒

使用方式

启动 Cyrene 后:

  1. 按下 Ctrl/Cmd+Shift+Space 呼出浮动窗口
  2. 输入问题或指令,或直接粘贴截图
  3. 随时按快捷键再次呼出继续对话
  4. 关闭窗口时自动回到系统托盘,不会中断正在进行的任务

Overview

Quick Chat is Cyrene's global shortcut chat feature. Press Ctrl/Cmd+Shift+Space from anywhere to open a floating chat window and talk to Cyrene.

Features

  • Global shortcutCtrl/Cmd+Shift+Space from any application
  • Screenshot paste — captures the active window on invocation
  • Independent window — closes to system tray, reuses the same window next time
  • Full chat experience — shared run manager with tool call traces, artifacts, real-time thinking cards
  • Background execution — agent continues after closing the window
  • System tray — app lives in the tray, always ready

Usage

  1. Press Ctrl/Cmd+Shift+Space to open the floating window
  2. Type your question or paste a screenshot
  3. Press the shortcut again to resume anytime
  4. Close to system tray — running tasks are not interrupted

调试

详细模式

记录每个 LLM 调用的完整上下文(提示词、工具定义、响应、耗时)和上下文溯源:

python -m cyrene.local_cli --verbose
python -m cyrene --workbench --verbose

调试日志

详细模式下,事件写入带时间戳的 JSONL 文件:

data/debug_20260617_133426.jsonl

每行是一个 JSON 对象,包含:

{"type": "llm_call", "caller": "main_agent", "phase": "phase1",
 "messages": [...], "response": {...}, "duration_ms": 423.0}

{"type": "tool_call", "caller": "subagent_poet", "tool": "send_agent_message",
 "args": {...}, "result": "Message sent.", "duration_ms": 150.2}

Context Debugger

每条 LLM 调用都带有 _ctx 元数据,标记每个上下文块的来源(系统提示、SOUL.md、短期记忆、历史消息、工具结果等)。调试方式:

# 通过 API
curl http://localhost:4242/api/context-debug/events?limit=10
curl http://localhost:4242/api/context-debug/events/evt_3b22f9a5c0cb

# 通过 CLI
cyrene flow --session run_live --round round_xxx --id evt_3b22f9a5c0cb

Web UI 调试

  • 状态页面——显示实时调试日志、系统指标、工作线程状态、服务健康
  • Agent Flow 页面——SVG 流程图可视化每一次 LLM 调用和工具执行

测试

# 安装开发测试依赖
uv pip install -e ".[dev]"

# 运行所有测试
uv run pytest -q

# 运行特定测试文件
python -m pytest tests/test_context_trace.py -v

# 带日志输出
uv run pytest -v --tb=long
注意:部分测试需要 LLM 端点。运行前设置 OPENAI_API_KEYOPENAI_BASE_URL。测试使用 pytest + async 支持,60 秒线程超时防止死锁。

项目约定

  • Python 3.12+——类型提示、模式匹配等最新特性
  • Ruff——代码检查(行长 180)
  • 类型提示——所有函数签名必须标注类型
  • Async/await——全程异步(asyncio)
  • 模块模式——每个模块单一职责:
    • 函数调用用于直接导入
    • 事件总线(debug.publish_event)用于实时 UI 更新
    • 文件收件箱(inbox.py)用于子代理通信
    • SQLite 用于结构化持久化

添加新工具

如果你想为 Cyrene 添加新的原生工具:

  1. cyrene/tool_impl/ 下创建新模块(如 my_tool.py
  2. 模块导出 TOOL_DEF(工具定义字典)和 handler(async 处理函数)
  3. cyrene/registry_tools.py_NATIVE_TOOL_MODULES 中注册模块
  4. 可选:在 src/webui/static/app/settings.jsx 中添加 UI 入口

MCP 协议工具不需要修改 Cyrene 代码——通过 cyrene mcp add 或 Web UI 直接连接即可。

CI / 发布

项目详情
CI 工作流.github/workflows/release.yml
触发方式推送 v* 标签,或手动触发(选择默认 UI:workbench/agent)
构建产物PyInstaller + Electron,打包 macOS、Windows(x64/ARM64)、Linux
冒烟测试打包应用运行 --smoke-test

目前没有 CI 持续集成测试任务。标记发布前请在本地运行 uv run pytest -q

Debugging

Verbose Mode

Logs every LLM call (full prompt, tools, response, duration) and context trace to data/debug_*.jsonl:

python -m cyrene.local_cli --verbose
python -m cyrene --workbench --verbose

Debug Logs

In verbose mode, events are written to timestamped JSONL files. Each line is a JSON object:

{"type": "llm_call", "caller": "main_agent", "phase": "phase1",
 "messages": [...], "response": {...}, "duration_ms": 423.0}

{"type": "tool_call", "caller": "subagent_poet", "tool": "send_agent_message",
 "args": {...}, "result": "Message sent.", "duration_ms": 150.2}

Context Debugger

Every LLM call is tagged with _ctx provenance metadata showing where each context block came from (system prompt, SOUL.md, short-term memory, history, tool results). View via the Web UI Context Debugger page or API:

curl http://localhost:4242/api/context-debug/events?limit=10
curl http://localhost:4242/api/context-debug/events/evt_3b22f9a5c0cb

Via CLI:

cyrene flow --session run_live --round round_xxx --id evt_3b22f9a5c0cb

Testing

uv pip install -e ".[dev]"
uv run pytest -q
python -m pytest tests/test_context_trace.py -v
Note: Some tests require an LLM endpoint. Set OPENAI_API_KEY and OPENAI_BASE_URL first.

Project Conventions

  • Python 3.12+ with type hints on all function signatures
  • Ruff for linting (line length: 180)
  • Async/await throughout (asyncio)
  • Single responsibility per module. Cross-module communication via function calls, event bus, file-based inbox, and SQLite.

Adding New Tools

  1. Create a module under cyrene/tool_impl/ (e.g., my_tool.py)
  2. Export TOOL_DEF (dict) and handler (async callable)
  3. Register in cyrene/registry_tools.py::_NATIVE_TOOL_MODULES
  4. Optionally add a UI entry in src/webui/static/app/settings.jsx

For MCP servers, use cyrene mcp add or the Web UI — no code changes needed.

CI / Release

ItemDetails
Workflow.github/workflows/release.yml
Triggerv* tag or manual dispatch
Build outputPyInstaller + Electron for macOS, Windows (x64/ARM64), Linux
Smoke testPackaged app runs --smoke-test

No CI test runner currently. Run uv run pytest -q locally before tagging a release.

cyrene 命令参考

cyrene 命令是一个 HTTP 客户端,与 http://localhost:4242 的守护进程通信。使用 --json 获取机器可读输出。

进程管理

命令说明
cyrene start后台启动守护进程
cyrene stop停止守护进程

会话管理

命令说明
cyrene do <text> --session <id>向代理会话发送消息
cyrene session list列出所有会话(活动 + 存档)
cyrene session status --session <id>显示会话详情
cyrene session delete --session <id>删除会话

代理轮次检查

命令说明
cyrene flow --session <id>列出代理轮次
cyrene flow --session <id> --round <r>显示轮次执行追踪
cyrene flow --session <id> --round <r> --id <e>检查特定事件详情

记忆

命令说明
cyrene memory soul打印当前 SOUL.md 内容
cyrene memory soul --edit <path>从文件替换 SOUL.md
cyrene memory short-term打印短期记忆条目
cyrene memory context打印上下文窗口状态

MCP 管理

命令说明
cyrene mcp list列出 MCP 服务器及其工具
cyrene mcp add <name> stdio <cmd> [args...]添加 stdio MCP 服务器
cyrene mcp add <name> sse <url>添加 SSE MCP 服务器
cyrene mcp remove <name>移除 MCP 服务器
cyrene mcp toggle <name>启用/禁用 MCP 服务器

系统

命令说明
cyrene status系统状态和指标

Telegram Bot

在 Web UI 设置或加密配置中配置以下值:

TELEGRAM_BOT_TOKEN=你的_bot_token
OWNER_ID=你的_telegram_user_id

然后运行:

python -m cyrene

Telegram Bot 支持与 Web UI 完全相同的双阶段循环、子代理和工具集。你可以从 Telegram 执行搜索、文件操作、生成子代理等所有操作。

WeChat Bot

在加密配置中设置 WECHAT_BOT_TOKENWECHAT_OWNER_ID。启动 Cyrene Web UI 后,WeChat 集成自动运行。状态显示在 Web UI 设置页面。

注意:WeChat 支持为 Alpha 状态。可能需要正常的代理设置才能使用。

完整工作流示例

# 1. 后台启动守护进程
cyrene start

# 2. 检查系统状态
cyrene status

# 3. 发送消息到实时会话
cyrene do "帮我搜索今天的 AI 新闻" --session daily

# 4. 查看代理执行了哪些轮次
cyrene flow --session daily

# 5. 查看特定轮次的工具调用详情
cyrene flow --session daily --round round_1

# 6. 查看系统指标
cyrene status

# 7. 完成工作后停止守护进程
cyrene stop

cyrene Commands

The cyrene command communicates with the daemon at http://localhost:4242. Use --json for machine-readable output.

Process Management

CommandDescription
cyrene startStart daemon in background
cyrene stopStop daemon

Session Management

CommandDescription
cyrene do <text> --session <id>Send message to agent session
cyrene session listList all sessions (live + archived)
cyrene session status --session <id>Show session details
cyrene session delete --session <id>Delete a session

Agent Round Inspection

CommandDescription
cyrene flow --session <id>List agent rounds
cyrene flow --session <id> --round <r>Show round execution trace
cyrene flow --session <id> --round <r> --id <e>Inspect specific event (LLM call or tool call)

Memory

CommandDescription
cyrene memory soulPrint current SOUL.md
cyrene memory soul --edit <path>Replace SOUL.md from file
cyrene memory short-termPrint short-term memory entries
cyrene memory contextPrint context window status

MCP Management

CommandDescription
cyrene mcp listList MCP servers and their tools
cyrene mcp add <name> stdio <cmd> [args...]Add a stdio MCP server
cyrene mcp add <name> sse <url>Add an SSE MCP server
cyrene mcp remove <name>Remove MCP server
cyrene mcp toggle <name>Enable/disable MCP server

System

CommandDescription
cyrene statusSystem status and metrics

Telegram Bot

Set TELEGRAM_BOT_TOKEN and OWNER_ID in the Web UI or encrypted config store, then run python -m cyrene. The Telegram bot supports the same two-phase loop, sub-agents, and tools as the Web UI.

WeChat Bot

Set WECHAT_BOT_TOKEN and WECHAT_OWNER_ID in the config store. Status is shown on the Web UI Settings page.

Note: WeChat support is Alpha. A working proxy setup may be required.

Full Workflow Example

# 1. Start daemon in background
cyrene start

# 2. Check system status
cyrene status

# 3. Send message to a live session
cyrene do "search today's AI news" --session daily

# 4. View agent execution rounds
cyrene flow --session daily

# 5. Inspect a specific round's tool calls
cyrene flow --session daily --round round_1

# 6. View system metrics
cyrene status

# 7. Stop daemon when done
cyrene stop