Jan Local API Server 如何暴露到局域网并配置 Trusted Hosts 与 CORS?
【免费下载链接】janJan is an open source alternative to ChatGPT that runs 100% offline on your computer.项目地址: https://gitcode.com/GitHub_Trending/ja/jan
默认情况下,Jan 内置的 Local API Server 只监听127.0.0.1:1337,只有本机可以访问。如果你的目标是让局域网内的其他设备(文档举的例子是手机或另一台电脑)也能调用这台机器上的 OpenAI 兼容接口,需要把 Server Host 改为0.0.0.0,并配合 API Key、Trusted Hosts 和 CORS 这几项配置来收敛暴露面。本文基于 Jan 官方文档 Local API Server 与 API Reference,给出完整的配置路径和验证方式。前置条件:已安装 Jan 并且其中至少有一个可用模型(请求体里的 model ID 必须对应 Jan 中实际存在的模型)。
启动服务并打开配置面板
- 进入Settings>Local API Server,点击Start Server。
- 当日志出现
JAN API listening at http://127.0.0.1:1337时,说明服务已就绪(这是文档给出的默认绑定下的就绪日志)。 - 点击该页面右上角的Configuration按钮,打开服务端配置面板。文档说明这些配置控制的是服务器的网络可达性与基础行为:
面板中本次需要修改的项是 Server Host、API Key、Trusted Hosts,以及 Advanced Settings 里的 CORS 开关。
将 Server Host 改为 0.0.0.0
Server Host 指定服务器监听的网络地址:
127.0.0.1(默认):仅本机可访问,文档称之为个人使用下最安全的选项;0.0.0.0:局域网内的其他设备可以访问,文档明确提示Use this with caution。
把该项改为0.0.0.0后,配合文档中的说明做两件配套的事:
- 设置 API Key:填入任意字符串(文档示例值
a-secure-password,请替换为你自己选定的密钥)。配置后所有请求必须在Authorization: Bearer YOUR_API_KEY请求头中携带该密钥。文档明确建议:绑定到0.0.0.0时不要留空——留空即关闭认证。 - 配置 Trusted Hosts:填入逗号分隔的主机名列表,表示允许访问服务器的主机。这是文档中给出的、针对"服务器暴露到网络"场景的额外一层安全控制。
其余与暴露到局域网直接相关的可选项:
- Server Port:默认
1337,可改为任意可用端口(文档示例8000)。如果端口被占用,Jan 的 Local API Server 不会自动换端口,绑定的端口不可用时服务会启动失败;故障排查文档给出的处理方式是按操作系统用netstat检查 1337 端口占用情况,然后在Settings>Local API Server>Configuration>Server Port中更换端口。 - API Prefix:默认
/v1,遵循 OpenAI 约定,也可修改或留空。改了这个前缀,所有端点路径都会跟着变。 - Request Timeout:单位是秒,指服务端等待本地模型响应的时长。在大模型跑慢硬件、出现请求超时的情况下调大。
按需关闭 CORS
Advanced Settings 中的Cross-Origin Resource Sharing (CORS)默认开启。文档对它的描述是:
- 开启时,允许运行在其他域名下的 Web 应用(例如你正在开发的自定义 Web UI)请求该 API 服务器;
- 如果 API 只会由非浏览器端程序访问(例如脚本、命令行工具),建议关闭以获得略好的安全性。
也就是说:你的局域网客户端如果是浏览器里的页面(前端直接 fetch),保持 CORS 开启;如果都是脚本或服务端调用,关闭即可。与 CORS 无关的另一项Execute Tools on Server默认关闭,含义是经/v1/chat/completions触发的 MCP 工具调用改在服务器端执行,客户端自行处理工具执行时应保持关闭。
从局域网设备发起验证请求
修改完配置后,在局域网内的另一台设备上请求 Jan 主机。下面的命令改编自文档的 curl 示例,其中LAN_IP需替换为 Jan 所在机器的局域网地址,a-secure-password需替换为你在 API Key 中实际填入的值:
# 先列出可用模型 curl http://LAN_IP:1337/v1/models \ -H "Authorization: Bearer a-secure-password"API Reference 文档给出的GET /v1/models示例响应(文档示例,实际返回的模型列表取决于你加载的模型):
{ "object": "list", "data": [ { "id": "jan-v3-4b-base-instruct", "object": "model" } ] }确认模型 ID 后,发起一次对话补全请求:
curl http://LAN_IP:1337/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer a-secure-password" \ -d '{ "model": "YOUR_MODEL_ID", "messages": [{"role": "user", "content": "Tell me a joke."}] }'YOUR_MODEL_ID替换为 Jan 中实际存在的模型 ID。除/v1/chat/completions外,服务端还支持 Anthropic 兼容的POST /v1/messages端点(见 API Reference);OpenAI Responses API(/v1/responses)文档标注为 coming soon。
按现象排查
文档建议在排查时保持Verbose Server Logs开启(默认开启),这样 "Server Logs" 视图里能看到每条请求、响应和服务端活动的详细日志。Local API Server 文档 给出的对照关系:
- Connection Refused:服务器没有在运行,或客户端指向了错误的 host 或端口。检查服务是否启动、
LAN_IP与端口是否正确。 - 401 Unauthorized:API Key 没有出现在
Authorization头里,或者值不对。 - 404 Not Found:请求体中的
modelID 与 Jan 中可用模型不匹配,或请求 URL 写错(检查 API Prefix 是否与你配置的一致)。 - CORS Error(浏览器端出现):确认 Jan 设置里的 CORS 开关处于开启状态。
需要注意的限制:文档只说明了0.0.0.0会让局域网设备可访问并提示"谨慎使用",Trusted Hosts 被描述为暴露到网络时的额外安全层,但没有给出该列表的语法细节或绕过行为;API Key 是配置后所有请求都必须携带的共享密钥。如果你后续要让 SDK 接入,OpenAI SDK 只需把base_url指向http://LAN_IP:1337/v1并传入同一密钥(API Reference 中给出了 Python 与 TypeScript 示例)。
【免费下载链接】janJan is an open source alternative to ChatGPT that runs 100% offline on your computer.项目地址: https://gitcode.com/GitHub_Trending/ja/jan
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考