|
| 1 | +# Local API Debug Helper |
| 2 | + |
| 3 | +用于测试 OpenAI-compatible local API server 的 Android 调试工具。目标服务项目是 [google-ai-edge-gallery-local-api](https://github.com/bugroom/google-ai-edge-gallery-local-api)。 |
| 4 | + |
| 5 | +这个仓库只维护 API 调试助手本身,适合独立构建、独立发布 APK、独立记录问题。 |
| 6 | + |
| 7 | +## 目录 |
| 8 | + |
| 9 | +- [功能](#功能) |
| 10 | +- [目标服务](#目标服务) |
| 11 | +- [快速使用](#快速使用) |
| 12 | +- [构建说明](#构建说明) |
| 13 | +- [GitHub Actions](#github-actions) |
| 14 | +- [项目结构](#项目结构) |
| 15 | +- [故障排查](#故障排查) |
| 16 | +- [License](#license) |
| 17 | + |
| 18 | +## 功能 |
| 19 | + |
| 20 | +- 配置 API 服务地址、端口和 API Key。 |
| 21 | +- 调用 `GET /health` 检查服务状态。 |
| 22 | +- 调用 `GET /v1/models` 获取模型列表。 |
| 23 | +- 调用 `POST /v1/chat/completions` 发送聊天补全请求。 |
| 24 | +- 支持非流式响应。 |
| 25 | +- 支持 SSE 流式响应和 `data: [DONE]` 结束事件。 |
| 26 | +- 提供请求历史记录。 |
| 27 | +- 提供应用内日志页面,支持复制日志,便于排查问题。 |
| 28 | + |
| 29 | +## 目标服务 |
| 30 | + |
| 31 | +推荐搭配以下服务端项目使用: |
| 32 | + |
| 33 | +```text |
| 34 | +https://github.com/bugroom/google-ai-edge-gallery-local-api |
| 35 | +``` |
| 36 | + |
| 37 | +目标服务支持的主要端点: |
| 38 | + |
| 39 | +| 方法 | 路径 | 用途 | |
| 40 | +|------|------|------| |
| 41 | +| GET | `/health` | 健康检查 | |
| 42 | +| GET | `/v1/models` | 模型列表 | |
| 43 | +| POST | `/v1/chat/completions` | 聊天补全 | |
| 44 | + |
| 45 | +## 快速使用 |
| 46 | + |
| 47 | +1. 在 Google AI Edge Gallery 本地 API 版中下载 LLM 模型。 |
| 48 | +2. 从 Gallery 侧栏进入 `API Server`。 |
| 49 | +3. 设置默认模型、采样参数和推理后端。 |
| 50 | +4. 本机测试可使用 `127.0.0.1`,局域网测试将 Gallery Host 设置为 `0.0.0.0`。 |
| 51 | +5. 按需启用 API Key。 |
| 52 | +6. 启动 API Server。 |
| 53 | +7. 打开 Local API Debug Helper。 |
| 54 | +8. 输入 Host、Port 和 API Key。 |
| 55 | +9. 依次测试健康检查、模型列表和聊天补全。 |
| 56 | + |
| 57 | +局域网测试时,调试助手中填写的是运行 Gallery 服务端设备的局域网 IP。 |
| 58 | + |
| 59 | +## 构建说明 |
| 60 | + |
| 61 | +### 环境要求 |
| 62 | + |
| 63 | +- Android SDK 34 |
| 64 | +- JDK 17 或更新版本 |
| 65 | +- Gradle wrapper 已包含在仓库中 |
| 66 | + |
| 67 | +### 本地构建 |
| 68 | + |
| 69 | +```bash |
| 70 | +# Build release APK |
| 71 | +./gradlew :app:assembleRelease |
| 72 | +``` |
| 73 | + |
| 74 | +Release APK 输出路径: |
| 75 | + |
| 76 | +```text |
| 77 | +app/build/outputs/apk/release/app-release-unsigned.apk |
| 78 | +``` |
| 79 | + |
| 80 | +Debug APK 构建: |
| 81 | + |
| 82 | +```bash |
| 83 | +# Build debug APK |
| 84 | +./gradlew :app:assembleDebug |
| 85 | +``` |
| 86 | + |
| 87 | +Debug APK 输出路径: |
| 88 | + |
| 89 | +```text |
| 90 | +app/build/outputs/apk/debug/app-debug.apk |
| 91 | +``` |
| 92 | + |
| 93 | +## GitHub Actions |
| 94 | + |
| 95 | +工作流文件: |
| 96 | + |
| 97 | +```text |
| 98 | +.github/workflows/build_android.yaml |
| 99 | +``` |
| 100 | + |
| 101 | +当前工作流会在以下场景触发: |
| 102 | + |
| 103 | +- 手动运行 `workflow_dispatch`。 |
| 104 | +- 推送到 `main` 且修改 Android 项目文件。 |
| 105 | +- 针对 `main` 的 Pull Request 且修改 Android 项目文件。 |
| 106 | + |
| 107 | +构建命令: |
| 108 | + |
| 109 | +```bash |
| 110 | +./gradlew :app:assembleRelease |
| 111 | +``` |
| 112 | + |
| 113 | +上传 artifact: |
| 114 | + |
| 115 | +```text |
| 116 | +api-debug-helper-release-unsigned |
| 117 | +``` |
| 118 | + |
| 119 | +artifact 对应文件: |
| 120 | + |
| 121 | +```text |
| 122 | +app/build/outputs/apk/release/app-release-unsigned.apk |
| 123 | +``` |
| 124 | + |
| 125 | +下载方式: |
| 126 | + |
| 127 | +1. 打开 GitHub 仓库的 `Actions` 页面。 |
| 128 | +2. 进入一次 `Build API Debug Helper APK` workflow run。 |
| 129 | +3. 在 `Artifacts` 区域下载 `api-debug-helper-release-unsigned`。 |
| 130 | + |
| 131 | +## 项目结构 |
| 132 | + |
| 133 | +```text |
| 134 | +app/src/main/java/com/api/debug/helper/ |
| 135 | +``` |
| 136 | + |
| 137 | +| 目录 | 说明 | |
| 138 | +|------|------| |
| 139 | +| `api/` | OkHttp API 调用封装 | |
| 140 | +| `data/` | 请求、响应、配置和历史记录模型 | |
| 141 | +| `ui/` | Compose UI 和 ViewModel | |
| 142 | +| `ui/theme/` | Material3 主题配置 | |
| 143 | +| `util/` | 应用内日志工具 | |
| 144 | + |
| 145 | +## 故障排查 |
| 146 | + |
| 147 | +### 连接失败 |
| 148 | + |
| 149 | +- 确认 Gallery API Server 已启动。 |
| 150 | +- 本机测试使用 `127.0.0.1`。 |
| 151 | +- 局域网测试使用 Gallery 设备的局域网 IP。 |
| 152 | +- 局域网测试时 Gallery Host 应设置为 `0.0.0.0`。 |
| 153 | +- 启用 API Key 时,确认调试助手中填写了相同 Key。 |
| 154 | + |
| 155 | +### 模型列表为空 |
| 156 | + |
| 157 | +- 确认 Gallery 中已下载 LLM 模型。 |
| 158 | +- 重新点击模型列表加载按钮。 |
| 159 | +- 检查 Gallery 端日志中的 `LOCAL_API event=models_list`。 |
| 160 | + |
| 161 | +### 聊天请求耗时较长 |
| 162 | + |
| 163 | +- 首次请求可能触发模型初始化。 |
| 164 | +- 大模型在移动设备上推理耗时更长。 |
| 165 | +- 可尝试降低 `max_tokens` 或切换推理后端。 |
| 166 | + |
| 167 | +### 流式响应没有结束 |
| 168 | + |
| 169 | +- 确认服务端发送 `data: [DONE]`。 |
| 170 | +- 查看调试助手日志页中的 `Chunks` 和 `ParseErrors`。 |
| 171 | +- 确认服务端没有在推理过程中被系统回收。 |
| 172 | + |
| 173 | +## License |
| 174 | + |
| 175 | +Apache License 2.0 |
0 commit comments