本地 AI

一个地址,调用本地 AI

聊天、模型发现和语音转写统一经过同一网关。服务管理页负责启动、停止和切换;API 请求不会自动加载模型。

入口与认证

用途地址认证
聊天网页qwen.vincentz.dev当前 Arch 配置免登录
API 基础地址https://qwen.vincentz.dev/v1Bearer API Key
服务管理 / 转写网页/admin · /asr独立管理员账号
公开状态/status.json免登录,仅显示服务状态

本机使用 http://127.0.0.1:18000。API key 从当前系统用户目录 ~/.config/qwen/api-keys.txt 读取。管理员账号保存在 ~/.config/local-ai/admin.json,与 API key 分开。

聊天 API

兼容 OpenAI Chat Completions。模型 ID:bonsai-27b-ternary、qwen3.8-27b。先在管理页启动目标模型,再在聊天页或客户端选择相同的模型。

export LOCAL_AI_KEY='替换为你的 API key'
curl https://qwen.vincentz.dev/v1/chat/completions \
  -H "Authorization: Bearer $LOCAL_AI_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"model":"bonsai-27b-ternary","messages":[{"role":"user","content":"你好"}],"stream":true}'

模型发现:GET /v1/models。公网长请求使用 stream: true。图片、思考档位与客户端配置见网关详细文档。

语音转写 API

先启动 ASR,检查 GET /v1/asr/health 的 model_state 为 ready。提交可直接下载的公网音频或视频文件链接,支持语言提示,不执行翻译。

curl https://qwen.vincentz.dev/v1/asr/jobs \
  -H "Authorization: Bearer $LOCAL_AI_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://example.com/video.mp4","language":"auto"}'

示例地址需要替换。返回任务 id 后,每 2 秒查询 GET /v1/asr/jobs/{id},带同一个 Bearer key。仅 status=completed 表示成功,文字在 result.text,分段在 result.segments;error 或 cancelled 时停止轮询。

任务与结果保存在内存,重启 ASR 后不可查询;请及时保存结果。最多 2 个未完成任务,识别串行处理。直链仅支持公网 HTTP/HTTPS 的 80/443 端口,不能访问本机或内网。文件限制与分段长度见 health 的 limits。

切换与状态灯

Bonsai、Qwen 和 ASR 轮流使用显卡,切换会先停止冲突服务再加载目标服务;聊天网页与网关始终独立运行。加载完成才显示绿色“已就绪”。有推理请求或受影响的转写任务时,管理操作返回 409;等待任务结束后重试。

绿色:已就绪;黄色:加载中或停止中;红色:服务异常;灰色:未启动或无法取得状态。Pages 每 15 秒检查一次;电脑关机、Tunnel 离线或检查超时时显示“无法连接”。Pages 本身仍可阅读文档,服务控制需要本机网关在线。

常见响应

401:认证失败;409:正在处理请求或切换服务;429:ASR 队列已满;503:服务未启动或模型尚未就绪。管理页的错误提示与本机服务日志用于定位加载失败。