#provider #model #openai #chat #ollama #editor #default

应用 xtalk

通用聊天模型的命令行界面

3 个版本

0.0.1-alpha.32024年8月16日
0.0.1-alpha.22024年8月12日
0.0.1-alpha.1 2024年8月5日

#39 in 机器学习

Download history 200/week @ 2024-08-02 134/week @ 2024-08-09

334 每月下载量

MIT OR GPL-2.0

160KB
3.5K SLoC

Crosstalk:通用聊天模型的命令行界面

[!警告]

该项目是gpt-chat-cli的继任者,目前处于早期开发阶段。目前仅提供alpha版本,因此可能存在错误和未记录的行为。在贡献之前请与我联系,因为项目正在变化。

简介

xtalk(发音为“crosstalk”),是一个用于与语言模型(LLMs)交互的命令行工具。它旨在为包括代码生成、写作辅助和问答在内的各种用例提供易于使用且高度可配置的聊天界面。

当前功能包括

  • 流式、实时输出
  • 支持命令行编辑器的交互式聊天REPL(例如 vimemacs 等)
  • 支持Ollama和OpenAI聊天提供者
  • 可组合的CLI界面
    • 输入可以从管道、here文档和任意文件描述符收集
    • 列表可以产生与JSON和awk兼容的输出
  • 声明性配置

安装

xtalk alpha版本仅支持Linux。

使用Cargo安装

cargo install [email protected]

从源码构建

首先,克隆仓库并切换到项目的根目录

git clone https://github.com/flu0r1ne/crosstalk
cd crosstalk

接下来,编译二进制文件

cargo build --release

最后,将二进制文件复制到 /usr/local/bin 目录

cp target/release/xtalk /usr/local/bin/xtalk

用户指南

入门

开始之前,您必须激活一个聊天提供者。Crosstalk不自带LLMs,因此需要通过提供者的API访问它们。目前有两个选项:OpenAI和Ollama。使用OpenAI,您可以访问包括 gpt-4ogpt-4o-mini 在内的旗舰模型。 Ollama 允许您在本地运行LLMs,保护数据隐私。在特定条件下,这些提供者可能会自动激活。

您可以使用 xtalk list providers 命令检查激活状态

$ xtalk list providers
PROVIDER  PRIORITY  ACTIVATED
ollama    15        yes      
openai    10        yes      

在上面的列表中,我们看到Ollama和OpenAI都是激活的。如果没有任何提供者激活,请访问它们各自的章节。

基本用法

一旦启用了一个服务提供商,可以使用 list 子命令列出所有可访问的模型。

$ xtalk list models
MODEL                     PROVIDER  CONTEXT
llama2:7b                 ollama    unknown
codellama:7b              ollama    unknown
mixtral:8x7b              ollama    unknown
llama2-uncensored:latest  ollama    unknown
codegemma:7b              ollama    unknown
gemma:2b                  ollama    unknown
gemma:7b                  ollama    unknown
llama3:latest             ollama    unknown
gpt-4o-mini               openai    128000 
gpt-4o                    openai    128000 
gpt-4-turbo               openai    128000 
gpt-4                     openai    8192   
gpt-3.5-turbo             openai    16385  

模型列提供了可以开始聊天的模型列表。

注意:要使模型可以通过 Ollama 访问,您必须首先通过 ollama pull <model> 下载。

要从列表中选择一个模型并开始聊天,请使用 xtalk chat -m <MODEL>。这将使用户进入一个交互式壳。

$ xtalk chat -m gemma:2b
[#] Hello
[gemma:2b] Hello! How can I assist you today?

Is there anything I can help you with?

这支持标准 Emacs 风格的绑定。要退出壳,请在任何时候按 Control + D

对于单个完成,可以将初始消息指定为第一个位置参数。

$ xtalk chat -m gemma:7b "In one sentence, who is Joseph Weizenbaum?"
Joseph Weizenbaum was a pioneering computer scientist and psychologist who developed the first conversational AI, ELIZA.

或者,您可以通过指定初始消息并使用 - 进入交互式壳。

$ xtalk chat -m gemma:7b -i "In one sentence, who is Joseph Weizenbaum?"
Joseph Weizenbaum was a pioneering computer scientist and psychologist who developed the first conversational AI, ELIZA.

[#] 

默认模型

如果您未指定模型开始聊天,xtalk 将使用 默认模型 开始聊天。默认模型将是首选提供商的默认模型。如果您启用了 OpenAI 提供商,gpt-4o-mini 将是默认模型。如果只启用了 Ollama,您必须手动指定默认模型。有关更多详细信息,请参阅默认模型部分。

如果未指定命令,Crosstalk 将使用默认模型开始聊天。

$ xtalk
[#] Hi!
[gpt-4o-mini] Hello! How can I assist you today?

文档

交互式聊天

交互式聊天支持斜杠命令和键绑定。键绑定可以操纵文本,而斜杠命令可以操纵会话。

斜杠命令

如果提示符以 / 开头,它将被解释为斜杠命令。这些命令会改变聊天的某些方面,而不是由模型解释。目前有三个斜杠命令

命令 功能
/clear 清除聊天缓冲区。模型将解释下一个消息为对话中的第一条消息。
/edit 启动一个交互式编辑器。在编辑器退出后,写入文件的任何内容将成为下一条消息的内容。
/exit 退出壳

键绑定

Crosstalk 目前使用 Emacs 风格的键绑定进行文本操作。尽管这不是可用键绑定的详尽列表,但这些键绑定很可能在版本之间保持不变。

键绑定 功能
C-j 插入换行符
C-e 打开编辑器
C-d 退出壳(EOF)
Home 移动到行的开头
End 移动到行的末尾
C-l 清除屏幕
Tab 执行制表符完成
C-k 从光标到行尾删除文本
C-u 从光标到行首删除文本

启动文本编辑器

可以使用 C- 或如上所述的 /edit 命令启动外部文本编辑器。当指定 C-/edit 时,将在此临时文件上调用外部编辑器。编辑器应正常退出,并将下一个提示的内容写入文件。然后使用此内容进行对话。

可以使用以下机制之一指定编辑器。找到的第一个将被使用

  • 配置文件中的 editor 字段
  • EDITOR 环境变量
  • editor Debian 命令
  • vimemacsvinano,找到的第一个

模型指定

模型使用模型规范进行指定,该规范由模型名称组成,可选地前面跟着提供者。例如,一个明确的模型规范是ollama/gemma:2b,这意味着通过ollama提供者访问gemma:2b模型。模型规范也可以仅由模型名称组成,例如gemma:2b,在这种情况下它被认为是模糊的。在这种情况下,将自动选择gemma:2b的提供者。如果存在多个提供者,则使用用户的首选提供者。有关更多详细信息,请参阅提供者偏好部分。如果chat命令中没有指定模型规范,则使用默认模型。

模型规范 含义
ollama/llama3:7b 通过Ollama提供者访问llama3:7b
llama3:7b 通过用户的首选提供者访问llama3:7b
使用默认模型

示例

$ xtalk chat -m ollama/llama3:7b "Hi Llama3!"

注意:目前,没有两个提供者提供相同模型的情况。然而,这可能在将来发生变化。

提供者

提供者是向Crosstalk提供聊天服务的实体。提供者有自己的独特API,这些API已集成到公共Crosstalk接口中。

Crosstalk目前支持两个提供者

  • OpenAI
  • Ollama

每个提供者都有一个提供者ID。这个助记符用于通过API引用它们。对于OpenAI,这是openai,而对于Ollama,这是ollama

激活

提供者需要用户指定的参数才能运行,例如API密钥。默认情况下,如果满足激活条件,提供者将自动激活。可以通过禁用提供者来禁用此行为。或者,可以强制启用提供者。如果未满足激活条件,Crosstalk将抛出错误。

提供者 参数 自动激活条件
ollama Ollama API基本URL(默认为localhost:11434) 启动时响应请求*
openai OpenAI API密钥 OPENAI_API_KEY环境变量已定义

* 可以通过强制启用提供者来禁用此功能。

激活OpenAI

要激活OpenAI提供者,您必须向xtalk提供OpenAI API密钥

  1. 访问https://platform.openai.com/api-keys
  2. 创建一个新的密钥
    • 选择“限制密钥权限”。
    • 为密钥选择一个名称,例如“xtalk”。
    • 为“模型能力”启用写权限,为“模型”启用读权限。
      • 注意:未来的功能可能需要额外的权限。您可以授予所有权限(不推荐)或在需要额外权限时生成新的密钥。
  3. ~/.config/xtalk/config下创建配置文件
    mkdir -p ~/.config/xtalk
    touch ~/.config/xtalk/config.toml
    
  4. providers.openai部分下填充api_key字段
    [providers.openai]
    api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    
激活Ollama

如果Ollama服务器在localhost:11434上运行,Ollama提供者将自动激活。如果API端点与此默认值不同,您可以在配置文件中更改它,如下所示

[providers.ollama]
api_base = "http://my-server.com:42"

提供者偏好

当模型由两个提供者提供时,服务请求的提供者将是首选提供者。这种优先级是通过提供者优先级建立的,优先级较高的提供者被选中来服务请求。优先级是一个无符号8位数字,最低优先级为0,最高为255。如果两个提供者的优先级相同,则选定的提供者取决于实现。

提供者 默认优先级
ollama 15
openai 10

注意:所有本地提供者将具有默认优先级15,所有远程提供者将具有默认优先级10。这确保了默认情况下优先选择本地提供者。

模型默认值

默认模型是在用户在调用聊天时没有指定偏好时使用的模型。用户可以在配置文件中指定默认情况下选择的模型。如果没有指定默认值,则优先级最高的提供者设置的默认模型。指定默认模型有两种方式,明确或通过首选提供者。

明确设置默认模型

可以使用配置文件中的default_model字段来设置默认模型。

示例1

default_model = "gpt-4o-mini"

示例2

default_model = "ollama/llama3:7b"

提供者默认模型

如果没有明确设置默认模型,则优先级最高的提供者设置默认模型。如果优先级最高的提供者没有设置默认模型,则使用具有下一个最高优先级的提供者的默认模型。可能更倾向于按提供者设置默认模型,而不是全局设置默认模型,因为如果提供者变得不可用,默认模型将自动回退到更好的默认值。

示例1

[providers.ollama]
priority = 20
default_model = 'llama:7b'

[providers.openai]
priority = 10
default_model = 'gpt-4o'

在上面的示例中,ollama/llama:7b将作为默认模型,除非ollama变得不可用。(例如,客户端没有运行,意味着激活条件没有满足。)在这种情况下,openai/gpt-4o将作为默认模型。

可组合性

Crosstalk尊重管道和重定向,因此您可以将其与其他命令行工具结合使用。

示例1

$ printf "What is smmsp in /etc/group?\n$(cat /etc/group | head)" | xtalk chat -m gpt-4o-mini

In the context of the `/etc/group` file in a Unix-like operating system, `smmsp` typically refers to a system user group related to the Simple Mail Transfer Protocol (SMTP) message submission program, often specifically associated with mail transfer agents (MTAs) like Sendmail.

Here's a breakdown of the entry:
...

示例2

$ xtalk chat -m gpt-4o-mini "Write rust code to find the average of a list" > average.rs
$ cat average.rs

Here's an example Rust code to find the average of a list of numbers:

fn main() {
    let numbers = vec![1, 2, 3, 4, 5];
    let sum: i32 = numbers.iter().sum();
    let count = numbers.len();
    let average = sum / count as i32;
    println!("The average is {}", average);
}

This code creates a vector of numbers, calculates the sum of the numbers using the `iter()` method and the `sum()` method, counts the number of elements in the vector using the `len()` method, and then calculates the average by dividing the sum by the count. Finally, it prints the average to the console.

如果xtalk检测到stdinstdout被重定向,它将以单次模式运行。提示是会话中的第一条消息,模型将执行单个完成并在退出之前完成。

配置

配置信息存储在TOML文件中。以下路径用于搜索配置文件。使用第一个可用的文件。

  • ~/.config/xtalk/config.toml
  • ~/.xtalk.toml
  • /etc/xtalk.toml

如果配置中未指定任何选项,则选择合理的默认值。

示例配置

# Specifies the command used to launch an external editor.
# This should specify a binary to be used as the external editor. It can either be
# an absolute path to a binary or a command in the PATH environment variable.
# It should accept a file as the first argument. If the editor exits with a zero status,
# the content in the file will be used for a prompt.
editor = "vim"

# Specifies the default model.
# It should be set in the form of a model spec, such as "gpt-4o-mini".
default_model = "gpt-4o-mini"

# Specifies the keybindings to be used within the chat REPL.
# Acceptable values are "vi" or "emacs". By default, Emacs-style bindings are used.
keybindings = "emacs"

# Configuration for the providers.
[providers]
[providers.ollama]
# The activation policy for Ollama.
# Acceptable values are "auto", "enabled", or "disabled".
activate = "auto"

# Specifies the default model to be used when Ollama is the preferred provider.
default_model = "llama2:7b"

# Specifies the base URL for the Ollama API.
api_base = "https://127.0.0.1:11434"

# Sets the priority for the Ollama provider.
priority = 15

[providers.openai]
# The activation policy for OpenAI.
# Acceptable values are "auto", "enabled", or "disabled".
activate = "auto"

# Specifies the default model to be used when OpenAI is the preferred provider.
default_model = "gpt-4"

# Sets the OpenAI API key.
# This takes precedence over the OPENAI_API_KEY environment variable, if set.
api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# Sets the priority for the OpenAI provider.
priority = 10

主要配置选项

主要配置结构包括外部编辑器、默认模型、快捷键和提供者配置的设置。

编辑器

  • 描述:指定用于启动外部编辑器的命令。
  • 类型String
  • 默认值:请参阅上面的外部编辑器部分。
  • 示例:
    editor = "vim"
    

默认模型

  • 描述:指定默认聊天模型并覆盖其他提供者指定的默认值。
  • 类型String,必须是模型规范
  • 示例:
    default_model = "gpt-4o-mini"
    

键绑定

  • 描述:指定在聊天REPL中使用的快捷键。
  • 类型String(可以是"emacs"或"vi")
  • 默认值emacs
  • 示例:
    keybindings = "emacs"
    

提供者配置

提供者设置嵌套在[providers]部分下。每个提供者,如Ollama和OpenAI,都有其自己的配置设置。

Ollama提供者

  • 部分[providers.ollama]
  • 字段:
    • 激活
      • 描述:Ollama 的激活策略。
      • 类型String(可以是 "auto", "enabled" 或 "disabled")
      • 默认值auto
    • default_model
      • 描述:指定当 Ollama 是首选提供者时使用的默认模型。
      • 类型String
    • api_base
      • 描述:指定 Ollama API 的基本 URL。
      • 类型String
    • priority
      • 描述:设置 Ollama 提供者的优先级。
      • 类型Integer
      • 默认值15
  • 示例:
    [providers.ollama]
      activate = "auto"
      default_model = "llama:7b"
      api_base = "https://127.0.0.1:11434"
      priority = 15
    

OpenAI 提供者

  • 部分[providers.openai]
  • 字段:
    • 激活
      • 描述:OpenAI 的激活策略。
      • 类型String(可以是 "auto", "enabled" 或 "disabled")
      • 默认值auto
    • default_model
      • 描述:指定当 OpenAI 是首选提供者时使用的默认模型。
      • 类型String
    • api_key
      • 描述:设置 OpenAI API 密钥。如果已设置,则此值优先于 OPENAI_API_KEY 环境变量。
      • 类型String
    • priority
      • 描述:设置 OpenAI 提供者的优先级。
      • 类型Integer
      • 默认值10
  • 示例:
    [providers.openai]
      activate = "auto"
      default_model = "gpt-4"
      api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      priority = 10
    

路线图

我相信在原地文件编辑方面还有很多改进空间。例如,可以使用 LLM 进行代码生成和编辑。尽管要达到这一阶段,必须铺设聊天客户端的基础。这是 0.0.1 版本的焦点。

这是第一个版本的粗略计划。此列表上的条目可能会重新排序或重新构思

  • 0.0.1-alpha.3
    • 向 REPL 添加 /model 命令,允许用户更改活动模型
    • 允许在没有默认模型的情况下启动 REPL
  • 0.0.1-alpha.4
    • 使用 Control-C 取消模型输出
  • 0.0.1-alpha.5
    • 添加语法高亮
  • 0.0.1-alpha.6
    • 自动检查更新,当发生关键更新时提醒用户
  • 0.0.1-alpha.7
    • 添加保存和加载聊天对话框的功能
  • 0.0.1-beta.1
    • 跨平台测试

支持和稳定性

Crosstalk 仅发布了 alpha 版本。因此,应将所有组件视为不稳定。当发布版本 1 时,CLI 和配置将得到稳定。

Crosstalk 依赖于模型提供者的 API。Crosstalk 的稳定性取决于上游提供者。某些提供者不支持列出可用模型的能力。这意味着 Crosstalk 必须连续更新才能访问新模型。

平台 Alpha Beta 发布目标 支持
GNU/Linux 计划 计划(0.0.1-rc.1)
OpenBSD 计划 计划(0.0.1-rc.1)
FreeBSD 现状
MacOS 计划 计划(0.0.1-rc.1)
Windows 10 否* 否* 否*
WSL 2 否** 否** 计划(0.0.1-rc.1)

由于带宽有限,Windows 10 目前被降级。这可能在将来改变。

** 假设 WSL 2 与 GNU/Linux 完全兼容,因此除在 GNU/Linux 上进行的测试外,没有官方的预发布测试。

依赖

~12–26MB
~411K SLoC