跳转至

知乎开放平台集成 — 设计稿

状态:设计稿(2026-09-14),未实现。本文档固定讨论结论,作为后续实施的依据。 范围:features/zhihu 后端(探测 / 安装 / 凭证 / CLI runner)、Agent 设置卡片(虚拟 Agent)、广场「知乎」面板、论文页「找知乎讨论」、划词「插入知乎引用」。 相关:plaza.md、plaza-feeds.md、agent-dx.md、../frontend/index.md。 依赖:知乎开放平台(https://developer.zhihu.com)Access Secret + zhihu-cli 官方二进制。

0. 设计决策总表

# 议题 结论
D1 定位 知乎 = 社区经验层:arXiv/S2 给学术文献,知乎给真实讨论、解读与实践经验
D2 后端形态 统一 CLI 后端:features/zhihu spawn 官方 zhihu-cli,不直连 HTTP、不自管鉴权
D3 虚拟 Agent Agent 注册表新增 kind: "builtin" 条目,host 内建 ACP 适配器,大脑用知乎直答(answer --stream)
D4 凭证边界 Agentero 永不接触 Access Secret:stdin 传给 auth set,由 CLI 写 macOS Keychain / Secret Service
D5 已有 CLI 用户 探测官方安装目录(~/Library/Application Support/zhihu-cli/current/),直接复用不重装
D6 安装器 Rust 重实现官方 setup.sh 逻辑:公开 manifest + HTTPS + SHA-256 + size + tar 单成员 + 版本自报六重校验
D7 配置一次全局生效 ZhihuState 单一事实源,Agent 卡片 / 广场空态 / composer Agent 选择器同步订阅
D8 明确不做 知识库上传、直答作通用 chat、me 数据、iframe 直嵌、默认全网搜索(见 §7)

1. 动机与定位

Agentero 是 local-first 科研文献工作台。学术链路(arXiv 发现 → S2/Crossref 引用 → 阅读笔记)已完整;缺的是社区经验层:「这篇论文大家怎么理解」「这个领域从业者在聊什么」。知乎的搜索 / 热榜 / 直答 API 提供带社交信号(赞同数、评论数、认证)的中文社区内容,与学术源互补。

原则(用户明确要求):能力克制,一个后端,N 个薄入口。只做发现与引用,不做账号管理、内容发布。

2. 总体架构

                ┌─ 配置层(做一次)──────────────────────────┐
                │  src-tauri/src/features/zhihu/             │
                │  ├─ detector  探测官方目录 CLI + 版本比对    │
                │  ├─ installer 一键下载(manifest 六重校验)  │
                │  ├─ auth      封装 auth set --secret-stdin  │
                │  ├─ runner    统一 CLI spawn(JSON stdout) │
                │  └─ ZhihuState 单一状态源 → Tauri event     │
                └──────────────┬─────────────────────────────┘
                               │ 统一 CLI runner
        ┌───────────┬──────────┼─────────────┬───────────────┐
        ▼           ▼          ▼             ▼               ▼
   广场知乎面板   知乎虚拟Agent  论文找讨论    划词插引用     额度/状态显示
   热榜+搜索     对话/直答     chip注入      markdown引用块  (设置页)
   (发现层)      (对话层)     (对话层)      (写作层)
  • 配置状态全局共享:任一入口完成「安装 + 配置凭证」,全部入口就绪。
  • 广场面板、划词等入口不引入任何独立配置,只有空态引导卡。

3. 后端:features/zhihu

仿 discovery/feeds/ 的 feature 结构(commands + XDG state),核心四个模块:

3.1 detector(探测,零副作用)

1. macOS: ~/Library/Application Support/zhihu-cli/current/zhihu-cli
   Linux:  ${XDG_DATA_HOME:-~/.local/share}/zhihu-cli/current/zhihu-cli
2. 存在 → spawn `zhihu-cli version` 读版本 → 与本 feature 维护的 MIN_CLI_VERSION 比对
3. 兼容 → Ready 复用;低于 → 提示升级;损坏 → 修复入口

版本比较逻辑照抄官方 run.sh 的 version_ge(点分三段 + prerelease 语义)。

3.2 installer(一键下载)

官方 skill 的 setup.sh 逻辑透明可审计,Rust 重实现(reqwest + sha2 + tar,约百行):

  1. GET https://developer-cdn.zhihu.com/zhihu-cli/releases/beta/manifest.json
  2. 选平台 artifact(darwin-arm64/amd64、win-amd64、linux-amd64/arm64 五平台)
  3. 校验:HTTPS-only、artifact host 必须等于 manifest host、SHA-256、size ≤ 128MiB、tar 归档有且仅有根级单成员 zhihu-cli、二进制自报版本等于 manifest 版本
  4. 原子落盘官方目录(.zhihu-cli.new.$$ → rename),不动 PATH、不用 sudo
  5. 进度经 Tauri event 推前端

3.3 auth(凭证,Agentero 零接触)

动作 命令 说明
写入 zhihu-cli auth set --secret-stdin secret 走 stdin(绝不进 argv,避免 ps 泄露);CLI 内含一次在线验证
本地状态 zhihu-cli auth status 不联网、不耗额度;返回脱敏值 + last_verified_at
在线验证 zhihu-cli auth status --verify 仅手动「重新检测」/ 换钥后调用;耗一次 creator 额度
清除 zhihu-cli auth logout 仅删本机 Keychain 条目

Agentero 侧不存 secret:settings.json 只存探测缓存(版本、脱敏值、last_verified_at)。

3.4 ZhihuState 与事件

struct ZhihuState {
    phase: Phase, // NotInstalled | Installing{progress} | NeedsSecret | Ready | Invalid{reason}
    version: Option<String>,
    secret_masked: Option<String>, // "b30d...e94c",来自 auth status
    last_verified_at: Option<String>,
}
// emit "zhihu://state-changed";前端 zustand store 订阅

3.5 Tauri commands(规划)

zhihu_probe / zhihu_install / zhihu_set_secret(stdin 桥接)/ zhihu_logout / zhihu_hot / zhihu_search / zhihu_answer(流式 event)/ zhihu_quota

4. 配置层:Agent 设置卡片

复用现有 agent registry 卡片样式,新增状态点 + Secret 输入框。建议抽出通用 SecretInputCard 组件(知乎为首个消费者,后续 API 型服务复用)。

4.1 卡片状态机

① 未安装      ○  [ ⬇ 一键安装 ]
② 安装中      下载进度 ··· 62% · ✓ SHA-256 校验通过
③ 待配置凭证  ◐  Secret 输入框 + [保存并验证] + 前往 developer.zhihu.com/profile ↗
④ 就绪        ●  v0.6.0 · 密钥 b30d••••e94c · 额度 97/100 · 验证于 2m 前
              [更换密钥] [检查更新];[⋯] 菜单:重新检测 / 清除本机凭证 / 复制诊断
⑤ 凭证失效    ●⚠ AUTH_INVALID · 密钥可能已轮换 → [重新输入] [前往个人中心重新生成 ↗]

4.2 绿点 Probe 策略(默认本地、零额度)

时机 命令 联网 耗额度
App 启动 / 打开设置页 / 安装完成 version + auth status ❌ ❌
保存 / 更换密钥后 auth set --secret-stdin(内含在线验证) ✅ 一次 creator
手动「重新检测」 auth status --verify ✅ 一次 creator
就绪态额度行 quota --api-id ... ✅ ❌ 查询免费

颜色:🟢 = installed && compatible && auth.configured;🟡 = 待配密钥 / 探测中(呼吸动画)/ 网络不可达;🔴 = verify 失败 / 版本不兼容 / 安装损坏。tooltip 显示 last_verified_at。

4.3 Secret 输入安全清单

  • type="password";保存后立即从 React state 清除;不进日志、不进 settings.json
  • stdin 传递;卡片只回显 CLI 返回的脱敏值
  • 「更换密钥」= 重新展开输入框,流程同首次

5. 入口层

5.1 广场「知乎」面板(发现层,主入口)

PLAZA_SOURCES 加一条 { id: "zhihu", panel: "zhihu", ... } + plaza-zhihu-view.tsx(壳抄 PlazaArxivRecView)。两个 tab:

Tab CLI 调用 呈现
热榜 zhihu-cli hot --limit 20 卡片流(标题/摘要/缩略图)
搜索 zhihu-cli search zhihu --query ... --count 10 卡片带赞同数/评论数/作者/认证

卡片动作:「问 Agent」(复用 buildPlazaAskPrompt,src/lib/plaza/ask-prompt.ts)+「打开」(跳外部浏览器)。不做收藏、评论、全文抓取(知乎登录墙,resolve_body 不可靠)。空态 = 复用配置层引导卡;ZhihuState 变 Ready 时已打开面板经 event 自动切换。

5.2 知乎虚拟 Agent(对话层)

  • AgentDescriptor 扩展 kind: "builtin":registry 不 spawn 外部 ACP 进程,路由到 host 内建适配器
  • prompt 路由表:
输入 CLI 调用 ACP 呈现
纯文本 answer --query <text> --stream --output sse 流式 AgentMessage(直答 LLM:zhida-fast/thinking/agent)
/search 关键词 search zhihu --count 10 ToolCall 块 + markdown 卡片
/hot hot --limit 20 热榜卡片流
/topic 主题 question recommend --query --count 5 推荐问题列表
  • 全部只读、无权限请求;session/cancel = kill 子进程
  • 「问 Agent」兜底路由:未连接任何 LLM Agent 时,广场卡片的「问 Agent」默认路由到知乎 Agent(开箱即用)

5.3 论文页「找知乎讨论」(对话层,最高价值/成本比)

论文页动作(命令面板或 References 侧栏旁):当前论文标题 → search zhihu → 结果作为 composer 上下文 chip 注入对话。复用现有 chip / 选区 pin 机制。

5.4 划词「插入知乎引用」(写作层)

笔记内选中文字 → 划词菜单加「找知乎」(现有翻译/⌘K/⌘L 菜单旁)→ 浮出结果 → 点选插入:

> **[标题](url)** — 作者(👍 128)
> 摘要文本…

先例:Cool Paper 笔记按钮(paper_coolpapers_notes 追加进当前笔记)。

5.5 零代码:vault Skill

.agents/skills/zhihu/(纯 markdown)教用户连接的 ACP Agent(Claude Code 等)直接调本机 zhihu-cli;可挂入广场 Skill 推荐面板(skill-catalog.ts)。与虚拟 Agent 共享同一 CLI 安装。

6. 技术选型记录:为什么是 CLI 后端

知乎侧可用通道有三:官方 zhihu-cli 二进制、官方 MCP 服务(zhihu_search / global_search / hot_list / zhida,SSE + Streamable HTTP)、裸 HTTP API。选 CLI:

  1. 凭证边界:MCP / HTTP 要求 Agentero 自存 secret、自管 Bearer;CLI 模式下凭证归 Keychain,Agentero 零鉴权代码
  2. 流式:answer --stream 有 SSE 增量;zhida 的 MCP 版等完整输出才返回
  3. 无状态:spawn 即用,崩了重跑;MCP over SSE 要管长连接 / sessionId
  4. 错误处理现成:CLI 已封装鉴权、时间戳、重试、错误码语义(AUTH_REQUIRED / 30001 频率 / 30002 配额等)

官方 MCP 留作未来彩蛋(如给外部客户端供工具);裸 HTTP 仅在 CLI 后续废弃时兜底。

7. 明确不做

项 理由
知识库上传(RAG 云端) 本地笔记推第三方云端,与广场「不注入登录态」隐私立场冲突,方向相反
直答作通用 chat BYOA 架构下不引入第二套通用 LLM;直答仅作知乎 Agent 的检索增强大脑。唯一保留可能:未来作为翻译功能的免费 OpenAI 兼容 provider 备选
me 数据(创作/关注/收藏) 创作者场景,与文献工作台无关
iframe 直嵌知乎 登录墙 / XFO,且代理模式不注入登录态
默认全网搜索 Agent 自带 web 能力,重复;仅作搜索面板 Filter 彩蛋

8. 边界与风险

风险 缓解
直答多轮:CLI answer 单轮(HTTP 才支持多轮 messages) 适配器拼接最近 N 轮进 query;体验不佳再评估直连 HTTP(需重议 D4)
直答无引用链接(OpenAI 格式仅 content) 引导「要来源用 /search」;或适配器组合:先 search 拿来源卡片再 answer
额度:各能力组 100 次/日(未实名 10 次) 设置页只读额度行(查询免费);30001/30002 错误停止重试并提示
版本耦合:CLI 接口演进 Rust 侧维护 MIN_CLI_VERSION;upgrade --check 供「检查更新」
用户预期 Agent 描述文案明确「知乎社区检索增强问答」,非通用 chat

9. 实施阶段

P1  features/zhihu 骨架:detector + installer + auth + ZhihuState + Agent 卡片(含 SecretInputCard)
P2  广场知乎面板(热榜 + 搜索 + 空态引导)
P3  知乎虚拟 Agent(builtin ACP 适配器 + answer 流式 + 斜杠路由)
P4  论文页「找知乎讨论」chip
P5  划词「插入知乎引用」
随时  vault Skill(零代码,可先行发布试用)