(发布)Superchat:提供一个简单好用的 GPTel 对话界面

Superchat.el

简介

Superchat.el 是一个独立的 Emacs AI 聊天客户端,它从 org-supertag 项目的 chat-view 模块演化而来。与原始版本不同,Superchat 去除了所有 org-supertag 特有的依赖,使其成为一个完全独立的包。

主要特性包括:

  • 保留了完整的命令系统

  • 新增了将文件作为上下文添加到对话的功能

  • 支持与各种大型语言模型(LLM)进行对话

  • 使用 GPL-3 协议开源

安装与配置

依赖要求

安装步骤

  1. superchat.el 文件放置在您的 Emacs 加载路径中

  2. 在您的 Emacs 配置文件(通常是 ~/.emacs.d/init.el)中添加以下代码:


(require 'superchat)

基本配置

您可以通过以下自定义选项来配置 Superchat:


;; 设置使用的 AI 模型(如果为 nil,则使用 gptel 的默认模型)

(setq superchat-model "gpt-4")

;; 设置数据存储目录

(setq superchat-data-directory "~/.emacs.d/superchat/")

;; 设置会话保存目录

(setq superchat-save-directory "~/.emacs.d/superchat/chat-notes/")

;; 设置文件选择的默认目录

(setq superchat-default-directories '("~/Documents" "~/Projects"))

快速开始

  1. 使用 M-x superchat 启动 Superchat

  2. 在提示符后输入您的问题

  3. RETC-c C-c 发送消息

  4. 等待 AI 助手回复

基本对话示例


User: 你好,你能帮我做什么?

Assistant: 我是一个 AI 助手,可以帮助您回答问题、分析代码、提供建议等。

核心功能详解

基本对话

Superchat 允许您与各种大型语言模型进行自然语言对话。

命令系统

Superchat 提供了一个强大的命令系统,允许您定义和使用自定义提示词:

  • 内置命令:如 /create-question

  • 自定义命令定义:使用 /define 命令

  • 查看所有可用命令:使用 /commands 命令

在输入提示符后,您可以使用自动补全功能来查看和选择命令:

  1. 输入 / 字符

  2. 继续输入命令的首字母,此时如果你有用 company 或 corfu 插件,从弹出的列表中选择命令。

  3. 如果你没有 company 或 corfu,可以直接按下 M-TAB(或您的 Emacs 环境中的补全键)触发自动补全,从弹出的列表中选择命令。

例如,要使用 /create-question 命令,您可以输入 /c 然后按 M-TAB,系统会显示所有以 ‘c’ 开头的可用命令供您选择。

文件上下文支持

Superchat 可以将文件内容作为上下文添加到对话中:

  1. 在输入提示符后按 #

  2. 选择要添加的文件

  3. 文件内容将作为上下文提供给 AI

您也可以手动输入文件路径,格式为 # /path/to/file

当设置了 superchat-default-directories 时,文件选择将限制在指定的目录中,使您能够更轻松地从预定义位置选择文件。

高级用法

自定义命令

您可以使用 /define 命令创建自定义提示词:


/define explain-code "请解释以下代码的作用:$input"

在自定义提示词中,您可以使用以下变量:

  • $input:用户的输入内容

  • $lang:设置的语言(默认为 English)

上下文管理

  • 使用 /clear-context 命令清除当前会话的所有上下文文件

  • Superchat 会自动管理添加到会话中的文件

键绑定

  • RETC-c C-c:发送输入

  • #:智能添加文件路径到上下文

  • C-c C-h:显示命令列表

  • C-c C-s:保存当前会话

配置选项

以下是 Superchat 的主要自定义选项:

  • superchat-buffer-name:聊天缓冲区的名称(默认为 “Superchat”)

  • superchat-model:使用的 AI 模型(如果为 nil,则使用 gptel 的默认模型)

  • superchat-data-directory:数据存储目录

  • superchat-save-directory:会话保存目录

  • superchat-default-directories:文件选择的默认目录列表

  • superchat-general-answer-prompt:通用回答提示词模板

故障排除

常见问题

  1. 无法连接到 AI 服务:请检查您的 gptel 配置是否正确,包括 API 密钥和端点设置。

  2. 文件上下文未正确添加:确保文件路径正确且文件可读。您可以查看消息缓冲区中的诊断信息来排查问题。

  3. 命令系统使用问题:使用 /commands 命令查看所有可用命令及其用法。

调试建议

  • 检查 gptel 的配置是否正确

  • 查看 *Messages* 缓冲区中的诊断信息

  • 确保所有依赖包都已正确安装和加载

许可证

Superchat.el 采用 GPL-3 协议开源。

8 个赞

新增:

  • 历史上下文支持
  • 输入支持多行输入

版本升级到 0.2

  • 新增记忆系统
  • 可以根据对话总结用户的画像习惯,任务,目标等等
  • 可以在对话中首先检索有无相关的记忆,以形成对话的连续感

目前记忆的召回还有改进的地方,但这个框架已经可以跑了。

这个记忆系统没有使用任何 embedding 的技术,以纯 elisp 实现。

新增依赖 org-ql。

版本升级到 0.2.1 继续更新记忆机制,现在可以

  1. 很好地召回之前记录下来的记忆
  2. 可以很好地自动化总结对话 seesion
  3. 基于使用次数的记忆遗忘算法

更新 0.2.2

现在 superchat 的大模型配置,将完全继承自 gptel。

用户不必自己另行设置,因此删除了容易让人产生误会的 superchat-model 自定义项。

更新:

版本 0.3 (2025-10-03)

  • MCP 集成:集成了 Model Context Protocol (MCP) 支持。

    • 零配置架构,自动检测和集成 MCP 服务器。
    • 实时状态监控,显示服务器连接状态和可用工具数量。
    • 无缝工具集成,MCP 工具自动融入 gptel 的工具系统。
    • 智能服务器管理,支持启动、停止和监控多个 MCP 服务器。
    • 新增 /mcp 和 /mcp-start 命令用于 MCP 管理。
  • gptel Tools 集成:零配置集成 gptel 的工具调用功能。

    • 直接读取用户在 gptel 中配置的 tools,无需重复配置。
    • 在聊天界面中无缝使用 gptel 的工具调用功能。
    • 支持 function calling 能力,可以调用外部工具和 API。
    • 添加 /tools 命令查看当前 tools 状态。
  • @ 模型切换功能:支持通过 @model 语法在对话中直接切换不同的 AI 模型。

    • 在聊天输入中使用 @模型名 语法快速切换模型。
    • 添加 /models 命令查看可用模型列表。
    • 临时模型切换,单次请求后自动恢复原模型。
    • Bug 修复:修复了命令系统初始化和会话管理的问题。
1 个赞

superchat 现在支持 gptel tools——

这里的天气信息来自 openweather 的 api。

;; 工具定义(示例:天气查询工具)
(defun my/ow-fetch-json (location unit)
  (require 'url)
  (require 'json)
  (let ((api-key "API-KEY")
        (units (if (and unit (string-match-p "\\(f\\|F\\)" unit))
                   "imperial"
                 "metric")))
    (when (or (null api-key) (string= api-key ""))
      (error "OpenWeather API key 未设置"))
    (let* ((urlstr (format "https://api.openweathermap.org/data/2.5/weather?q=%s&appid=%s&units=%s"
                           (url-hexify-string location) api-key units))
           (buf (url-retrieve-synchronously urlstr t t 10)))
      (unless buf
        (error "HTTP 请求失败"))
      (with-current-buffer buf
        (goto-char (point-min))
        (unless (search-forward "\n\n" nil t)
          (kill-buffer buf)
          (error "响应格式不对"))
        (let ((data (json-parse-buffer :object-type 'alist
                                       :array-type 'list
                                       :null-object nil
                                       :false-object nil)))
          (kill-buffer buf)
          data)))))

(defun my/ow-tool (location unit)
  "gptel 用的天气查询工具:返回 JSON 字符串。"
  (let ((data (my/ow-fetch-json location unit)))
    (json-encode data)))

;; 注册工具到 gptel
(setq gptel-tools
      (list
       (gptel-make-tool
         :name "get_weather"
         :function (lambda (location unit)
                     (my/ow-tool location unit))
         :description "获取某个城市当前天气,返回 JSON 数据"
         :args (list '(:name "location" :type "string"
                             :description "例如 “Shanghai, CN” 或 “London, UK”")
                     '(:name "unit" :type "string"
                             :description "温度单位,可为 celsius 或 fahrenheit"
                             :optional t)))))
1 个赞

superchat 升级到 0.4:新增 workflow 功能

工作流就像把多轮对话录成“脚本”。一次指令即可完成搜索、分析、保存等步骤,再也不用手动重复。

聊天里直接调用:输入 >workflow-name 主题 即可运行同名 .workflow 文件,自动复用你在 gptel 中已经启用的工具与 MCP 服务器。

按需组合步骤:可以继续使用 #文件路径、@model、/write-file 等语法,把文件、模型切换、结果保存串联起来。

一次配置,长期使用:把工作流文件放在 ~/.emacs.d/superchat/workflow/(或 superchat-data-directory/workflow/),想用随时调用。

简单线性执行:每一行非空内容就是一个步骤,按顺序逐行执行。目前暂不支持 n8n 那样的分支/条件,请使用直线流程。

试试看:

新建 ~/.emacs.d/superchat/workflow/ai-news-summary.workflow,写入以下内容。

在 superchat 中输入 >ai-news-summary AI技术(或任何关键词)。

工作流会自动检索新闻、生成摘要,并把 Markdown 报告写入你指定的文件。

# Workflow: AI技术新闻摘要
# Description: 每周技术新闻摘要

/web-search 搜索关于 "$input" 相关的新闻

@qwen3-coder:30b-a3b-q8_0 分析上面(3 个角度:商业,技术,社会)搜索到的新闻信息,生成一份简洁的中文的新闻摘要

将分析结果保存到 #/Users/chenyibin/Documents/news-summary.md

我使用 >ai-news-summary Emacs 然后得到的执行结果:

# News Summary

## Emacs News

- **eldoc-mouse**: Updates from eldoc-mouse, display document on a popup for mouse hover.
- **inhibit-mouse.el**: Deactivate mouse input in Emacs (Alternative to disable-mouse) by James Cherti.
- **Mechanical Keyboards**: Thoughts on Mechanical Keyboards and the ZSA Moonlander (Reddit).
- **Links**: From reddit.com/r/emacs, r/orgmode, r/spacemacs, Mastodon #emacs.
2 个赞

Andrej Karpathy 昨天说遗忘是智能的特性,而非 bug。我回头望了一眼自己设计的 memory 机制(就是基于遗忘的),哈哈哈哈!

哈哈,karthink 觉得 superchat 看上去很棒!

以及,superchat 现在正式列入 GPTel 的 Alternatives。

大佬是珠海的? :grinning_face:

哎呀,不是什么大佬,都是 Emacser。嗯呐,我是珠海的~

更新 :

  • 修复:当使用在线大模型的时候,对话直接卡死的问题
  • 修复:偶发的出现大模型回答未结束而对话界面提前截断的问题
1 个赞