Skip to content
FrankWkd-Plus edited this page Jul 25, 2026 · 1 revision

08 · AI 链路

上级:Wiki 首页 · Provider 实现:web/functions/_shared/aiProvider.ts


设计原则

  1. 密钥只在服务端(Pages Functions)
  2. 演示不断线 — 远程失败必有本地模板
  3. 人格上下文 — 始终带上 toy 的 role / traits / bio / monologue
  4. 记忆可注入 — 对话带近期 entries 摘要

链路 A · 日记分析

ComposePage / 重写
  → analyzeEntry()          # web/src/ai/analyzeEntry.ts
    → POST /api/analyze-entry
      → aiProvider (OpenAI chat/completions 或 Anthropic messages)
    → 失败 / 关闭:generateLocalAnalysis()
  → 用户可编辑 title / aiDiary
  → api.createEntry 或 regenerate

多模态:有 imageDataUrl 时一并传入(视上游支持)。

OpenAI 路径请求 response_format: json_object;Anthropic 依赖 system 提示约束 JSON。


链路 B · 对话

ConversationPage
  → chatToyReply()          # web/src/ai/chatToyReply.ts
    → POST /api/chat
      body: message, toy, history(≤12), memories(≤6), quietMode
    → 失败:localPersonaReply + API 错误气泡 / Toast
  → chatStorage 按 toyId 追加

安静模式toydairy.quietMode):更短、少追问;并抑制 ToyNudgeHost 主动打扰。


链路 C · 人设生成

NewToyPage
  → generateToyProfile()    # 走对话/分析同类适配或本地
  → 填充 bio + monologue

失败用本地性格模板,不阻塞保存。


Provider 适配

AI_PROVIDER 行为
openai POST {base}/chat/completions,Bearer
anthropic POST {base}/messages,x-api-key + Bearer + anthropic-version
auto(默认) 按 base URL / 模型名(如 claude-*)判断;自定义网关可回退

响应解析兼容 choices[]content[{type,text}]
失败响应带 auth 元数据(provider、endpoint、keyHint)便于排障。

坑: OPENAI_BASE_URL 必须含 /v1,否则中转站常返回 HTML 门户页。


本地能力(非 LLM 服务端)

能力 说明
抠图 @imgly/background-removal + ONNX 浏览器内;AGPL;动态 import
OCR tesseract.js 拍照记一笔填描述
贴纸 Canvas 512 白边 createStickerAvatar

安全

  • 禁止把 Key 写进任何 VITE_*
  • 抠图默认本地,原图不强制上传
  • 演示 CORS *;生产应收紧

下一步

Clone this wiki locally