Compare commits

...

13 Commits

Author SHA1 Message Date
d38cbea01a feat: 前端根据LLM能力显示/隐藏功能按钮
- llmCapabilities 存储思考模式和视觉能力状态
- loadBackendConfig 从后台API加载LLM能力配置
- 智能体对话界面根据能力条件渲染深度思考按钮
- 普通对话界面根据能力条件渲染深度思考按钮
- 上传图片选项根据视觉能力条件显示/隐藏
- 输入框placeholder根据视觉能力动态变化
- handleImageUpload 检查视觉能力,不支持时提示用户等待升级
2026-04-29 11:52:00 +08:00
00d074efca feat: 大模型配置添加思考模式和视觉能力属性
- 数据库 llm_configs 表新增 enable_thinking 和 enable_vision 字段
- 后台管理界面大模型列表显示思考模式/视觉能力状态
- 添加/编辑大模型配置支持设置这两个能力开关
- 前端配置API返回LLM能力信息
- 对话界面根据能力显示或隐藏深度思考按钮
- 对话界面根据能力显示或隐藏上传图片选项
- 不支持视觉能力时上传图片提示用户等待升级

enable_thinking: 控制深度思考功能可用性
enable_vision: 控制图片分析功能可用性
2026-04-29 11:38:48 +08:00
055c60aae2 docs: 整理2026-04-28会话记录并更新长期记忆 2026-04-29 11:09:24 +08:00
74b95f9f18 docs: 整理2026-04-27事务记录到MEMORY.md和memory目录 2026-04-28 09:04:58 +08:00
a3a209da0a feat: 后台管理添加用户管理功能 + 用户注册登录改为调用backend API 2026-04-27 17:16:00 +08:00
7cdccd9bef fix: 快捷语句按钮点击无反应
- 改用 data-text 属性存储文本
- 使用事件监听绑定点击事件
- 避免 inline onclick 在动态渲染中的作用域问题
2026-04-25 23:20:58 +08:00
849fe063eb fix: 兼容旧数据格式自动转换
- 检测旧 chat_history 数据
- 自动转换为新的 conversations 格式
- 清理旧数据避免重复
2026-04-25 23:06:19 +08:00
3417709a79 feat: 多对话管理 + 历史对话列表
- 新增对话列表页面(首页)
- 每个对话显示标题、消息数、更新时间
- 对话列表支持删除对话
- 新建对话按钮
- 对话标题自动生成(第一条消息摘要)
- 点击对话进入具体对话页面
- 返回按钮回到对话列表
- 数据结构改为 conversations 多对话存储
- 兼容旧数据格式自动转换
2026-04-25 23:05:51 +08:00
3f72306e78 fix: 移除响应式消息宽度限制
- 删除 .message-content max-width: 60% 限制
- 消息宽度由 message-body 控制,更灵活
2026-04-25 17:25:21 +08:00
f06260cf78 fix: 增加用户消息宽度
- 用户消息宽度从 75% 增加到 85%
- AI 消息宽度调整为 80%
- 减少消息行数,显示更紧凑
2026-04-25 17:23:55 +08:00
e1ab11c007 feat: 添加复制按钮(复制原文)
- 用户和AI消息都添加复制按钮
- 复制原始文本内容(不包含Markdown格式)
- 添加Toast提示显示复制成功
- 复制按钮hover时显示蓝色
2026-04-25 17:20:32 +08:00
386fa20c84 feat: Markdown格式显示 + 重新生成 + 删除功能
- 使用 marked.js 渲染 Markdown 格式
- AI消息添加重新生成按钮(刷新图标)
- 用户和AI消息都可删除
- 删除AI消息时同时删除对应的用户消息
- 删除用户消息时同时删除对应的AI回复
- 消息操作按钮hover时显示
- 优化Markdown样式(标题、列表、代码块、表格等)
2026-04-25 17:17:53 +08:00
108a496dab feat: AI回复流式输出
- 使用 SSE 流式调用智谱 API
- 实时显示 AI 回复内容
- 添加闪烁光标动画效果
- 移除打字指示器,改为实时内容显示
2026-04-25 17:06:04 +08:00
18 changed files with 10775 additions and 190 deletions

266
MEMORY.md
View File

@@ -1,8 +1,58 @@
# MEMORY.md - 长期记忆
## 开发规范
## 项目索引
### 开发测试流程 ⭐⭐⭐
详细项目信息请查看 `PROJECTS.md`,包含启动命令、检查方式、端口分配等。
| 项目 | 仓库 | 端口 | 状态 |
|------|------|------|------|
| PDF翻译助手 V2 | 本地 | 19000 | ✅ 运行中 |
| 碎片信息记录 | 本地 | 19009 | ✅ 运行中 |
| ParamHub Python | 本地 | 19010 | ✅ 运行中 |
| 项目服务管理面板 | 本地 | 19013 | ✅ 运行中 |
| 视觉记录系统 | /coder/vision-record | 19016 | ✅ 运行中 |
| AI Chat App | /coder/ai-chat-app | - | 📦 开发中 |
| 网页助手插件 | /coder/web-context-extension | - | 📦 已完成 |
| 磁盘大文件扫描 | 本地 | - | 📦 已完成 |
---
## ParamHub Python - 参数百科系统
**Git仓库**: http://192.168.2.8:12007/coder/param-hub-python
### 核心功能架构
**1. 参数字段配置系统**
- 类别层面:基础参数字段(所有子类别共享)
- 子类别层面可添加额外参数字段extra_fields
- 字段结构:`{key, label, type, description, required, input_style}`
- 前端表格列和编辑表单从类别配置动态生成
**2. 子类别管理**
- 内置分类ai-models、gpus、cpus支持子类别编辑
- 子类别有 `key_features`(关键特性字段)和 `extra_fields`(额外参数)
- 智能添加时可选子类别,解析时包含额外字段
**3. 智能添加/补充解析**
- 上传参数截图(规格表、参数页面)而非产品图
- AI根据类别字段配置解析参数
- 支持多次解析,每次来源记录到 `parse_sources` 数组
- 解析来源记录:`{type, timestamp, images, text, updated_fields}`
**4. 子类别分配**
- AI模型chat、code、reasoning、vision
- GPUdatacenter、professional、gaming
- CPUserver、desktop、mobile
**5. 数据字段规范**
- 所有参数字段统一为文本类型
- 长文本字段description等标记 `input_style: 'long'
- 发布日期统一格式YYYY-MM-DD
---
## 更新日志
**必须遵循的工作流程:**
@@ -166,6 +216,218 @@ server.quit()
## 更新日志
- **AI Chat App v3.14.4**修复API URL拼接问题
- 前端自动拼接 `/chat/completions` 到后台配置的 API URL
- 解决后台存储 `https://api.xxx/v1` 但前端需要完整 URL 的问题
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.14.4
- **AI Chat App v3.14.3**修复普通对话不使用后台配置的LLM
- `/api/config` 现根据 `chat_config.llm_config_id` 获取对应的 LLM 配置
- 解决原来直接取默认 LLM 配置的问题
- 后台管理"对话配置"选择的 LLM 现在在前端生效
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.14.3
- **AI Chat App v3.14.2**TTS文本清理优化
- 语音播放过滤Markdown特殊字符标题#、列表-*、代码块、链接、粗体斜体等
- 过滤表情符号emoji
- 过滤引用符号>、分割线等
- 清理多余空白,保留纯文本内容
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.14.2
- **AI Chat App v3.14.1**TTS流式播放+新对话默认关闭
- 新建对话(普通对话和智能体对话)默认关闭语音播放
- AI回复边生成边播放流式TTS不等完全生成完
- 每80字符左右播放一段智能断句句子结束符号
- 使用队列机制管理播放,顺序播放各段文本
- 切换对话时自动停止当前播放
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.14.1
- **AI Chat App v3.14.0**AI回复语音播放功能
- 普通对话和智能体对话支持语音播放Edge TTS
- 对话界面顶部右侧添加语音播放开关按钮(替代原清除按钮)
- AI消息操作栏添加播放按钮点击可播放/停止
- 开启后AI回复完成自动播放
- 后台管理系统设置添加TTS方案和语音配置
- 支持多种中文语音(晓晓、云希等)
- APIPOST /api/tts生成语音GET /api/tts/voices语音列表
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.14.0
- **AI Chat App v3.13.3**修复用户信息API路由缺失
- `/api/user/<int:id>` 只有PUT方法添加GET方法
- 前端初始化可正确获取用户信息(包括头像)
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.13.3
- **AI Chat App v3.13.2**:修复登录用户跨设备头像不同步
- 初始化时从后台 API `/api/user/<id>` 获取最新用户信息(包括头像)
- 解决原来只从 localStorage 加载导致换设备头像不更新的问题
- 同时更新 localStorage 保持离线可用
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.13.2
- **AI Chat App v3.13.1**:修复系统设置部分配置项无法保存
- init_db 添加兼容逻辑,自动检测并插入缺失的系统配置字段
- 解决旧数据库缺少 app_developer、app_update_date、app_technology、app_description 等字段的问题
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.13.1
- **AI Chat App v3.13.0**:我的页面和关于页面绑定后台系统配置
- 版本号、技术基础、开发者、更新日期从后台管理设置生效
- 隐私政策、用户协议链接从后台配置读取,点击跳转外部链接
- 前端加载后台配置后赋值到 CONFIG.system
- 前端加载后台 LLM 配置api_url、api_key、model
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.13.0
- **AI Chat App v3.12.3**修复发现智能体搜索bug
- 搜索功能现在正确过滤基础智能体basic类别
- filterDiscoverAgents 函数添加 basic 类别处理
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.12.3
- **AI Chat App v3.12.2**:历史使用记录布局修正
- 左边:对话标题
- 右边:智能体名字(带样式标签)
- 主页最近使用列表同样修正
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.12.2
- **AI Chat App v3.12.1**:历史使用记录布局调整
- 左边:智能体名字(如"代码助手"
- 右边:对话标题
- 主页最近使用列表同样调整
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.12.1
- **AI Chat App v3.12.0**:智能体对话标题自动更新+历史显示优化
- 智能体对话初始标题改为"新对话",和普通对话一致
- 第一次对话和每5次对话自动生成标题AI总结
- 历史使用界面:左边是对话标题,右边显示智能体类型(工作/学习/生活等)
- 主页最近使用列表同样优化显示智能体类型
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.12.0
- **AI Chat App v3.11.0**:用户头像在对话界面正确显示
- 修改消息渲染逻辑,用户头像使用 currentUser.avatar
- 普通对话和智能体对话界面都正确显示用户修改的头像
- AI 头像使用智能体头像(智能体对话)或默认头像(普通对话)
- 支持图片头像和 emoji 头像的渲染
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.11.0
- **AI Chat App v3.10.4**:智能体对话界面工具栏优化
- 智能体对话不显示工具选择按钮(深度思考、联网搜索、更多工具)
- 智能体使用的工具由后台管理配置决定
- 只保留导航按钮(向上/向下滚动)
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.10.4
- **AI Chat App v3.10.3**:工具选择状态记忆
- 更多工具弹窗过滤掉联网搜索(已有独立按钮)
- 所有工具默认未启用状态
- 普通对话记住上次工具选择localStorage 'chatEnabledTools'
- 智能体对话记住该智能体的上次选择localStorage 'agentEnabledTools_{agentId}'
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.10.3
- **AI Chat App v3.10.2**:添加更多工具按钮,支持多选工具
- 工具栏添加"更多工具"按钮
- 点击显示工具选择弹窗(从后台配置加载)
- 支持多选模式,显示选中数量
- Backend 返回 allTools 供前端选择
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.10.2
- **AI Chat App v3.10.1**:系统设置扩展版本信息配置
- 后台管理新增:应用简介、技术基础、开发者、更新日期配置
- 后台管理新增:隐私政策链接、用户协议链接配置
- 前端"关于"页面和"我的"页面底部显示可配置的信息
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.10.1
- **AI Chat App v3.10.0**:用户头像上传功能
- Backend 添加头像上传 APIbase64 格式)
- Backend 新增 avatars 目录存储上传的头像
- 前端编辑资料页面添加上传头像按钮
- 支持 emoji 预设头像和自定义上传头像
- 新增 `renderAvatar()` 函数渲染头像(支持 emoji 和图片)
- APIPOST /api/user/{id}/avatarGET /api/avatars/{filename}
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.10.0
- **AI Chat App v3.9.2**:修复统计功能
- LLM 调用完成后记录统计到 backend
- 搜索调用完成后记录统计到 backend
- 新增 `logStatsToBackend()` 函数
- APIPOST /api/admin/stats/log
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.9.2
- **AI Chat App v3.9.1**:后台管理添加查看用户对话记录功能
- 用户管理页面添加"查看对话"按钮
- 显示用户对话列表(标题、智能体、消息数、时间)
- 点击查看对话详情(完整消息内容)
- 支持删除用户对话记录
- APIGET /api/user/{id}/conversations/{conv_id}
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.9.1
- **AI Chat App v3.9.0**:完整数据同步到 backend
- Backend 新增 `user_agents` 表存储用户智能体配置
- 初始化时:已登录用户从 backend 加载对话数据
- 初始化时:已登录用户从 backend 加载智能体配置myAgents、favoriteAgents、pinnedAgents
- 添加/移除/置顶/收藏智能体同步到 backend
- API/api/user/{id}/agents增删改查
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.9.0
- **AI Chat App v3.8.2**:修复用户数据同步逻辑
- 创建新对话时先调用 backend API 获取 ID
- 发送消息后同步当前对话到 backend
- 登录时保存完整用户数据
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.8.2
- **AI Chat App v3.8.1**:修复对话创建同步逻辑
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.8.1
- backend 新增 conversations 表存储用户对话数据
- 对话创建/更新/删除同步到 backend
- 登录后自动从 backend 加载对话数据
- 用户资料修改同步到 backend
- API/api/user/{id}/conversationsGET/POST/PUT/DELETE
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.8.0
- **AI Chat App v3.7.1**:隐藏注册页面验证码功能
- 暂时跳过验证码验证
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.7.1
- **AI Chat App v3.7.0**:后台管理添加用户管理功能
- backend 新增 users 表存储用户注册信息
- 用户注册登录改为调用 backend API从 localStorage 改为 SQLite
- 后台管理界面新增用户管理页面
- 用户管理支持搜索、编辑、重置密码、删除
- 注册添加手机号验证码功能(模拟)
- API/api/register、/api/login、/api/admin/users
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.7.0
- **AI Chat App v3.6.3**:修复智能体历史使用记录逻辑
- 只显示真正有对话消息的智能体记录messages.length > 0
- 修复点击打开智能体就记录"使用"的问题
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-app v3.6.3
### 2026-04-27
- **ParamHub Python v1.7.1**:子类别管理界面重构
- 添加子类别编辑弹框,可视化增删改
- 子类别列表以卡片样式显示hover显示操作按钮
- 表单输入关键特性字段(逗号分隔)和标签(字段:显示名)
- 替换原来的JSON文本编辑方式更直观易用
- Git仓库: http://192.168.2.8:12007/coder/param-hub-python v1.7.1
- **ParamHub Python v1.7.0**:支持子类别配置和关键特性显示
- 类别数据结构新增 subcategories 字段
- 每个子类别可定义 key_features关键特性字段和 feature_labels标签显示名
- 前端模型页面添加子类别选择器,切换显示不同特性
- 表格根据子类别动态显示关键特性列
- 后台管理支持编辑子类别配置JSON格式
- 预设子类别:对话模型、代码模型、推理模型、视觉模型等
- Git仓库: http://192.168.2.8:12007/coder/param-hub-python v1.7.0
- **ParamHub Python v1.6.0**:后台管理添加大模型接口配置功能
- 网站配置页面新增 LLM 配置区域
- 支持配置 API 地址、API Key、文本模型、视觉模型
- LLM 配置从 config.json 动态读取,无需修改代码
- Git仓库: http://192.168.2.8:12007/coder/param-hub-python v1.6.0
- **ParamHub Python v1.5.0**:多图上传和智能解析产品参数
- 所有类别(模型/GPU/CPU/动态分类)支持上传图片解析
- 支持一次上传多张图片
- AI智能解析可能识别出多个产品
- 新增 `/api/parse-images` API 预览解析结果
- 智能添加弹窗支持图片上传和粘贴
- 配置 LLM Proxy 视觉模型Qwen/Qwen2-VL-72B-Instruct
- Git仓库: http://192.168.2.8:12007/coder/param-hub-python v1.5.0
### 2026-04-26
- **AI对话系统 v3.1.0**UI重构 - 历史对话列表页
- 首页改为历史对话列表页(而非侧边栏)
- 新建对话按钮放在右上角
- 历史对话列表支持删除操作
- 点击对话进入具体对话页面
- 对话页面有返回按钮回到列表
- API新增 message_count 字段
- API新增 GET /api/conversations/{id} 获取详情
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-system v3.1.0
### 2026-04-24
- **Xian Favor v4.6.3**修复Markdown显示开关切换失效
- 改用 data-raw-content 属性存储原始内容

View File

@@ -174,7 +174,39 @@ curl -s http://localhost:19010/api/categories
**Git仓库**: http://192.168.2.8:12007/coder/param-hub-python
**版本**: v1.2.0
**版本**: v1.7.1
**v1.7.1 子类别管理**:
- 可视化子类别增删改界面
- 卡片样式显示子类别列表
- 表单输入关键特性字段和标签
**v1.7.0 子类别功能**:
- 类别支持配置子类别
- 前端动态显示子类别关键特性
- 后台管理子类别配置
**v1.6.0 LLM配置**:
- 后台管理配置大模型接口
- API地址/Key/模型配置
- 文本模型和视觉模型分离配置
**v1.5.0 多图解析**:
- 支持多图上传和智能解析
- 可能识别多个产品
- 图片解析API预览功能
**v1.5.0 新功能**:
- 多图上传和智能解析所有类别支持上传图片让AI解析参数
- 支持一次上传多张图片,综合分析
- 可能识别出多个产品,批量添加
- 新增 `/api/parse-images` API 预览解析结果
- 智能添加弹窗支持图片上传和粘贴
- vision_model 配置支持视觉模型
**v1.4.0 新功能**:
- 图片上传功能:编辑时可上传多张图片
- 图片保存到 static/uploads 目录
**v1.2.0 新功能**:
- 网站配置管理:后台可修改网站名称、备案号、页脚文字等

33
memory/2026-04-26.md Normal file
View File

@@ -0,0 +1,33 @@
# 2026-04-26 每日事务记录
## 开发任务
### AI对话系统 v3.1.0 - UI重构历史对话列表页
**需求来源**: 优化用户体验,改进对话管理方式
**主要改动**:
1. 首页改为历史对话列表页(而非侧边栏)
2. 新建对话按钮放在右上角
3. 历史对话列表支持删除操作
4. 点击对话进入具体对话页面
5. 对话页面有返回按钮回到列表
6. API新增 message_count 字段
7. API新增 GET /api/conversations/{id} 获取详情
**Git仓库**: http://192.168.2.8:12007/coder/ai-chat-system v3.1.0
---
## 项目信息
- 项目名: AI对话系统
- 目录: `works/ai-chat-system`
- 端口: 19020
- Git仓库: http://192.168.2.8:12007/coder/ai-chat-system
---
## 备注
今日只记录了 AI对话系统 v3.1.0 一个版本更新。如有其他事务需要补充,请告知。

115
memory/2026-04-27.md Normal file
View File

@@ -0,0 +1,115 @@
# 2026-04-27 每日事务记录
## 开发任务
### ParamHub Python - 多图上传和智能解析功能
**需求来源**: 用户openclaw-control-ui
**v1.5.0 主要改动**:
1. 所有类别(模型/GPU/CPU/动态分类)支持上传图片解析
2. 支持一次上传多张图片AI综合分析
3. 可能识别出多个产品参数,批量添加
4. 新增 `/api/parse-images` API 预览解析结果
5. 智能添加弹窗支持图片上传和粘贴
6. 添加 vision_model 配置支持视觉模型
**遇到的问题**:
- 图片上传后报错f-string花括号转义问题导致API错误
- 视觉模型配置问题:需要配置 LLM Proxy 的视觉模型
- SiliconFlow 视觉模型名称Qwen/Qwen2-VL-72B-Instruct
**解决方案**:
- 修复 f-string 格式化问题,使用字符串拼接
- 配置 LLM Proxy 添加视觉模型提供商
- 添加剪贴板粘贴的错误提示HTTPS/localhost限制
**Git仓库**: http://192.168.2.8:12007/coder/param-hub-python v1.5.0
---
### ParamHub Python - 大模型接口配置功能
**需求来源**: 用户openclaw-control-ui
**v1.6.0 主要改动**:
1. 网站配置页面新增 LLM 配置区域
2. 支持配置 API 地址、API Key、文本模型、视觉模型
3. LLM 配置从 config.json 动态读取,无需修改代码
4. 删除硬编码的 LLM_CONFIG 常量
5. 新增 `get_llm_config()` 函数动态获取配置
**配置默认值**:
- API地址: http://192.168.2.17:19007/v1
- 文本模型: auto
- 视觉模型: gpt-4-vision-preview
**Git仓库**: http://192.168.2.8:12007/coder/param-hub-python v1.6.0
---
### ParamHub Python - 子类别功能
**需求来源**: 用户openclaw-control-ui
**v1.7.0 主要改动**:
1. 类别数据结构新增 subcategories 字段
2. 每个子类别可定义:
- id: 子类别ID
- name: 子类别名称
- icon: 图标
- key_features: 关键特性字段列表
- feature_labels: 特性显示标签
3. 前端模型页面添加子类别选择器
4. 表格根据子类别动态显示关键特性列
5. 预设子类别配置:对话模型、代码模型、推理模型、视觉模型等
**v1.7.1 主要改动**:
1. 添加子类别编辑弹框subcategoryModal
2. 子类别列表可视化显示(卡片样式)
3. 支持添加、编辑、删除子类别
4. 表单输入关键特性字段(逗号分隔)和标签(字段:显示名)
5. 替换原来的JSON文本编辑方式
**Git仓库**: http://192.168.2.8:12007/coder/param-hub-python v1.7.1
---
## 技术要点
### LLM Proxy 视觉模型配置
添加了 SiliconFlow Vision 提供商:
```json
{
"id": "siliconflow-vision",
"name": "SiliconFlow Vision",
"base_url": "https://api.siliconflow.cn/v1",
"models": ["Qwen/Qwen2-VL-72B-Instruct"],
"vision": true
}
```
模型别名配置:
- `gpt-4-vision-preview` -> `Qwen/Qwen2-VL-72B-Instruct`
### 剪贴板粘贴图片的限制
浏览器剪贴板 API `navigator.clipboard.read()` 有安全限制:
- 只在 HTTPS 或 localhost 环境下可用
- HTTP 环境下会报错 NotAllowedError
---
## 项目信息
- 项目名: ParamHub Python
- 目录: `works/param-hub-python`
- 端口: 19010
- Git仓库: http://192.168.2.8:12007/coder/param-hub-python
---
## 备注
今日主要完成了 ParamHub Python 的三个版本更新重点是多图解析功能和子类别管理功能的开发。LLM Proxy 也新增了视觉模型支持,使得图片解析功能可以正常工作。

132
memory/2026-04-28.md Normal file
View File

@@ -0,0 +1,132 @@
# 2026-04-28 每日事务记录
## 开发任务
### ParamHub Python - 子类别管理与参数字段配置系统
**需求来源**: 用户openclaw-control-ui
**版本迭代**下午开发v1.7.2 ~ v1.14.0:
| 版本 | 功能 |
|------|------|
| v1.7.2 | 修复分类编辑API缺失 - 添加 GET /api/categories/<id> |
| v1.8.0 | 智能补充参数功能 - 编辑已有产品时上传参数截图/文本补充缺失字段 |
| v1.8.1 | 内置分类子类别管理 - 分类管理中可编辑内置类别的子类别配置 |
| v1.8.2 | ID自动生成 - 分类和子类别ID无需手动填写 |
| v1.9.0 | 子类别字段和筛选 - 所有数据支持子类别字段,列表可筛选 |
| v1.9.1 | 产品子类别分配 - 为模型/GPU/CPU等分配子类别 |
| v1.10.0 | 参数字段管理 - 类别和子类别可配置参数列表 |
| v1.10.1 | 参数字段配置 - 为所有类别配置14-17个参数字段 |
| v1.11.0 | 智能添加字段配置解析 - 根据类别参数字段配置解析数据 |
| v1.12.0 | 动态字段显示 - 表格列和编辑表单从类别配置动态生成 |
| v1.12.1 | 语法错误修复 - JSON.stringify images字段重复定义 |
| v1.12.2 | 发布日期统一 - 所有产品发布日期格式 YYYY-MM-DD |
| v1.13.0 | 参数截图+解析来源历史 - 图片改为参数截图,支持多次解析并记录来源 |
| v1.14.0 | 字段统一为文本类型 - 长文本字段标记 input_style |
**核心功能点**:
1. **参数字段配置系统**
- 类别层面:基础参数字段(所有子类别共享)
- 子类别层面:可添加额外参数字段
- 字段结构key、label、type、description、required、input_style
- 前端动态生成表格列和编辑表单
2. **子类别管理**
- 内置分类ai-models、gpus、cpus支持子类别编辑
- 子类别有 key_features关键特性和 extra_fields额外参数
- 智能添加时可选子类别,解析时包含额外字段
3. **智能添加/补充解析**
- 上传参数截图(规格表、参数页面)而非产品图
- AI根据类别字段配置解析参数
- 支持多次解析,每次来源记录到 parse_sources
- 解析来源记录timestamp、images、text、updated_fields
4. **数据结构**
```json
{
"parse_sources": [{
"type": "smart_add",
"timestamp": "2026-04-28 22:41:00",
"images": ["参数截图URL"],
"text": "解析文本",
"updated_fields": ["补充的字段"]
}],
"product_images": [] // 产品展示图(后续功能)
}
```
**Git仓库**: http://192.168.2.8:12007/coder/param-hub-python
---
### AI Chat App - 用户头像在对话界面显示
**需求来源**: 用户huangzhuang_bro
**v3.11.0 主要改动**:
1. 修改 `renderMessages` 函数中的头像逻辑
2. 用户头像使用 `currentUser?.avatar || '👤'`
3. AI 头像使用智能体头像 `currentAgent?.avatar || '🤖'`
4. 使用 `renderAvatar()` 函数渲染用户头像(支持图片和 emoji
5. 普通对话和智能体对话界面都正确显示用户修改的头像
**Git仓库**: http://192.168.2.8:12007/coder/ai-chat-app v3.11.0
---
### AI Chat App - 智能体对话标题自动更新+历史显示优化
**需求来源**: 用户huangzhuang_bro
**v3.12.0 主要改动**:
1. 智能体对话初始标题改为"新对话"(和普通对话一致)
2. 第一次对话和每5次对话自动生成标题AI总结
3. 历史使用界面:左边显示对话标题,右边显示智能体类型
4. 主页最近使用列表同样优化显示智能体类型
**Git仓库**: http://192.168.2.8:12007/coder/ai-chat-app v3.12.0
---
### AI Chat App - 我的页面和关于页面绑定后台系统配置
**需求来源**: 用户huangzhuang_bro
**v3.13.0 主要改动**:
1. 前端加载后台配置后赋值到 CONFIG.system
2. 我的页面底部显示版本号、技术基础从后台配置读取
3. 关于页面所有信息从后台配置读取
4. 隐私政策、用户协议链接从后台配置读取
**Git仓库**: http://192.168.2.8:12007/coder/ai-chat-app v3.13.0
---
### AI Chat App - AI回复语音播放功能Edge TTS
**需求来源**: 用户huangzhuang_bro
**v3.14.0 主要改动**:
1. 普通对话和智能体对话界面顶部右侧添加语音播放开关按钮
2. AI消息操作栏添加播放按钮点击播放/停止语音
3. 开启后AI回复完成自动播放
4. 后台管理系统设置添加TTS配置方案、语音选择
5. 支持多种中文语音(晓晓、云希、云健等)
**技术要点**:
- 使用 edge-tts 库(免费)生成语音
- 后端 APIPOST /api/ttsGET /api/tts/voices
- 前端使用 Audio 对象播放 MP3 音频
**Git仓库**: http://192.168.2.8:12007/coder/ai-chat-app v3.14.0
---
## 备注
今日完成了两个项目的重要功能:
- **ParamHub Python**: 子类别管理、参数字段配置、智能解析系统14个版本迭代
- **AI Chat App**: 头像显示、标题机制、语音播放4个版本迭代

22
memory/2026-04-29.md Normal file
View File

@@ -0,0 +1,22 @@
# 2026-04-29 每日事务记录
## 开发任务
### ParamHub Python - 参数字段统一为文本类型
**需求来源**: 用户openclaw-control-ui
**v1.14.0 主要改动**:
1. 所有参数字段改为文本类型type: 'text'
2. 长文本字段description、specs标记 input_style: 'long'
3. 普通文本字段标记 input_style: 'normal'
4. 前端根据 input_style 显示不同输入控件textarea vs input
5. 数值字段暂时保持文本存储,后期考虑数值对比功能
**Git仓库**: http://192.168.2.8:12007/coder/param-hub-python v1.14.0
---
## 备注
上午整理了昨天的会话记录并更新记忆文件。

View File

@@ -1,6 +1,7 @@
{
"lastSummaryDate": "2026-04-21",
"lastSummaryDate": "2026-04-29",
"lastChecks": {
"memory_created": "2026-04-21T02:24:00Z"
"memory_created": "2026-04-21T02:24:00Z",
"2026-04-28_summary": "已整理memory/2026-04-28.md 已存在,记录完整"
}
}

Submodule works/ai-chat updated: daccc625c3...26a76b030d

12
works/ai-chat-app/.gitignore vendored Normal file
View File

@@ -0,0 +1,12 @@
__pycache__/
*.pyc
*.pyo
*.pyd
.Python
*.so
*.egg-info/
dist/
build/
*.db
data.db
node_modules/

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,2 @@
flask>=2.0.0
flask-cors>=3.0.0

View File

@@ -0,0 +1,4 @@
#!/bin/bash
cd "$(dirname "$0")"
pip install -r requirements.txt -q
python app.py

View File

@@ -0,0 +1,482 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI助手 - 后台管理</title>
<link rel="stylesheet" href="admin.css?v=3.6.6">
<style>
:root {
--primary: #667eea;
--primary-dark: #5a67d8;
--bg-color: #f5f7fa;
--card-bg: #ffffff;
--text-color: #2d3748;
--text-light: #718096;
--border-color: #e2e8f0;
--danger: #e53e3e;
--success: #22c55e;
--warning: #f59e0b;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: var(--bg-color);
color: var(--text-color);
line-height: 1.6;
}
/* 登录页面 */
.login-page {
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
background: linear-gradient(135deg, var(--primary) 0%, #764ba2 100%);
}
.login-card {
background: white;
padding: 40px;
border-radius: 16px;
width: 350px;
text-align: center;
}
.login-logo {
font-size: 48px;
margin-bottom: 16px;
}
.login-title {
font-size: 24px;
font-weight: 600;
margin-bottom: 24px;
}
.login-input {
width: 100%;
padding: 12px 16px;
border: 2px solid var(--border-color);
border-radius: 10px;
font-size: 16px;
margin-bottom: 16px;
outline: none;
}
.login-input:focus {
border-color: var(--primary);
}
.login-btn {
width: 100%;
padding: 14px;
background: linear-gradient(135deg, var(--primary) 0%, #764ba2 100%);
color: white;
border: none;
border-radius: 10px;
font-size: 16px;
font-weight: 500;
cursor: pointer;
margin-top: 8px;
}
.login-btn:hover {
opacity: 0.9;
}
/* 主页面 */
.admin-page {
display: none;
}
.admin-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 24px;
background: white;
border-bottom: 1px solid var(--border-color);
}
.admin-logo {
display: flex;
align-items: center;
gap: 8px;
font-size: 20px;
font-weight: 600;
}
.admin-logo span {
font-size: 28px;
}
.admin-header-right {
display: flex;
align-items: center;
gap: 16px;
}
.admin-logout {
padding: 8px 16px;
background: var(--danger);
color: white;
border: none;
border-radius: 6px;
cursor: pointer;
}
/* 侧边栏 */
.admin-container {
display: flex;
height: calc(100vh - 60px);
}
.admin-sidebar {
width: 220px;
background: white;
border-right: 1px solid var(--border-color);
padding: 16px;
}
.sidebar-item {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 16px;
border-radius: 8px;
cursor: pointer;
transition: all 0.2s;
margin-bottom: 4px;
}
.sidebar-item:hover {
background: rgba(102, 126, 234, 0.1);
}
.sidebar-item.active {
background: linear-gradient(135deg, var(--primary) 0%, #764ba2 100%);
color: white;
}
.sidebar-icon {
font-size: 20px;
}
/* 内容区 */
.admin-content {
flex: 1;
padding: 24px;
overflow-y: auto;
}
.content-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24px;
}
.content-title {
font-size: 24px;
font-weight: 600;
}
.add-btn {
padding: 10px 20px;
background: var(--primary);
color: white;
border: none;
border-radius: 8px;
cursor: pointer;
}
/* 数据卡片 */
.stats-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16px;
margin-bottom: 24px;
}
.stat-card {
background: white;
padding: 20px;
border-radius: 12px;
text-align: center;
}
.stat-icon {
font-size: 32px;
margin-bottom: 8px;
}
.stat-value {
font-size: 28px;
font-weight: 600;
color: var(--primary);
}
.stat-label {
font-size: 14px;
color: var(--text-light);
}
/* 数据表格 */
.data-table {
background: white;
border-radius: 12px;
overflow: hidden;
}
.data-table table {
width: 100%;
border-collapse: collapse;
}
.data-table th, .data-table td {
padding: 14px 16px;
text-align: left;
border-bottom: 1px solid var(--border-color);
}
.data-table th {
background: var(--bg-color);
font-weight: 600;
color: var(--text-light);
}
.data-table tr:last-child td {
border-bottom: none;
}
.data-table tr:hover td {
background: rgba(102, 126, 234, 0.05);
}
/* 操作按钮 */
.action-btns {
display: flex;
gap: 8px;
}
.action-btn {
padding: 6px 12px;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 12px;
}
.action-btn.edit {
background: var(--primary);
color: white;
}
.action-btn.delete {
background: var(--danger);
color: white;
}
.action-btn.default {
background: var(--success);
color: white;
}
/* 默认标记 */
.default-badge {
padding: 4px 8px;
background: var(--success);
color: white;
border-radius: 4px;
font-size: 12px;
}
/* 模态框 */
.modal {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.5);
display: none;
align-items: center;
justify-content: center;
z-index: 1000;
}
.modal.show {
display: flex;
}
.modal-content {
background: white;
padding: 24px;
border-radius: 16px;
max-width: 500px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24px;
}
.modal-title {
font-size: 20px;
font-weight: 600;
}
.modal-close {
font-size: 24px;
cursor: pointer;
color: var(--text-light);
}
.form-group {
margin-bottom: 16px;
}
.form-label {
display: block;
font-size: 14px;
font-weight: 500;
margin-bottom: 8px;
}
.form-input, .form-select, .form-textarea {
width: 100%;
padding: 12px;
border: 1px solid var(--border-color);
border-radius: 8px;
font-size: 14px;
outline: none;
}
.form-input:focus, .form-select:focus, .form-textarea:focus {
border-color: var(--primary);
}
.form-textarea {
resize: vertical;
min-height: 100px;
}
.form-submit {
width: 100%;
padding: 14px;
background: var(--primary);
color: white;
border: none;
border-radius: 8px;
font-size: 16px;
cursor: pointer;
margin-top: 16px;
}
/* Toast */
.toast {
position: fixed;
top: 80px;
left: 50%;
transform: translateX(-50%);
background: var(--text-color);
color: white;
padding: 12px 24px;
border-radius: 8px;
font-size: 14px;
opacity: 0;
transition: opacity 0.3s;
z-index: 2000;
}
.toast.show {
opacity: 1;
}
</style>
</head>
<body>
<!-- 登录页面 -->
<div class="login-page" id="loginPage">
<div class="login-card">
<div class="login-logo">🤖</div>
<h1 class="login-title">后台管理系统</h1>
<input type="text" class="login-input" id="loginUsername" placeholder="用户名">
<input type="password" class="login-input" id="loginPassword" placeholder="密码">
<button class="login-btn" id="loginBtn">登录</button>
<p style="margin-top: 16px; color: #999; font-size: 12px;">默认: admin / admin123</p>
</div>
</div>
<!-- 管理页面 -->
<div class="admin-page" id="adminPage">
<header class="admin-header">
<div class="admin-logo">
<span>🤖</span>
AI助手 - 后台管理
</div>
<div class="admin-header-right">
<span id="adminName">管理员</span>
<button class="admin-logout" id="logoutBtn">退出</button>
</div>
</header>
<div class="admin-container">
<aside class="admin-sidebar">
<div class="sidebar-item active" data-page="stats">
<span class="sidebar-icon">📊</span>
<span>统计信息</span>
</div>
<div class="sidebar-item" data-page="users">
<span class="sidebar-icon">👥</span>
<span>用户管理</span>
</div>
<div class="sidebar-item" data-page="llm">
<span class="sidebar-icon">🧠</span>
<span>大模型配置</span>
</div>
<div class="sidebar-item" data-page="agents">
<span class="sidebar-icon">🤖</span>
<span>智能体管理</span>
</div>
<div class="sidebar-item" data-page="chat">
<span class="sidebar-icon">💬</span>
<span>对话配置</span>
</div>
<div class="sidebar-item" data-page="tools">
<span class="sidebar-icon">🔧</span>
<span>工具配置</span>
</div>
<div class="sidebar-item" data-page="system">
<span class="sidebar-icon">⚙️</span>
<span>系统设置</span>
</div>
</aside>
<main class="admin-content" id="mainContent">
<!-- 内容区动态加载 -->
</main>
</div>
</div>
<!-- Toast -->
<div class="toast" id="toast"></div>
<!-- 模态框 -->
<div class="modal" id="modal">
<div class="modal-content" id="modalContent">
<!-- 动态内容 -->
</div>
</div>
<script src="admin.js?v=3.6.6"></script>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -4,57 +4,16 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="theme-color" content="#667eea">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<title>AI助手</title>
<link rel="stylesheet" href="style.css">
<link rel="stylesheet" href="style.css?v=3.5.1">
<link rel="manifest" href="manifest.json">
</head>
<body>
<div id="app">
<!-- 头部 -->
<header class="header">
<div class="header-title">
<span class="logo">🤖</span>
<h1>AI助手</h1>
</div>
<button class="clear-btn" onclick="clearChat()" title="清空对话">
<svg viewBox="0 0 24 24" width="20" height="20">
<path fill="currentColor" d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/>
</svg>
</button>
</header>
<!-- 消息区域 -->
<div class="messages-container" id="messagesContainer">
<div class="welcome" id="welcome">
<div class="welcome-icon">👋</div>
<h2>你好我是AI助手</h2>
<p>有什么可以帮助你的吗?</p>
<div class="quick-actions">
<button onclick="sendQuickMessage('介绍一下你自己')">介绍一下你自己</button>
<button onclick="sendQuickMessage('帮我写一段代码')">帮我写代码</button>
<button onclick="sendQuickMessage('解释一个概念')">解释概念</button>
</div>
</div>
<div class="messages" id="messages"></div>
</div>
<!-- 输入区域 -->
<div class="input-area">
<textarea
id="userInput"
placeholder="输入消息..."
rows="1"
onkeydown="handleKeyDown(event)"
oninput="autoResize(this)"
></textarea>
<button class="send-btn" onclick="sendMessage()" id="sendBtn">
<svg viewBox="0 0 24 24" width="24" height="24">
<path fill="currentColor" d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/>
</svg>
</button>
</div>
</div>
<script src="app.js"></script>
<div id="app"></div>
<script src="marked.min.js?v=3.5.1"></script>
<script src="app.js?v=3.5.1"></script>
</body>
</html>

69
works/ai-chat-app/www/marked.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff