# doubao-cli **Repository Path**: wang-tx_1_0/doubao-cli ## Basic Information - **Project Name**: doubao-cli - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-16 - **Last Updated**: 2026-04-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 豆包AI命令行聊天程序 README和注释都是让AI帮写的,我先人工写一段: 这个项目原本是写来自家用的,起因是从家里翻出一台2010年的老MacBookAir,装什么系统都卡, 后来突发奇想装了个纯命令行的Linux接入了豆包AI,扔给孩子们写作业查资料用, 这样就不用担心他们自己装软件游戏或者打开浏览器刷B站了。如果在座的有孩子家长我想应该会比较认同~ 做好之后果然效果拔群,后来发在小红书,一些朋友让分享一下,所以传到了github。 该项目的最大特色我觉得还是能让一些老设备通过AI接入活起来,如果有人想做同样的东西,可以按照此项目思路来尝试。 说一下我这边总结的一些经验供各位参考,当然我相信各位大佬可能也会找到更好的方案,此处仅供参考。 系统我在尝试了一些版本的Linux之后选择了Antix,比较轻量级。 为了能够显示中文,我选择了Fbterm作为cli显示,同时中文输入法选择了ucimf。 之前在Debian系统尝试了一下Fcitx输入法也可以在Fbterm显示,但是Antix系统不能成功使用,可能是系统本身缺少一些图形依赖。 Zhcon作为Cli显示也可以,但是自带的那个全拼输入法真的一言难尽,建议各位还是首选Fbterm, 而且目前做了一个电量显示的小功能是利用Fbterm的BUG从tty穿透显示在前台的,可以通过翻页刷新掉,不会遮挡前台的聊天。 然后是跟想接AI的新人讲一下,豆包的火山引擎平台注册一个账号,开通一下豆包模型,一般选1.6就可以(现在是2025年十一期间,不排除以后有更新)。 找到你的API_KEY,地址是https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey 接入点ENDPOINT_ID在“在线推理”页面能找到,地址是https://console.volcengine.com/ark/region:ark+cn-beijing/endpoint 在第一次运行的时候会让你们填入API_KEY和ENDPOINT_ID,然后就能使用了。 火山注册完送50万tokens,能用很久,再不行就充点儿,一个人自用只是聊天的话花费很低的,我自己连测试带联网搜索两周了才花了不到一块钱~ 在“~”文件夹里附赠了一个启动脚本“start_doubao.sh”,可以检测网络情况然后启动本程序。 把这个脚本设为开机启动就能自动开机进入AI聊天界面,给小朋友们准备的,免去了他们手动运行的过程。 检测网络再启动是因为一些老设备进系统了结果网络还没初始化完成。 至于怎么把脚本设为开机启动可以自己去找AI聊一下,你都用AI了很多问题都是可以自己解决的了,加油! 初始的SystemPrompt把豆包的角色设为了家庭教师,你们可以通过修改config.py里的GLOBAL_SYSTEM_PROMPT把他改为其他任意你喜欢的角色,猫娘啊女警啊都没问题。 好了,我自己写的就这么多了,以下都是AI写的,看了下基本都是对的,如果不对与我无瓜 ``` /\_/\ QUÉ MIRA BOBO? /\ / o o \ ノ //\\ \~(*)~/ ` \/ ^ / | \|| || \ '|| || \(()-()) ~~~~~~~~~~~~~~~ ``` **基于火山引擎豆包AI的智能命令行聊天应用** [![Python](https://img.shields.io/badge/Python-3.8+-blue.svg)](https://www.python.org) [![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) --- ## ✨ 特性 - 🤖 **智能对话** - 基于火山引擎豆包AI,支持流式输出 - 💭 **深度思考** - 支持三种思考模式:自动、强制启用、禁用 - 🌐 **联网搜索** - 自动判断并调用Web Search获取最新信息 - 📝 **上下文管理** - 自动维护对话历史,支持多轮对话 - 🔖 **对话追踪** - 每轮对话生成短ID(3位),方便追溯和继续 - 📚 **历史记录** - JSONL格式持久化存储,支持查看最近N轮对话 - 🔄 **对话切换** - 可从任意历史对话点继续聊天,灵活管理上下文 - 🎨 **精美界面** - TTY/FBTERM兼容的彩色终端界面 - 🔋 **电池监控** - Linux系统下实时显示电池电量(可配置) - 🛡️ **编码处理** - 自动处理UTF-8编码问题,智能修复输入错误 --- ## 📋 目录 - [快速开始](#-快速开始) - [功能说明](#-功能说明) - [项目结构](#-项目结构) - [配置说明](#-配置说明) - [使用示例](#-使用示例) - [常见问题](#-常见问题) - [开发说明](#-开发说明) --- ## 🚀 快速开始 ### 环境要求 - Python 3.8+ - 火山引擎API密钥和端点ID ### 安装步骤 1. **克隆项目** ```bash git clone cd doubaochat ``` 2. **安装依赖** ```bash pip install -r requirements.txt ``` 3. **配置API密钥** 首次运行程序会提示填入API密钥,也可以通过在项目根目录创建 `api_keys.ini`填入以下内容来配置密钥。 [API] API_KEY = "your_api_key_here" ENDPOINT_ID = "your_endpoint_id_here" 后续可以通过编辑 `api_keys.ini` 文件,修改您的API密钥: 4. **运行程序** ```bash python main.py ``` --- ## 💡 功能说明 ### 基础对话 程序启动后,直接输入消息即可开始聊天: ``` (^▽^) 您 (新对话): 你好 (id:8d3) 豆包: 你好!很高兴见到你... ``` 每次AI回复都会显示一个短ID(如:`id:8d3`),这个ID用于后续继续对话或查看历史记录。 ### 对话历史管理 程序会自动保存所有聊天记录到 `data/chat_history.jsonl` 文件,你可以: - **查看历史**:使用 `#history` 命令查看最近的对话 ``` #history 10 ``` - **继续对话**:使用 `#chat` 命令从历史对话点继续 ``` #chat 8d3 继续上次的讨论 ``` - **新话题**:使用 `#new` 命令清空上下文,开始新话题 ``` #new 介绍一下机器学习 ``` ### 深度思考控制 - **默认模式**:AI自动判断是否需要深度思考 - **强制启用**:以 `#think` 开头的消息会强制启用深度思考 ``` #think 请详细分析量子计算的原理 ``` - **快速回复**:以 `#fast` 开头的消息会禁用深度思考 ``` #fast 今天天气怎么样 ``` ### 命令列表 所有命令都以 `#` 开头,命令与消息内容用空格分隔: | 命令 | 说明 | 示例 | |------|------|------| | `#new` / `#clear` / `#新话题` + 消息 | 清空对话历史,开始新话题 | `#new 介绍一下Python` | | `#chat` / `#c` / `#对话` + ID + 消息 | 从指定对话点继续聊天 | `#chat a3f 继续上次的话题` | | `#history` / `#h` / `#历史` [数字] | 显示最近N轮对话(默认10轮) | `#history 20` | | `#think` + 消息 | 强制启用深度思考模式 | `#think 分析量子计算原理` | | `#fast` + 消息 | 禁用深度思考,快速回复 | `#fast 今天天气怎么样` | > **注意**: > - 每次AI回复都会显示一个短ID(如:`id:a3f`),用于后续继续对话 > - 使用 `#chat` 命令可以切换到任意历史对话点继续聊天 > - 使用 `#history` 命令查看所有可用的对话ID ### 联网搜索 程序会自动判断何时需要联网搜索,无需手动触发。当问题涉及: - 实时信息(天气、新闻等) - 最新数据 - 超出AI知识范围的内容 --- ## 📁 项目结构 ``` doubaochat/ ├── data/ # 数据目录 │ └── chat_history.jsonl # 聊天历史记录(JSONL格式) ├── src/ # 源代码目录 │ ├── __init__.py # 包初始化 │ ├── client.py # 豆包AI客户端 │ ├── config.py # 配置文件 │ ├── ui.py # UI显示模块 │ └── utils/ # 工具模块 │ ├── __init__.py # 工具包初始化 │ ├── battery.py # 电池监控 │ ├── encoding.py # 编码处理 │ ├── history.py # 聊天历史管理 │ ├── id_mapper.py # 短ID映射管理 │ └── input_handler.py # 输入处理 ├── main.py # 程序主入口 ├── requirements.txt # 依赖包列表 └── README.md # 项目文档 ``` ### 模块说明 #### `src/client.py` - AI客户端 - `DoubaoClient` - 豆包AI客户端类 - 管理对话历史和上下文 - 处理流式响应 #### `src/config.py` - 配置管理 - API配置(密钥、端点等) - 模型参数(温度、top_p等) - UI配置(颜色、符号等) - 系统提示词 #### `src/ui.py` - 界面显示 - `colored_print()` - 彩色打印函数 - `waiting_animation()` - 等待动画 - `StreamOutputHandler` - 流式输出处理器 #### `src/utils/` - 工具模块 - `battery.py` - Linux TTY电池显示 - `encoding.py` - 编码处理工具 - `history.py` - 聊天历史管理(JSONL持久化) - `id_mapper.py` - 短ID映射管理(3位混淆ID) - `input_handler.py` - 输入处理和编码修复 #### `data/` - 数据目录 - `chat_history.jsonl` - 聊天历史存储文件(自动创建和管理) --- ## ⚙️ 配置说明 # API基础URL API_BASE_URL = "https://ark.cn-beijing.volces.com/api/v3" ``` ### 模型参数 ```python MAX_TOKENS = 2000 # 最大回复长度 TEMPERATURE = 0.7 # 回复随机性 (0-1) TOP_P = 0.9 # 核采样参数 ``` ### 思考模式 ```python DEFAULT_THINKING_MODE = 'auto' # 'auto' | 'enabled' | 'disabled' ``` ### 历史记录 ```python HISTORY_MAX_TURNS = 100 # 最大保存的聊天轮次数 ``` ### 电池显示 ```python BATTERY_DISPLAY_ENABLED = True # 是否启用电池显示 BATTERY_REFRESH_INTERVAL = 10 # 刷新间隔(秒) ``` ### UI配置 ```python ENABLE_COLORS = True # 是否启用终端颜色 ``` ### 系统提示词 在 `GLOBAL_SYSTEM_PROMPT` 中自定义AI的角色和行为。 --- ## 📝 使用示例 ### 示例1:日常对话 ``` 您 (新对话): 介绍一下Python的装饰器 (id:8d3) 豆包: Python装饰器是一种设计模式... ``` ### 示例2:深度思考 ``` 您 (第2轮对话): #think 如何设计一个高并发系统 (・・?) 深度思考中... [要求深度思考] ★ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ★ 首先要考虑系统的瓶颈在哪里... (思考过程) ★ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ★ (id:a1f) 豆包: 设计高并发系统需要考虑以下几个方面... ``` ### 示例3:继续历史对话 ``` 您 (第3轮对话): #chat 8d3 那装饰器有哪些应用场景? (id:e2c) 豆包 [继续对话:8d3]: 装饰器在Python中有很多应用场景... ``` ### 示例4:查看历史记录 ``` 您 (第4轮对话): #history 5 ★ ━━━━━━━━━━━━━━━ 历史记录(最近5轮)━━━━━━━━━━━━━━━ ★ [2025-01-15 14:23:45] (8d3) 您: 介绍一下Python的装饰器 豆包: Python装饰器是一种设计模式... [2025-01-15 14:25:10] (a1f) 您: #think 如何设计一个高并发系统 豆包: 设计高并发系统需要考虑以下几个方面... [2025-01-15 14:27:35] (e2c) 您: 那装饰器有哪些应用场景? 豆包: 装饰器在Python中有很多应用场景... ★ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ★ ``` ### 示例5:开始新话题 ``` 您 (第5轮对话): #new 讲讲机器学习的基本概念 (◕‿◕) 对话历史已清空,我们可以开始新的聊天话题 (id:4b2) 豆包: 机器学习是人工智能的一个分支... ``` ### 示例6:联网搜索 ``` 您 (新对话): 今天上海的天气 ⚡(^_^) 正在联网搜索... ▶ 搜索关键词: 上海天气今天 (◕‿◕) 联网搜索完成,正在整理答案... (id:7c9) 豆包: 根据最新信息,今天上海的天气是... 参考资料: 1. [上海天气预报](http://...) ``` --- ## ❓ 常见问题 ### Q: 如何获取API密钥? A: 访问 [火山引擎控制台](https://console.volcengine.com/) 注册账号并创建应用,即可获取API密钥和端点ID。 ### Q: Windows系统可以使用吗? A: 可以。但电池监控功能仅在Linux系统下有效,Windows下会自动禁用该功能。 ### Q: 为什么会出现编码错误? A: 这通常发生在Linux TTY模式下删除汉字时。程序会自动检测并修复编码错误,按提示操作即可。 ### Q: 如何禁用颜色? A: 在 `src/config.py` 中设置: ```python ENABLE_COLORS = False ``` ### Q: 如何禁用电池显示? A: 在 `src/config.py` 中设置: ```python BATTERY_DISPLAY_ENABLED = False ``` ### Q: 联网搜索失败怎么办? A: 确保: 1. 网络连接正常 2. API密钥有效 3. 端点配置正确 ### Q: 短ID是什么?如何使用? A: 由于api返回的response_id过长且具有私密性,所以系统按每轮对话的response_id重新生成3位标识符(如:`8d3`、`a1f`),用于: - 追踪对话历史 - 通过 `#chat` 命令继续指定对话 - 在历史记录中快速定位对话 ### Q:为什么要生成短ID而不直接使用数字序号? A:经过混淆计算生成的三位短ID不会直接暴露用户的聊天次数,更能保护用户隐私。 使用方法:`#chat 8d3 继续讨论装饰器` ### Q: 历史记录保存在哪里? A: 历史记录保存在 `data/chat_history.jsonl` 文件中,采用JSONL格式(每行一个JSON对象)。默认保存最近100轮对话,超出后自动删除旧记录。可在 `src/config.py` 中通过 `HISTORY_MAX_TURNS` 配置。 ### Q: 如何清除所有历史记录? A: 可以直接删除 `data/chat_history.jsonl` 文件,或者使用 `#new` 命令清空当前会话的上下文(不影响历史文件)。 ### Q: 短ID会重复吗? A: 系统支持最多4096个唯一短ID(000-fff),采用混淆算法生成。达到上限后会循环使用,但在默认100轮历史限制下,不会出现重复。 --- ## 🔧 开发说明 ### 代码规范 项目遵循 PEP 8 代码规范,建议使用以下工具: ```bash # 代码格式化 black src/ # 代码检查 pylint src/ # 类型检查 mypy src/ ``` ### 添加新功能 1. 在对应模块下创建新文件 2. 在 `__init__.py` 中导出 3. 在 `main.py` 中集成 4. 更新 README 文档 ### 测试 ```bash # 运行测试 pytest tests/ # 测试覆盖率 pytest --cov=src tests/ ``` --- ## 📄 许可证 本项目采用 MIT 许可证。详见 [LICENSE](LICENSE) 文件。 --- ## 🙏 致谢 - [火山引擎](https://www.volcengine.com/) - 提供豆包AI API - [Ark SDK](https://github.com/volcengine/volcengine-python-sdk) - 官方Python SDK --- ## 📮 联系方式 如有问题或建议,欢迎提交 Issue 或 Pull Request。 ---
**用 ♥ 制作** Made with Python 🐍