gptel-tab is an Emacs package that provides tab-specific contexts for the gptel package. It automatically saves and restores GPTel context data when switching tabs, ensuring that your context remains consistent across different tabs.
ATTENTION! THIS IS A WORK IN PROGRESS, THINGS MAY GLITCH.
gptel-tab uses emacs tab-bar tabs (not to be confused with tab-line tabs!) as work scope tags.
We assume that within a tab you set up your windows and buffers and work on some single task, so it’s reasonable to suggest you also want to set up gptel context for this task. And if you work on different task, you create another tab for it.
This solves the problem of deciding which context to use when adding something from arbitrary buffer not connected to a project or chat window, or invoking an LLM in arbitrary buffer. It also allows to use one file in several contexts (with some limitations, see below).
No manual context switching is required. No extra commands or menus. Just switch to the right tab and work with ~gptel~ as usual.
(Only named tabs are considered as scopes. If you switch to unnamed tab, previous context will be kept.)
You can install it With use-package:
(use-package gptel-tab
:vc "https://github.com/krvkir/gptel-tab"
:after gptel)Or you can just clone the repo and load the file.
Everything is set up upon loading the package: just check how contexts are changing when you switch tabs. (Remember: only named tabs are used!)
If you use desktop-save mode, you may want contexts to persist over emacs restarts. For that, add gptel-tab--tab-contexts and gptel-tab--current-tab-name variables into Desktop Globals To Save option of desktop group.
gptel-tab works by saving and restoring GPTel context data whenever you switch tabs or change context. Internally, gptel-tab keeps a list with contexts for each tab and uptates it on important evetns.
Since we can’t directly track tab switches, the package hooks into window-configuration-change-hook and checks if tab bar name changed.
Since gptel doesn’t provide methods to access its context, gptel-tab gets it directly from internal gptel-context--alist variable. The same it tracks context changes, by advicing to functions that add or remove context. This is fragile and may break if gptel internals would change.
For example, if you edit one file on several tabs (say it’s your .emacs file which you constantly tweak, or org journal file where you write your thoughts from various projects), and add regions of those files to the context, then those regions will become invalid (will have wrong start and end lines) when you switch back and forth between tabs.
In such cases, I recommend to add those files as the whole files, not regions or buffers.