# QN-chat **Repository Path**: YuYao-Gith/QN-chat ## Basic Information - **Project Name**: QN-chat - **Description**: AI API聊天工具 - **Primary Language**: Python - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-07-26 - **Last Updated**: 2026-08-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
``` ╔═══════════════════════════════════════════╗ ║ ██████╗ ███╗ ██╗ ║ ║ ██╔═══██╗████╗ ██║ ║ ║ ██║ ██║██╔██╗ ██║ QN-Chat v2.1 ║ ║ ██║▄▄ ██║██║╚██╗██║ 青年Chat ║ ║ ╚██████╔╝██║ ╚████║ ║ ║ ╚══▀▀═╝ ╚═╝ ╚═══╝ ║ ║ ██████╗██╗ ██╗ █████╗ ████████╗ ║ ║ ██╔════╝██║ ██║██╔══██╗╚══██╔══╝ ║ ║ ██║ ███████║███████║ ██║ ║ ║ ██║ ██╔══██║██╔══██║ ██║ ║ ║ ╚██████╗██║ ██║██║ ██║ ██║ ║ ║ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ║ ╚═══════════════════════════════════════════╝ ``` **QN-Chat (青年Chat) v2.1** — 多模型 AI 聊天应用 [四合一界面] Web · CLI · GUI · Admin
--- # QN-Chat · 青年Chat > 一款轻量级的多模型 AI 聊天工具,支持流式对话、联网搜索、文件管理、加密 API Key 存储,提供 **四种操作界面**。 --- ## 📋 目录 - [功能特性](#-功能特性) - [支持的模型](#-支持的模型) - [四种界面](#-四种界面) - [安全架构](#-安全架构) - [文件管理](#-文件管理) - [快速开始](#-快速开始) - [项目结构](#-项目结构) - [配置说明](#-配置说明) - [API 文档](#-api-文档) - [本地模型配置](#-本地模型配置) - [常见问题](#-常见问题) - [开发指南](#-开发指南) - [开源许可](#-开源许可) --- ## ✨ 功能特性 ### 🤖 多模型支持 无缝切换六大 AI 模型提供方,全部使用 OpenAI 兼容 API: | 提供方 | 说明 | API 地址 | |--------|------|----------| | **DeepSeek** | 深度求索 v4 系列 | `https://api.deepseek.com` | | **通义千问** | 阿里云百炼平台 | `https://dashscope.aliyuncs.com/compatible-mode/v1` | | **智谱 GLM** | 智谱 AI 开放平台 | `https://open.bigmodel.cn/api/paas/v4` | | **月之暗面 Kimi** | Moonshot AI | `https://api.moonshot.cn/v1` | | **Ollama** | 本地开源模型 | `http://localhost:11434/v1` | | **LM Studio** | 本地 Hugging Face 模型 | `http://localhost:1234/v1` | ### 🎨 四种操作界面 | 界面 | 技术栈 | 特点 | |------|--------|------| | **🌐 Web 网页版** | HTML + CSS + JS (原生) | 暗色主题、流式 SSE、拖拽上传、响应式设计 | | **💻 终端 CLI** | Python Rich 库 | Markdown 渲染、彩色主题、快捷键、命令系统 | | **🖥️ 桌面 GUI** | Python Tkinter | 原生窗口、侧边栏、菜单系统、对话框 | | **🔧 管理后台** | 自包含 Web 应用 | 用户管理、API Key 管理、系统监控、日志审计 | ### 🔒 加密 API Key 存储 - **RSA-2048 + AES-256-CBC** 双层加密保护 - RSA 私钥使用 **PBKDF2**(480,000 次迭代)派生密钥加密 - 每次启动需输入用户名和密码解密,密钥永不存明文 - 每个模型提供方可独立配置 API Key ### 📁 文件管理 完整的本地文件 I/O 能力,三种权限级别: - **📖 只读模式** — AI 仅可读取文件 - **❓ 需确认模式** — AI 操作文件前需用户批准 - **🔓 完全自主模式** — AI 可自主操作文件 支持代码文件、文档、PDF 等多种格式(可配置扩展名白名单)。 ### 🌐 联网搜索 内置多引擎搜索功能,支持 **4 种搜索引擎**,AI 可结合实时搜索结果回答问题: | 搜索引擎 | 说明 | 适用地区 | 是否需要 Key | |---------|------|---------|-------------| | **DuckDuckGo** | 默认搜索引擎,即时答案 API | 海外 | 否 | | **Bing** | Microsoft Bing Web Search API | 国内/海外 | 需 Azure API Key | | **SearXNG** | 自建隐私友好元搜索引擎 | 自建实例 | 否(自建) | | **博查搜索 (Bocha)** | 国内 AI 搜索 API | 国内 | 需 API Key | > 💡 **国内用户建议**:使用 Bing 搜索(需申请 Azure 免费 API Key)或自建 SearXNG 实例。可在管理后台「系统设置」中切换搜索引擎。 ### 💬 对话管理 - 多会话管理(创建/切换/删除/重命名) - 自动上下文裁剪(可配置最大消息数) - 文件上下文注入 - 系统提示词自定义 - Token 用量统计 ### ⚡ 流式对话 - Web 界面:Server-Sent Events (SSE) 实时流式输出 - CLI 界面:Rich 进度动画流式渲染 - GUI 界面:多线程流式更新 --- ## 🧠 支持的模型 ### DeepSeek | 模型 | 说明 | |------|------| | `deepseek-v4-flash` | 快速推理模型(推荐) | | `deepseek-v4-pro` | 高性能专业模型 | ### 通义千问(Qwen) | 模型 | 说明 | |------|------| | `qwen-plus` | 增强版(推荐) | | `qwen-max` | 最大能力版 | | `qwen-turbo` | 快速版 | | `qwen-long` | 长上下文版 | | `qwen3.7-max-preview` | Qwen3.7 最大版预览 | | `qwen3.7-max` | Qwen3.7 最大版 | | `qwen3.7-plus` | Qwen3.7 增强版 | | `qwen3.5-omni-plus` | Qwen3.5 多模态增强版 | ### 智谱 GLM | 模型 | 说明 | |------|------| | `glm-4-flash` | 快速版(推荐) | | `glm-4` | 标准版 | | `glm-4-plus` | 增强版 | | `glm-4-air` | 轻量版 | | `glm-5.2-flash` | GLM-5.2 快速版 | | `glm-5.2` | GLM-5.2 标准版 | | `glm-5.2-plus` | GLM-5.2 增强版 | ### 月之暗面 Kimi | 模型 | 说明 | |------|------| | `moonshot-v1-8k` | 8K 上下文(推荐) | | `moonshot-v1-32k` | 32K 长上下文 | | `moonshot-v1-128k` | 128K 超长上下文 | | `kimi-k3` | Kimi K3 模型 | | `kimi-k2.7-code` | K2.7 代码专用 | | `kimi-k2.6` | K2.6 模型 | ### Ollama(本地) | 模型 | 说明 | |------|------| | `llama3.1` / `llama3.2` | Meta LLaMA 系列 | | `qwen2.5` / `qwen2.5-coder` | 千问 2.5 系列 | | `mistral` / `mixtral` | Mistral AI 系列 | | `codellama` | 代码专用 LLaMA | | 以及更多社区模型 | 通过 Ollama 支持 | ### LM Studio(本地) | 模型 | 说明 | |------|------| | `local-model` | LM Studio 中加载的任意 Hugging Face 模型 | --- ## 🖥️ 四种界面 ### 🌐 Web 网页版 浏览器访问,功能最完整的界面。 ```bash python run.py web # 默认 http://localhost:8888 python run.py web --port 9999 # 自定义端口 ``` **功能特点:** - 暗色主题现代化 UI,响应式设计 - 左侧面板:模型选择、API Key 配置、文件上传 - 联网搜索和上下文开关 - SSE 流式输出,实时显示生成内容 - Markdown 渲染(代码块、标题、列表等) - 文件拖拽上传(支持多种格式) - 多会话对话管理 --- ### 💻 终端 CLI 适合服务器环境或无桌面场景。 ```bash python run.py cli ``` **功能特点:** - Rich 库美化,支持 Markdown 渲染 - 彩色主题输出 - 命令系统(/model、/search、/files 等) - 快捷键支持(Ctrl+C 取消、Ctrl+D 退出) - 对话管理(/conv list|new|switch|delete) - 内置状态栏显示模型和权限信息 **CLI 命令列表:** | 命令 | 说明 | |------|------| | `/model [provider] [model]` | 切换模型 | | `/apikey set\|list\|delete` | 管理 API Key | | `/files mode <模式>` | 设置文件权限 | | `/read ` | 读取文件 | | `/ls [path]` | 列出目录 | | `/clear` | 清除上下文 | | `/conv list\|new\|switch\|delete` | 管理对话 | | `/search on\|off` | 切换联网搜索 | | `/status` | 显示系统状态 | | `/help` | 显示帮助 | | `/quit` | 退出程序 | --- ### 🖥️ 桌面 GUI 原生桌面应用,适合日常使用。 ```bash python run.py gui ``` **功能特点:** - Tkinter 原生窗口,暗色主题 - 侧边栏对话列表 - 菜单栏(文件/模型/文件权限/帮助) - 对话框式模型切换和 API Key 管理 - 首次设置向导 - 文件打开和读取 --- ### 🔧 管理后台 全功能 Web 管理面板。 ```bash python run.py admin # 默认 http://localhost:4444 python run.py admin --port 9998 # 自定义端口 ``` **功能特点:** - **管理员登录** — 会话认证,默认账户 root/root(超级管理员)、admin/admin(管理员)、user/user(普通用户) - **系统状态仪表盘** — 运行时间、模型状态、API Key 状态 - **用户管理** — 创建/编辑/删除管理员账户 - **API Key 管理** — 加密存储各个提供方的 API Key - **模型配置** — 切换默认模型和提供方 - **自定义提供方** — 添加任意 OpenAI 兼容 API - **Ollama/LM Studio 管理** — 本地服务连通性检查 - **对话历史浏览** — 查看所有历史对话 - **访问日志审计** — 记录所有管理操作 - **多主题切换** — 极客风、春意盎然、夏日美好、秋日飘香、冬日飘雪 --- ## 🔒 安全架构 ### 加密流程 ``` 用户输入 (用户名 + 密码) ↓ PBKDF2 (480,000 次迭代) ↓ AES-256 密钥 ← 用于加密 RSA 私钥 ↓ RSA-2048 密钥对 ├── 公钥 → 加密 API Key └── 私钥 → 解密 API Key(需登录解锁) ``` ### 文件存储 ``` ~/.qchat/ ├── config.json # 运行时配置(明文) ├── keys.json # 加密后的 RSA 私钥(AES-256-CBC) ├── secrets.dat # 加密后的 API Key(RSA-2048 加密) ├── users.json # 用户账户信息(密码 SHA-256 哈希) └── custom_providers.json # 自定义提供方配置 ``` ### 安全特性 - 私钥文件权限设置为 `600`(仅所有者可读写) - API Key 在内存中解密,使用时才加载 - 每次启动必须重新输入密码解锁 - 支持所有提供方独立的 API Key --- ## 📁 文件管理 ### 权限模式 | 模式 | AI 读取 | AI 写入 | AI 删除 | |------|---------|---------|---------| | **📖 只读** | ✅ | ❌ | ❌ | | **❓ 需确认** | ✅ | ⏳ 需批准 | ⏳ 需批准 | | **🔓 完全自主** | ✅ | ✅ | ✅ | ### 支持的文件类型 `.txt` `.md` `.py` `.js` `.ts` `.html` `.css` `.json` `.xml` `.yaml` `.yml` `.toml` `.ini` `.cfg` `.c` `.cpp` `.h` `.hpp` `.rs` `.go` `.java` `.kt` `.sh` `.bash` `.zsh` `.sql` `.r` `.rb` `.php` `.csv` `.log` `.pdf` `.docx` `.pptx` --- ## 🚀 快速开始 ### 环境要求 - Python 3.9+ - pip ### 安装步骤 ```bash # 1. 克隆项目 git clone <仓库地址> cd DeepSeekChat # 2. 安装依赖 pip install -r requirements.txt # 3. (可选)安装 PDF 解析支持 pip install pdfminer.six ``` ### 启动使用 ```bash # 交互式菜单 python run.py # 或直接指定模式 python run.py web # Web 服务器 → http://localhost:8888 python run.py cli # 终端 CLI python run.py gui # 桌面 GUI python run.py admin # 管理后台 → http://localhost:4444 python run.py all # Web + Admin 同时启动 # 自定义端口 python run.py web --port 9999 python run.py admin --port 9998 python run.py all --port 9999 --admin-port 9998 # 或通过环境变量 QCHAT_PORT=9999 QCHAT_ADMIN_PORT=9998 python run.py web ``` ### 首次使用 1. **启动任意界面**(如 `python run.py web`) 2. **创建管理员账户** — 首次启动会提示设置用户名和密码 3. **添加 API Key** — 至少配置一个模型提供方的 API Key 4. **开始对话** — 选择模型,输入消息 --- ## 📁 项目结构 ``` DeepSeekChat/ ├── run.py # 🚀 统一启动器(支持所有模式) ├── server.py # 🌐 Web 服务器(单页应用,811 行) ├── _check.py # ✅ 语法检查工具 ├── requirements.txt # 📦 Python 依赖清单 ├── README.md # 📖 中文文档 ├── README_EN.md # 📖 英文文档 │ ├── core/ # ⚙️ 核心引擎 │ ├── __init__.py # 模块导出 │ ├── auth.py # 用户认证与会话管理 │ ├── config.py # 运行时配置、提供方定义、模型列表 │ ├── crypto.py # RSA-2048 + AES-256-CBC 双层加密 │ ├── models.py # 多模型管理器(统一 OpenAI API 调用) │ ├── files.py # 文件管理器(含三级权限控制) │ └── conversation.py # 多会话对话管理器 │ ├── cli/ # 💻 终端界面 │ └── app.py # Rich 增强的命令行聊天(627 行) │ ├── gui/ # 🖥️ 桌面界面 │ └── app.py # Tkinter 原生桌面应用(846 行) │ ├── admin/ # 🔧 管理后台 │ └── __init__.py # 全功能 Web 管理面板(1292 行) │ └── static/ # 🌐 Web 前端 └── index.html # 单页应用(嵌入式 CSS/JS,816 行) ``` ### 架构图 ``` 用户输入 → 界面层(Web/CLI/GUI) → 核心引擎 → OpenAI 兼容 API → AI 模型 ↕ 加密层(RSA + AES) ↕ 本地配置与密钥存储(~/.qchat/) ``` 所有界面共享相同的核心模块: - **Config** — 从 `~/.qchat/config.json` 加载/保存配置 - **Crypto** — 管理加密的 API Key 存储 - **Models** — 统一的 `chat_stream()` / `chat()` / `chat_with_tools()` 接口 - **Files** — 带权限门控的本地文件操作 - **Conversation** — 多会话对话历史管理 --- ## ⚙️ 配置说明 配置文件位于 `~/.qchat/config.json`,包含: | 配置项 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `provider` | str | `deepseek` | 当前模型提供方 | | `model` | str | `deepseek-v4-flash` | 当前模型 | | `auto_send_context` | bool | `true` | 是否自动发送文件上下文 | | `max_context_messages` | int | `50` | 最大上下文消息数 | | `file_permission` | str | `ask_permission` | 文件权限模式 | | `allowed_extensions` | list | (见上文) | 允许的文件扩展名 | | `max_file_size` | int | `10485760` | 最大文件大小(10MB) | | `enable_web_search` | bool | `false` | 是否启用联网搜索 | | `search_provider` | str | `duckduckgo` | 搜索提供方(duckduckgo / bing / searxng / bocha) | | `search_api_key` | str | `""` | 搜索 API Key(Bing/博查需要) | | `search_api_base_url` | str | `""` | 自定义搜索 API 地址(SearXNG 自建实例等) | | `web_port` | int | `8888` | Web 服务端口 | | `admin_port` | int | `4444` | 管理后台端口 | | `theme` | str | `geek` | UI 主题 | --- ## 📡 API 文档 ### Web 服务器 API | 方法 | 路径 | 说明 | |------|------|------| | GET | `/` | 提供聊天界面 | | GET | `/api/context` | 获取当前对话上下文 | | GET | `/api/models` | 列出可用模型 | | GET | `/api/providers` | 列出模型提供方 | | GET | `/api/config` | 获取运行时配置 | | GET | `/api/conversations` | 获取对话列表 | | GET | `/api/files/permission` | 获取文件权限设置 | | GET | `/api/files/pending` | 获取待审批文件操作 | | POST | `/api/chat` | 发送消息(SSE 流式返回) | | POST | `/api/upload` | 上传文件 | | POST | `/api/search` | 执行联网搜索 | | POST | `/api/config` | 更新配置 | | POST | `/api/unlock` | 解锁加密模块 | | POST | `/api/conversations` | 创建新对话 | | POST | `/api/files/read` | AI 读取文件 | | POST | `/api/files/write` | AI 写入文件 | | POST | `/api/files/list` | AI 列出目录 | | POST | `/api/files/approve` | 批准文件操作 | | POST | `/api/files/reject` | 拒绝文件操作 | | DELETE | `/api/context` | 清除对话上下文 | | DELETE | `/api/upload` | 清除上传文件 | | DELETE | `/api/conversations/` | 删除对话 | ### 管理后台 API | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/admin/login` | 管理员登录 | | POST | `/api/admin/logout` | 退出登录 | | GET | `/api/admin/status` | 系统状态 | | GET | `/api/admin/config` | 获取配置 | | POST | `/api/admin/config` | 更新配置 | | GET | `/api/admin/providers` | 列出提供方 | | GET | `/api/admin/keys` | 列出 API Key | | POST | `/api/admin/keys` | 设置 API Key | | DELETE | `/api/admin/keys/` | 删除 API Key | | GET | `/api/admin/users` | 列出用户 | | POST | `/api/admin/users` | 创建用户 | | POST | `/api/admin/users/update` | 更新用户 | | POST | `/api/admin/users/delete` | 删除用户 | | GET | `/api/admin/logs` | 获取访问日志 | | GET | `/api/admin/conversations` | 获取对话列表 | | GET | `/api/admin/custom-providers` | 列出自定义提供方 | | POST | `/api/admin/custom-providers` | 添加自定义提供方 | --- ## 🦙 本地模型配置 ### Ollama 1. 安装 [Ollama](https://ollama.com/) 2. 拉取模型:`ollama pull llama3.1` 3. 确保 Ollama 服务运行(默认 `http://localhost:11434`) 4. 在 QN-Chat 中选择 Ollama 提供方和对应模型 ### LM Studio 1. 下载安装 [LM Studio](https://lmstudio.ai/) 2. 加载 Hugging Face 模型 3. 启动本地推理服务器(默认 `http://localhost:1234`) 4. 在 QN-Chat 中选择 LM Studio 提供方 --- ## ❓ 常见问题 **Q: 如何获取 API Key?** - DeepSeek: https://platform.deepseek.com/api_keys - 通义千问: https://bailian.console.aliyun.com/ - 智谱 GLM: https://open.bigmodel.cn/usercenter/apikeys - 月之暗面 Kimi: https://platform.moonshot.cn/console/api-keys **Q: 忘记管理员密码怎么办?** 删除 `~/.qchat/users.json` 文件,重启后系统会重新创建三组默认账户。 **Q: 默认账户有哪些?** 系统首次启动自动创建三个账户: | 用户名 | 密码 | 角色 | 说明 | |--------|------|------|------| | `root` | `root` | 超级管理员 | 拥有全部管理权限 | | `admin` | `admin` | 管理员 | 用户和 API Key 管理 | | `user` | `user` | 普通用户 | 仅查看权限 | **Q: Crypto 解锁密码是什么?** Crypto 加密模块的默认密码是 `qchat2024`(用户名: `admin`)。在管理后台的「API Key 管理」页面中使用此密码解锁加密存储。如果曾自行修改过密码但忘记了,删除 `~/.qchat/keys.json` 和 `~/.qchat/secrets.dat` 并重启即可恢复默认。 **Q: 如何更换模型?** - Web 界面:左侧面板选择提供方和模型 - CLI 界面:输入 `/model [model]` - GUI 界面:菜单 → 模型 → 切换模型 - 管理后台:系统设置页面 **Q: 如何设置联网搜索?** - Web 界面:点击左侧"联网搜索"开关 - CLI 界面:输入 `/search on` - 管理后台:系统设置页开启,并可选择搜索引擎 **Q: 国内无法访问 DuckDuckGo 怎么办?** 可在管理后台「系统设置」中将搜索引擎切换为:Bing(需申请 Azure API Key)、自建 SearXNG 实例,或博查搜索。 **Q: 配置文件在哪里?** 所有配置文件存储在 `~/.qchat/` 目录下。 **Q: 如何添加自定义模型提供方?** 在管理后台的"自定义提供方"页面添加 API Base URL 和模型列表。 **Q: 如何查看对话历史?** 在管理后台的"对话"页面可以浏览所有历史对话。 --- ## 👨‍💻 开发指南 ### 环境准备 ```bash git clone <仓库地址> cd DeepSeekChat pip install -r requirements.txt pip install pdfminer.six # 可选,PDF 支持 ``` ### 代码检查 ```bash python3 _check.py ``` ### 添加新的模型提供方 1. 在 `core/config.py` 的 `PROVIDERS` 字典中添加新提供方信息 2. 在 `MODEL_CATALOG` 中添加对应模型列表 3. 在 `static/index.html` 的 `MODEL_MAP` 中添加前端映射 ### 添加新的 API 端点 1. 在 `server.py` 或 `admin/__init__.py` 中添加路由和处理器 2. 遵循现有的 `send_json()` / `read_body()` 模式 --- ## 📄 开源许可 本项目基于 **GNU General Public License v3 (GPLv3)** 开源。 完整许可证文本见 [LICENSE](./LICENSE) 文件,或访问 [GNU 官网](https://www.gnu.org/licenses/gpl-3.0.html)。 --- *Made with ❤️ by 青年 Chat Team*