@templmf/temp-solf-lmf 0.0.54 → 0.0.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/guanwang/README.md +95 -0
- package/guanwang/docs/changelog.md +145 -0
- package/guanwang/docs/doc-maintenance.md +229 -0
- package/guanwang/docs/product.md +181 -0
- package/guanwang/docs/test-cases.md +395 -0
- package/guanwang/docs/usage.md +291 -0
- package/guanwang/env.example +27 -0
- package/guanwang/index.html +13 -0
- package/guanwang/package-lock.json +3825 -0
- package/guanwang/package.json +32 -0
- package/guanwang/public/favicon.svg +4 -0
- package/guanwang/public/react-runtime/babel.min.js +4 -0
- package/guanwang/public/react-runtime/react-dom.min.js +267 -0
- package/guanwang/public/react-runtime/react.min.js +31 -0
- package/guanwang/public/vue-repl-assets/compiler-sfc.esm-browser.js +50795 -0
- package/guanwang/public/vue-repl-assets/runtime-dom.esm-browser.js +12758 -0
- package/guanwang/public/vue-repl-assets/server-renderer.esm-browser.js +8600 -0
- package/guanwang/public/vue-repl-assets/vue.esm-browser.js +18672 -0
- package/guanwang/src/App.vue +61 -0
- package/guanwang/src/chat-sdk/core/components/ChatBox.vue +305 -0
- package/guanwang/src/chat-sdk/core/components/ChatSidebar.vue +84 -0
- package/guanwang/src/chat-sdk/core/components/InputBar.vue +354 -0
- package/guanwang/src/chat-sdk/core/components/MessageBubble.vue +703 -0
- package/guanwang/src/chat-sdk/core/useTheme.js +31 -0
- package/guanwang/src/chat-sdk/features/artifact/ArtifactCard.vue +172 -0
- package/guanwang/src/chat-sdk/features/artifact/ArtifactPanel.vue +963 -0
- package/guanwang/src/chat-sdk/features/artifact/index.js +13 -0
- package/guanwang/src/chat-sdk/features/artifact/useArtifactStore.js +275 -0
- package/guanwang/src/chat-sdk/features/codepreview/CodePreview.vue +523 -0
- package/guanwang/src/chat-sdk/features/codepreview/index.js +7 -0
- package/guanwang/src/chat-sdk/features/markdown/index.js +13 -0
- package/guanwang/src/chat-sdk/features/markdown/useMarkdown.js +724 -0
- package/guanwang/src/chat-sdk/features/mermaid/MermaidZoom.vue +254 -0
- package/guanwang/src/chat-sdk/features/upload/FileAttachment.vue +142 -0
- package/guanwang/src/chat-sdk/features/upload/index.js +17 -0
- package/guanwang/src/chat-sdk/features/upload/useFileHandler.js +336 -0
- package/guanwang/src/chat-sdk/headless/api/adapters/openai.js +76 -0
- package/guanwang/src/chat-sdk/headless/api/chatApi.js +126 -0
- package/guanwang/src/chat-sdk/headless/buildSystemPrompt.js +351 -0
- package/guanwang/src/chat-sdk/headless/index.js +15 -0
- package/guanwang/src/chat-sdk/headless/useChat.js +77 -0
- package/guanwang/src/chat-sdk/headless/useChatDB.js +147 -0
- package/guanwang/src/chat-sdk/headless/useChatStore.js +529 -0
- package/guanwang/src/chat-sdk/index.js +79 -0
- package/guanwang/src/chat-sdk/modes/architect.js +27 -0
- package/guanwang/src/chat-sdk/modes/ask.js +26 -0
- package/guanwang/src/chat-sdk/modes/code.js +25 -0
- package/guanwang/src/chat-sdk/modes/index.js +36 -0
- package/guanwang/src/chat-sdk/modes/requirements.js +175 -0
- package/guanwang/src/chat-sdk/settings/SettingsPanel.vue +170 -0
- package/guanwang/src/chat-sdk/settings/index.js +9 -0
- package/guanwang/src/chat-sdk/settings/useSettings.js +122 -0
- package/guanwang/src/chat-sdk/tools/defaults.js +89 -0
- package/guanwang/src/chat-sdk/tools/index.js +16 -0
- package/guanwang/src/chat-sdk/tools/parser.js +116 -0
- package/guanwang/src/components/CustomCursor.vue +69 -0
- package/guanwang/src/components/Footer.vue +24 -0
- package/guanwang/src/components/LoginModal.vue +109 -0
- package/guanwang/src/components/Navbar.vue +193 -0
- package/guanwang/src/components/ThemeToggle.vue +25 -0
- package/guanwang/src/composables/useArtifactStore.js +253 -0
- package/guanwang/src/composables/useAuth.js +88 -0
- package/guanwang/src/composables/useChatDB.js +147 -0
- package/guanwang/src/composables/useCountUp.js +24 -0
- package/guanwang/src/composables/useFileHandler.js +345 -0
- package/guanwang/src/composables/useTheme.js +31 -0
- package/guanwang/src/config/api.js +71 -0
- package/guanwang/src/main.js +23 -0
- package/guanwang/src/router/index.js +23 -0
- package/guanwang/src/services/authApi.js +27 -0
- package/guanwang/src/services/chatApi.js +66 -0
- package/guanwang/src/styles/global.css +478 -0
- package/guanwang/src/tracker/analyze.js +73 -0
- package/guanwang/src/tracker/config.js +82 -0
- package/guanwang/src/tracker/index.js +18 -0
- package/guanwang/src/tracker/service.js +102 -0
- package/guanwang/src/tracker/useChatTracker.js +179 -0
- package/guanwang/src/tracker/useTracker.js +45 -0
- package/guanwang/src/views/ChatView.vue +65 -0
- package/guanwang/src/views/HomeView.vue +156 -0
- package/guanwang/src/views/MarketView.vue +143 -0
- package/guanwang/src/views/PracticesView.vue +190 -0
- package/guanwang/src/views/SkillsView.vue +129 -0
- package/guanwang/temp +19 -0
- package/guanwang/vite.config.js +6 -0
- package/package.json +1 -1
- package/guanwang copy.zip +0 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Citic Frontend(Vue 3 版)
|
|
2
|
+
|
|
3
|
+
基于 **Vue 3 + Vite + Vue Router v4** 构建的Citic Frontend AI体验平台。
|
|
4
|
+
|
|
5
|
+
## 快速启动
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 1. 安装依赖(需要 Node 18+)
|
|
9
|
+
npm install
|
|
10
|
+
|
|
11
|
+
# 2. 配置环境变量
|
|
12
|
+
cp .env.local.example .env.local
|
|
13
|
+
# 编辑 .env.local,填入模型 API 地址和 Key
|
|
14
|
+
|
|
15
|
+
# 3. 启动开发服务器
|
|
16
|
+
npm run dev
|
|
17
|
+
|
|
18
|
+
# 4. 打包生产版本
|
|
19
|
+
npm run build
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 环境变量
|
|
23
|
+
|
|
24
|
+
| 变量名 | 说明 | 示例 |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| `VITE_API_BASE_URL` | 模型 API 地址(OpenAI 兼容) | `https://api.openai.com` |
|
|
27
|
+
| `VITE_API_KEY` | API Key | `sk-xxxx` |
|
|
28
|
+
| `VITE_MODEL` | 模型名称 | `gpt-4o` |
|
|
29
|
+
|
|
30
|
+
## 项目结构
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
src/
|
|
34
|
+
├── config/
|
|
35
|
+
│ └── api.js # API 配置(读取 .env.local)
|
|
36
|
+
├── services/
|
|
37
|
+
│ ├── chatApi.js # OpenAI 兼容流式请求封装
|
|
38
|
+
│ └── authApi.js # 登录/登出(mock,可替换为真实接口)
|
|
39
|
+
├── composables/ # 对应 React Hooks
|
|
40
|
+
│ ├── useAuth.js # 全局用户状态(provide/inject)
|
|
41
|
+
│ ├── useChatStore.js # 聊天会话状态管理
|
|
42
|
+
│ ├── useTheme.js # 主题(深色/浅色)
|
|
43
|
+
│ └── useCountUp.js # 数字滚动动画
|
|
44
|
+
├── components/
|
|
45
|
+
│ ├── Navbar.vue # 导航栏(含登录入口、用户头像下拉)
|
|
46
|
+
│ ├── LoginModal.vue # 登录弹框
|
|
47
|
+
│ ├── ChatInputBar.vue # 聊天输入框
|
|
48
|
+
│ ├── ChatSidebar.vue # 聊天侧边栏
|
|
49
|
+
│ ├── MessageBubble.vue # 消息气泡
|
|
50
|
+
│ ├── ThemeToggle.vue # 主题切换按钮
|
|
51
|
+
│ ├── Footer.vue
|
|
52
|
+
│ └── CustomCursor.vue # 自定义鼠标(桌面端)
|
|
53
|
+
├── views/
|
|
54
|
+
│ ├── HomeView.vue # 首页
|
|
55
|
+
│ ├── ChatView.vue # AI 对话页
|
|
56
|
+
│ ├── MarketView.vue # 组件市场
|
|
57
|
+
│ ├── SkillsView.vue # Skills 市场
|
|
58
|
+
│ └── PracticesView.vue # 最佳实践
|
|
59
|
+
├── router/
|
|
60
|
+
│ └── index.js # Vue Router v4 路由配置
|
|
61
|
+
├── styles/
|
|
62
|
+
│ └── global.css # CSS 变量 + 全局工具类
|
|
63
|
+
├── App.vue # 根组件
|
|
64
|
+
└── main.js # 入口文件
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 路由
|
|
68
|
+
|
|
69
|
+
| 路径 | 页面 |
|
|
70
|
+
|---|---|
|
|
71
|
+
| `/` | 首页 |
|
|
72
|
+
| `/chat` | AI 对话(需登录) |
|
|
73
|
+
| `/market` | 组件市场 |
|
|
74
|
+
| `/skills` | Skills 市场 |
|
|
75
|
+
| `/practices` | 最佳实践 |
|
|
76
|
+
|
|
77
|
+
## 登录账号(mock)
|
|
78
|
+
|
|
79
|
+
| 账号 | 密码 | 角色 |
|
|
80
|
+
|---|---|---|
|
|
81
|
+
| `admin` | `admin123` | 管理员 |
|
|
82
|
+
| `dev` | `dev123` | 开发者 |
|
|
83
|
+
|
|
84
|
+
## React → Vue 3 迁移说明
|
|
85
|
+
|
|
86
|
+
| React 原始方案 | Vue 3 方案 |
|
|
87
|
+
|---|---|
|
|
88
|
+
| `createContext` + `useContext` | `provide` / `inject` |
|
|
89
|
+
| `useState` / `useRef` | `ref` |
|
|
90
|
+
| `useMemo` | `computed` |
|
|
91
|
+
| `useEffect` + `IntersectionObserver` | `onMounted` + `onUnmounted` |
|
|
92
|
+
| `useCallback` | 普通函数(Vue 响应性系统不需要) |
|
|
93
|
+
| JSX 内联子组件 | 拆分为独立 `.vue` 文件 |
|
|
94
|
+
| `lucide-react` | `lucide-vue-next` |
|
|
95
|
+
| `react-router-dom` | `vue-router` |
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [1.1.0] — 2025-03-20
|
|
4
|
+
|
|
5
|
+
### 新增:埋点系统
|
|
6
|
+
|
|
7
|
+
- `src/tracker/config.js`:埋点总配置,Ackee URL/Domain 从环境变量读取,21 个 Event UUID 集中管理,意图关键词字典和复杂度阈值可配置,`VITE_TRACK_ENABLED=false` 时全部静默
|
|
8
|
+
- `src/tracker/analyze.js`:本地分析函数,提问方向/意图/复杂度/附件类型全部本地判断,不上报原文
|
|
9
|
+
- `src/tracker/service.js`:Ackee 实例懒加载 + 上报队列,避免初始化期间丢事件
|
|
10
|
+
- `src/tracker/useTracker.js`:官网页面埋点(`pageView` / `btnClick` / `loginSuccess`)
|
|
11
|
+
- `src/tracker/useChatTracker.js`:对话框埋点,覆盖发消息、回复完成/报错/中止、模式切换、复制、下载,提问内容分析无用户关联
|
|
12
|
+
- `src/tracker/index.js`:统一导出入口
|
|
13
|
+
|
|
14
|
+
**埋点覆盖范围(21 个 Ackee Event)**
|
|
15
|
+
- 页面行为 3 个:页面访问、按钮点击、登录成功
|
|
16
|
+
- 对话行为 8 个:消息发送-模式/模型/用户、回复耗时、首字节延迟、中止、报错、模式切换
|
|
17
|
+
- 采纳行为 5 个:内容复制-来源/用户/语言、文件下载-用户/语言
|
|
18
|
+
- 提问内容分析 4 个:方向、意图、复杂度、附件(无用户关联)
|
|
19
|
+
- 工具调用 1 个
|
|
20
|
+
|
|
21
|
+
**采纳率三口径**:消息级、会话级、用户级,共用同一批事件,聚合 key 不同
|
|
22
|
+
|
|
23
|
+
### 变更:useChatStore
|
|
24
|
+
|
|
25
|
+
- 新增 `config.getUser` 注入接口,消费方传入获取当前用户信息的函数
|
|
26
|
+
- `return` 新增 `tracker` 字段,供 `ArtifactPanel` / `MessageBubble` 调用采纳行为埋点
|
|
27
|
+
- `abortStream()` 和 `switchMode()` 内置埋点调用
|
|
28
|
+
|
|
29
|
+
### 文档
|
|
30
|
+
- `docs/product.md` 新增「埋点与数据分析」章节
|
|
31
|
+
- `docs/usage.md` 新增「埋点接入」章节,补充三个埋点环境变量
|
|
32
|
+
- `docs/test-cases.md` 新增「十一、埋点」章节,16 个测试用例(T-100 ~ T-115)
|
|
33
|
+
- `docs/doc-maintenance.md` 新增埋点维护规范
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## [1.1.0] — 2025-03-20
|
|
38
|
+
|
|
39
|
+
### 新增:埋点系统
|
|
40
|
+
|
|
41
|
+
- `src/tracker/config.js`:埋点总配置,Ackee URL/Domain/开关从 `.env` 读取,21 个 Event UUID 集中管理,意图关键词字典、模式方向映射、复杂度阈值全部可配置
|
|
42
|
+
- `src/tracker/analyze.js`:提问内容本地分析,输出方向/意图/复杂度/附件类型,不上报原文
|
|
43
|
+
- `src/tracker/service.js`:Ackee 实例懒加载 + 上报队列,`TRACK_ENABLED=false` 时全部静默
|
|
44
|
+
- `src/tracker/useTracker.js`:官网页面埋点 composable(`pageView` / `btnClick` / `loginSuccess`)
|
|
45
|
+
- `src/tracker/useChatTracker.js`:对话框全量埋点 composable(发消息、回复完成/报错/中止、模式切换、复制、下载)
|
|
46
|
+
- `src/tracker/index.js`:统一入口
|
|
47
|
+
|
|
48
|
+
### 埋点
|
|
49
|
+
|
|
50
|
+
共 21 个 Ackee Event,分五类:
|
|
51
|
+
|
|
52
|
+
- 页面行为(3个):页面访问、按钮点击、登录成功
|
|
53
|
+
- 对话行为(8个):消息发送模式/模型/用户分布、回复耗时、首字节延迟、中止、报错、模式切换
|
|
54
|
+
- 采纳行为(5个):复制来源/用户/语言分布、下载用户/语言分布
|
|
55
|
+
- 提问内容分析(4个,无用户关联):提问方向、意图、复杂度、附件类型
|
|
56
|
+
- 工具调用(1个):工具名分布
|
|
57
|
+
|
|
58
|
+
### 变更
|
|
59
|
+
|
|
60
|
+
- `useChatStore.js`:注入 `useChatTracker`,新增 `config.getUser` 注入口,`return` 暴露 `tracker` 供上层组件调用采纳埋点
|
|
61
|
+
- `useChatStore.switchMode()`:注入模式切换埋点(⚠️ 函数内部逻辑有变,但对外接口不变)
|
|
62
|
+
|
|
63
|
+
### 文档
|
|
64
|
+
|
|
65
|
+
- `docs/doc-maintenance.md`:新增埋点维护步骤、Ackee 展示类型速查、自查清单补充埋点项
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## [1.0.0] — 2025-03-20
|
|
70
|
+
|
|
71
|
+
### 架构重构
|
|
72
|
+
|
|
73
|
+
- 引入 `chat-sdk/` 目录,将对话能力从 guanwang 页面层剥离为独立 SDK
|
|
74
|
+
- 新增双接入入口:`createAIChat()`(完整视图)和 `useChat()`(Headless 纯逻辑)
|
|
75
|
+
- 分层结构:`headless/` → `core/` → `features/`,依赖方向单向
|
|
76
|
+
- `features/` 每个目录内部区分 `core.js`(逻辑)和 `*.vue`(UI),headless 模式只引用逻辑层
|
|
77
|
+
|
|
78
|
+
### 新增:多模型支持
|
|
79
|
+
|
|
80
|
+
- `config.models` 支持配置多个独立 `baseURL/apiKey/model` 的模型
|
|
81
|
+
- 输入栏底部新增模型 pill 选择器,仅在模型数 > 1 且 `userControls.modelSelector` 时显示
|
|
82
|
+
- `autoVision`:含图片消息自动路由到 `vision: true` 的模型
|
|
83
|
+
- 移除旧的 `VITE_VL_*` 视觉模型环境变量,统一到 `config.models`
|
|
84
|
+
|
|
85
|
+
### 新增:多模式 Prompt 系统
|
|
86
|
+
|
|
87
|
+
- `modes/code.js`:Code 模式,代码生成/修改,强制 `render_artifact` 输出
|
|
88
|
+
- `modes/ask.js`:Ask 模式,只回答不生成文件
|
|
89
|
+
- `modes/architect.js`:Architect 模式,系统设计,输出技术文档
|
|
90
|
+
- `modes/requirements.js`:需求创造者模式,假设+确认流程,输出用户故事和功能拆解
|
|
91
|
+
- `headless/buildSystemPrompt.js`:动态组装 system prompt,七区块结构,针对 Qwen3/弱模型优化
|
|
92
|
+
- 模式切换时 system prompt 自动重建
|
|
93
|
+
|
|
94
|
+
### 新增:Tool-use 解析循环
|
|
95
|
+
|
|
96
|
+
- `tools/parser.js`:XML 工具调用解析,支持流式快速检测和批量提取
|
|
97
|
+
- `tools/defaults.js`:五个工具内置默认处理逻辑(`ask_followup_question` / `attempt_completion` / `switch_mode` / `render_artifact` / `request_context`)
|
|
98
|
+
- `useChatStore.onToolCall()`:支持按工具名或全局覆盖默认行为
|
|
99
|
+
|
|
100
|
+
### 新增:设置面板
|
|
101
|
+
|
|
102
|
+
- `settings/useSettings.js`:两层配置规则实现,`localStorage` 持久化
|
|
103
|
+
- `settings/SettingsPanel.vue`:模型列表 + 功能开关 UI
|
|
104
|
+
|
|
105
|
+
### 重构:chatApi.js
|
|
106
|
+
|
|
107
|
+
- 移除全局 `selectConfig` 依赖,改为接收 `modelConfig` 对象
|
|
108
|
+
- `headless/api/adapters/openai.js`:UI 消息格式 → OpenAI 兼容格式转换层,与业务逻辑解耦
|
|
109
|
+
|
|
110
|
+
### 重构:useChatStore.js
|
|
111
|
+
|
|
112
|
+
- 接收 `config` 参数,移除硬编码 `SYSTEM_PROMPT`
|
|
113
|
+
- 集成 `loadModes()`、`buildSystemPrompt()`、`toAPIMessages()`
|
|
114
|
+
- 集成 tool-use 循环:流式结束后自动解析并执行工具调用
|
|
115
|
+
- 新增 `switchMode()`、`selectModel()`、`newSession()`、`switchSession()` 方法
|
|
116
|
+
|
|
117
|
+
### 重构:ChatView.vue
|
|
118
|
+
|
|
119
|
+
- 从 248 行页面组件精简为 46 行挂载壳,所有对话逻辑迁入 `ChatBox.vue`
|
|
120
|
+
- `sdkConfig` 由环境变量组装,为后续迁移到 `createAIChat()` 调用预留接口
|
|
121
|
+
|
|
122
|
+
### 重构:InputBar.vue
|
|
123
|
+
|
|
124
|
+
- 移除全局 `config/api.js` 依赖
|
|
125
|
+
- 改为接收 `availableModels`、`selectedModelId`、`showModelSelector` props
|
|
126
|
+
- 通过 `emit('select-model')` 通知上层,不再内部维护模型状态
|
|
127
|
+
|
|
128
|
+
### Bug 修复
|
|
129
|
+
|
|
130
|
+
- `CodePreview.vue`:修复 Vue SFC 预览报错 `props.store.init is not a function`,`<Repl>` 组件内部会自调 `init()`,移除重复调用
|
|
131
|
+
- `CodePreview.vue`:修复 `editor` prop 必填报错,补充 `CodeMirror` 异步加载并传入
|
|
132
|
+
- `CodePreview.vue`:修复代码区滚动异常,改为 `flex` 列布局 + `shiki-scroll` 层独立滚动,`min-height: 0` 消除 flex 子元素默认约束
|
|
133
|
+
- `ArtifactPanel.vue`:修复流式期间高亮竞态,引入 token 机制,后发的异步结果自动丢弃
|
|
134
|
+
- `MessageBubble.vue`:原始文本调试面板(`VITE_SHOW_RAW_TEXT=true` 时显示)
|
|
135
|
+
|
|
136
|
+
### 字体
|
|
137
|
+
|
|
138
|
+
- 全局字体统一替换为 `Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif`
|
|
139
|
+
- 涉及文件:`global.css` 及所有组件,数字/代码字体 monospace 保持不变
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## [0.x] — 历史版本
|
|
144
|
+
|
|
145
|
+
> 历史版本为 guanwang 项目初始开发阶段,未形成 SDK 结构,不单独记录。
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# 文档维护规范
|
|
2
|
+
|
|
3
|
+
每次新增功能或修复 Bug 后,按以下步骤同步更新文档。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 需要维护的文档
|
|
8
|
+
|
|
9
|
+
| 文档 | 路径 | 维护频率 |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| 产品说明书 | `docs/product.md` | 新增/删除功能时 |
|
|
12
|
+
| 组件使用文档 | `docs/usage.md` | 接口变更时 |
|
|
13
|
+
| 测试用例 | `docs/test-cases.md` | 新增功能时 |
|
|
14
|
+
| 埋点配置 | `src/tracker/config.js` | 新增埋点事件时 |
|
|
15
|
+
|
|
16
|
+
> `docs/changelog.md` 每次都要更新,不在上表之列,但每步都涉及。
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 每次更新的步骤
|
|
21
|
+
|
|
22
|
+
### 第一步:在 changelog.md 新增版本条目
|
|
23
|
+
|
|
24
|
+
在文件顶部(最新版本之前)插入新条目:
|
|
25
|
+
|
|
26
|
+
```markdown
|
|
27
|
+
## [x.x.x] — YYYY-MM-DD
|
|
28
|
+
|
|
29
|
+
### 新增
|
|
30
|
+
- 简短描述,说明加了什么、为什么加
|
|
31
|
+
|
|
32
|
+
### 修复
|
|
33
|
+
- 简短描述,说明修了什么 Bug
|
|
34
|
+
|
|
35
|
+
### 变更
|
|
36
|
+
- 简短描述,说明改了什么接口或行为(破坏性变更需标注 ⚠️)
|
|
37
|
+
|
|
38
|
+
### 埋点
|
|
39
|
+
- 新增了哪些 Event,用途是什么
|
|
40
|
+
|
|
41
|
+
### 文档
|
|
42
|
+
- 同步更新了哪些文档
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
只写本次实际改动,没有的分类直接省略。
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
### 第二步:按改动类型更新对应文档
|
|
50
|
+
|
|
51
|
+
#### 新增功能 → 更新 product.md
|
|
52
|
+
|
|
53
|
+
找到对应功能模块的章节,补充新能力描述。若是全新模块,在合适位置新增一节。
|
|
54
|
+
|
|
55
|
+
```markdown
|
|
56
|
+
### [新功能名]
|
|
57
|
+
- 一句话说明这个功能是什么
|
|
58
|
+
- 关键限制或注意事项(如有)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
#### 接口变更 → 更新 usage.md
|
|
62
|
+
|
|
63
|
+
- 新增 config 字段:在「config 完整字段说明」表格补行
|
|
64
|
+
- 新增 `useChat()` 返回值:在对应表格补行
|
|
65
|
+
- 接口删除或重命名:更新对应行,备注「已废弃,改用 xxx」
|
|
66
|
+
|
|
67
|
+
#### 新增功能 → 更新 test-cases.md
|
|
68
|
+
|
|
69
|
+
在对应模块章节末尾追加测试用例,编号连续递增(当前最大编号 T-093):
|
|
70
|
+
|
|
71
|
+
```markdown
|
|
72
|
+
### T-xxx 用例名称
|
|
73
|
+
**步骤**:操作步骤描述
|
|
74
|
+
**预期**:期望的结果
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
功能较多时可新增模块章节(`## 十一、xxx`)。
|
|
78
|
+
|
|
79
|
+
#### 新增埋点 → 更新 tracker/config.js
|
|
80
|
+
|
|
81
|
+
这是埋点维护的核心步骤,分三小步:
|
|
82
|
+
|
|
83
|
+
**① 在 Ackee 后台创建 Event**
|
|
84
|
+
|
|
85
|
+
进入 Ackee 管理后台 → Settings → Events → 新建 Event,填写:
|
|
86
|
+
- Name:和 `config.js` 里的注释保持一致,方便后台辨识
|
|
87
|
+
- Type:参考下方「展示类型速查」选择
|
|
88
|
+
|
|
89
|
+
**② 把 UUID 填入 config.js**
|
|
90
|
+
|
|
91
|
+
找到 `src/tracker/config.js` 的 `EVENTS` 对象,将 Ackee 生成的真实 UUID 替换对应的占位 UUID:
|
|
92
|
+
|
|
93
|
+
```js
|
|
94
|
+
export const EVENTS = {
|
|
95
|
+
// 把这里的占位 UUID 替换成 Ackee 后台生成的真实 UUID
|
|
96
|
+
NEW_EVENT: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**③ 在对应的 tracker 函数里调用**
|
|
101
|
+
|
|
102
|
+
- 页面行为 → `src/tracker/useTracker.js`
|
|
103
|
+
- 对话行为 / 采纳行为 / 工具调用 → `src/tracker/useChatTracker.js`
|
|
104
|
+
- 提问内容分析 → `src/tracker/analyze.js`(关键词字典)+ `useChatTracker.js`
|
|
105
|
+
|
|
106
|
+
新增意图关键词时,只需修改 `config.js` 里的 `INTENT_KEYWORDS`,无需改其他文件。
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
### 第三步:自查清单
|
|
111
|
+
|
|
112
|
+
提交前过一遍:
|
|
113
|
+
|
|
114
|
+
- [ ] `changelog.md` 已新增版本条目,日期正确
|
|
115
|
+
- [ ] 新增功能已在 `product.md` 对应章节有描述
|
|
116
|
+
- [ ] 接口变更已在 `usage.md` 对应表格更新
|
|
117
|
+
- [ ] 新功能有对应测试用例,编号连续
|
|
118
|
+
- [ ] 新增埋点已在 Ackee 后台创建 Event,UUID 已更新到 `config.js`
|
|
119
|
+
- [ ] 新增埋点已在对应 tracker 函数里调用,并在 `changelog.md` 的「埋点」分类里记录
|
|
120
|
+
- [ ] 已知限制有变化的,`product.md` 底部「已知限制」已更新
|
|
121
|
+
- [ ] **涉及文件迁移或路径变更的,已执行引用扫描(见下方)**
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
### 架构变更专项:引用扫描
|
|
126
|
+
|
|
127
|
+
**每次发生以下情况,必须执行引用扫描,不得跳过:**
|
|
128
|
+
|
|
129
|
+
- 文件移动或重命名
|
|
130
|
+
- 文件删除或被新文件取代
|
|
131
|
+
- 模块路径变更(如从 `composables/` 迁移到 `chat-sdk/headless/`)
|
|
132
|
+
- 接口名称变更
|
|
133
|
+
|
|
134
|
+
**扫描指令(在项目根目录执行):**
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# 扫描某个旧路径是否还有文件在引用
|
|
138
|
+
grep -rn "旧文件名或旧路径" src/ --include="*.vue" --include="*.js"
|
|
139
|
+
|
|
140
|
+
# 示例:确认旧的 useChatStore 没有残留引用
|
|
141
|
+
grep -rn "composables/useChatStore" src/ --include="*.vue" --include="*.js"
|
|
142
|
+
|
|
143
|
+
# 示例:确认旧的 config/api.js 没有残留引用
|
|
144
|
+
grep -rn "config/api" src/ --include="*.vue" --include="*.js"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**结果为空才算完成**,有输出说明还有文件没更新,必须逐一处理后再提交。
|
|
148
|
+
|
|
149
|
+
**扫描时机:每改完一个文件,立即扫一次对应的旧路径**,不要等所有文件改完再统一扫,否则容易遗漏。
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## 版本号规则
|
|
154
|
+
|
|
155
|
+
遵循语义化版本 `major.minor.patch`:
|
|
156
|
+
|
|
157
|
+
| 变更类型 | 升级哪位 | 示例 |
|
|
158
|
+
|---|---|---|
|
|
159
|
+
| 破坏性接口变更 | major | 1.0.0 → 2.0.0 |
|
|
160
|
+
| 新增功能(向后兼容) | minor | 1.0.0 → 1.1.0 |
|
|
161
|
+
| Bug 修复 / 文档 / 样式 / 埋点 | patch | 1.0.0 → 1.0.1 |
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 展示类型速查(Ackee Event Type)
|
|
166
|
+
|
|
167
|
+
| 类型 | 适用场景 | 示例 |
|
|
168
|
+
|---|---|---|
|
|
169
|
+
| List 总计 | 统计各 key 的出现次数 | 模式分布、用户用量、复制来源 |
|
|
170
|
+
| List 平均值 | 统计各 key 的平均数值 | 不常用 |
|
|
171
|
+
| Chart 总计 | 按时间看总量趋势 | 不常用 |
|
|
172
|
+
| Chart 平均值 | 按时间看均值趋势 | 回复耗时、首字节延迟 |
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 快速参考:各文档的章节结构
|
|
177
|
+
|
|
178
|
+
### product.md 章节
|
|
179
|
+
```
|
|
180
|
+
## 核心能力
|
|
181
|
+
### [功能模块] ← 新增/修改功能在这里
|
|
182
|
+
## 技术架构
|
|
183
|
+
## 配置两层边界
|
|
184
|
+
## 已知限制 ← Bug 修复后可能需要更新
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### usage.md 章节
|
|
188
|
+
```
|
|
189
|
+
## 两种接入方式
|
|
190
|
+
## config 完整字段说明 ← 新字段加这里
|
|
191
|
+
### ModelConfig
|
|
192
|
+
### FeaturesConfig
|
|
193
|
+
### UserControlsConfig
|
|
194
|
+
## useChat() 返回值 ← 新返回值加这里
|
|
195
|
+
### 状态
|
|
196
|
+
### 方法
|
|
197
|
+
## 模式说明
|
|
198
|
+
## 环境变量 ← 新环境变量加这里
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### test-cases.md 章节
|
|
202
|
+
```
|
|
203
|
+
## 一、配置与初始化 (T-001 ~ T-005)
|
|
204
|
+
## 二、对话核心 (T-010 ~ T-017)
|
|
205
|
+
## 三、多模型 (T-020 ~ T-022)
|
|
206
|
+
## 四、多模式 (T-030 ~ T-034)
|
|
207
|
+
## 五、Tool-use (T-040 ~ T-045)
|
|
208
|
+
## 六、Artifact 面板 (T-050 ~ T-056)
|
|
209
|
+
## 七、Markdown 渲染 (T-060 ~ T-064)
|
|
210
|
+
## 八、文件上传 (T-070 ~ T-074)
|
|
211
|
+
## 九、Headless 模式 (T-080 ~ T-084)
|
|
212
|
+
## 十、CodePreview (T-090 ~ T-093)
|
|
213
|
+
## 十一、埋点 (T-100 ~) ← 新增埋点测试用例加这里
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### tracker/config.js 结构
|
|
217
|
+
```
|
|
218
|
+
ACKEE_URL / ACKEE_DOMAIN / TRACK_ENABLED ← 读取环境变量,不要硬编码
|
|
219
|
+
EVENTS = {
|
|
220
|
+
// 页面行为(3个)
|
|
221
|
+
// 对话行为(8个)
|
|
222
|
+
// 采纳行为(5个)
|
|
223
|
+
// 提问内容分析(4个)
|
|
224
|
+
// 工具调用(1个)
|
|
225
|
+
}
|
|
226
|
+
INTENT_KEYWORDS ← 意图关键词字典,新增意图类型在这里加
|
|
227
|
+
MODE_TO_DIRECTION ← 模式→方向映射
|
|
228
|
+
COMPLEXITY_THRESHOLD
|
|
229
|
+
```
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# chat-sdk 产品说明书
|
|
2
|
+
|
|
3
|
+
版本:1.0.0 · 面向 Vue3 项目的可嵌入 AI 对话组件库
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 核心能力
|
|
8
|
+
|
|
9
|
+
### 对话
|
|
10
|
+
|
|
11
|
+
- 流式输出,token 逐字渲染,rAF 节流避免掉帧
|
|
12
|
+
- 多会话管理,侧边栏切换,标题自动截取
|
|
13
|
+
- 中止请求(停止按钮)
|
|
14
|
+
- 首条消息自动触发 AI 自我介绍
|
|
15
|
+
|
|
16
|
+
### 多模型
|
|
17
|
+
|
|
18
|
+
- 每个模型独立 `baseURL` / `apiKey` / `model id`,适配内网多服务部署
|
|
19
|
+
- 支持运行时切换,输入栏底部 pill 选择器
|
|
20
|
+
- `autoVision`:消息含图片时自动路由到 `vision: true` 的模型
|
|
21
|
+
- 用户选择持久化至 `localStorage`
|
|
22
|
+
|
|
23
|
+
### 多模式(Prompt 系统)
|
|
24
|
+
|
|
25
|
+
| 模式 | 核心职责 | 不做什么 |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| Code | 生成/修改代码,输出 Artifact 文件 | 不做需求分析,不做系统设计 |
|
|
28
|
+
| Ask | 解释概念、回答技术问题 | 不生成完整代码文件 |
|
|
29
|
+
| Architect | 系统设计、技术方案、架构拆解 | 不写实现代码 |
|
|
30
|
+
| 需求 | 梳理需求,输出用户故事和功能拆解 | 不主动切换到 Code/Architect |
|
|
31
|
+
|
|
32
|
+
Prompt 特性:
|
|
33
|
+
- 针对 Qwen3 / 弱模型优化:大量工具示例,强约束语气(MUST/NEVER/ALWAYS)
|
|
34
|
+
- 重要规则前置(弱模型容易忽略 prompt 后半段)
|
|
35
|
+
- 中文 prompt,与 Qwen3 中文语料对齐
|
|
36
|
+
- 模式切换时 system prompt 自动重建
|
|
37
|
+
|
|
38
|
+
### Tool-use 循环
|
|
39
|
+
|
|
40
|
+
AI 输出中包含工具调用时自动触发,流式结束后解析执行。
|
|
41
|
+
|
|
42
|
+
| 工具 | 默认行为 | 可覆盖 |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| `ask_followup_question` | 渲染选项气泡,等用户点选 | ✓ |
|
|
45
|
+
| `attempt_completion` | 标记任务完成 | ✓ |
|
|
46
|
+
| `switch_mode` | 切换模式,追加系统提示 | ✓ |
|
|
47
|
+
| `render_artifact` | 注册到 ArtifactPanel 展示 | ✓ |
|
|
48
|
+
| `request_context` | 追加引导提示,请求用户粘贴代码 | ✓ |
|
|
49
|
+
|
|
50
|
+
### Artifact 文件面板
|
|
51
|
+
|
|
52
|
+
- AI 生成完整代码时自动弹出右侧面板
|
|
53
|
+
- 顶部 Tab 栏,支持多文件切换
|
|
54
|
+
- 代码视图:Shiki 语法高亮、行号、行列号状态栏
|
|
55
|
+
- 预览视图:HTML/JS/CSS iframe 运行预览,Vue SFC 通过 `@vue/repl` 实时编译预览
|
|
56
|
+
- 支持复制代码、下载文件
|
|
57
|
+
|
|
58
|
+
### Markdown 渲染
|
|
59
|
+
|
|
60
|
+
- `marked` 解析,`DOMPurify` 净化
|
|
61
|
+
- `Shiki` 代码高亮(双主题:`one-dark-pro` / `github-light`)
|
|
62
|
+
- `KaTeX` 数学公式
|
|
63
|
+
- `Mermaid` 流程图
|
|
64
|
+
- 流式渲染:双区差分(已完成区 + 流入区),避免整体重绘闪烁
|
|
65
|
+
|
|
66
|
+
### 文件上传
|
|
67
|
+
|
|
68
|
+
支持类型:图片(JPG/PNG/GIF/WebP)、PDF、代码文件(.vue/.ts/.js/.py 等)、Word(.docx)、Excel(.xlsx)
|
|
69
|
+
|
|
70
|
+
- 图片:base64 编码,附入 API 消息,气泡内显示缩略图
|
|
71
|
+
- PDF / Word / Excel:提取文本内容附入消息,显示文件名图标
|
|
72
|
+
- 粘贴截图(Ctrl+V)
|
|
73
|
+
- 拖拽上传
|
|
74
|
+
- 最多同时 5 个附件
|
|
75
|
+
|
|
76
|
+
### CodePreview 弹框
|
|
77
|
+
|
|
78
|
+
- 点击代码块右上角按钮打开
|
|
79
|
+
- 分屏 / 代码 / 预览 三种 Tab
|
|
80
|
+
- Vue SFC:`@vue/repl` 实时编译,CodeMirror 编辑器
|
|
81
|
+
- HTML/JS/JSX:iframe 沙箱运行
|
|
82
|
+
- SVG:inline 渲染
|
|
83
|
+
- 代码区行号,底部状态栏显示总行数和点击位置行列号
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 技术架构
|
|
88
|
+
|
|
89
|
+
### 分层设计
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
headless/ 纯逻辑层,零 UI 依赖,可独立使用
|
|
93
|
+
core/ UI 组件层,依赖 headless
|
|
94
|
+
features/ 按需加载,feature 内部分 core.js(逻辑)和 *.vue(UI)
|
|
95
|
+
modes/ Prompt 配置,纯 JS,按需导入
|
|
96
|
+
tools/ Tool-use 解析器和默认处理器
|
|
97
|
+
settings/ 运行时开关持久化
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 两种接入方式
|
|
101
|
+
|
|
102
|
+
**完整视图**:`createAIChat(config)` 挂载整套界面
|
|
103
|
+
|
|
104
|
+
**Headless**:`useChat(config)` 返回状态和方法,消费方自己写视图
|
|
105
|
+
|
|
106
|
+
### 按需加载机制
|
|
107
|
+
|
|
108
|
+
两层配置控制加载行为:
|
|
109
|
+
|
|
110
|
+
- `features.xxx = false`:对应 chunk 不下载,代码体积最小化
|
|
111
|
+
- `userControls.xxx`:控制运行时 UI 开关是否对用户可见
|
|
112
|
+
|
|
113
|
+
### 数据流
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
消费方 send({ text, attachments })
|
|
117
|
+
→ headless/useChatStore
|
|
118
|
+
→ api/adapters/openai.js UI消息 → API格式
|
|
119
|
+
→ headless/api/chatApi.js 流式请求
|
|
120
|
+
→ token 回来 → RAF 节流渲染
|
|
121
|
+
→ 流结束 → tools/parser.js 解析工具调用
|
|
122
|
+
→ tools/defaults.js 执行默认行为 / 消费方覆盖
|
|
123
|
+
→ messages 状态更新 → 视图重渲染
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### API 格式适配层
|
|
127
|
+
|
|
128
|
+
`headless/api/adapters/openai.js` 负责 UI 消息格式 → OpenAI 兼容格式转换,更换模型服务时只需新增 adapter,不影响上层。
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 配置两层边界
|
|
133
|
+
|
|
134
|
+
| 层级 | 配置位置 | 控制内容 | 谁决定 |
|
|
135
|
+
|---|---|---|---|
|
|
136
|
+
| 初始化层 | `features` | chunk 是否下载 | 开发者 |
|
|
137
|
+
| 运行时层 | `userControls` | UI 开关是否可见和默认状态 | 用户 |
|
|
138
|
+
|
|
139
|
+
`features: false` 时,即使 `userControls` 声明了对应开关,开关也不会显示(代码未加载)。
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 埋点与数据分析
|
|
144
|
+
|
|
145
|
+
基于 Ackee 的隐私友好型埋点,共 21 个 Event,分四个模块。
|
|
146
|
+
|
|
147
|
+
### 页面行为
|
|
148
|
+
页面访问、按钮点击、登录成功。通过路由 `afterEach` 自动上报页面访问,按钮需手动调用 `btnClick(btnId)`。
|
|
149
|
+
|
|
150
|
+
### 对话行为
|
|
151
|
+
消息发送(模式/模型/用户三维度)、回复耗时与首字节延迟(Chart 平均值)、中止、报错、模式切换。内置在 `useChatStore` 中,无需额外接入。
|
|
152
|
+
|
|
153
|
+
### 采纳行为(三口径采纳率)
|
|
154
|
+
内容复制(来源/用户/语言)、文件下载(用户/语言)。支持三个统计口径:
|
|
155
|
+
- 消息级:有采纳行为的消息数 / AI 消息总数
|
|
156
|
+
- 会话级:有采纳的会话数 / 总会话数
|
|
157
|
+
- 用户级:有采纳的用户数 / 活跃用户数
|
|
158
|
+
|
|
159
|
+
### 提问内容分析(无用户关联)
|
|
160
|
+
- **方向**:从当前模式直接读取(code/ask/architect → `code`,requirements → `requirement`)
|
|
161
|
+
- **意图**:关键词字典本地匹配(code_gen / debug / explain / refactor / review / other),仅代码方向触发
|
|
162
|
+
- **复杂度**:按字符数划分(short < 50 / medium < 200 / long ≥ 200)
|
|
163
|
+
- **附件类型**:image / code_file / pdf / mixed / none
|
|
164
|
+
|
|
165
|
+
全部本地分析,不上报提问原文,不关联用户身份。
|
|
166
|
+
|
|
167
|
+
### 配置
|
|
168
|
+
```env
|
|
169
|
+
VITE_ACKEE_URL=http://your-ackee-server:3000
|
|
170
|
+
VITE_ACKEE_DOMAIN=your-domain-uuid
|
|
171
|
+
VITE_TRACK_ENABLED=true # false 时全部静默
|
|
172
|
+
```
|
|
173
|
+
Event UUID 在 `src/tracker/config.js` 的 `EVENTS` 对象中集中管理,替换为 Ackee 后台生成的真实 UUID 即可。
|
|
174
|
+
|
|
175
|
+
## 已知限制
|
|
176
|
+
|
|
177
|
+
- 仅支持 Vue3 项目
|
|
178
|
+
- 不支持 SSR(依赖 `localStorage` 和浏览器 API)
|
|
179
|
+
- 对话历史仅存在内存,刷新页面丢失(持久化能力预留 `useChatDB.js`,未完整实现)
|
|
180
|
+
- `@vue/repl` Vue SFC 预览依赖网络加载 Vue 运行时(离线环境不可用)
|
|
181
|
+
- 单次请求无超时控制,长请求依赖用户手动中止
|