[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-105407":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":12,"openIssues":13,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":15,"stars30d":15,"stars90d":14,"forks30d":14,"starsTrendScore":16,"compositeScore":17,"rankGlobal":8,"rankLanguage":8,"license":8,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":18,"topics":21,"createdAt":8,"pushedAt":8,"updatedAt":22,"readmeContent":23,"aiSummary":8,"trendingCount":14,"starSnapshotCount":14,"syncStatus":24,"lastSyncTime":25,"discoverSource":26},105407,"Hotline","SC-10749\u002FHotline","SC-10749",null,"Python",171,3,66,1,0,76,228,78.5,false,"master",true,[],"2026-11-01 00:16:04","\u003Cdiv align=\"center\">\n\n# ⚡ Hotline\n\n### 前沿技术可用性实验室 · Skill & MCP 开箱即用工厂\n\n探索正在发生的技术，把热点变成工具，把想法变成能力，把能力交付给每一个需要它的人。\n\n对话问答、文件检索、PPT 生成、深度研究与技能包管理，一体化单项目交付。\n\n\u003Cp>\n  \u003Ca href=\"https:\u002F\u002Fnodejs.org\u002F\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FNode.js-20%2B-339933?logo=node.js&logoColor=white\" alt=\"Node.js 20+\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fwww.python.org\u002F\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPython-3.11%2B-3776AB?logo=python&logoColor=white\" alt=\"Python 3.11+\">\u003C\u002Fa>\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fstatus-working-16803c\" alt=\"Project status: working\">\n\u003C\u002Fp>\n\n[快速开始](#快速开始) · [架构](#整体架构) · [技能中心](#技能中心与-skill-自进化) · [配置](#配置)\n\n\u003C\u002Fdiv>\n\n---\n\n## 项目简介\n\nHotline Agent 是一个面向企业级应用的端到端通用智能体（End-to-End Universal Agent）平台，采用多智能体架构，深度融合大语言模型（LLM）能力与现代软件工程架构，提供从感知、推理到执行的全链路智能化解决方案。\n\n本仓库是**单一项目仓库**：Vue 前端、FastAPI 后端、技能中心与技能控制台都在这里，一条命令启动，不再依赖任何外部平台。\n\n## 快速开始\n\n### 环境要求\n\n- Node.js 20+（前端构建与开发服务）\n- Python 3.11+（后端；本机可直接用 `python`，也可用 uv 管理依赖）\n\n### 私密配置\n\n真实 API Key、密码和服务地址统一放在项目根目录 `.env`，由 `.gitignore` 排除；不含真实密钥的 `.env.example` 模板可以提交。远程环境与本地不同的值使用同一文件中的 `REMOTE_` 前缀配置：Python、PowerShell、Shell 启动脚本及数据库初始化脚本均读取根目录 `.env`，支持 `DODO_ENV_FILE` 指定其他路径；`DODO_ENV_PROFILE=remote` 时应用 `REMOTE_` 配置（去掉前缀后覆盖对应项），PowerShell 远程脚本默认应用该配置。普通开发启动保留 SQLite、本地文件及关闭 Redis 的默认行为。\n\n### 安装与启动\n\n浏览器仍只访问一个 FastAPI 入口，FastAPI 直接服务 Vue 构建产物；长任务由同机独立的 Python Execution Worker 消费。API、Worker 和前端由启动器统一编排。\n\n```bash\n# 1) 首次：安装并构建前端\nnpm --prefix frontend install\nnpm --prefix frontend run build\n\n# 2) 启动网关 + Execution Worker（页面、API、技能控制台仍在 8888）\nnpm start\n```\n\n启动后：\n\n| 入口 | 地址 |\n| --- | --- |\n| 应用页面 | http:\u002F\u002F127.0.0.1:8888\u002F |\n| 后端 API 文档 | http:\u002F\u002F127.0.0.1:8888\u002Fdocs |\n| 健康检查 | http:\u002F\u002F127.0.0.1:8888\u002Fhealth |\n| 就绪检查 | http:\u002F\u002F127.0.0.1:8888\u002Fhealth\u002Fready |\n| 技能控制台 | http:\u002F\u002F127.0.0.1:8888\u002Fconsole |\n\n`npm start` 启动 FastAPI Gateway 和 Python Execution Worker 两个进程。当前执行队列、运行状态和 SSE 事件保存在被忽略的 `data\u002Fexecution.db`，是同机 SQLite 队列，支持 Worker 重启后的事件回放；它还不承担多主机分布式调度。Worker 不在线时 `\u002Fhealth\u002Fready` 返回 503，新的 Agent 运行会被拒绝。\n\n### 常见问题\n\n**启动报 `Errno 10048`（端口 8888 被占用）**：多半是上次开发模式（`node dev-launcher.mjs`）残留的旧后端还在运行。查询占用并结束：\n\n```powershell\nnetstat -ano | findstr :8888     # 找到 LISTENING 行末尾的 PID\ntaskkill \u002FPID \u003CPID> \u002FF\n```\n\n开发模式下若端口被占，启动器也会打印同样的提示。\n\n### 热部署（改代码自动更新，推荐日常使用）\n\n网关跑在 8888，改完代码不用手动重启或构建：\n\n```bash\nnpm run hot\n```\n\n- 改 Python（`python_backend\u002F`、`main.py` 等所有 `.py`）→ 网关和 Execution Worker 自动重启\n- 改 Vue\u002FCSS（`frontend\u002Fsrc\u002F`）→ 自动重新构建，浏览器页面自动刷新（页面内置热部署探针）\n- 窗口里会分别提示前端构建完成、后端启动完成，全部就绪后直接访问 \u003Chttp:\u002F\u002F127.0.0.1:8888\u002F>\n\n### 前端开发模式（热更新）\n\n修改 Vue 代码时使用开发模式，页面仍是 5180，但 API 请求由 Vite 代理转发到后端，前后端依旧同源：\n\n```bash\nnode dev-launcher.mjs    # 或 npm run dev\n```\n\n前端使用 Vite HMR（修改即时更新），后端 Gateway 与 Python Execution Worker 一起启动；端口可用 `DODO_DEV_FRONTEND_PORT` 和 `DODO_DEV_BACKEND_PORT` 覆盖。改完前端要回到网关 + Worker 模式时，重新执行 `npm --prefix frontend run build` 即可。\n\n### 仅启动后端 \u002F 其他方式\n\n```bash\npython -m uvicorn main:app --host 127.0.0.1 --port 8888 --reload   # 开发后端\n.\u002Frun_python_backend.ps1                                            # Windows，读取 .env 后运行\n.\u002Frun_python_backend.sh                                             # Linux \u002F macOS\nbash deploy\u002Finit_mysql_schema.sh                                    # 初始化 MySQL schema（按需）\nuv sync                                                             # 可选：用 uv 重建 .venv\n```\n\n## 整体架构\n\n```\n┌─────────────────────────────────────────────────────────────────────────────┐\n│                           应用层 (Application Layer)                         │\n│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────┐ │\n│  │ 智能问答Agent │ │ 文件问答Agent │  │ PPT生成Agent │  │    深度研究Agent     │ │\n│  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘  └──────────┬──────────┘ │\n│         └──────────────────────────┴────────────────────┘                  │\n│                              AgentEngine（技能路由）                         │\n├─────────────────────────────────────────────────────────────────────────────┤\n│  服务层：Embedding \u002F 文件管理 \u002F 会话管理 \u002F PPT 渲染 \u002F 文档解析（MinerU）        │\n├─────────────────────────────────────────────────────────────────────────────┤\n│  工具层：MCP 工具回调（Tavily 搜索）\u002F 向量检索 \u002F 图片生成 \u002F 技能中心             │\n├─────────────────────────────────────────────────────────────────────────────┤\n│  基础设施：大模型 API \u002F SQLite(默认) 或 MySQL \u002F 本地文件 或 MinIO \u002F pgvector   │\n└─────────────────────────────────────────────────────────────────────────────┘\n```\n\n### 多模式智能体\n\n| Agent 类型 | 核心模式 | 适用场景 |\n|-----------|---------|---------|\n| **WebSearchReactAgent** | ReAct + 联网搜索 | 实时信息查询、新闻分析 |\n| **FileReactAgent** | RAG + ReAct | 企业内部文档问答 |\n| **PPTBuilderAgent** | 状态机 + 断点续传 | 一句话生成演示文稿 |\n| **PlanExecuteAgent** | Plan-Execute-Critique | 深度研究、复杂任务分解 |\n| **技能智能体** | 技能中心版本绑定 | 沉淀可复用的工作流经验 |\n\n### 技术栈\n\n| 层级 | 选型 |\n|-----|------|\n| 前端 | Vue 3、Vite 6、Lucide 图标 |\n| 后端 | Python 3.11+、FastAPI、Uvicorn、SSE 流式响应 |\n| 存储 | 本地 SQLite + 文件（默认）；可选 MySQL、Redis、MinIO、PostgreSQL \u002F pgvector |\n| 技能中心 | SQLite 目录库（`data\u002Fskill-center\u002Fcatalog.db`），纯标准库实现 |\n\n## 技能中心与 Skill 自进化\n\n技能中心已并入后端：版本目录、项目绑定、评测用例、自进化门禁、灰度发布与自动回滚，全部通过 FastAPI 提供服务，数据库位于 `data\u002Fskill-center\u002Fcatalog.db`（Git 忽略）。\n\n- **技能控制台**：后端启动后打开 \u003Chttp:\u002F\u002F127.0.0.1:8888\u002Fconsole>，可新建\u002F编辑技能（SKILL.md + 可选资源）、按版本启用或停用、运行自进化并查看门禁结果。\n- **渐进式披露**：技能智能体（`\u002Fagent\u002Fskills\u002Fstream`）使用 LangChain `create_agent` 处理模型与工具调用。技能名称与摘要仅放在动态生成的 `read_skill` 工具描述中，不注入初始消息，也不将技能名称注册成独立工具；模型需要时按技能 ID 调用工具读取完整 `SKILL.md`，参考资料另行按相对路径按需读取。\n- **技能来源**：仓库根 `skills\u002F*\u002FSKILL.md`（当前包含开发流程技能 `hotline-tdd`）、原安装目录 `data\u002Fskills\u002F`、技能中心中绑定当前项目的版本。仓库技能仅扫描元数据头部；目录查询不读取数据库正文\u002F资源，不自动加载 `skill-center\u002Fsamples\u002F`。`$技能名` 是传给模型的显式使用提示，不再通过关键词预选后直接注入正文。\n- **元数据缓存**：后端进程内按来源缓存文件技能的名称与摘要。每次请求枚举技能并检查 `SKILL.md` 的 inode、修改时间和大小；未变化的条目复用缓存，新增或变更的条目才重新解析头部，删除项从缓存移除。技能中心仍按请求 ID 查询当前灰度版本，避免缓存绕过版本路由。目录变化在下一次技能请求生效；同尺寸内容若被外部程序同时恢复完全相同的 inode\u002F时间戳\u002F大小，stat 签名无法检测。\n- **请求隔离**：每次只向 LangChain 提供当前问题，不接入 history、checkpointer 或持久化记忆；当次工具循环消息临时保留。原接口仍可保存最终问答结果，但不作为下一次技能请求的模型输入。技能中心灰度按该请求 ID 稳定分桶，任务内固定选中版本；解绑\u002F禁用后后续读取被拒绝。\n- **自进化闭环**：评测用例按 `train \u002F selection \u002F test` 分段；`evolve` 只接受最多 8 条 `add\u002Fdelete\u002Freplace` patch，通过静态、动态、回归、增益、安全五道门禁后进入 `staged`，再用 `promote` 灰度绑定、`rollback` 回滚；错误率达到阈值自动回滚。\n- **可选模型配置**：`SKILL_EVOLUTION_*`（自动生成 patch）与 `SKILL_JUDGE_*`（独立评分），见 `.env.example`。\n\n命令行工具（`skill-center\u002F`，纯标准库）：\n\n```bash\npython skill-center\u002Ftest_center.py       # 目录库回归测试\npython skill-center\u002Ftest_skill_disclosure.py  # 渐进披露、版本和资源安全\npython skill-center\u002Ftest_agent_tools.py  # 离线 LangChain 工具调用及接口兼容\npython skill-center\u002Fimport_samples.py    # 导入 samples\u002F 研究样本（默认不绑定）\npython skill-center\u002Fpull_samples.py      # 更新上游样本（anthropics\u002Fskills 固定提交）\n```\n\n`samples\u002F` 内容来自 [Anthropic 官方 skills 仓库](https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills)，`samples\u002Fsources.json` 记录固定提交号。这些文件属于研究数据，不是本仓库开发的行为指令。\n\n技能执行边界：\n\n- 模型适配在 `python_backend\u002Fllm.py`，通用工具调用及 `read_skill` 工具定义在 `python_backend\u002Fmodules\u002Fexecution\u002F`，技能目录和受限资源读取在 `python_backend\u002Fskills.py`；根 `skills\u002F` 只放技能包，不承载 Agent 基础设施。\n- `read_skill` 只按本次登记的技能 ID 读取技能包内文本资源，禁止宿主机任意路径、越界链接、隐藏\u002F私密文件及二进制内容；不执行 Shell\u002FPython 脚本，不安装工具，不启动工作流引擎。Skill 中提到命令不代表已具备相应执行能力。\n- 技能工具描述预算为 8000 字符，超出时提示省略；单文件最多 1 MiB，每页最多 12000 字符，按 `next_offset` 继续读取，不静默截断正文。\n- 每次请求最多 8 次模型调用、16 次工具调用，工具结果累计最多 64000 字符；错误、超限和停止均返回错误事件，不标记完成。在途模型请求不保证即时取消，返回后会检查停止信号。\n- 需要支持工具调用的 OpenAI-compatible 模型；缺少配置、协议不支持或调用失败时明确报错，不退化为虚构技能执行。执行期间关闭 LangSmith 自动追踪。接口保持 SSE 事件格式，当前在最终答案就绪后发送文本，不承诺逐 Token 流式输出。\n\n## 配置\n\n| 变量 | 说明 |\n| --- | --- |\n| `DODO_ENV_FILE` | 指定 env 文件路径，默认项目根目录 `.env` |\n| `DODO_ENV_PROFILE` | `remote` 时应用 `REMOTE_` 前缀配置 |\n| `DODO_STORAGE_BACKEND` \u002F `DODO_FILE_STORAGE_BACKEND` | `sqlite`\u002F`mysql`、`local`\u002F`minio`，本地开发默认 SQLite + 本地文件 |\n| `DODO_VECTOR_ENABLED` | 向量检索开关，本地默认关闭 |\n| `DODO_SKILL_CATALOG_DB` \u002F `DODO_SKILL_PROJECT` | 技能目录库路径（默认 `data\u002Fskill-center\u002Fcatalog.db`）与绑定项目 ID（默认 `dodo-agent`） |\n| `DODO_REPO_SKILLS_DIRECTORY` | 仓库技能包目录，默认根据源码位置定位根 `skills\u002F`，不受启动工作目录影响 |\n| `SKILLS_DIRECTORY` | 原技能安装目录，默认 `data\u002Fskills\u002F`，与仓库技能目录分别管理 |\n| `DODO_DEV_FRONTEND_PORT` \u002F `DODO_DEV_BACKEND_PORT` | 开发端口覆盖，默认 5180 \u002F 8888 |\n\n完整清单见 [.env.example](.\u002F.env.example)。\n\n## 目录结构\n\n```text\n├─ frontend\u002F          # Vue 3 前端（Vite）\n│  └─ src\u002Fmodules\u002F     # chat、workspaces、memory、retrieval、skills、MCP 等前端模块边界\n├─ python_backend\u002F    # Python 后端\n│  ├─ api\u002F             # FastAPI Router 与 HTTP\u002FSSE 接口\n│  ├─ application\u002F    # 用例编排服务\n│  ├─ domain\u002F          # 领域实体、状态和规则\n│  ├─ infrastructure\u002F # SQLite 队列及外部系统适配器\n│  ├─ runtime\u002F        # Agent Runtime 抽象\n│  ├─ workers\u002F        # 后台 Worker 进程入口\n│  └─ modules\u002F        # memory、retrieval、storage、技能、MCP 等能力边界\n├─ static\u002F            # favicon 与 console\u002F 技能控制台页面（Vue 产物由后端服务 frontend\u002Fdist）\n├─ skill-center\u002F      # 技能中心命令行工具与研究样本\n├─ deploy\u002F            # 数据库初始化脚本\n├─ sql\u002F templates\u002F    # SQL schema 与 PPT 模板\n├─ docs\u002F              # 设计规范、运维手册与脚本\n├─ data\u002F              # 运行数据（Git 忽略）：应用库、上传、技能目录库\n├─ main.py            # FastAPI 入口（加载根目录 .env）\n└─ dev-launcher.mjs   # 一键启动前端 + 后端\n```\n\n### 模块边界\n\n前后端按同名能力模块逐步拆分，API、应用服务、领域和基础设施按依赖方向组织；现有旧入口继续负责兼容装配，迁移不会改变现有接口：\n\n| 模块 | 负责内容 | 当前实现入口 |\n| --- | --- | --- |\n| `memory` | 会话历史、草稿、项目记忆 | `agents.py`、`storage.py` |\n| `retrieval` | 文件、向量、关键词、图谱和联网检索 | `vector_store.py`、`documents.py`、`agents.py` |\n| `storage` | 会话、文件、文档和对象存储 | `storage.py`、`object_store.py` |\n| `context_engineering` | 历史、检索、技能和提示词组装 | `agents.py` |\n| `skills` | Skill 版本、绑定、运行时加载 | `skills.py`、`skill_center.py` |\n| `mcp` | 外部工具协议和搜索工具 | `agents.py`（逐步迁移） |\n| `execution` | 任务生命周期、停止、脚本和 EXE 执行 | `domain\u002Fexecution`、`application\u002Fexecution_service.py`、`workers\u002Fexecution_worker.py` |\n| `workspaces` | 文件夹、工作区和任务归属 | 前端工作区状态（逐步持久化） |\n| `artifacts` | PPT、文档预览、下载和结果交付 | `ppt.py`、`documents.py` |\n\n模块目录位于 `python_backend\u002Fmodules\u002F` 和 `frontend\u002Fsrc\u002Fmodules\u002F`；协作约束和迁移规则统一见 [AGENTS.md](.\u002FAGENTS.md)。\n\n## 设计原则\n\n1. **单项目单仓库**：一个应用一个仓库，前端、后端、工具、文档同仓维护，不再有平台与项目之分。\n2. **一个浏览器入口，运行面解耦**：FastAPI 直接服务 Vue 构建产物，页面、接口、技能控制台同源同端口；长任务由独立 Python Execution Worker 承载，执行 API 通过应用服务和队列端口连接基础设施，后续按数据所有权逐步抽取其他服务。\n3. **事实优先**：不把计划、推测或未验证结果描述成已实现能力。\n4. **可重复验证**：`python skill-center\u002Ftest_center.py`、`npm --prefix frontend run build` 等命令可重复执行。\n5. **安全优先**：不提交密钥、访问令牌、真实个人信息或生产数据；技能内容保存前自动做敏感信息与提示注入扫描。\n6. **最小改动**：新增功能只影响必要的文件，不进行无关重构。\n\n协作规则见 [AGENTS.md](.\u002FAGENTS.md)。\n\n## 贡献方式\n\n1. 阅读 [AGENTS.md](.\u002FAGENTS.md)。\n2. 在对应子目录（frontend \u002F python_backend \u002F skill-center）内修改。\n3. 运行项目自身的检查命令（后端编译与技能测试、前端构建）。\n4. 提交变更时使用清晰的 Conventional Commits 信息。\n\n## 许可证\n\n当前仓库尚未声明开源许可证。正式公开到 GitHub 前，请根据你的授权方式补充 `LICENSE` 文件。\n## 我们在做什么\n\n技术的价值，不在于它有多新，而在于它能否在真实场景中稳定工作。\n\nHotline 关注最新的模型、协议、开发工具和智能工作流，通过快速、可复现的实验回答三个问题：\n\n> **它能不能用？为什么值得用？怎样让别人马上用起来？**\n\n每个实验都尽量走完从发现到交付的完整路径：\n\n```text\n热点发现 → 最小原型 → 真实验证 → 工程封装 → 开箱即用\n```\n\n我们不收集概念，也不堆叠演示。能够留下来的成果，必须经得起安装、配置、运行和复用。\n\n## 能力地图\n\n| 方向 | 关注内容 | 最终交付 |\n| --- | --- | --- |\n| **MCP** | 工具、资源、提示模板、外部系统连接 | 可启动的 MCP 服务 |\n| **Skills** | 提示词、工作流、脚本和领域方法 | 可复用的 Skill |\n| **Plugins** | 完整插件、配置、依赖与运行入口 | 可独立运行的工具 |\n| **Experiments** | 新模型、新协议、新框架和新交互 | 可复现的验证结论 |\n\n## 从灵感到能力\n\n```mermaid\ngraph LR\n    A[发现热点技术] --> B[提出真实问题]\n    B --> C[构建最小原型]\n    C --> D{验证通过?}\n    D -- 否 --> E[记录限制与失败原因]\n    D -- 是 --> F[封装 Skill \u002F MCP]\n    F --> G[补齐文档与示例]\n    G --> H[开箱运行与复用]\n```\n\n## 项目结构\n\n```text\nHotline\u002F\n├── mcp\u002F                    # MCP 服务、工具与资源\n│   └── \u003Cmcp-project>\u002F\n├── skills\u002F                 # 可复用的 Skill 定义与工作流\n│   └── \u003Cskill-project>\u002F\n├── plugins\u002F                # 完整插件项目与打包配置\n│   └── \u003Cplugin-project>\u002F\n└── README.md               # 项目入口与实验索引\n```\n\n每个独立项目都应尽可能包含自己的 README、依赖清单、示例配置和验证命令，让它可以脱离上下文被理解、安装和运行。\n\n## 快速开始\n\n```bash\n# 获取主分支\ngit clone -b master https:\u002F\u002Fgithub.com\u002FSC-10749\u002FHotline.git\ncd Hotline\n\n# 选择一个方向开始实验\nls mcp skills plugins\n```\n\n创建新项目时，建议从一个小而完整的闭环开始：\n\n1. 写下真实用户场景和成功标准。\n2. 用最少依赖完成可运行原型。\n3. 记录安装步骤、输入输出和已知限制。\n4. 验证后再抽象成 Skill 或 MCP。\n5. 为使用者提供一条清晰的启动命令。\n\n## 开发准则\n\n- **实用优先**：先证明能解决问题，再讨论规模化。\n- **最小闭环**：每个实验都要能运行、能验证、能复现。\n- **清晰交付**：安装、配置、启动和验证步骤必须可读。\n- **诚实记录**：明确写出边界、失败案例和不适用场景。\n- **安全默认**：示例只使用占位符，真实密钥和服务地址留在本地。\n- **独立可用**：插件不依赖另一个项目的内部状态才能启动。\n\n## 什么样的成果会被留下\n\n一个值得交付的 Skill 或 MCP，至少应该做到：\n\n- 用户知道它解决什么问题；\n- 用户能在干净环境中安装它；\n- 用户能用一条明确命令启动或调用它；\n- 用户能看到可预期的输入、输出和错误信息；\n- 用户能根据文档判断它是否适合自己的场景。\n\n## 一起把新技术变成新能力\n\n如果一个技术值得关注，就让它接受真实任务的检验；如果一个实验证明有效，就把它整理成任何人都能使用的能力。\n\n**Hotline 不追逐热闹，Hotline 负责让有价值的技术真正抵达。**\n\n\u003Cdiv align=\"center\">\n\n`Explore · Verify · Package · Share`\n\n\u003C\u002Fdiv>\n\n",2,"2026-10-31 04:26:42","CREATED_QUERY"]