Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

README.md

All AI tools can configure their own model parameters, in the same way as the Chat's configuration.

  • Dependency
local tools = require("llm.tools")

side_by_side_handler

["Tool Name"] = {
  handler = tools.side_by_side_handler,
  prompt = "xxxxxxxx",
  opts = {
    ---------------------------------------
    -- [Optional] set your model parameters
    timeout = 30,
    ---------------------------------------
    left = {
      focusable = false,
      border = {
        style = "rounded",
        text = { top = " Source ", top_align = "center" },
      },
      buf_options = {
        buftype = "nofile",
        filetype = ft,
      },
      win_options = {
        spell = false,
        number = true,
        wrap = true,
        linebreak = false,
      },
    },
    right = {
      focusable = true,
      border = {
        style = "rounded",
        text = { top = " Preview ", top_align = "center" },
      },
      enter = true,
      buf_options = {
        buftype = "nofile",
        filetype = ft,
      },
      win_options = {
        spell = false,
        number = true,
        wrap = true,
        linebreak = false,
      },
    },
    accept = {
      mapping = {
        mode = "n",
        keys = { "Y", "y" },
      },
      action = nil,
    },
    reject = {
      mapping = {
        mode = "n",
        keys = { "N", "n" },
      },
      action = nil,
    },
    close = {
      mapping = {
        mode = "n",
        keys = { "<esc>" },
      },
      action = nil,
    },
  },
}

action_handler

["Tool Name"] = {
  handler = tools.action_handler,
  prompt = "xxxxxxxx",
  opts = {
    ---------------------------------------
    -- [Optional] set your model parameters
    timeout = 30,
    ---------------------------------------
    -- Code block formatting
    start_str = "```",
    end_str = "```",

    -- Not to show the analysis process, only to show the final diff.
    only_display_diff = false,
    -- To set additional rules for different languages
    templates = nil,
    language = "English",

    -- Press "i" to open the input window, resubmit your request
    input = {
      relative = "win",
      position = "bottom",
      size = "25%",
      enter = true,
      buf_options = {
        filetype = "llm",
        buftype = "nofile",
      },
      win_options = {
        spell = false,
        number = false,
        relativenumber = false,
        wrap = true,
        linebreak = false,
        signcolumn = "no",
      },
    },
    output = {
      relative = "editor",
      position = "right",
      size = "25%",
      enter = true,
      buf_options = {
        filetype = "llm",
        buftype = "nofile",
      },
      win_options = {
        spell = false,
        number = false,
        relativenumber = false,
        wrap = true,
        linebreak = false,
        signcolumn = "no",
      },
    },
    accept = {
      mapping = {
        mode = "n",
        keys = { "Y", "y" },
      },
      action = nil,
    },
    reject = {
      mapping = {
        mode = "n",
        keys = { "N", "n" },
      },
      action = nil,
    },
    close = {
      mapping = {
        mode = "n",
        keys = { "<esc>" },
      },
      action = nil,
    },
  },
}

qa_handler

["Tool Name"] = {
  handler = tools.qa_handler,
  prompt = "xxxxxxxx",
  opts = {
    ---------------------------------------
    -- [Optional] set your model parameters
    timeout = 30,
    ---------------------------------------
    -- The overall size setting of input + preview windows
    component_width = "60%",
    component_height = "55%",

    input_box_opts = {
      enter = true,
      size = "15%",
      border = {
        style = "rounded",
        text = {
          top = " 󰊿 Trans ",
          top_align = "center",
        },
      },
      border = {
        style = "rounded",
        text = { top_align = "center" },
      },
      buf_options = {
        buftype = "nofile",
        filetype = "llm",
      },
      win_options = {
        spell = false,
        number = false,
        wrap = true,
        linebreak = false,
        winhighlight = "Normal:Normal,FloatBorder:FloatBorder,FloatTitle:Define",
      },
    },
    preview_box_opts = {
      focusable = true,
      size = "85%",
      border = {
        style = "rounded",
        text = { top = "", top_align = "center" },
      },
      buf_options = {
        buftype = "nofile",
        filetype = "llm",
      },
      win_options = {
        spell = false,
        number = false,
        wrap = true,
        linebreak = false,
        winhighlight = "Normal:Normal,FloatBorder:FloatBorder",
      },
    },
    accept = {
      mapping = {
        mode = "n",
        keys = { "Y", "y" },
      },
      action = nil,
    },
    reject = {
      mapping = {
        mode = "n",
        keys = { "N", "n" },
      },
      action = nil,
    },
    close = {
      mapping = {
        mode = "n",
        keys = { "<esc>" },
      },
      action = nil,
    },
  },
}

images_handler

["Tool Name"] = {
  handler = tools.images_handler,
  prompt = "xxxxxxxx",
  opts = {
    ---------------------------------------
    -- [Optional] set your model parameters
    timeout = 30,
    ---------------------------------------
    picker = {
      cmd = "fzf",
      position = "50%",
      size = "60%",
      relative = "editor",
      select = {
        border = {
          style = "rounded",
          text = {
            top = " Files ",
            top_align = "center",
          },
        },
      },
      mapping = {
        mode = "i",
        keys = "<C-f>",
      },
    },
    -- The overall size setting of input + preview windows
    component_width = "60%",
    component_height = "55%",

    input_box_opts = {
      enter = true,
      size = "15%",
      border = {
        style = "rounded",
        text = {
          top = " Image Path ",
          top_align = "center",
        },
      },
      buf_options = {
        filetype = "llm",
        buftype = "nofile",
      },
      win_options = {
        spell = false,
        number = false,
        wrap = true,
        linebreak = false,
        winhighlight = "Normal:Normal,FloatBorder:FloatBorder,FloatTitle:Define",
      },
    },
    preview_box_opts = {
      focusable = true,
      size = "85%",
      border = {
        style = "rounded",
        text = { top = "", top_align = "center" },
      },
      buf_options = {
        filetype = "llm",
        buftype = "nofile",
      },
      win_options = {
        spell = false,
        number = false,
        wrap = true,
        linebreak = false,
        winhighlight = "Normal:Normal,FloatBorder:FloatBorder",
      },
    },
    accept = {
      mapping = {
        mode = "n",
        keys = { "Y", "y" },
      },
      action = nil,
    },
    reject = {
      mapping = {
        mode = "n",
        keys = { "N", "n" },
      },
      action = nil,
    },
    close = {
      mapping = {
        mode = "n",
        keys = { "<esc>" },
      },
      action = nil,
    },
  },
}

flexi_handler

["Tool Name"] = {
  handler = tools.flexi_handler,
  prompt = "xxxxxxxx",
  opts = {
    ---------------------------------------
    -- [Optional] set your model parameters
    timeout = 30,
    ---------------------------------------
    -- The window closes when the cursor moves.
    exit_on_move = false,
    -- When the result pops up, automatically focus on the result preview window.
    enter_flexible_window = true,

    -- Whether to use the selected content as the context for the language model
    -- For the feature of generating AI Commit Messages, this option should be set to false.
    apply_visual_selection = true,
    win_opts = {
      win_options = {
        spell = false,
        wrap = true,
        number = false,
        linebreak = false,
      },
      buf_options = {
        buftype = "nofile",
        filetype = "llm",
      },
    },
    accept = {
      mapping = {
        mode = "n",
        keys = { "Y", "y" },
      },
      action = nil,
    },
    reject = {
      mapping = {
        mode = "n",
        keys = { "N", "n" },
      },
      action = nil,
    },
    close = {
      mapping = {
        mode = "n",
        keys = { "<esc>" },
      },
      action = nil,
    },
  },
}

disposable_ask_handler

["Tool Name"] = {
  handler = tools.disposable_ask_handler,
  prompt = "xxxxxxxx",
  opts = {
    ---------------------------------------
    -- [Optional] set your model parameters
    timeout = 30,
    ---------------------------------------
    language = "English",

    -- Whether to enable diff feature
    inline_assistant = false,
    -- Display diff
    display = {
      mapping = {
        mode = "n",
        keys = { "d" },
      },
      action = nil,
    },

    buf_options = {
      filetype = "llm",
    },
    win_options = {
      winblend = 0,
      winhighlight = "Normal:Normal,FloatBorder:FloatBorder",
    },
    border = {
      style = "rounded",
      text = {
        top = " Ask ",
        top_align = "center",
      },
    },
    position = {
      row = 0,
      col = 0,
    },
    relative = "cursor",
    size = {
      width = "50%",
      height = "5%",
    },
    enter = true,
    copy_suggestion_code = {
      mapping = {
        mode = "n",
        keys = { "Y", "y" },
      },
    },
    accept = {
      mapping = {
        mode = "n",
        keys = { "Y", "y" },
      },
      action = nil,
    },
    reject = {
      mapping = {
        mode = "n",
        keys = { "N", "n" },
      },
      action = nil,
    },
    close = {
      mapping = {
        mode = "n",
        keys = { "<esc>" },
      },
      action = nil,
    },
  },
}

attach_to_chat_handler

["Tool Name"] = {
  handler = tools.attach_to_chat_handler,
  prompt = "xxxxxxxx",
  opts = {
    ---------------------------------------
    -- [Optional] set your model parameters
    timeout = 30,
    ---------------------------------------
    language = "English",

    -- If set to True, it will automatically convert the format to code block based on the current file's suffix.
    is_codeblock = false,
    -- Whether to enable diff feature
    inline_assistant = false,
    -- Display diff
    display = {
      mapping = {
        mode = "n",
        keys = { "d" },
      },
      action = nil,
    },

    copy_suggestion_code = {
      mapping = {
        mode = "n",
        keys = { "Y", "y" },
      },
      action = nil,
    },
    accept = {
      mapping = {
        mode = "n",
        keys = { "Y", "y" },
      },
      action = nil,
    },
    reject = {
      mapping = {
        mode = "n",
        keys = { "N", "n" },
      },
      action = nil,
    },
    close = {
      mapping = {
        mode = "n",
        keys = { "<esc>" },
      },
      action = nil,
    },
  },
}

completion_handler

Completion = {
  handler = tools.completion_handler,
  opts = {
    timeout = 10,
    context_window = 12800,
    context_ratio = 0.75,
    -- only send the request every x milliseconds, use 0 to disable throttle.
    throttle = 400,
    -- debounce the request in x milliseconds, set to 0 to disable debounce
    debounce = 200,
    filetypes = {},
    default_filetype_enabled = true,
    auto_trigger = true,
    only_trigger_by_keywords = true,
    style = "virtual_text",
    keymap = {
      virtual_text = {
        accept = {
          mode = "i",
          keys = "<A-a>",
        },
        next = {
          mode = "i",
          keys = "<A-n>",
        },
        prev = {
          mode = "i",
          keys = "<A-p>",
        },
      },
      toggle = {
        mode = "n",
        keys = "<leader>cp",
      },
    },
  }

See the Example

curl_request_handler

UserInfo = {
  handler = function()
    local tools = require("llm.tools")
    local key = os.getenv("SILICONFLOW_TOKEN")
    local res = tools.curl_request_handler(
      "https://api.siliconflow.cn/v1/user/info",
      { "GET", "-H", string.format("'Authorization: Bearer %s'", key) }
    )
    if res ~= nil then
      print("balance: " .. res.data.balance)
    end
  end,
}