Skip to content

Rio-UI/chat

Repository files navigation

LLMs Assistants Web App - 交付报告

1. 项目概述

本项目旨在开发一个功能完善的 LLMs 助手 Web 应用,提供中文用户界面,核心功能是利用大语言模型 API 进行对话交互。用户可以管理多个助手、自定义提示词、配置不同的 LLM 服务,并在一个直观的界面中与助手进行聊天。

2. 主要功能

应用包含以下主要功能模块:

2.1. 助手管理

  • Dock栏助手列表
    • 浅灰色背景,位于应用左侧。
    • 显示用户添加的助手列表,包含头像和名称。
    • 支持拖拽助手头像进行排序。
    • 选中助手后,右侧主区域切换到对应助手的聊天界面。
    • 列表底部包含“查看全部助手”和“添加助手”图标。
  • 助手中心页面 (/assistants-hub)
    • 点击 Dock 栏“查看全部助手”图标进入。
    • 使用卡片宫格展示“我的助手”和“助手库”。
    • 助手卡片显示头像、名称和单行指令提示词。
    • 我的助手:可编辑或删除已添加的助手。
    • 助手库:预设多个助手(头像、名称、指令提示词),用户可将其添加到“我的助手”列表,并实时在 Dock 栏显示。
  • 添加/编辑助手 (/add-assistant, /edit-assistant/[id])
    • 点击 Dock 栏“添加助手”图标或助手中心的编辑按钮进入。
    • 表单字段:
      • 头像:从大量 Emoji 下拉列表中选择。
      • 名称:自定义助手名称。
      • 指令提示词:定义助手的行为和角色。
      • 模型ID:从已配置的 LLM 服务模型列表中选择(按 API 域名/服务名称分组)。
    • 新建或从助手库添加助手时,默认使用用户最新添加的模型服务(若无则使用预设的 Riiid Chat 模型)。
    • 编辑助手时可以更改模型。
  • 默认助手:应用初始化时会自动添加一个“默认助手”(头像: 🤖, 名称: 默认助手, 指令提示词: 我可以回答任何问题, 模型: 预设的 Riiid Chat 模型)。

2.2. 聊天界面 (主页 /)

  • 顶部信息栏
    • 显示当前选中助手的头像、名称和当前使用的模型ID。
    • 点击助手头像或名称旁边的编辑图标可跳转至编辑助手页面。
  • 聊天记录区
    • 实时流式显示聊天记录(当前为模拟流式输出)。
    • 支持 Markdown 格式渲染。
    • 支持预览聊天消息中的图片链接。
    • 支持将 <think>...</think> 标签内的内容识别为“深度思考”,并提供可收起/展开的交互。
  • 底部输入框与功能区
    • 悬浮输入框,始终位于聊天记录之上。
    • 多行输入框,默认显示一行,随内容增多自动扩展,与右侧功能区图标对齐。
    • 快捷键:Enter 发送消息,Shift + Enter 换行。
    • 功能区图标 (位于输入框内右侧):
      • Paperclip (上传图片):点击上传图片,图片在输入区预览,随文本消息一同发送(图片实际发送逻辑未对接真实后端,仅为前端效果)。
      • FileText (提示词):点击弹出底部对齐的下拉菜单,显示提示词列表(单行内容),点击可将提示词插入输入框。
      • Columns (选择模型):点击弹出底部对齐的下拉菜单,选择本次提问使用的模型 ID(按 API 域名/服务名称分组)。默认勾选当前助手配置的模型或上次选择的模型。支持选择多个模型 ID 进行提问,勾选多个模型后,聊天区域会横向分割成多栏,每个模型在各自的分栏内同时回答(当前为模拟并行回答)。
      • Clock (历史会话):UI占位符已添加,点击弹出历史会话列表的下拉菜单。完整功能(自动命名、删除、查看、新建会话)待进一步开发。
      • 发送/停止按钮:发送消息后,发送按钮变为停止生成按钮,用于停止 AI 生成内容(当前为模拟停止)。点停止后按钮回到默认状态。
  • 多模型提问
    • 选择多个模型ID后,聊天区域横向分割,每个模型对应一个分栏。
    • 共用一个输入框发送提问。
    • 多个模型在各自分栏内同时回答(当前为模拟)。
  • 本地持久化
    • 助手列表、聊天记录、提示词、模型服务配置均使用 localStorage 进行本地持久化存储。
    • 选择助手后默认继续上次会话,若无历史会话则自动创建新会话。
    • 进入页面时默认选择第一个助手。

2.3. 提示词管理 (/prompts)

  • 卡片列表
    • 使用卡片宫格展示用户保存的提示词列表。
    • 卡片固定显示2行内容,超出部分截断。
    • 点击卡片弹窗显示完整内容并可直接编辑。
  • 管理功能
    • 添加/编辑:通过弹窗进行,关闭弹窗即时保存。
    • 删除:鼠标 Hover 卡片时显示删除图标,点击确认后删除。
    • 拖拽排序:支持拖拽卡片进行排序,排序结果实时保存。

2.4. 设置 (/settings)

  • 模型服务管理
    • 以卡片形式展示所有已添加的 LLM 服务。
    • 添加/编辑模型服务
      • 服务名称:用户自定义。
      • API 密钥:输入框下方显示获取密钥的示例链接 (https://riiio.top)。
      • API 地址:自动补全 /v1/chat/completions 后缀(如果用户未填写)。
      • 模型ID
        • 标签形式展示已添加的模型ID列表。
        • 支持通过输入框手动输入模型ID后按回车添加。
        • 激活模型ID输入框或填写完API地址和密钥后,尝试从API地址获取模型列表(当前为模拟获取),供用户从下拉列表中点击添加,支持筛选。
    • 删除模型服务:用户添加的服务可删除,默认预设服务不可删除。
    • API连通性测试:提供按钮测试用户添加的模型服务的API连通性(当前为模拟测试)。
    • 导入/导出模型设置:支持以 JSON 文件格式导入和导出用户添加的模型服务配置(不包括默认服务)。
    • 兼容性:设计上考虑兼容 OpenAI、Gemini、DeepSeek、Anthropic 等多种 LLM 提供商及自定义 API 服务(通过填写API地址和模型ID实现)。
    • 默认预设服务
      • 预添加一个名为 “Riiid Chat (默认)” 的模型服务。
      • 模型ID包含 deepseek/deepseek-chat:freeqwen/qwen2.5-vl-32b-instruct:free
      • API 地址显示为 api.riiio.chat (实际使用 OpenRouter 地址进行模拟测试)。
      • API 密钥为预设的 OpenRouter 密钥。
      • 此默认服务不可编辑、不可删除,其真实 API 地址和密钥对用户隐藏。

3. 技术栈

  • 前端框架:Next.js (App Router)
  • 状态管理:Zustand
  • UI组件:Tailwind CSS, Lucide Icons
  • 拖拽排序:@dnd-kit/core, @dnd-kit/sortable
  • Markdown渲染:react-markdown, remark-gfm
  • 包管理:pnpm

4. 项目结构

llm-assistants-webapp/
├── public/
│   └── assets/ (原计划存放SVG图标,现使用lucide-react替代)
├── src/
│   ├── app/                 # Next.js 页面和布局
│   │   ├── (main)/          # 主应用页面 (示例分组,实际未用)
│   │   │   ├── page.tsx     # 聊天主界面
│   │   │   └── layout.tsx   # 主布局 (Dock栏等)
│   │   ├── add-assistant/
│   │   │   └── page.tsx
│   │   ├── edit-assistant/[id]/
│   │   │   └── page.tsx
│   │   ├── assistants-hub/
│   │   │   └── page.tsx
│   │   ├── prompts/
│   │   │   └── page.tsx
│   │   ├── settings/
│   │   │   └── page.tsx
│   │   ├── globals.css
│   │   └── layout.tsx       # 根布局
│   ├── components/
│   │   ├── AssistantList.tsx
│   │   └── chat/            # 聊天相关组件 (如果拆分)
│   ├── store/
│   │   ├── assistantStore.ts
│   │   ├── chatStore.ts
│   │   ├── modelStore.ts
│   │   └── promptStore.ts
│   └── lib/                 # 工具函数等 (未使用)
├── .eslintrc.json
├── .gitignore
├── next.config.mjs
├── package.json
├── pnpm-lock.yaml
├── postcss.config.js
├── tailwind.config.ts
├── tsconfig.json
└── todo.md                # 开发任务清单

5. 如何运行

  1. 环境准备
    • 确保已安装 Node.js (推荐 v18 或更高版本) 和 pnpm。
  2. 解压项目
    • 将提供的 llm-assistants-webapp.zip 解压到本地目录。
  3. 安装依赖
    • 在项目根目录下打开终端,运行命令:
      pnpm install
  4. 启动开发服务器
    • 运行命令:
      pnpm dev
  5. 访问应用
    • 在浏览器中打开 http://localhost:3000 (或终端提示的其他端口)。

6. 注意事项与待办

  • API 调用:所有涉及 LLM API 的调用(聊天、获取模型列表、API连通性测试)当前均为 模拟实现。需要替换为真实的 API 请求逻辑才能与实际大模型交互。
  • 流式输出:聊天回复的流式输出当前也是模拟的,真实场景下需要对接支持流式响应的 API。
  • 历史会话:聊天界面中的“历史会话”功能目前仅有UI占位符,其具体功能(如会话列表展示、切换、删除、新建、自动命名等)尚未完全实现,是后续可以完善的方向。
  • 图标:应用主要使用 lucide-react 图标库,未单独在 public/assets 存放 SVG 文件。
  • 错误处理:已进行基础的错误提示,但更完善的错误处理和用户反馈机制可以进一步加强。
  • 安全性:API 密钥等敏感信息目前直接存储在前端状态管理和 localStorage 中,这在生产环境中是不安全的。真实部署时,API 密钥管理和对 LLM 的调用应通过后端服务进行代理,以保护密钥安全。
  • 响应式设计:已进行基础的响应式布局,但在各种设备和屏幕尺寸下的详细测试和优化仍需进行。
  • 代码优化与测试:部分组件和逻辑可以进一步优化和重构,单元测试和集成测试的覆盖可以提高项目质量。

7. 总结

LLMs Assistants Web App 项目已按照需求完成了核心功能的开发,提供了一个相对完整的单页面应用体验。通过模块化的组件和状态管理,项目具备了良好的可扩展性。后续可以根据实际需求,对接真实 API、完善细节功能、并进行性能优化和安全加固。

About

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages