(分享)gptel 版本升级至 0.98,带来诸多新特性,包括 tool-use

版本0.9.8新增了对Gemini、Anthropic、OpenAI、Perplexity和DeepSeek等新型号的支持,引入了LLM工具使用/函数调用功能,重新设计了gptel-menu,新增了自定义钩子、模拟运行选项和优化设置,改进了重写功能并增强了对LLM“推理”内容的控制。

重大变更

  • gemini-pro已从Gemini模型列表中移除,因为Gemini API不再支持此模型。

  • 在Org模式下发送活动区域时,现将对文本应用Org模式特定的规则,例如分支上下文。

  • 以下过时的变量和函数已被移除:

    • gptel-send-menu:请改用gptel-menu。

    • gptel-host:请改用gptel-make-openai。

    • gptel-playback:请改用gptel-stream。

    • gptel–debug:请改用gptel-log-level。

新模型与后端支持

  • 新增了对多个Gemini模型的支持,包括gemini-2.0-flash、gemini-2.0-pro-exp和gemini-2.0-flash-thinking-exp等。

  • 新增了对Anthropic模型claude-3-7-sonnet-20250219的支持,包括其“推理”输出。

  • 新增了对OpenAI的o1、o3-mini和gpt-4.5-preview模型的支持。

  • 新增了对Perplexity的原生支持。虽然早期版本的gptel通过复用OpenAI支持Perplexity,但现在提供了对Perplexity API的完整支持,包括引用功能。

  • 新增了对DeepSeek的原生支持。早期版本通过复用OpenAI支持DeepSeek,现提供对DeepSeek API的完整支持,包括处理“推理”输出。

新功能与界面调整

  • gptel-rewrite现支持对响应的迭代优化。

  • gptel支持模拟/试运行请求,用户可准确查看将要发送的内容。此负载预览现可在原地编辑并继续请求。

  • 现可将目录添加到gptel的全局上下文中,递归添加目录中的所有文件。

  • “一次性”设置:使用gptel的瞬态菜单时,请求参数、指令和工具现可仅为下一次请求设置,而不仅限于Emacs会话全局或缓冲区本地设置。这对临时使用不同设置的请求非常有用。

  • gptel-mode现可用于所有派生自text-mode的模式。

  • gptel现尝试正确处理混合Org/Markdown标记的LLM响应。

  • 新增gptel-org-convert-response,可切换是否将(可能为)Markdown格式的LLM响应自动转换为Org标记。

  • 现可通过gptel-get-backend函数查询注册的gptel后端,旨在简化脚本编写和配置。gptel-get-backend为广义变量,可通过setf设置或取消后端。

  • 工具使用:gptel现支持LLM工具使用或函数调用。用户可为LLM配备功能(如文件系统访问、网络搜索、控制Emacs或检查Emacs状态等),以执行任务。gptel使用LLM提供的参数值运行这些工具。需指定工具,即带有参数和结果纯文本描述的elisp函数。目前gptel尚未内置任何工具。

  • 现可通过gptel-get-tool函数查询注册的gptel工具,旨在简化脚本编写和配置。gptel-get-tool为广义变量,可通过setf设置或取消工具。

新增自定义钩子

  • gptel-prompt-filter-hook:在创建完整查询前,于包含待发送文本的临时缓冲区中运行,可用于对源文本进行任意转换。

  • gptel-post-request-hook:在请求发送后、响应接收前(可能)运行,适用于准备/重置代码。

  • gptel-post-rewrite-hook:在gptel-rewrite请求成功且完整接收后运行。

  • gptel-menu经过重新设计,现显示将发送内容及输出目标的详细描述,旨在阐明gptel的默认提示行为及各种提示/响应重定向效果。不兼容的选项组合现被禁用。

  • 提示结束与响应开始之间的间距现可通过gptel-response-separator自定义,支持任意字符串。

  • gptel-context-remove-all现为交互式命令。

  • gptel现可处理LLM生成的“推理”内容。部分LLM会在响应中包含“思考”或“推理”部分,此文本可提升最终输出质量,但本身可能对用户无直接吸引力。新用户选项gptel-include-reasoning控制是否及如何显示此内容。

  • (仅Anthropic API)部分LLM后端可缓存gptel发送的内容,仅需在后续对话轮次处理新增文本,从而加快处理速度并大幅降低成本。新用户选项gptel-cache可指定对提示、系统消息和/或工具定义的缓存偏好。目前仅Anthropic API支持此功能。

  • (Org模式)发送查询前,现会从提示文本中移除Org属性抽屉。可通过gptel-org-ignore-elements控制此行为或指定其他忽略的Org元素。(更复杂的预处理可使用gptel-prompt-filter-hook。)

重要错误修复

  • 修复在Org模式缓冲区中并发请求时的响应混乱问题。

  • gptel现可绕过Org模式中因流式响应导致源代码块未被正确高亮的字体化错误。

7 个赞

以前试用gptel时发现的最大问题是,首先打开一个使用模型la的gptel buffer A,然后打开一个使用模型lb的gptel buffer B,A里面的模型也会自动改为lb。作者当时给我的回复是可以去A里面通过transient菜单改回去。我可。。。然后换成ellama了。

gptel 的易用性没那么高,ellama 和 ollama-buddy 都提供了更加易用的方案。不过我觉还是觉得 gptel 的发展,代表着 emacs 在 ai 方面的方向。

https://www.reddit.com/r/emacs/comments/1jb6xtb/gptel_098_released_tooluse_support_for_reasoning/

gptel 0.9.8 版本发布(支持工具使用、捕获“推理”输出、试运行选项等)

gptel 是一个为 Emacs 设计的大型语言模型客户端。它力求在 Emacs 中保持灵活性和统一性。(项目 README 中有更多详细信息)

v0.9.8 版本更新说明

此次更新包含了许多新功能和修复,以下是部分亮点:

  • LLM 工具使用支持现已稳定这里有一个示例,展示了 LLM 创建一些文件的过程,以及 u/Psionikus 制作的视频,演示了如何使用工具功能探索 Emacs 包和 elisp 代码。
  • LLM 生成的“推理”输出现已被 gptel 捕获,并且你可以控制是否以及如何显示这些输出。示例
  • gptel 的菜单已重新设计,现在可以准确描述你所选择的重定向选项将执行的操作。(这一改进由 u/JDRiverRun 建议。)
  • gptel 的试运行输出,用于查看将要发送的确切数据现在可以在恢复请求之前直接编辑。

细节说明:

关于工具(tool-use)的说明:工具使用功能使得 gptel 能够实现“代理式”的 LLM 工作流,但 gptel 目前并未自带任何工具。其目标是建立一个共享的工具库,供所有 Emacs 的 LLM 客户端使用。目前有一个 llm-tool-collection 仓库,但内容较为简单——欢迎提交你编写的工具到该仓库。

工具规范格式是与 u/ahyatt 合作开发的,以便 gptel 和 llm 库的使用者(如 Ellama)可以使用相同的工具,未来其他支持工具调用的 Emacs LLM 客户端也有望兼容。

关于 MCP 的说明:Anthropic 的模型上下文协议(Model Context Protocol)为 LLM 提供了上下文和工具的接口。目前有一个 mcp.el 用于 Emacs,可以与 gptel 的工具使用接口配合,但双向支持仍处于初期阶段。

1 个赞

现在 Request Parameters 已经支持设置 scope 了(global,buffer,oneshot)

gptel 的项目名有点吃亏,咋一看以为是只能用于 OpenAI的 GPT

请教一下,如何设置成deepseek? 默认是chatgpt, 模型只能选chatgpt的模型

karthink/gptel: A simple LLM client for Emacs

(setq gptel-model 'deepseek-chat
      gptel-backend (gptel-make-deepseek "Deepseek"
		      :stream t
		      :key "sk-你的 deepseek KEY")
      gptel-use-curl nil)

系统上有 curl 可以去掉下面那个变量设定。

README 里面的 gptel-model 推荐设置是 deepseek-reasoner ,可能我没用到相关功能,写成 deepseek-chat 似乎也能用。

2 个赞

其实现在绝大部分的LLM都是GPT,只是各大产品为了和ChatGPT做出差异化取名取得比较随性了而已

1 个赞

如果没有/不想用 openai 的模型,可以用下面的代码删除默认模型:

  ;; remove default ChatGPT provider from backends
  (dolist (item gptel--known-backends)
    (if (string= (car item) "ChatGPT")
        (setq gptel--known-backends (cl-remove item gptel--known-backends))))
1 个赞

这东西能离线运行吗

支持 ollama

好的,我去看看哪个能集成显卡跑起来 :sweat_smile:

看了下支持emacs 27, 太好了

这是 deepseek-reasoner 特有的功能吗?试了下只有 deepseek-reasoner 会输出思考过程,o3-mini 不会,OpenAI 文档中也没有提到 reasoning_content,是不是 API 不支持?

➜  ~ curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "o3-mini",
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "Explain pipeline in shell"
        }
      ]
    }
  ],
  "response_format": {
    "type": "text"
  },
  "reasoning_effort": "medium",
  "store": true, "stream": true
}' -v

data: {"id":"chatcmpl-BEburqikiZ7DVq5wuHifTu9gkktG9","object":"chat.completion.chunk","created":1742822041,"model":"o3-mini-2025-01-31","service_tier":"default","system_fingerprint":"fp_617f206dd9","choices":[{"index":0,"delta":{"content":"A"},"finish_reason":null}]}

data: {"id":"chatcmpl-BEburqikiZ7DVq5wuHifTu9gkktG9","object":"chat.completion.chunk","created":1742822041,"model":"o3-mini-2025-01-31","service_tier":"default","system_fingerprint":"fp_617f206dd9","choices":[{"index":0,"delta":{"content":" pipeline"},"finish_reason":null}]}

data: {"id":"chatcmpl-BEburqikiZ7DVq5wuHifTu9gkktG9","object":"chat.completion.chunk","created":1742822041,"model":"o3-mini-2025-01-31","service_tier":"default","system_fingerprint":"fp_617f206dd9","choices":[{"index":0,"delta":{"content":" in"},"finish_reason":null}]}

o3-mini 不是推理大模型。

不是的,o系列都是推理模型

https://platform.openai.com/docs/models

openai 屏蔽了 thinking token 不对用户发布。他们最开始怕友商蒸馏他们的模型所以不选择发布。结果没想到 deepseek claude qwen 等完全不靠蒸馏,就靠着 RL 自己训也训出来了。

1 个赞

哦,推理不输出过程的话,我也不清楚咋推理的,甚至推理了没。等下试试看 qwq 的,看了文档也是支持输出推理过程的。

我两个都配置了,但是也是感觉 ellama 的 UI 更符合直觉。不过 ellama 实在是 bug 太多了,宣传也不如 gptel ,看 star 数能看出来