Atuin AI 后端自托管(Self-Hosting)完整指南:从 Ollama 到 OpenAI 兼容端点
【免费下载链接】atuin✨ Making your shell magical项目地址: https://gitcode.com/gh_mirrors/at/atuin
Atuin AI 是 Atuin 内置的 LLM 助手,支持在终端内直接生成 shell 命令、进行对话式信息查询与智能补全。本指南聚焦于如何自托管 Atuin AI 的后端服务,从而摆脱对官方 Atuin Hub 的依赖,实现完全自主可控的本地 AI 体验。读完本文,你将掌握 atuin-ai-server 的从源码与 Docker 两种运行方式、基于 OpenAI 兼容协议对接 Ollama/vLLM/LM Studio/llama.cpp/LiteLLM 等本地模型的配置技巧,以及 Atuin 客户端侧[ai]全部配置项的完整含义与调优方法。
Atuin AI 后端架构概览
Atuin AI 的功能分为两部分:客户端(即 Atuin 本体,Rust 实现,代码位于 crates/atuin-ai)与服务端(负责接入 LLM 的 AI 后端)。
服务端的核心是开源项目atuin-ai-server,它基于atuin-ai-core(使用 Gleam 语言编写)构建——这与驱动 Atuin 官方生产 AI 后端的是同一套 Gleam 库,因此自托管版本与官方版本在协议、行为上保持高度一致。这意味着你可以放心地用自己的服务器替换官方 Hub,客户端无需任何特殊适配。
从 客户端源码 可以看到,Atuin AI 客户端默认连接到官方地址https://hub.atuin.sh(见 settings.rs 中 DEFAULT_HUB_URL 定义),并通过ai.endpoint配置覆盖为自定义地址。
目前服务端兼容任何 OpenAI 兼容的 chat completions 风格端点,覆盖两大类场景:
- 本地模型运行时:Ollama、vLLM、LM Studio、llama.cpp、LiteLLM 等;
- OpenAI 兼容的在线服务:例如 OpenRouter。
背景知识:Atuin AI 面向终端用户的开箱即用方案是注册 Atuin Hub。
快速开始:Ollama 本地模型的最小配置
atuin-ai-server仓库克隆下来后,将示例配置文件config.example.toml复制为config.toml,再按 README 的配置说明设置你的实例即可。
以下是基于 Ollama 的基础配置示例(服务端配置文件):
port = 8080 endpoint = "http://localhost:11434/v1" # or host.docker.internal api_key = "ollama" default_model = "llama31" [request.body] stream_options = { include_usage = true } [[models]] alias = "llama31" name = "Llama 3.1 70b" description = "Ollama Llama 3.1 70b" model = "llama3.1:70b" [[models]] alias = "gemma4" name = "Gemma 4 r4b" description = "Ollama Gemma 4 - Effective 4b" model = "gemma4:e4b"逐项解析这份配置:
| 配置项 | 含义与取值说明 |
|---|---|
port | 服务端监听端口,客户端将通过http://<主机>:<端口>访问 |
endpoint | 上游 LLM 的 OpenAI 兼容地址。Ollama 的兼容端点是http://localhost:11434/v1;若服务端跑在容器内,应改用http://host.docker.internal:11434/v1 |
api_key | 访问上游 LLM 服务的密钥。Ollama 默认不校验密钥,填"ollama"占位即可 |
default_model | 默认模型别名(对应下方[[models]]表中的alias),当客户端请求未指定模型时使用 |
[request.body] | 透传给上游 LLM 请求体的附加参数,stream_options = { include_usage = true }让流式响应附带 token 用量统计 |
[[models]] | 模型表,每一项定义一个对外暴露的模型:alias(客户端可见的模型别名)、name(显示名)、description(描述)、model(实际请求上游时的模型 ID) |
alias的语义在客户端侧 models.rs 中有对应体现:alias 是网络传输中使用的模型标识,name 和 description 则用于客户端/model选择器的展示。
运行方式一:从源码运行
如果你已安装 Erlang、Elixir 和 Gleam(具体版本要求见仓库中的.tool-versions),可以原生方式运行服务端:
mix deps.get mix run --no-halt注意事项:
- 如果你的
config.toml通过环境变量指定 API 密钥,启动服务前务必先设置好这些环境变量; - 使用
mix run --no-halt让服务以前台进程持续运行(生产环境建议配合 systemd 或进程管理器)。
运行方式二:Docker 运行
更推荐的方式是直接使用官方镜像:
docker run \ -v ./config.toml:/etc/atuin-ai/config.toml \ -p 8080:8080 \ ghcr.io/atuinsh/atuin-ai-server:latest参数说明:
-v ./config.toml:/etc/atuin-ai/config.toml:将宿主机配置挂载到容器内固定路径/etc/atuin-ai/config.toml;-p 8080:8080:将容器 8080 端口映射到宿主机,供 Atuin 客户端访问;- 镜像使用
ghcr.io/atuinsh/atuin-ai-server:latest标签。
Docker 场景下的关键坑:host.docker.internal
如果服务端跑在 Docker 容器内、而本地 LLM 服务(如 Ollama)跑在宿主机上,必须把endpoint指向host.docker.internal而不是localhost。原因在于:容器内的localhost解析的是容器自身的回环接口,而非宿主机的回环接口;host.docker.internal是 Docker 提供的、专门用于从容器访问宿主机服务的特殊主机名。
配置 Atuin AI 客户端:连接自托管端点
服务端跑起来后,在 Atuin 客户端的config.toml中设置[ai]配置来连接:
[ai] endpoint = "http://localhost:8080"这是客户端连接自托管后端的最简配置。客户端会通过GET {endpoint}/api/cli/models拉取可用模型列表(见 models.rs 中 fetch_models 实现),并通过POST {endpoint}/api/cli/chat建立 SSE 流式对话(见 stream.rs 中 create_chat_stream 实现)。
端点协议:auto / hub / oss
客户端通过endpoint_protocol决定与端点通信的方式,默认值"auto":
| 取值 | 行为 |
|---|---|
"auto" | 从endpoint推断:官方 Atuin 地址使用 Hub 协议,其余一律视为 OSS 独立服务器 |
"hub" | 将端点视为 Atuin Hub 实例:走浏览器 Hub 登录流程,并上报信用(credit)用量;主要用于针对本地 Hub 实例的二次开发 |
"oss" | 将端点视为独立 AI 服务器(如atuin-ai-server):无登录流程,请求使用api_token(若设置)认证 |
auto模式的具体推断逻辑在 settings.rs 的 is_hub_ai_endpoint 实现中:官方地址以https://hub.atuin.sh等官方域名为准,非官方地址一律按 OSS 处理。因此默认配置下,把endpoint指向你自己的服务器即可直接工作;如果你的服务器要求认证,再设置api_token。
从 inline.rs 客户端启动逻辑 可以看到完整的认证决策链:
- 显式传入
api_token(CLI 参数或配置)→ 直接使用该 token,不触发登录流程; - 未设置 token 且端点是 Hub → 走 Hub 会话登录(
ensure_hub_session); - 未设置 token 且端点是 OSS →不带 token 直接请求(OSS 服务器可能不需要认证,客户端不会强制走不适用于它的登录流程)。
CLI 覆盖参数
除了配置文件,atuin ai子命令还支持全局覆盖参数(见 commands.rs):
--api-endpoint <URL>:覆盖ai.endpoint;--api-token <TOKEN>:覆盖ai.api_token;-v/--verbose:开启详细日志。
Atuin AI 客户端配置项全解
以下配置全部位于客户端config.toml的[ai]段(数据结构定义见 settings.rs 中 Ai 结构体):
基础配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
enabled | false | 是否启用 AI 功能。设为false时,问号键绑定会输出提示,指引你运行atuin setup开启该功能 |
model | 未设置 | 新会话使用的 AI 模型(别名)。未设置时使用服务端默认模型;可在 Atuin AI 界面内运行/model查看可用模型并切换 |
db_path | Atuin 数据目录下的ai_sessions.db | Atuin AI 会话存储所用 SQLite 数据库的路径 |
session_continue_minutes | 1h | 距上次交互多久内的会话算"最近",可被自动续接。格式为时长字符串(30m、1h、2h等);裸数字按分钟数解析(如60= 60 分钟),用于向后兼容 |
endpoint | null | Atuin AI 端点地址,用于命令生成等 AI 功能。大多数用户无需设置,仅在自定义 AI 端点时需要 |
api_token | null | Atuin AI 端点的 API token,同样仅自定义端点时需要 |
endpoint_protocol | "auto" | 见上文"端点协议"一节 |
yolo | false | 开启 YOLO 模式:自动放行所有权限检查。⚠️ 请谨慎使用。注意它并不会开启任何新能力,只是跳过权限检查 |
tips | true | 是否在 Atuin AI 每轮 agent 回合底部显示提示 |
补充细节(源码佐证):
session_continue_minutes在 settings.rs 中通过AsDisableableDuration<Minutes>反序列化,支持"时长字符串或分钟数",且0表示禁用自动续接;db_path对应的 SQLite 数据库由 crates/atuin-ai/migrations 中的迁移文件(如create_ai_sessions.sql、add_session_metadata.sql、create_ai_usage.sql)创建和维护;- 在 Atuin AI 界面内用
/model选择模型后,选择的别名会通过save_model_selection持久化写入config.toml的ai.model(见 models.rs),成为后续会话的默认模型。
能力开关:[ai.capabilities]
这些设置控制向 LLM 发送哪些能力描述,LLM 据此了解客户端可用哪些工具并主动发起调用:
| 配置项 | 默认值 | 说明 |
|---|---|---|
enable_history_search | true | 是否在上下文包含"history search"能力。开启后,AI 在生成建议或回答问题时可请求搜索你的 Atuin 历史命令 |
enable_history_output | true | 是否包含"history output"能力。开启后,AI 可请求查看历史命令的输出。前提是pty-proxy 与 daemon 已启用并运行(Atuin 才能捕获命令输出),配置方法见 Reading Command Output |
enable_file_tools | true | 是否包含"file tools"能力。开启后,AI 可请求读写你系统上的文件 |
enable_command_execution | true | 是否包含"command execution"能力。开启后,AI 可请求在你的系统上执行命令 |
示例:
[ai.capabilities] enable_history_search = false源码说明:AiCapabilities结构体定义在 settings.rs,每个字段默认None即未设置(等同于启用)。这些能力会由 context.rs 的 capability_strings 转换为发送给服务端的能力字符串列表;每个工具的能力字符串定义在其ToolDescriptor上,FSM 状态机(见 fsm 模块)据此接受或拒绝 AI 的工具调用请求——这构成了 Atuin AI 权限体系的底层机制。
开场上下文:[ai.opening]
控制开场请求发送给 LLM 的上下文内容:
| 配置项 | 默认值 | 说明 |
|---|---|---|
send_cwd | false | 是否将当前工作目录包含进发送给 LLM 的上下文。默认只发送操作系统和当前 shell 信息 |
send_last_command | false | 是否将你的上一条命令作为上下文发送到初始请求,以便 AI 提供更相关的建议 |
示例:
[ai.opening] send_cwd = true[ai.opening] send_last_command = true源码说明:AiOpening结构体定义在 settings.rs;send_cwd与上一条命令最终会通过 stream.rs 中 create_chat_stream 的 context 序列化 注入到开场请求的上下文中。
完整的客户端配置示例
结合以上全部配置项,一份连接自托管后端的完整客户端config.toml示例如下:
[ai] enabled = true endpoint = "http://localhost:8080" api_token = "your-server-token" # 若服务端要求认证 endpoint_protocol = "oss" # 或留空使用 "auto" model = "llama31" # 可选,服务端默认模型别名 db_path = "ai_sessions.db" # 默认在 Atuin 数据目录下 session_continue_minutes = "1h" # 也支持纯数字分钟数,如 60 tips = true # yolo = true # 谨慎使用:自动放行所有权限检查 [ai.capabilities] enable_history_search = true enable_history_output = true # 需 pty-proxy + daemon 运行才能捕获命令输出 enable_file_tools = true enable_command_execution = true [ai.opening] send_cwd = false send_last_command = false自托管部署检查清单
完成整套自托管部署,可按以下顺序核对:
- 服务端:克隆
atuin-ai-server,复制config.example.toml为config.toml,配置endpoint(上游 LLM)与[[models]]表; - 启动服务端:源码方式(
mix deps.get && mix run --no-halt,需 Erlang/Elixir/Gleam)或 Docker 方式(docker run -v ./config.toml:/etc/atuin-ai/config.toml -p 8080:8080 ghcr.io/atuinsh/atuin-ai-server:latest); - 容器访问宿主机 LLM:Docker 场景下
endpoint用host.docker.internal而非localhost; - 客户端:在
config.toml设置[ai] endpoint = "http://localhost:8080"(可选api_token); - 协议:默认
auto即可自动识别 OSS 服务器;特殊场景(本地 Hub 开发)可显式设hub; - 验证:运行
atuin ai(或按?调起界面),在界面内用/model确认模型列表已从自托管端点正确拉取。
如需进一步了解 Atuin AI 的完整功能(命令生成、对话搜索、危险命令检测等),可参考 Atuin AI 介绍;客户端[ai]配置的官方文档见 AI 设置文档;如需将 AI 能力扩展到 Claude Code、Cursor 等外部工具,可参考内置 MCP 服务器文档。
【免费下载链接】atuin✨ Making your shell magical项目地址: https://gitcode.com/gh_mirrors/at/atuin
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考