V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
tbxark
V2EX  ›  分享创造

使用纯 Bash 脚本直接从终端询问 LLM

  •  1
     
  •   tbxark ·
    tbxark · 169 天前 · 2352 次点击
    这是一个创建于 169 天前的主题,其中的信息可能已经有所发展或是发生改变。

    shell-ask

    https://github.com/TBXark/shell-ask

    直接从您的终端询问 LLM, 不离开终端直接让 AI 帮你解答终端的输出。或者生成你不熟悉的 shell 指令。一个 bash 脚本就能解决。

    Install

    此脚本是用 bash 编写的,只需下载脚本并添加执行权限,该脚本依赖于curljq,请确保它们已安装在您的系统上!

    curl https://raw.githubusercontent.com/TBXark/shell-ask/master/ask.sh > /usr/local/bin/ask
    chmod +x /usr/local/bin/ask
    

    Supported LLMs

    • 所有兼容 OpenAI 的 LLMs API

    Configuration

    Config File

    ask set-config answer_language chinese
    ask set-config api_key sk-xxxx
    ask set-config api_model deepseek-chat
    ask set-config api_endpoint https://api.deepseek.com/chat/completions
    

    您也可以直接编辑 ~/.config/ask.sh/config.json

    Environment Variables

    If you don't want to use a configuration file, you can set the configuration via environment variables.

    export SHELL_ASK_API_KEY=xxx
    export SHELL_ASK_API_MODEL=xxx
    export SHELL_ASK_API_ENDPOINT=xxx
    export SHELL_ASK_ANSWER_LANGUAGE=xxx
    

    或者您可以通过设置 SHELL_ASK_CONFIG_FILE 环境变量来更改配置文件路径。

    export SHELL_ASK_CONFIG_FILE=/path/to/config.json
    

    Usage

    根据问题生成 Shell 命令:

    ask "What was my last git commit message?"
    

    使用命令输出作为上下文:

    ifconfig -a | ask "My local IP"
    

    Thanks

    这个项目的灵感来自 egoist/shell-ask,但由于它依赖于 nodejs ,所以我决定用 bash 重写它

    第 1 条附言  ·  169 天前

    文档里的ask后面双引号只是起装饰作用,其实没有什么意义,你可以直接输入提示词

    ➜  ~ ask what is my local ip
    
    # /sbin/ifconfig | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}'
    
    ➜  ~ ifconfig -a | ask What is my local IP
    # Your local IP address is `192.168.31.200`. This is the IPv4 address listed under the `en0` interface with the status "active".
    

    具体原理如下

    在Shell脚本中,$* 是一个特殊变量,用于表示传递给脚本的所有参数。具体来说,$* 会将所有参数作为一个单独的字符串返回,其中参数之间由第一个字符的 IFS(内部字段分隔符)变量分隔。如果 IFS 未设置,则默认使用空格分隔参数

    第 2 条附言  ·  169 天前

    添加插件系统

    安装插件

    ask install-plugin https://raw.githubusercontent.com/TBXark/shell-ask/master/plugins/translate.sh
    

    或者您可以手动安装插件到 ~/.config/ask.sh/plugins 目录中。

    Use Plugin

    echo "你好" | ask -p translate english
    

    编写插件

    #!/bin/bash
    
    # echo "Location: $(pwd)"
    # 您可以使用与 ask.sh 相同的上下文
    
    # 插件脚本必须包含一个 gen_content 函数,该函数需要两个参数。第一个参数是用户输入,第二个参数是管道输入。
    gen_content() {
        question=$1 # target language
        context=$2 # need translation text
    
        # 只能有一个 /dev/stdin 输出。如果其他命令也会导致输出,则需要将它们重定向到其他地方。
        echo "Translate the following text into $question: $context"
    }
    
    15 条回复    2024-05-24 08:20:37 +08:00
    cdlnls
        1
    cdlnls  
       169 天前 via Android
    这个工具的使用方法很有意思!

    感觉可以扩展一下,在命令行中通过管道,经过一个程序之后,再从管道的另一段输出,就可以实现通过 AI 修改配置文件。不仅仅是让 AI 解析输出结果
    RandyLuo
        2
    RandyLuo  
       169 天前 via Android
    我没记错的话,egoist 前天开源了一个一样的 bash 工具
    RandyLuo
        3
    RandyLuo  
       169 天前 via Android
    RandyLuo
        4
    RandyLuo  
       169 天前 via Android
    抱歉,滑手机看到的,看到项目最底下的引用声明了
    tbxark
        5
    tbxark  
    OP
       169 天前 via iPhone
    @RandyLuo 对就是懒得给 pve 里的容器装 node 所以才写的
    hitsmaxft
        6
    hitsmaxft  
       169 天前 via iPhone
    我之前用 openai 辅助写了个 rust 实现的 gemini cli
    hitsmaxft
        7
    hitsmaxft  
       169 天前 via iPhone
    coolloves
        8
    coolloves  
       169 天前
    支持了,有点小小建议,可以考虑修改下,要不,每次输入还需要用引号,

    ask() {
    local input=""
    local content=""
    local prompt="$@"
    #local prompt="$1"


    root@n1:/usr/local/bin# ip a |ask what is my local ip
    Your local IP address is 192.168.123.150.
    tbxark
        9
    tbxark  
    OP
       169 天前 via iPhone
    @coolloves 其实不用引号也可以,只不过加上之后 readme 长得比较好看。因为传参的时候已经合并了 ask "$*"
    lekai63
        10
    lekai63  
       169 天前 via iPhone
    iterm2 最新版自带了这个功能,需 OpenAI key
    tbxark
        11
    tbxark  
    OP
       169 天前
    @lekai63 是的,不过 3.5.0 有 BUG ,第三方 API 用不了,在等他 3.5.1 release 。我的这个生成命令的 prompt 就是直接复制 iterm2 默认的 prompt 。
    tbxark
        12
    tbxark  
    OP
       168 天前 via iPhone
    @cdlnls 加了一个插件系统,可以在插件里自定义结果处理函数。可以实现这个功能
    molezznet
        13
    molezznet  
       168 天前
    @tbxark 有问号的话要加引号
    tbxark
        14
    tbxark  
    OP
       168 天前
    @molezznet 这个属于通配符了,可以使用\?转译或者中文?比较快
    adrianzhang
        15
    adrianzhang  
       168 天前
    哇!这个很棒呀!
    如果能实现完全自然语言操作就完美了。例如:
    我的本机 IP 地址,答案:10.10.8.790 。
    修改本机 IP 为 10.10.8.780 答案:好的,已经修改完成,现在的本机 IP 是 10.10.8.780
    本机有几个网卡? 答案:一块网卡
    把 DNS 修改为 10.10.0.1 答案:修改完成

    类似这样。。高抽象具体操作。
    有空我也参与吧。希望你这个项目能坚持下去。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5484 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:36 · PVG 09:36 · LAX 17:36 · JFK 20:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.