# LLM in Text - 智能写作助手

基于 Vue3 和 FastAPI 的智能 Markdown 编辑器，集成大语言模型（LLM）实时补全建议功能。

## 功能特性

### Markdown 编辑器
- 基于 Milkdown Crepe 的所见即所得编辑体验
- 支持 Markdown 语法和 LaTeX 公式
- 支持 Mermaid 图表渲染
- 导入/导出 Markdown 文件
- 导出 DOCX 和 PDF 格式

### AI 智能补全
- 实时生成文本补全建议（灰色显示）
- 流式响应，低延迟体验
- 多种交互方式：Tab接受、Esc拒绝、点击接受

### 功能块系统

编辑器提供三种**功能块**，统一为顶层原子节点（`atom: true, isolating: true`），通过 ProseMirror schema 强制禁止互相嵌套，无数量限制。导入 Markdown 后自动解析还原为交互卡片，导出后可完整复原：

| 功能块 | Markdown 语法 | 作用 |
|--------|---------------|------|
| **文档块** (`doc_block`) | \`\`\`llm-file fenced code / `<doc_type=...>` legacy HTML tag | 上传的 PDF/DOCX/PPTX/TXT 等文件以可折叠卡片嵌入编辑器，支持内联编辑和 AI 补全 |
| **PRO 块** (`pro_block`) | `[PRO]` / `[PRO]{指令}` | 基于全文上下文进行深度 AI 思考并流式生成 Markdown，`Ctrl+Shift+P` 快速插入 |
| **上传块** (`upload_block`) | `{{{}}}` / `{{{upload file type:pdf,docx}}}` | 文件上传占位符，支持按类型过滤（PDF/DOCX/PPTX/TXT/JSON/YAML/图片等） |

### 文档处理（历史名称，已整合入功能块系统）
- OCR 图片识别：上传图片自动识别文字（OCR 结果注入 AI 补全和 PRO 块上下文）
- 智能大小限制：32KB自动禁用AI

### 设置面板
- 外观主题：亮色/暗色/跟随系统
- 背景模式：默认/暖色/阅读灯/自定义图片
- 模型智能：低/中/高思考级别
- 隐私控制：隐私模式防止发送IP
- 多语言界面：中英日韩德法

### 语音功能
- TTS文字转语音（macOS优化，支持Apple Silicon M1/M2/M3）
- STT语音转文字（支持多种模型大小和量化）
- 自动设备检测（MPS/CUDA/CPU智能切换）
- 离线模式支持（模型缓存检查）

## 技术架构

前端: Vue3 + Vite + Milkdown/Crepe + ProseMirror
后端: FastAPI + Python（OpenAI 兼容端点）

### 功能块架构
三种功能块统一为顶层原子节点（`atom: true, isolating: true`），通过 ProseMirror schema 强制禁止嵌套：
- **文档块** (`doc_block`) — `src/plugins/docBlockPlugin.ts`，Markdown 语法：\`\`\`llm-file fenced code block
- **PRO 块** (`pro_block`) — `src/plugins/proBlockPlugin.ts`，Markdown 语法：`[PRO]` / `[PRO]{指令}`
- **上传块** (`upload_block`) — `src/plugins/uploadBlockPlugin.ts`，Markdown 语法：`{{{}}}` / `{{{upload file type:...}}}`

每个功能块配备独立的 Remark 解析器和序列化器，确保 Markdown 导入导出时自动识别和还原。

## 快速开始

环境: Node.js 18+、Python 3.8+

安装:
- 前端: npm install
- 后端: pip install -r backend/requirements.txt

启动:
- 后端: python backend/main.py (端口8001)
- 前端: npm run dev (端口5173)

## Docker 部署

将整个项目目录放进本机 `~/lit/llm-in-text` 后，在项目根目录执行：

```bash
cp backend/.env.example backend/.env
docker compose up -d --build
```

默认对外端口：
- 前端: `http://localhost:8080`
- 后端: `http://localhost:8001`

持久化目录全部位于当前项目下的 `docker-data/`：
- PostgreSQL: `docker-data/postgres`
- Redis: `docker-data/redis`
- 任务共享临时目录: `docker-data/jobs`

部署前至少需要修改这些环境变量：
- `backend/.env` 中的 `LLM_BASE_URL`
- `backend/.env` 中的 `LLM_API_KEY`
- `backend/.env` 或 shell 环境中的 `DATABASE_URL`
- `backend/.env` 中的 `API_KEY`

## API接口

- POST /v1/completions 流式补全建议
- POST /v1/ocr 图片文字识别
- POST /v1/convert 文档转换
- POST /v1/completions/cancel 取消请求
- GET /v1/docs/nodes 文档空间节点列表
- POST /v1/docs/folders 创建文件夹
- POST /v1/docs/files/text 创建文本文件
- POST /v1/docs/files/upload 上传文件到文档空间
- PATCH /v1/docs/nodes/{id} 更新节点
- PUT /v1/docs/files/{id}/blob 替换文件二进制内容
- DELETE /v1/docs/nodes/{id} 删除节点
- GET /v1/docs/files/{id}/blob 下载或预览原文件
- GET /v1/tts-asr/status TTS/ASR状态
- GET /v1/tts-asr/config TTS/ASR配置信息
- POST /v1/tts-asr/tts 文字转语音
- POST /v1/tts-asr/asr 语音转文字

## TTS/ASR环境变量配置

支持以下环境变量来配置TTS/ASR模块：

| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `LLM_BASE_URL` | OpenAI-compatible 上游地址 | 必填 |
| `LLM_API_KEY` | OpenAI-compatible 上游密钥 | 必填 |
| `TTS_MODEL_ID` | TTS 模型名 | `Qwen3-TTS-12Hz-1.7B-VoiceDesign-8bit` |
| `ASR_MODEL_ID` | ASR 模型名 | `Qwen3-ASR-0.6B-8bit` |
| `TTS_ASR_TTS_TIMEOUT_SECONDS` | TTS 上游超时(秒) | 180 |
| `TTS_ASR_ASR_TIMEOUT_SECONDS` | ASR 上游超时(秒) | 300 |
| `TTS_ASR_MAX_CONNECTIONS` | Speech API 连接池上限 | 24 |
| `TTS_ASR_MAX_KEEPALIVE_CONNECTIONS` | Speech API keepalive 连接数 | 12 |

## 核心实现

### 后端
- main.py: FastAPI服务器、SSE流式响应
- llm.py: 异步LLM调用（OpenAI兼容）、超时控制
- prompt.py: 7条Prompt规则
- tts_asr.py: 基于共享 OpenAI-compatible Speech API 的 TTS/ASR 适配层
  - 统一使用 `LLM_BASE_URL` 和 `LLM_API_KEY`
  - 通过 `/audio/speech` 与 `/audio/transcriptions` 调用上游
  - 内建连接池、超时、音频时长估算和上游请求 ID 透传

### 前端
- copilotPlugin.ts: ProseMirror Mark系统
- 关键函数: scheduleFetch、insertGhostText
- Pinia Store状态管理

## 设计亮点

1. 前后端分离
2. 低延迟优化：防抖+SSE+AbortController
3. ProseMirror Mark系统
4. 多种交互方式
5. 智能大小限制
6. 隐私保护
7. 多语言支持
8. 主题定制
9. 文档处理
10. 语音功能

## 开发指南

代码风格: Python(4空格,snake_case) JS/TS(2空格,camelCase)
测试: pytest
构建: npm run build

### 运行测试

项目提供完整的测试套件，包括单元测试、集成测试和macOS环境模拟测试：

```bash
# 快速运行单元测试
python backend/tests/run_tests.py unit

# 运行集成测试（需要启动后端服务）
python backend/tests/run_tests.py integration

# 运行macOS环境模拟测试（在非Mac环境测试）
python backend/tests/run_tests.py simulate

# 运行所有测试
python backend/tests/run_tests.py all
```

详细测试说明请参考: [测试指南](backend/tests/TESTING_GUIDE.md)

## 许可证

MIT License
