* gptel.el (gptel--inspect-query): `gptel--inspect-query` now
takes data to display as an argument. Reduce its function to
displaying a buffer with the data.
* gptel-transient.el (gptel-menu, gptel--suffix-send): Fold
dry-run the option into `gptel--suffix-send` and call it with a
dry-run flag instead of using an alternate pathway for dry-runs.
The "Inspect query" suffixes of `gptel-menu` now perform actual
dry-runs, avoiding issues like #276.
* gptel.el: Load gptel-org after Org is loaded.
* gptel-org.el (gptel-org--send-with-props): Advise `gptel-send`
and `gptel--suffix-send` to use gptel's local config (stored under
the current Org heading) when applicable. Advice is a hacky way
to do it, but this is the simplest option without explicit
indirection via `derived-mode-p`-based dispatch code in many more
places in gptel.
* gptel.el (gptel--convert-markdown->org,
gptel--stream-convert-markdown->org, gptel-set-topic): Move code
for transforming responses and setting the GPTEL_TOPIC property to
gptel-org. Add declarations for the byte-compiler.
* gptel-org.el (gptel-org-branching-context, gptel-org-set-topic,
gptel-org--restore-state, gptel--convert-markdown->org,
gptel--stream-convert-markdown->org): Add `gptel-org-set-topic` to
set the topic per heading in Org buffers. Fix typo in
gptel-org--restore-state. Add declarations for
the byte-compiler and page markers for the reader.
* gptel.el (gptel--restore-backend, gptel--save-state,
gptel--restore-state): Move the Org-specific code for saving and
restoring state to gptel-org.
* gptel-org.el (gptel-org--entry-properties,
gptel-org--save-state, gptel-org--restore-state): Org-specific
code for saving and restoring state using Org properties, moved
from gptel-org.
* gptel.el (gptel--create-prompt): Split the Org mode logic in
`gptel--create-prompt` into gptel-org.el.
* gptel-org.el (gptel-org-branching-context,
gptel-org--create-prompt): Handle prompt creation for Org buffers
in `gptel-org--create-prompt`. The option
`gptel-org-branching-context` limits the context in Org buffers to
the direct ancestors of the active heading. This is useful for
conversations with branches. gptel-org.el is intended to
eventually contain all the Org mode specific gptel code, and will
not be loaded unless gptel is called in an Org buffer.
* gptel.el (gptel-request): let-bind `gptel--system-message`
correctly in `gptel-request`. The Anthropic API requires the
system message to be attached to the query differently from the
others, causing the let-bindings in `gptel-request` to not work as
expected. (#276)
* gptel.el (gptel): Show chosen system message in
header-line (#274). Remove the context indicator `[Send: ...]`,
as this needs to be reworked for the upcoming context-inclusion
features anyway.
* gptel-transient.el (gptel-system-prompt): Autoload
`gptel-system-prompt`, this is required for the gptel header-line.
* gptel-openai.el (gptel--json-read): Fix typo in
`gptel--json-read` that caused macroexpansion intended to use
json.el fail. This error was reported by @vkz. Fix#260.
* gptel.el (gptel-post-response-functions): Adjust docstring for
this hook to mention that the hook runs in the response buffer,
not the prompt buffer. (#269)
* gptel.el (gptel--insert-response): Moving point in a buffer does
not move window-point in a window displaying that buffer if the
window is not selected (#269). So select the gptel response
window explicitly (if possible) when running
`gptel-post-response-functions`.
NOTE: Instead of selecting the window before running the hook, We
could run `set-window-point` in the window after running it.
Since the hook can have any kind of behavior (smooth-scrolling for
instance) we want it to play out interactively.
* gptel-curl.el (gptel--curl-stream-cleanup): Ditto.
gptel-anthropic.el (gptel-curl--parse-stream): When parsing
responses from Anthropic, wait for more input when the
corresponding data chunk for the event hasn't arrived yet. (#261)
* gptel-transient.el (gptel--suffix-send): Don't pre-fill the
minibuffer prompt with the current line when reading the query
from the minibuffer. (If the region is active, it is used as the
initial contents -- this behavior is unchanged.)
* gptel-anthropic.el (gptel-curl--parse-stream): Remove extraneous
statements and simplify the stream parser. Addresses #261, but
the main problem is still elusive.
* gptel.el (gptel-backend, gptel-model, gptel-temperature,
gptel-max-tokens, gptel--num-messages-to-send,
gptel--system-message): Make all model/request paramters global
variables, i.e. not buffer-local by default. This is following
the discussion in #249.
* gptel-transient.el (gptel-menu, gptel-system-prompt--setup,
gptel-system-prompt, gptel--suffix-system-message,
gptel--infix-provider, gptel--infix-temperature, gptel--switches,
gptel--set-buffer-locally, gptel--set-with-scope): and associated
transient methods: add a toggle `gptel--set-buffer-locally` to
allow model parameters to be set buffer-locally. The function
`gptel--set-with-scope` can be used to reset a variable or set it
buffer-locally.
Reorder gptel-transient so all the custom classes, methods and
utility functions are at the top.
* README.org (all backend sections): Replace `setq-default` with
setq in the recommended configuration.
* gptel-transient.el (gptel-menu, gptel--infix-add-directive,
gptel--suffix-system-message): Enable the additional directive
option in `gptel-menu` by default, and change the wording of
documentation strings for transient options.
* gptel-ollama.el (gptel-curl--parse-stream): libjansson and
json.el behave differently w.r.t moving point when there is a
parsing error. Fix by explicitly handling point when there is an
error. (#255)
* gptel-transient.el (gptel--infix-provider, gptel--infix-model):
Simplify model and backend selection into a single step. Remove
unused and obsolete option `gptel--infix-provider`.
* gptel-transient.el (gptel--get-directive,
gptel--infix-add-directive, gptel-menu): Rename the
directive-related functions to be shorter/more consistent with the
rest of the code.
gptel--additional-directive -> gptel--infix-add-directive
gptel--additional-directive-get -> gptel--get-directive
* gptel-transient.el (gptel-menu, gptel-system-prompt--setup,
gptel-system-prompt, gptel--infix-temperature,
transient-format-value, gptel--additional-directive,
gptel--suffix-system-message): Tweak to the "additional directive"
overlay display. `gptel-menu` changes based on feedback
from #249 (thanks to @jwr):
- Keys to set the system message are remapped from "h" to
"s" (mnemonic)
- `gptel--infix-temperature` is now hidden by default and requires
enabling `gptel-expert-commands`
- Keys to prompt from minibuf and respond in echo area are changed
to "m" and "e" respectively.
* gptel.el (gptel-end-of-response, gptel-beginning-of-response,
gptel-expert-commands): Add `gptel-expert-commands` to selectively
enable experimental options in `gptel-menu`. This should keep the
interface from overwhelming new users. Add a command to move to
the beginning of a response.
* gptel-transient.el (gptel-menu, gptel-system-prompt,
gptel--instructions-make-overlay, gptel-option-overlaid,
transient-format-value, gptel--additional-directive,
gptel--additional-directive-get): Add a transient option to
include a (short) additional instruction/directive along with the
system message. This makes it convenient to have an extensive
system message and specify additional, per-response tasks (such as
refactoring) on top. Ensure that the dry run options handle this
correctly. This option is made available when
`gptel-expert-commands` is turned on.
NOTE: WIP design. The nomenclature for `gptel-expert-commands`
and "additional directive" is subject to change.
* gptel-transient.el (gptel-menu, gptel-lisp-variable,
gptel--infix-num-messages-to-send, gptel--infix-max-tokens,
gptel--infix-provider): Improve the wording and the display of the
default settings. Define a new class `gptel-lisp-variable` to
faciliate this.
* gptel.el (gptel--inspect-query): Add a function to inspect the
query that will be sent. This is useful to ensure that (only and
all of) what you expect to be sent is being sent.
* gptel-transient.el (gptel-menu): Allow the query in progress to
be inspected from `gptel-menu` as an elisp or JSON object.
* gptel.el (gptel-request, gptel-send, gptel--url-get-response):
Consolidate the HTTP query construction into `gptel-request`,
and use it as the single point for sending gptel queries. This
simplifies the code, makes it easier to debug and (later) advise
or otherwise modify. To this end, `gptel-send` reuses
`gptel-request` and no longer does its own thing. Adjust other
HTTP request-related functions accordingly.
* gptel-curl.el (gptel-curl--get-args, gptel-curl--get-response):
Receive the full request data instead of constructing it partly in
`gptel-curl--get-args`.
* gptel.el (gptel--url-get-response): Log request headers as JSON objects.
* gptel-curl.el (gptel-curl--get-args, gptel-curl--get-response):
Log request headers as JSON objects, Curl command as a shell
command you can copy and paste into the terminal.
Using the libjansson JSON parser gives us a modest boost in speed.
It's not as significant a speedup as it is for LSP clients since
our jSON payloads are smaller and less frequent -- but we might as
well use it.
* gptel.el (gptel--json-read, gptel--json-encode,
gptel--url-get-response, gptel--parse-response): Define macros to
use the libjansson-supported `json-parse-buffer` and
`json-serialize`. Replace use of `json-encode` and `json-read`
appropriately.
* gptel-openai.el: (gptel-curl--parse-stream) : Use
`gptel--json-read` instead of `json-read`.
* gptel-ollama.el (gptel-curl--parse-stream): Use
`gptel--json-read` instead of `json-read`.
* gptel-gemini.el (gptel-curl--parse-stream): Use
`gptel--json-read` instead of `json-read`.
* gptel-curl.el (gptel-curl--get-args, gptel-curl--get-response,
gptel-curl--log-response, gptel-curl--stream-cleanup,
gptel-curl--parse-response): Use `gptel--json-read` and
`gptel--json-encode` in place of the json.el versions.
* gptel-anthropic.el (gptel-curl--parse-stream): Use
`gptel--json-read` instead of `json-read`.
* test/gptel-org-test.el: Use `gptel--json-read`.
* gptel.el (gptel--sanitize-model, gptel): Check for mismatches
between the default values of gptel-backend and gptel-model when
starting a new gptel chat. Previously the default value of
gptel-backend was compared against the buffer-local value of
gptel-model.
* gptel.el (gptel--insert-response, gptel--restore-state): Don't
set the rear-nonsticky property on the gptel response text.
Instead, the gptel text-property is globally declared to be
nonsticky via `text-property-default-nonsticky`.
This change is since markdown-mode makes rear-nonsticky a
font-lock-managed property and we can't set it manually. Setting
this property explicitly also makes all text properties in the
range nonsticky, which can have unintended side effects.
* gptel-curl.el (gptel-curl--stream-insert-response): Ditto.
gptel.el (gptel--convert-markdown->org,
gptel--stream-convert-markdown->org): Handle the case of Markdown
bullet lists that begin with a "*", which the Gemini LLMs produce
often. Address #238.
gptel-anthropic.el (gptel-curl--parse-stream): Reset point
explicitly when parsing streaming responses returned by the
Anthropic API. Try to address #233.
gptel.el (gptel--url-parse-response): Handle HTTP 100 followed by
200. Note: this fix is brittle, it will break if 100 is followed
by an error code.
gptel-curl.el (gptel-curl--stream-filter,
gptel-curl--parse-stream): Ditto. Address #194.