37 个版本 (12 个重大变化)
0.13.0 | 2024年3月16日 |
---|---|
0.12.4 | 2024年1月30日 |
0.12.1 | 2023年12月29日 |
0.5.5 | 2023年11月30日 |
#69 in 机器学习
每月49次下载
245KB
6K SLoC
Oatmeal
使用不同的模型后端与大型语言模型(LLM)进行聊天的终端UI,并集成您最喜欢的 编辑器!
概述
Oatmeal是一个终端UI聊天应用程序,可与LLM进行对话,包括斜杠命令和花哨的聊天气泡。它具有无差别的后端,允许在ChatGPT的强大功能之间切换,或使用Ollama来保持隐私。虽然Oatmeal作为一个独立的终端应用程序效果很好,但如果与Neovim等编辑器一起使用,效果会更好!
与Neovim一起使用(点击重启)
注意:该项目仍然相当新颖,LLM可能会返回一些UI未准备的意外答案。可能存在一些隐藏的bug。
安装
MacOS
brew install dustinblackman/tap/oatmeal
Debian / Ubuntu
注意:此方法可能有过时的版本。
curl -s https://apt.dustinblackman.com/KEY.gpg | apt-key add -
curl -s https://apt.dustinblackman.com/dustinblackman.list > /etc/apt/sources.list.d/dustinblackman.list
sudo apt-get update
sudo apt-get install oatmeal
Fedora / CentOS
注意:此方法可能有过时的版本。
dnf config-manager --add-repo https://yum.dustinblackman.com/config.repo
dnf install oatmeal
Nix
nix-env -f '<nixpkgs>' -iA nur.repos.dustinblackman.oatmeal
Arch Linux
yay -S oatmeal-bin
Alpine Linux
arch=$(uname -a | grep -q aarch64 && echo 'arm64' || echo 'amd64')
curl -L -o oatmeal.apk "https://github.com/dustinblackman/oatmeal/releases/download/v0.13.0/oatmeal_0.13.0_linux_${arch}.apk"
apk add --allow-untrusted ./oatmeal.apk
Windows
Chocolatey
choco install oatmeal --version=0.13.0
Scoop
scoop bucket add dustinblackman https://github.com/dustinblackman/scoop-bucket.git
scoop install oatmeal
Winget
winget install -e --id dustinblackman.oatmeal
Cargo
cargo install oatmeal --locked
Docker
docker run --rm -it ghcr.io/dustinblackman/oatmeal:latest
手册
从发布页面下载预编译的二进制文件和包,并将其复制到所需的位置。
源代码
git clone https://github.com/dustinblackman/oatmeal.git
cd oatmeal
cargo build --release
mv ./target/release/oatmeal /usr/local/bin/
使用方法
以下展示了启动聊天会话的可用选项。默认情况下运行 oatmeal
时,Ollama 是选定的后端,以及编辑器的 clipboard
集成。查看 oatmeal --help
、聊天中的 /help
或下面的输出以获取所有详细信息。
Terminal UI to chat with large language models (LLM) using different model backends, and direct integrations with your favourite editors!
Version: 0.13.0
Commit: v0.13.0
Usage: oatmeal [OPTIONS] [COMMAND]
Commands:
chat Start a new chat session.
completions Generates shell completions.
config Configuration file options.
manpages Generates manpages and outputs to stdout.
sessions Manage past chat sessions.
help Print this message or the help of the given subcommand(s)
Options:
-b, --backend <backend>
The initial backend hosting a model to connect to. [default: ollama] [env: OATMEAL_BACKEND=] [possible values: langchain, ollama, openai, claude, gemini]
--backend-health-check-timeout <backend-health-check-timeout>
Time to wait in milliseconds before timing out when doing a healthcheck for a backend. [default: 1000] [env: OATMEAL_BACKEND_HEALTH_CHECK_TIMEOUT=]
-m, --model <model>
The initial model on a backend to consume. Defaults to the first model available from the backend if not set. [env: OATMEAL_MODEL=]
-c, --config-file <config-file>
Path to configuration file [default: ~/.config/oatmeal/config.toml] [env: OATMEAL_CONFIG_FILE=]
-e, --editor <editor>
The editor to integrate with. [default: clipboard] [env: OATMEAL_EDITOR=] [possible values: neovim, clipboard, none]
-t, --theme <theme>
Sets code syntax highlighting theme. [default: base16-onedark] [env: OATMEAL_THEME=] [possible values: base16-github, base16-monokai, base16-one-light, base16-onedark, base16-seti]
--theme-file <theme-file>
Absolute path to a TextMate tmTheme to use for code syntax highlighting. [env: OATMEAL_THEME_FILE=]
--lang-chain-url <lang-chain-url>
LangChain Serve API URL when using the LangChain backend. [default: http://localhost:8000] [env: OATMEAL_LANGCHAIN_URL=]
--ollama-url <ollama-url>
Ollama API URL when using the Ollama backend. [default: http://localhost:11434] [env: OATMEAL_OLLAMA_URL=]
--open-ai-url <open-ai-url>
OpenAI API URL when using the OpenAI backend. Can be swapped to a compatible proxy. [default: https://api.openai.com] [env: OATMEAL_OPENAI_URL=]
--open-ai-token <open-ai-token>
OpenAI API token when using the OpenAI backend. [env: OATMEAL_OPENAI_TOKEN=]
--claude-token <claude-token>
Anthropic's Claude API token when using the Claude backend. [env: OATMEAL_CLAUDE_TOKEN=]
--gemini-token <gemini-token>
Google Gemini API token when using the Gemini backend. [env: OATMEAL_GEMINI_TOKEN=]
-h, --help
Print help
-V, --version
Print version
CHAT COMMANDS:
- /modellist (/ml) - Lists all available models from the backend.
- /model (/model) [MODEL_NAME,MODEL_INDEX] - Sets the specified model as the active model. You can pass either the model name, or the index from `/modellist`.
- /append (/a) [CODE_BLOCK_NUMBER?] - Appends code blocks to an editor. See Code Actions for more details.
- /replace (/r) [CODE_BLOCK_NUMBER?] - Replaces selections with code blocks in an editor. See Code Actions for more details.
- /copy (/c) [CODE_BLOCK_NUMBER?] - Copies the entire chat history to your clipboard. When a `CODE_BLOCK_NUMBER` is used, only the specified copy blocks are copied to clipboard. See Code Actions for more details.
- /quit /exit (/q) - Exit Oatmeal.
- /help (/h) - Provides this help menu.
CHAT HOTKEYS:
- Up arrow - Scroll up.
- Down arrow - Scroll down.
- CTRL+U - Page up.
- CTRL+D - Page down.
- CTRL+C - Interrupt waiting for prompt response if in progress, otherwise exit.
- CTRL+O - Insert a line break at the cursor position.
- CTRL+R - Resubmit your last message to the backend.
CHAT CODE ACTIONS:
When working with models that provide code, and using an editor integration, Oatmeal has the capabilities to read selected code from an editor, and submit model provided code back in to an editor. Each code block provided by a model is indexed with a (NUMBER) at the beginning of the block to make it easily identifiable.
- /append (/a) [CODE_BLOCK_NUMBER?] will append one-to-many model provided code blocks to the open file in your editor.
- /replace (/r) [CODE_BLOCK_NUMBER?] - will replace selected code in your editor with one-to-many model provided code blocks.
- /copy (/c) [CODE_BLOCK_NUMBER?] - Copies the entire chat history to your clipboard. When a `CODE_BLOCK_NUMBER` is used it will append one-to-many model provided code blocks to your clipboard, no matter the editor integration.
The `CODE_BLOCK_NUMBER` allows you to select several code blocks to send back to your editor at once. The parameter can be set as follows:
- `1` - Selects the first code block
- `1,3,5` - Selects code blocks 1, 3, and 5.
- `2..5`- Selects an inclusive range of code blocks between 2 and 5.
- None - Selects the last provided code block.
配置
除了可以通过命令标志和环境变量进行配置外,Oatmeal 还可以通过如此示例所示的配置文件进行管理。您可以使用 oatmeal config create
初始化第一次运行。
Configuration file options.
Usage: oatmeal config [OPTIONS] [COMMAND]
Commands:
create Saves the default config file to the configuration file path. This command will fail if the file exists already.
default Outputs the default configuration file to stdout.
path Returns the default path for the configuration file.
help Print this message or the help of the given subcommand(s)
后端
以下模型后端得到支持
- OpenAI(或任何兼容代理/API)
- Ollama
- LangChain/LangServe(实验性)
- Claude(实验性)
- Gemini(实验性)
编辑器
以下编辑器目前得到支持。clipboard
编辑器是一个特殊情况,其中任何复制或接受命令都简单地复制到您的剪贴板。这是默认行为。点击下面的任何链接以获取更多使用详情!
- 剪贴板(默认)
- 无(禁用所有编辑器功能)
- Neovim
主题
应用程序中内置了一些主题,用于代码语法高亮,默认为 OneDark。如果没有任何一个符合您的需求,Oatmeal 支持任何 Sublime Text/Text Mate .tmTheme
文件,可以使用 theme-file
配置选项。 base16-textmate 提供了大量的选择!
会话
Oatmeal 会持久保存所有与您的模型进行的聊天会话,让您能够回顾旧对话,或从上次停止的地方继续!
Manage past chat sessions.
Usage: oatmeal sessions [OPTIONS] [COMMAND]
Commands:
dir Print the sessions cache directory path.
list List all previous sessions with their ids and models.
open Open a previous session by ID. Omit passing any session ID to load an interactive selection.
delete Delete one or all sessions.
help Print this message or the help of the given subcommand(s)
在 Oatmeal 中通过 grep 搜索以前的会话尚未内置(尚且)。此 bash 函数可以使用 Ripgrep 和 FZF 帮助您做到这一点。
function oatmeal-sessions() {
(
cd "$(oatmeal sessions dir)"
id=$(rg --color always -n . | fzf --ansi | awk -F ':' '{print $1}' | head -n1 | awk -F '.' '{print $1}')
oatmeal sessions open --id "$id"
)
}
或者一个稍微深入一些(虽然有点 hacky)的方法,它还使用了 yq 和 jq。
function oatmeal-sessions() {
(
cd "$(oatmeal sessions dir)"
id=$(
ls | \
(while read f; do echo "$(cat $f)\n---\n"; done;) | \
yq -p=yaml -o=json - 2> /dev/null | \
jq -s . | \
jq -rc '. |= sort_by(.timestamp) | .[] | "\(.id):\(.timestamp):\(.state.backend_model):\(.state.editor_language):\(.state.messages[] | .text | tojson)"' | \
fzf --ansi | \
awk -F ':' '{print $1}' | \
head -n1 | \
awk -F '.' '{print $1}'
)
oatmeal sessions open --id "$id"
)
}
贡献
报告问题
在每次 Oatmeal 发布中,都有单独的下载,有助于在报告中深入挖掘问题所在!如果您遇到问题,我会非常感激解决它。
- 前往 发布 下载 Oatmeal 最新版本的 DEBUG 包。
- 解压缩存档内容,并在终端中进入存档内部的目录。
- 使用错误消息中提供的参数运行您的命令,并在前面加上
RUST_BACKTRACE=1 ./oatmeal **ARGS-HERE**
- 复制/粘贴输出并打开一个问题。包括任何您认为可能有助于解决问题的截图!
开发
设置
Oatmeal 附带一个预先配置好的 DevContainer,其中包含在项目上工作的所有魔法。但是,如果您希望完全本地开发,以下步骤将帮助您设置所有必要的工具。
cargo install cargo-run-bin
git clone https://github.com/dustinblackman/oatmeal.git
cd oatmeal
cargo cmd setup
添加后端
每个后端都在其自己的基础设施文件中实现了后端特质。该特质对每个方法的期望都有文档说明。您可以查看Ollama作为示例。
以下步骤应该完成以添加后端:
- 为新后端实现特质。
- 更新BackendName枚举,包含您的新后端名称。
- 更新BackendManager以提供您的新后端。
- 编写测试
添加编辑器
每个编辑器在其自己的基础设施文件中实现了编辑器特质。该特质对每个方法的期望都有文档说明。您可以查看Neovim作为示例。
以下步骤应该完成以添加编辑器:
- 为新编辑器实现特质。
- 更新EditorName枚举,包含您的新编辑器名称。
- 更新EditorManager以提供您的新编辑器。
- 编写测试
添加语言语法高亮
语法高亮语言选择是稍微手动的过程,需要先整理几个语言,然后将它们添加到assets.toml
。
- 在GitHub上搜索您的语言的.sublime-syntax项目。 bat有很多!
- 更新
assets.toml
以包含新仓库。请确保在文件数组中包含许可证。您可以将nix-hash
留为空字符串,维护者稍后将其更新。或者如果您已安装docker,可以运行cargo xtask hash-assets
。 rm-rf.缓存&&cargo build
- 测试以查看高亮是否正常工作。
常见问题解答
为什么选择Oatmeal?
我写第一个提交的时候正在吃一碗燕麦粥 🤷。(他们不再让我在工作时命名东西了...)
许可证
依赖
~33–51MB
~896K SLoC