TUI AI chat tool for local LLM development
Project description
TinyChat
轻量级终端 AI 聊天应用,支持多后端供应商,中英文双语界面。
特性
多后端支持
- Ollama - 本地 Ollama 服务器
- OpenAI 兼容 - 支持 OpenAI 兼容的 API 服务
现代化终端界面
- 基于 Textual 框架
- 丰富的 Markdown 渲染和代码高亮
- 响应式布局,自适应终端尺寸
- 原生鼠标支持(点击、滚动)
- 多主题支持(明/暗主题)
国际化
- 中文/英文双语界面
- 一键切换语言
会话管理
- 自动保存聊天历史
- 支持多会话切换
- 自动生成会话标题
- 流式响应实时显示
跨平台
- 支持 Windows、macOS、Linux
- 跨平台剪贴板支持
安装
系统要求
- Python 3.9+
- pip 或 uv 包管理器
从 PyPI 安装
pip install tinychat
从源码安装
git clone <repository-url>
cd tinychat
# 使用 pip
pip install -e ".[dev]"
# 或使用 uv
uv sync --extra dev
使用
启动应用
tinychat
或直接运行模块:
python -m tinychat
基本操作
- 选择后端 - 在左侧边栏点击后端名称
- 选择模型 - 在边栏点击模型名称
- 发送消息 - 输入内容后按 Enter
- 换行 - 按 Ctrl+Enter 插入换行
- 滚动历史 - 使用鼠标滚轮或方向键
快捷键
| 按键 | 功能 |
|---|---|
| Enter | 发送消息 |
| Ctrl+Enter | 输入换行 |
| Ctrl+L | 切换语言 |
| Ctrl+T | 切换主题 |
| Ctrl+Q | 退出应用 |
| Ctrl+P | 命令面板 |
配置
配置文件位于 ~/.config/tinychat/config.toml(如不存在会自动创建)。
配置结构
[settings]
locale = "zh" # 语言: "en" (英语) 或 "zh" (中文)
[[backends]] # 可以配置多个后端
name = "backend-name" # 后端显示名称
type = "backend-type" # 后端类型
endpoint = "API地址" # API 端点
default_model = "模型名" # 默认模型
api_key = "密钥" # API 密钥(可选)
后端类型详解
| 类型 | 说明 | API 端点示例 |
|---|---|---|
ollama |
本地 Ollama 服务器 | http://localhost:11434 |
openai-compatible |
OpenAI 兼容的 API 服务 | https://api.example.com/v1 |
后端配置参数
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
name |
字符串 | 是 | 后端显示名称,用于 UI 标识 |
type |
字符串 | 是 | 后端类型:ollama 或 openai-compatible |
endpoint |
字符串 | 是 | API 地址,需包含完整路径(如 /v1) |
default_model |
字符串 | 是 | 默认使用的模型名称 |
api_key |
字符串 | 否 | API 密钥(Ollama 不需要) |
配置示例
Ollama 本地服务器:
[[backends]]
name = "ollama-local"
type = "ollama"
endpoint = "http://localhost:11434"
default_model = "llama3.2"
OpenAI 官方 API:
[[backends]]
name = "openai"
type = "openai-compatible"
endpoint = "https://api.openai.com/v1"
api_key = "sk-..."
default_model = "gpt-4o"
vLLM / LM Studio / Text Generation WebUI 等 OpenAI 兼容服务:
[[backends]]
name = "vllm-server"
type = "openai-compatible"
endpoint = "http://localhost:8000/v1"
api_key = "not-required" # 多数本地服务不需要密钥
default_model = "meta-llama/Llama-2-7b-chat-hf"
OpenRouter / Together AI 等云服务:
[[backends]]
name = "openrouter"
type = "openai-compatible"
endpoint = "https://openrouter.ai/api/v1"
api_key = "sk-or-..."
default_model = "openai/gpt-3.5-turbo"
Azure OpenAI Service:
[[backends]]
name = "azure-openai"
type = "openai-compatible"
endpoint = "https://your-resource.openai.azure.com/openai/deployments/your-deployment"
api_key = "your-azure-api-key"
default_model = "gpt-35-turbo"
多后端配置
可以同时配置多个后端,通过 name 字段区分:
[settings]
locale = "zh"
[[backends]]
name = "ollama-local"
type = "ollama"
endpoint = "http://localhost:11434"
default_model = "llama3.2"
[[backends]]
name = "openai-cloud"
type = "openai-compatible"
endpoint = "https://api.openai.com/v1"
api_key = "sk-..."
default_model = "gpt-4o"
[[backends]]
name = "vllm-server"
type = "openai-compatible"
endpoint = "http://localhost:8000/v1"
default_model = "meta-llama/Llama-2-7b-chat-hf"
启动后可在左侧边栏点击切换不同后端和模型。
开发
项目结构
tinychat/
├── src/tinychat/
│ ├── __main__.py # 入口
│ ├── app_textual.py # 主应用
│ ├── backends/ # 后端实现
│ │ ├── base.py # 抽象基类
│ │ ├── ollama.py # Ollama 后端
│ │ └── openai.py # OpenAI 后端
│ ├── components/ # UI 组件
│ │ ├── chat_view_textual.py
│ │ ├── input_area_textual.py
│ │ ├── sidebar_textual.py
│ │ └── status_bar_textual.py
│ ├── models/ # 数据模型
│ ├── utils/ # 工具函数
│ │ ├── event_bus.py # 事件系统
│ │ ├── i18n.py # 国际化
│ │ └── theme_manager.py # 主题管理
│ └── locales/ # 翻译文件
│ ├── en/LC_MESSAGES/
│ └── zh/LC_MESSAGES/
└── tests/ # 测试
运行测试
# 运行所有测试
pytest tests/ -v
# 带覆盖率报告
pytest tests/ --cov=src/tinychat --cov-report=html
# 运行单个测试
pytest tests/unit/test_app_textual.py -v
代码检查
ruff check src/ tests/
ruff format src/ tests/
打包发布
# 安装构建工具
pip install build
# 构建
python -m build
# 生成的文件在 dist/ 目录
致谢
许可证
MIT License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tinychat_ai-0.1.3.tar.gz.
File metadata
- Download URL: tinychat_ai-0.1.3.tar.gz
- Upload date:
- Size: 49.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e18831a22a26997e99a8a9eceeca169baac3441a0c28ef007d604bb8a94d3d42
|
|
| MD5 |
5057a3ca878d5fb05c53805510f948cc
|
|
| BLAKE2b-256 |
022832d36c127476ec4084a6913a692cc0852d263d0febec59e01d44dfc719d0
|
File details
Details for the file tinychat_ai-0.1.3-py3-none-any.whl.
File metadata
- Download URL: tinychat_ai-0.1.3-py3-none-any.whl
- Upload date:
- Size: 59.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9322b2cb934fee550a624775ba4c5e7ddc3b22bf91632d74457b0da2d647526e
|
|
| MD5 |
96dd1b8b62677caf87188258d5022d9f
|
|
| BLAKE2b-256 |
ebdd54a46516dbf0ffa831e9a66316bae81faca095e7a1ea248b46da48e6c005
|