Files
agentPCapp/README.md
T
2026-07-21 09:01:27 +08:00

4.7 KiB
Raw Blame History

FengAI ✦

一个简洁、好看的 OpenAI 兼容大模型对话桌面应用(Electron)。支持流式输出、思考过程、Markdown 渲染、思考强度(reasoning_effort)、Token 统计、供应商/模型配置、本地历史会话管理,可打包为 Windows exe 安装包。

功能

  • OpenAI 兼容协议API 地址自动拼接 /chat/completions
  • 流式输出,节流增量渲染,支持中断;超长输出自动降级,不卡顿、不截断
  • 思考强度:顶栏分段控制 关闭 / 增强(high) / 深度(max),对应 thinking + reasoning_effort
  • Token 统计:每条助手消息显示「输入 · 思考 · 输出 · 合计」,输入框下方显示本会话累计
  • 分离展示「思考过程」与「回答」,思考区可折叠、可独立滚动
  • Markdown 渲染marked + DOMPurify 消毒)
  • 上下文条数控制(默认保留最近 6 条,可调)
  • 最大输出 tokens 可配置(留空=不限制;GLM-5.2 可填 131072
  • 系统提示词、深度思考开关
  • 历史会话本地保存,左侧列表 + 右侧对话,自动命名
  • 智能滚动 + 「回到底部」按钮
  • 消息操作:复制、重新生成
  • 会话管理:删除单条、清空当前、清空全部、双击重命名
  • 明/暗双主题切换(持久化),渐变品牌风格
  • 自定义渐变图标(青-靛「风」字形)

目录结构

fengai/
├── package.json
├── .npmrc                # 国内镜像
├── build/icon.ico        # 应用图标(由脚本生成)
├── scripts/make-icon.js  # 图标生成脚本(纯 Node,无外部依赖)
├── src/
│   ├── main/
│   │   ├── main.js       # 主进程(窗口/IPC
│   │   ├── preload.js    # 预加载(安全暴露 API)
│   │   ├── store.js      # 本地存储(供应商/会话 JSON)
│   │   └── api.js        # 流式请求与 SSE 解析(含 usage 提取)
│   └── renderer/
│       ├── index.html
│       ├── styles.css
│       ├── app.js        # 渲染层逻辑
│       └── vendor/       # marked + dompurify(本地副本,符合 CSP

开发运行

npm install
npm start            # 运行
npm run dev          # 调试模式(打开 DevTools
npm run icon         # 重新生成 build/icon.ico

打包为 exe 安装包

npm run build        # 生成 dist/FengAI-Setup-1.0.0.exeNSIS 安装程序)
npm run pack         # 仅生成免安装目录版本 dist/win-unpacked/

配置示例(GLM-5.2

打开应用后点「⚙ 供应商与模型」:

字段 示例值
供应商名称 GLM5.1
API 地址 https://ark.cn-beijing.volces.com/api/coding/v3
密钥 sk-...
模型列表 glm-5.2, kimi-k2.6, deepseek-v4-pro, ...
最大输出 tokens 131072

请求体(深度思考 + 128K 输出):

{ "model": "glm-5.2", "stream": true,
  "thinking": {"type":"enabled"}, "reasoning_effort": "max",
  "max_tokens": 131072, "messages": [...] }

流式响应正确处理 delta.reasoning_contentdelta.content,并解析末尾 usage(含 completion_tokens_details.reasoning_tokens)用于 Token 统计。

流式稳定性说明

为支持几十万字的超长输出数分钟的思考,已做以下处理:

  • HTTP 层改用 Node https 模块(非 fetch/undici),无默认 body 超时,避免长思考/长输出被 5 分钟超时截断。
  • 渲染每 100ms 节流刷新一次 DOM;内容 < 40KB 实时 Markdown、超过自动切纯文本增量追加,流结束后最终格式化。
  • 自动续写:检测到 finish_reason=length(被 max_tokens 截断)或流异常中断时,自动拼接「继续」请求,无缝追加到同一条消息,最多 12 轮,无需手动发「继续」。
  • 若仍被截断:在供应商配置里把「最大输出 tokens」设为 131072GLM-5.2 最大输出 128K)。

排查与日志

所有流式请求均写入日志文件:%APPDATA%\FengAI\fengai.log

日志记录:每次请求的迭代、模型、消息数、思考开关、HTTP 状态、每段的 finish_reason、是否 sawDone、累计长度、自动续写决策、错误堆栈等。

设置弹窗底部「📂 打开日志文件」可直接在资源管理器中定位该文件。遇到问题时把该文件内容发我即可定位。

技术栈

  • Electron 31 + 原生 HTML/CSS/JS(无前端构建步骤)
  • Node https 模块(流式 SSE 解析,无超时,AbortController 中断)
  • marked + DOMPurifyMarkdown 渲染与消毒)
  • 本地文件存储(JSON),electron-builder 打包