ChatGPT.nvim
ChatGPT
是一个 Neovim 插件,使您能够轻松利用 OpenAI 的 ChatGPT API,直接在编辑器中生成自然语言响应,以回答您的查询。
功能
-
互动问答:使用直观的界面,与强大的 GPT 模型(ChatGPT)进行互动问答。
-
基于人物的对话:通过从 Awesome ChatGPT Prompts 中选择提示,探索各种观点并与不同的人物进行对话。
-
代码编辑协助:通过互动编辑窗口提高您的编码体验,该窗口由 GPT 模型支持,提供针对编码任务的定制指令。
-
代码补全:享受类似 GitHub Copilot 的代码补全便利,利用 GPT 模型根据上下文和编程模式建议代码片段和补全。
-
可自定义的操作:使用 GPT 模型执行一系列操作,例如语法纠正、翻译、关键词生成、文档字符串创建、测试添加、代码优化、总结、错误修复、代码解释、Roxygen 编辑和代码可读性分析。此外,您还可以使用 JSON 文件定义自己的自定义操作。
欲全面了解该插件的功能,可以观看插件展示 视频。
安装
-
确保您已安装
curl
。 -
从 OpenAI 获取一个 API 密钥,您可以通过 此处 获取。(注意:ChatGPT Plus 订阅目前不包括所需的 API 额度。您需要单独购买 API 额度 此处。)
提供 OpenAI API 密钥的方式有以下两种:
-
在配置选项
api_key_cmd
中,提供返回 API 密钥的可执行文件的路径和参数,通过 stdout 返回。 -
通过名为
$OPENAI_API_KEY
的环境变量设置。
通过配置选项 api_host_cmd
或 名为 $OPENAI_API_HOST
的环境变量设置自定义 OpenAI API 主机。如果您无法直接访问 OpenAI,这将很有用。
可以使用配置选项 extra_curl_params
传递自定义 cURL 参数。如果需要包含请求的额外头信息,这将很有用:
{
...,
extra_curl_params = {
"-H",
"Origin: https://example.com"
}
}
对于 Azure 部署,您需要指定 URL 基址、引擎和 API 类型。可以通过以下两种方式实现:
- 使用配置选项
api_type_cmd
、azure_api_base
、azure_api_engine_cmd
和azure_api_version_cmd
。每一个都应为返回相应值的可执行命令。
例如:
local config = {
api_host_cmd = 'echo -n ""',
api_key_cmd = 'pass azure-openai-key',
api_type_cmd = 'echo azure',
azure_api_base_cmd = 'echo https://{your-resource-name}.openai.azure.com',
azure_api_engine_cmd = 'echo chat',
azure_api_version_cmd = 'echo 2023-05-15'
}
require("chatgpt").setup(config)
- 通过环境变量设置值
$OPENAI_API_TYPE
、$OPENAI_API_BASE
、$OPENAI_API_AZURE_ENGINE
和$OPENAI_API_AZURE_VERSION
。
例如:
export OPENAI_API_TYPE="azure"
export OPENAI_API_BASE="https://{your-resource-name}.openai.azure.com"
export OPENAI_API_AZURE_ENGINE="chat"
export OPENAI_API_AZURE_VERSION="2023-05-15"
请注意,编辑模型已弃用,可能无法正常工作。
如果您使用 packer.nvim 作为插件管理器:
-- Packer
use({
"jackMort/ChatGPT.nvim",
config = function()
require("chatgpt").setup()
end,
requires = {
"MunifTanjim/nui.nvim",
"nvim-lua/plenary.nvim",
"folke/trouble.nvim",
"nvim-telescope/telescope.nvim"
}
})
或者如果您使用 [lazy.nvim](https://github.com/folke/lazy.nvim):
-- Lazy
{
"jackMort/ChatGPT.nvim",
event = "VeryLazy",
config = function()
require("chatgpt").setup()
end,
dependencies = {
"MunifTanjim/nui.nvim",
"nvim-lua/plenary.nvim",
"folke/trouble.nvim",
"nvim-telescope/telescope.nvim"
}
}
配置
ChatGPT.nvim
提供了以下默认配置,您可以在 setup 参数中传递 config 来覆盖它们
示例配置
聊天模型的一个简单配置可能如下所示:
{
"jackMort/ChatGPT.nvim",
event = "VeryLazy",
config = function()
require("chatgpt").setup({
-- 此配置假设您已设置 OPENAI_API_KEY 环境变量
openai_params = {
-- 注意:模型可以是一个返回模型名称的函数
-- 这对于您想要使用命令动态更改模型时很有用
-- 例如:
-- model = function()
-- if some_condition() then
-- return "gpt-4-1106-preview"
-- else
-- return "gpt-3.5-turbo"
-- end
-- end,
model = "gpt-4-1106-preview",
frequency_penalty = 0,
presence_penalty = 0,
max_tokens = 4095,
temperature = 0.2,
top_p = 0.1,
n = 1,
}
})
end,
dependencies = {
"MunifTanjim/nui.nvim",
"nvim-lua/plenary.nvim",
"nvim-telescope/telescope.nvim"
}
}
秘密管理
通过环境变量提供 OpenAI API 密钥是危险的,因为任何能够访问其他进程环境变量的进程都能轻松读取 API 密钥。此外,这鼓励用户在配置文件中以明文存储凭据。
作为通过 OPENAI_API_KEY
环境变量提供 API 密钥的替代方法,建议用户使用 api_key_cmd
配置选项。api_key_cmd
配置选项接受一个字符串,该字符串在启动时执行,其输出用作 API 密钥。
以下配置将使用 1Password 的 CLI op
从 OpenAI
条目的 credential
字段中获取 API 密钥。
require("chatgpt").setup({
api_key_cmd = "op read op://private/OpenAI/credential --no-newline"
})
以下配置将使用 GPG 解密包含 API 密钥的本地文件
local home = vim.fn.expand("$HOME")
require("chatgpt").setup({
api_key_cmd = "gpg --decrypt " .. home .. "/secret.txt.gpg"
})
请注意,api_key_cmd
参数通过空白字符分割。如果您需要在参数中包含空白字符(例如引用带空格的路径),可以将其包装在一个单独的脚本中。
使用
插件暴露以下命令:
ChatGPT
ChatGPT
命令打开使用 gpt-3.5-turbo
模型的互动窗口。
(也称为 ChatGPT
)
ChatGPTActAs
ChatGPTActAs
命令打开从 Awesome ChatGPT Prompts 中选择提示的界面,使用 gpt-3.5-turbo
模型。
ChatGPTEditWithInstructions
ChatGPTEditWithInstructions
命令打开互动窗口,使用 code-davinci-edit-001
模型(GPT 3.5 为编码微调),编辑选定的文本或整个窗口。
你可以使用 Lua API 映射,例如使用 which-key.nvim
:
local chatgpt = require("chatgpt")
wk.register({
p = {
name = "ChatGPT",
e = {
function()
chatgpt.edit_with_instructions()
end,
"Edit with instructions",
},
},
}, {
prefix = "<leader>",
mode = "v",
})
- 演示视频.
ChatGPTRun
ChatGPTRun [action]
命令运行特定操作——请参阅 actions.json
文件以获得详细列表。可用操作如下:
grammar_correction
translate
keywords
docstring
add_tests
optimize_code
summarize
fix_bugs
explain_code
roxygen_edit
code_readability_analysis
——请参阅演示
以上所有操作都使用 gpt-3.5-turbo
模型。
可以用 JSON 文件定义自定义操作。请参阅 actions.json
示例。自定义操作的路径可以在配置中设置(见上面配置示例中的 actions_paths
字段)。
自定义操作示例如下:(#
表示注释)
{
"action_name": {
"type": "chat", # 或者 "completion" 或 "edit"
"opts": {
"template": "使用可能变量的模板:{{filetype}}(neovim 文件类型),{{input}}(选择的文本)和 {{argument}}(命令行提供的),{{filepath}}(文件的相对路径)",
"strategy": "replace", # 或者 "display" 或 "append" 或 "edit"
"params": { # 根据官方 OpenAI API 的参数
"model": "gpt-3.5-turbo", # 或任何其他模型,根据 OpenAI API 中的 `"type"` 支持,参考 playground
"stop": [
"```" # 用于停止模型的字符串
]
}
},
"args": {
"argument": {
"type": "string",
"optional": "true",
"default": "some value"
}
}
}
}
edit
策略是将输出与输入并排显示,可用于进一步编辑请求。 目前,edit
策略只在 chat
类型中实现。
display
策略会在浮动窗口中显示输出。
append
和 replace
直接在缓冲区中修改文本。
交互式弹出窗口
使用 ChatGPT
和 ChatGPTEditWithInstructions
时,以下键绑定可用:
<C-Enter>
[Both] 提交。<C-y>
[Both] 复制/剪切最后一个答案。<C-o>
[Both] 切换设置窗口。<C-h>
[Both] 切换帮助窗口。<Tab>
[Both] 循环切换窗口。<C-f>
[Chat] 循环切换模式(居中,右对齐)。<C-c>
[Both] 关闭聊天窗口。<C-p>
[Chat] 切换会话列表。<C-u>
[Chat] 向上滚动聊天窗口。<C-d>
[Chat] 向下滚动聊天窗口。<C-k>
[Chat] 复制/剪切最后一个答案的代码。<C-n>
[Chat] 开启新会话。<C-r>
[Chat] 草拟消息(创建消息但不提交到服务器)。<C-r>
[Chat] 切换角色(在用户和助手角色之间切换以定义工作流程)。<C-s>
[Both] 切换系统消息窗口。<C-i>
[编辑窗口] 将响应用作输入。<C-d>
[编辑窗口] 查看左右窗格之间的差异并使用差异模式命令。
当设置窗口打开时(用 <C-o>
),可以通过按 Enter
修改相关配置。设置会保存在各个会话中。
Whichkey 插件映射
将这些添加到你的 whichkey 插件映射中,以便于绑定
c = {
name = "ChatGPT",
c = { "<cmd>ChatGPT<CR>", "ChatGPT" },
e = { "<cmd>ChatGPTEditWithInstruction<CR>", "Edit with instruction", mode = { "n", "v" } },
g = { "<cmd>ChatGPTRun grammar_correction<CR>", "Grammar Correction", mode = { "n", "v" } },
t = { "<cmd>ChatGPTRun translate<CR>", "Translate", mode = { "n", "v" } },
k = { "<cmd>ChatGPTRun keywords<CR>", "Keywords", mode = { "n", "v" } },
d = { "<cmd>ChatGPTRun docstring<CR>", "Docstring", mode = { "n", "v" } },
a = { "<cmd>ChatGPTRun add_tests<CR>", "Add Tests", mode = { "n", "v" } },
o = { "<cmd>ChatGPTRun optimize_code<CR>", "Optimize Code", mode = { "n", "v" } },
s = { "<cmd>ChatGPTRun summarize<CR>", "Summarize", mode = { "n", "v" } },
f = { "<cmd>ChatGPTRun fix_bugs<CR>", "Fix Bugs", mode = { "n", "v" } },
x = { "<cmd>ChatGPTRun explain_code<CR>", "Explain Code", mode = { "n", "v" } },
r = { "<cmd>ChatGPTRun roxygen_edit<CR>", "Roxygen Edit", mode = { "n", "v" } },
l = { "<cmd>ChatGPTRun code_readability_analysis<CR>", "Code Readability Analysis", mode = { "n", "v" } },
},