commit 2f4bd55297cb690237e16ddd92b2a5fb79b1b867
parent e08570af1f8e2e21e0d22319ba113c1a8ba1de18
Author: Vineet Kumar <git@vineetk.net>
Date: Wed, 15 Apr 2026 10:56:17 -0400
emacs: add gptel-agent
Diffstat:
3 files changed, 185 insertions(+), 28 deletions(-)
diff --git a/epistemia/files/emacs/.config/emacs/init.el b/epistemia/files/emacs/.config/emacs/init.el
@@ -547,31 +547,30 @@
:host "llm.demiurge.epistemia"
:endpoint "/v1/chat/completions"
:stream t
- :models '(Qwen3.5-0.8B
- Qwen3.5-2B
- Qwen3.5-4B
- Qwen3.5-9B
- Qwen3.5-27B
- Qwen3.5-35B-A3B_128K
- Qwen3.5-35B-A3B_256K
- Qwen3.5-122B-A10B
- Qwen3.5-397B-A17B
+ :models '(Qwen3.5-27B
+ Qwen3.5-35B-A3B
Rocinante-X-12B-v1
- Ministral-3-14B-Instruct-2512
- Ministral-3-14B-Reasoning-2512
- Nanbeige4.1-3B))
- (gptel-make-openai "OpenRouter"
- :host "openrouter.ai"
- :endpoint "/api/v1/chat/completions"
- :stream t
- :key (auth-source-pick-first-password :host "openrouter.ai")
- :models '(minimax/minimax-m2.7
- minimax/minimax-m2.5:free
- anthropic/claude-haiku-4.5
- anthropic/claude-sonnet-4.6))
- :custom
- (gptel-model "llama-swap:Qwen3.5-35B-A3B_128K")
- (gptel-temperature nil))
+ Ministral-3-14B-Instruct-2512))
+ (gptel-make-openai "OpenRouter"
+ :host "openrouter.ai"
+ :endpoint "/api/v1/chat/completions"
+ :stream t
+ :key (auth-source-pick-first-password :host "openrouter.ai")
+ :models '(minimax/minimax-m2.7
+ minimax/minimax-m2.5:free
+ anthropic/claude-sonnet-4.6))
+ :custom
+ (gptel-model "llama-swap:Qwen3.5-35B-A3B")
+ (gptel-temperature nil)
+ (gptel-directives
+ '((default . "You are a large language model living in Emacs and a helpful assistant. Respond concisely.")
+ (programming . "You are a large language model and a careful programmer. Provide code and only code as output without any additional text, prompt or note.")
+ (writing . "You are a large language model and a writing assistant. Respond concisely."))))
+
+(use-package gptel-agent
+ :after gptel
+ :config (gptel-agent-update)
+ :custom (gptel-agent-dirs '("~/.config/emacs/agents/")))
;;;;;;;;;
;; RSS ;;
diff --git a/epistemia/home/config.scm b/epistemia/home/config.scm
@@ -82,10 +82,8 @@
emacs-exwm
emacs-geiser
emacs-geiser-guile
- ((options->transformation
- '((with-commit . "emacs-gptel=ad619463d1a9cb466b8dd575cc905f2554886cd7")
- (without-tests . "emacs-gptel")))
- emacs-gptel)
+ emacs-gptel-new
+ emacs-gptel-agent
emacs-guix
emacs-hl-todo
emacs-kaolin-themes
diff --git a/epistemia/packages/emacs.scm b/epistemia/packages/emacs.scm
@@ -65,3 +65,163 @@ underline style instead of regular underline. (setq kaolin-themes-underline-wave
t) ;; When t, will display colored hl-line style (setq
kaolin-themes-hl-line-colored t).")
(license license:gpl3)))
+
+(define-public emacs-gptel-new
+ (package
+ (name "emacs-gptel-new")
+ (version "20260410.711")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/karthink/gptel")
+ (commit "8d6411b5f89d796c817ff79324973b8910e164fe")))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "0zl5qdp9qqh8chadsp2m3jpbpsxlywdlfkax8p97y73q1yias0q6"))))
+ (build-system emacs-build-system)
+ (propagated-inputs (list emacs-transient emacs-compat))
+ (home-page "https://github.com/karthink/gptel")
+ (synopsis "Interact with ChatGPT or other LLMs")
+ (description
+ "gptel is a simple Large Language Model chat client, with support for multiple
+models and backends. It works in the spirit of Emacs, available at any time and
+in any buffer. gptel supports: - The services @code{ChatGPT}, Azure, Gemini,
+Anthropic AI, Together.ai, Perplexity, AI/ML API, Anyscale, @code{OpenRouter},
+Groq, @code{PrivateGPT}, @code{DeepSeek}, Cerebras, Github Models, @code{GitHub}
+Copilot chat, AWS Bedrock, Novita AI, @code{xAI}, Sambanova, Mistral Le Chat and
+Kagi (@code{FastGPT} & Summarizer). - Local models via Ollama, Llama.cpp,
+Llamafiles or GPT4All Additionally, any LLM service (local or remote) that
+provides an @code{OpenAI-compatible} API is supported. Features: - Interact
+with LLMs from anywhere in Emacs (any buffer, shell, minibuffer, wherever). -
+LLM responses are in Markdown or Org markup. - Supports conversations and
+multiple independent sessions. - Supports tool-use to equip LLMs with agentic
+capabilities. - Supports Model Context Protocol (MCP) integration using the
+mcp.el package. - Supports multi-modal models (send images, documents). -
+Supports \"reasoning\" content in LLM responses. - Save chats as regular
+Markdown/Org/Text files and resume them later. - You can go back and edit your
+previous prompts or LLM responses when continuing a conversation. These will be
+fed back to the model. - Redirect prompts and responses easily - Rewrite,
+refactor or fill in regions in buffers. - Write your own commands for custom
+tasks with a simple API. Requirements for @code{ChatGPT}, Azure, Gemini or Kagi:
+- You need an appropriate API key. Set the variable `gptel-api-key to the key
+or to a function of no arguments that returns the key. (It tries to use
+`auth-source by default) @code{ChatGPT} is configured out of the box. For the
+other sources: - For Azure: define a gptel-backend with `gptel-make-azure'. -
+For Gemini: define a gptel-backend with `gptel-make-gemini'. - For Anthropic
+(Claude): define a gptel-backend with `gptel-make-anthropic'. - For AI/ML API,
+Together.ai, Anyscale, Groq, @code{OpenRouter}, @code{DeepSeek}, Cerebras or
+Github Models: define a gptel-backend with `gptel-make-openai'. - For
+@code{PrivateGPT}: define a backend with `gptel-make-privategpt'. - For
+Perplexity: define a backend with `gptel-make-perplexity'. - For Deepseek:
+define a backend with `gptel-make-deepseek'. - For Kagi: define a gptel-backend
+with `gptel-make-kagi'. For local models using Ollama, Llama.cpp or GPT4All: -
+The model has to be running on an accessible address (or localhost) - Define a
+gptel-backend with `gptel-make-ollama or `gptel-make-gpt4all'. - Llama.cpp or
+Llamafiles: Define a gptel-backend with `gptel-make-openai'. Consult the
+package README for examples and more help with configuring backends. Usage:
+gptel can be used in any buffer or in a dedicated chat buffer. The interaction
+model is simple: Type in a query and the response will be inserted below. You
+can continue the conversation by typing below the response. To use this in any
+buffer: - Call `gptel-send to send the buffer's text up to the cursor. Select a
+region to send only the region. - You can select previous prompts and responses
+to continue the conversation. - Call `gptel-send with a prefix argument to
+access a menu where you can set your backend, model and other parameters, or to
+redirect the prompt/response. To use this in a dedicated buffer: - M-x gptel:
+Start a chat session. - In the chat session: Press `C-c RET (`gptel-send') to
+send your prompt. Use a prefix argument (`C-u C-c RET') to access a menu. In
+this menu you can set chat parameters like the system directives, active backend
+or model, or choose to redirect the input or output elsewhere (such as to the
+kill ring or the echo area). - You can save this buffer to a file. When opening
+this file, turn on `gptel-mode before editing it to restore the conversation
+state and continue chatting. - To include media files with your request, you can
+add them to the context (described next), or include them as links in Org or
+Markdown mode chat buffers. Sending media is disabled by default, you can turn
+it on globally via `gptel-track-media', or locally in a chat buffer via the
+header line. Include more context with requests: If you want to provide the LLM
+with more context, you can add arbitrary regions, buffers, files or directories
+to the query with `gptel-add'. To add text or media files, call `gptel-add in
+Dired or use the dedicated `gptel-add-file'. You can also add context from
+gptel's menu instead (`gptel-send with a prefix arg), as well as examine or
+modify context. When context is available, gptel will include it with each LLM
+query. LLM Tool use: gptel supports \"tool calling\" behavior, where LLMs can
+specify arguments with which to call provided \"tools\" (elisp functions). The
+results of running the tools are fed back to the LLM, giving it capabilities and
+knowledge beyond what is available out of the box. For example, tools can
+perform web searches or API lookups, modify files and directories, and so on.
+Tools can be specified via `gptel-make-tool', or obtained from other
+repositories, or from Model Context Protocol (MCP) servers using the mcp.el
+package. See the README for details. Tools can be included with LLM queries
+using gptel's menu, or from `gptel-tools'. Rewrite interface In any buffer:
+with a region selected, you can rewrite prose, refactor code or fill in the
+region. This is accessible via `gptel-rewrite', and also from the `gptel-send
+menu. Presets Define a bundle of configuration (model, backend, system message,
+tools etc) as a \"preset\" that can be applied together, making it easy to switch
+between tasks in gptel. Presets can be saved and applied from gptel's transient
+menu. You can also include a cookie of the form \"@@preset-name\" in the prompt
+to send a request with a preset applied. This feature works everywhere, but
+preset cookies are also fontified in chat buffers. gptel in Org mode: gptel
+offers a few extra conveniences in Org mode: - You can limit the conversation
+context to an Org heading with `gptel-org-set-topic'. - You can have branching
+conversations in Org mode, where each hierarchical outline path through the
+document is a separate conversation branch. See the variable
+`gptel-org-branching-context'. - You can declare the gptel model, backend,
+temperature, system message and other parameters as Org properties with the
+command `gptel-org-set-properties'. gptel queries under the corresponding
+heading will always use these settings, allowing you to create mostly
+reproducible LLM chat notebooks. Finally, gptel offers a general purpose API
+for writing LLM ineractions that suit your workflow. See `gptel-request', and
+`gptel-fsm for more advanced usage.")
+ (license license:gpl3)))
+
+(define-public emacs-gptel-agent
+ (package
+ (name "emacs-gptel-agent")
+ (version "20260412.716")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/karthink/gptel-agent")
+ (commit "bef06bccdbf847e0c4a94d1b57dd96d979437430")))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "1g33w8db2g33l3qf4f9vnafkdpilaxh4s9cy76yv79rphg92ipaw"))))
+ (build-system emacs-build-system)
+ (propagated-inputs (list emacs-compat emacs-gptel-new emacs-yaml
+ emacs-orderless))
+ (arguments
+ '(#:include '("^[^/]*.el$" "^[^/]*.el.in$"
+ "^dir$"
+ "^[^/]*.info$"
+ "^[^/]*.texi$"
+ "^[^/]*.texinfo$"
+ "^doc/dir$"
+ "^doc/[^/]*.info$"
+ "^doc/[^/]*.texi$"
+ "^doc/[^/]*.texinfo$"
+ "^agents$")
+ #:exclude '("^.dir-locals.el$" "^test.el$" "^tests.el$"
+ "^[^/]*-test.el$" "^[^/]*-tests.el$")))
+ (home-page "https://github.com/karthink/gptel-agent")
+ (synopsis "Agentic LLM use for gptel")
+ (description
+ "This is a collection of tools and prompts to use gptel \"agentically\" with any
+LLM, to autonomously perform tasks. It has access to - the web (via basic web
+search, URL fetching and @code{YouTube} video metadata), - local files
+(read/write/edit), - the state of Emacs (documentation and Elisp evaluation), -
+and Bash, if you are in a POSIX-y environment. To use gptel-agent in a
+dedicated buffer: - Set `gptel-model and `gptel-backend to use your preferred
+LLM. - Run M-x `gptel-agent'. This will open a buffer with the agent preset
+loaded. - Use gptel as usual, calling `gptel-send etc. - If you change the
+system prompt, tools or other settings in this buffer, you can reset the agent
+state by (re)applying the \"gptel-agent\" preset from gptel's menu. To use
+gptel-agent anywhere in Emacs: - As with gptel, you can use gptel-agent in any
+buffer. Just apply the \"gptel-agent\" preset in the buffer, or include
+\"@@gptel-agent\" in a prompt. gptel-agent can delegate tasks to \"sub-agents\".
+Sub-agents can be specified in Markdown or Org files in a directory. To see how
+to specify agents, examine the \"agents\" directory in this package. You can add
+your directory of agents to `gptel-agent-dirs', which see. Please note:
+gptel-agent uses significantly more tokens than the average gptel LLM
+interaction.")
+ (license license:gpl3)))