Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

A multi-llm Emacs shell (ChatGPT, Claude, DeepSeek, Gemini, Kagi, Ollama, Perplexity) + editing integrations

License

NotificationsYou must be signed in to change notification settings

xenodium/chatgpt-shell

Repository files navigation

👉Support this work via GitHub Sponsors

https://stable.melpa.org/packages/chatgpt-shell-badge.svghttps://melpa.org/packages/chatgpt-shell-badge.svg

chatgpt-shell

A multi-llm Emacscomint shell, byme.

Related packages

  • ob-chatgpt-shell: Evaluate chatgpt-shell blocks as Emacs org babel blocks.
  • ob-dall-e-shell: Evaluate DALL-E shell blocks as Emacs org babel blocks.
  • dall-e-shell: An Emacs shell for OpenAI’s DALL-E.
  • shell-maker: Create Emacs shells backed by either local or cloud services.

News

chatgpt-shell goes multi model 🎉

Please sponsor the project to make development + support sustainable.

ProviderModelSupportedSetup
AnthropicClaudeYesSetchatgpt-shell-anthropic-key
DeepseekChat/ReasonerYesSetchatgpt-shell-deepseek-key
GoogleGeminiYesSetchatgpt-shell-google-key
KagiSummarizerYesSetchatgpt-shell-kagi-key
OllamaLlamaYesInstallOllama
OpenAIChatGPTYesSetchatgpt-shell-openai-key
OpenRouterVariousYesSetchatgpt-shell-openrouter-key
PerplexityLlama SonarYesSetchatgpt-shell-perplexity-key

Note: With the exception ofOllama, you typically have to pay the cloud services for API access. Please check with each respective LLM service.

My favourite model is missing.

File a feature requestsponsor the work

A familiar shell

chatgpt-shell is acomint shell. Bring your favourite Emacs shell flows along.

Swap models

One shell to query all. Swap LLM provider (viaM-x chatgpt-shell-swap-model) and continue with your familiar flow.

A shell hybrid

chatgpt-shell includes a compose buffer experience. This is my favourite and most frequently used mechanism to interact with LLMs.

For example, select a region and invokeM-x chatgpt-shell-prompt-compose (C-c C-e is my preferred binding), and an editable buffer automatically copies the region and enables crafting a more thorough query. When ready, submit with the familiarC-c C-c binding. The buffer automatically becomes read-only and enables single-character bindings.

Navigation: n/p (or TAB/shift-TAB)

Navigate through source blocks (including previous submissions in history). Source blocks are automatically selected.

Reply: r

Reply with with follow-up requests using ther binding.

Give me more: m

Want to ask for more of the same data? Pressm to request more of it. This is handy to follow up on any kind of list (suggestion, candidates, results, etc).

Quick quick: q

I’m a big fan of quickly disposing of Emacs buffers with theq binding. chatgpt-shell compose buffers are no exception.

Request entire snippets: e

LLM being lazy and returning partial code? Presse to request entire snippet.

Quick Actions with Transient Menu

For quick access to common actions,chatgpt-shell provides a transient menu, powered by the excellenttransient package. Think of it as a temporary keymap overlay that pops up, shows you available commands with their keybindings, and disappears after you select one.

Invoke it withC-c C-t while inside achatgpt-shell buffer.

The menu is organized into logical groups for easy navigation:

┌──────────────────────────────────────────────────────────────────────────────┐│ Shells                          Compose prompt via              Inline edit  ││ b: Switch to shell buffer       e: Dedicated buffer             q: Quick     ││ N: Create new shell             p: Minibuffer                      insert/   ││                                 P: Minibuffer (include last        edit      ││                                    kill)                        r: Send      ││                                                                    region    ││                                                                 R: Send &    ││                                                                    review    ││                                                                    region    ││                                                                              ││ Session                         History                         Navigation   ││ m: Swap model                   h: Search                       n: Next item ││ L: Reload models                                                p: Previous  ││ y: Swap system prompt                                              item      ││                                                                 TAB: Next    ││                                                                      source  ││                                                                      block   ││                                                                 <backtab>:   ││                                                                      Previous││                                                                      source  ││                                                                      block   ││                                                                              ││ Source blocks                   Transcript                      Code Actions ││ C-c C-c: Execute                S: Save                         d: Describe  ││ E: Edit                         O: Restore                         code      ││ V: View                                                         f: Refactor  ││                                                                    code      ││                                                                 g: Write git ││                                                                    commit    ││                                                                 t: Generate  ││                                                                    unit test ││                                                                 w: Proofread ││                                                                              ││ Other                                                                        ││ C: Clear buffer                                                              ││ I: Interrupt                                                                 ││ v: Show version                                                              │└──────────────────────────────────────────────────────────────────────────────┘

(Note: The exact commands shown depend on context, like whether a region is active or if you are inside achatgpt-shell buffer.)

If you prefer a global keybinding (available everywhere in Emacs), you can add something like this to your personal Emacs configuration:

;; In your init.el or equivalent(global-set-key (kbd"C-c C-g")'chatgpt-shell-transient)

This menu helps with discovering available commands and executing them quickly without needing to remember every single keybinding orM-x command name.

Confirm inline mods (via diffs)

Request inline modifications, with explicit confirmation before accepting.

Execute snippets (a laorg babel)

Both the shell and the compose buffers enable users to execute source blocks viaC-c C-c, leveragingorg babel.

Vision experiments

I’ve been experimenting with image queries (currently ChatGPT only, pleasesponsor to help bring support for others).

Below is a handy integration to extract Japanese vocabulary. There’s also a generic image descriptor available viaM-x chatgpt-shell-describe-image that works on any Emacs image (via dired, image buffer, point on image, or selecting a desktop region).

Support this effort

If you’re findingchatgpt-shell useful, help make the project sustainable and consider ✨sponsoring✨.

chatgpt-shell is in development. Please report issues or sendpull requests for improvements.

Like this package? Tell me about it 💙

Finding it useful? Like the package? I’d love to hear from you. Get in touch (Mastodon /Twitter /Bluesky /Reddit /Email).

Install

MELPA

Viause-package, you can install with:ensure t.

(use-package chatgpt-shell:ensuret:custom  ((chatgpt-shell-openai-key    (lambda ()      (auth-source-pass-get'secret"openai-key")))))

Straight

(use-package shell-maker:straight (:type git:host github:repo"xenodium/shell-maker"))(use-package chatgpt-shell:straight (:type git:host github:repo"xenodium/chatgpt-shell":files ("chatgpt-shell*.el")):custom  ((chatgpt-shell-openai-key    (lambda ()      (auth-source-pass-get'secret"openai-key")))))

Swap models

M-x chatgpt-shell-swap-model

Set default model

(setq chatgpt-shell-model-version"llama3.2")

Set API Keys

You will first need to get an API key for each of the various public LLM endpoints you want to interact with.

ServiceModel(s)Link: get an API Key
OpenAIChatGPTGet an API Key
AnthropicClaudeVisit the Dashboard
DeepseekChat/ReasonerGet an API Key
GoogleGeminiGet an API Key
KagiSummarizerGet an API Key
OpenRouterVariousManage your API keys
PerplexityLlama SonarGet an API Key

Provide the API Key to ChatGPT via a function

You can define a function that chatgpt-shell invokes to get the API Key. The following example is for Open AI; use a similar approach for other services.

;; if you are using the "pass" password manager(setq chatgpt-shell-openai-key      (lambda ();; (auth-source-pass-get 'secret "openai-key") ; alternative using pass support in auth-sources        (nth0 (process-lines"pass""show""openai-key"))));; or if using auth-sources, e.g., so the file ~/.authinfo has this line:;;  machine api.openai.com password OPENAI_KEY(setq chatgpt-shell-openai-key      (auth-source-pick-first-password:host"api.openai.com"));; or same as previous but lazy loaded (prevents unexpected passphrase prompt)(setq chatgpt-shell-openai-key      (lambda ()        (auth-source-pick-first-password:host"api.openai.com")))

Set the appropriate variable Manually/Interactively

M-x set-variable chatgpt-shell-anthropic-key

M-x set-variable chatgpt-shell-deepseek-key

M-x set-variable chatgpt-shell-google-key

Set the appropriate variable programatically, in your emacs init file

;; set anthropic key from a string(setq chatgpt-shell-anthropic-key"my anthropic key");; set OpenAI key from the environment(setq chatgpt-shell-openai-key (getenv"OPENAI_API_KEY"))

ChatGPT through proxy service

If you use ChatGPT through proxy service “https://api.chatgpt.domain.com”, set options like the following:

(use-package chatgpt-shell:ensuret:custom  ((chatgpt-shell-api-url-base"https://api.chatgpt.domain.com")   (chatgpt-shell-openai-key    (lambda ();; Here the openai-key should be the proxy service key.      (auth-source-pass-get'secret"openai-key")))))

If your proxy service API path is not OpenAI ChatGPT default path like ”/v1/chat/completions”, then you can customize optionchatgpt-shell-api-url-path.

Using ChatGPT through HTTP(S) proxy

Behind the scenes chatgpt-shell usescurl to send requests to the openai server. If you use ChatGPT through a HTTP proxy (for example you are in a corporate network and a HTTP proxy shields the corporate network from the internet), you need to tellcurl to use the proxy via the curl option-x http://your_proxy. For this, usechatgpt-shell-proxy.

For example, if you want curl-x andhttp://your_proxy, setchatgpt-shell-proxy to ”http://your_proxy”.

Launch

Launch withM-x chatgpt-shell.

Note:M-x chatgpt-shell keeps a single shell around, refocusing if needed. To launch multiple shells, useC-u M-x chatgpt-shell.

Clear buffer

Typeclear as a prompt.

ChatGPT> clear

Alternatively, use eitherM-x chatgpt-shell-clear-buffer orM-x comint-clear-buffer.

Saving and restoring

Save withM-x chatgpt-shell-save-session-transcript and restore withM-x chatgpt-shell-restore-session-from-transcript.

Some related values stored inshell-maker likeshell-maker-transcript-default-path andshell-maker-forget-file-after-clear.

Streaming

chatgpt-shell can either wait until the entire response is received before displaying, or it can progressively display as chunks arrive (streaming).

Streaming is enabled by default.(setq chatgpt-shell-streaming nil) to disable it.

chatgpt-shell customizations

Custom variableDescription
chatgpt-shell-google-api-url-baseGoogle API’s base URL.
chatgpt-shell-deepseek-api-url-baseDeepSeek API’s base URL.
chatgpt-shell-perplexity-keyPerplexity API key as a string or a function that loads and returns it.
chatgpt-shell-anthropic-thinkingWhen non-nil enable model thinking if available.
chatgpt-shell-deepseek-keyDeepSeek key as a string or a function that loads and returns it.
chatgpt-shell-prompt-header-write-git-commitPrompt header of ‘git-commit‘.
chatgpt-shell-highlight-blocksWhether or not to highlight source blocks.
chatgpt-shell-prompt-compose-display-actionChoose how to display the compose buffer.
chatgpt-shell-display-functionFunction to display the shell. Set to ‘display-buffer’ or custom function.
chatgpt-shell-prompt-header-generate-unit-testPrompt header of ‘generate-unit-test‘.
chatgpt-shell-prompt-header-refactor-codePrompt header of ‘refactor-code‘.
chatgpt-shell-prompt-header-proofread-regionPrompt header used by ‘chatgpt-shell-proofread-region‘.
chatgpt-shell-openai-reasoning-effortThe amount of reasoning effort to use for OpenAI reasoning models.
chatgpt-shell-welcome-functionFunction returning welcome message or nil for no message.
chatgpt-shell-perplexity-api-url-basePerplexity API’s base URL.
chatgpt-shell-prompt-query-response-styleDetermines the prompt style when invoking from other buffers.
chatgpt-shell-model-versionThe active model version as either a string.
chatgpt-shell-kagi-keyKagi API key as a string or a function that loads and returns it.
chatgpt-shell-loggingLogging disabled by default (slows things down).
chatgpt-shell-render-latexWhether or not to render LaTeX blocks (experimental).
chatgpt-shell-swap-model-selectorCustom function to select a model during swap.
chatgpt-shell-api-url-baseOpenAI API’s base URL.
chatgpt-shell-google-keyGoogle API key as a string or a function that loads and returns it.
chatgpt-shell-ollama-api-url-baseOllama API’s base URL.
chatgpt-shell-openrouter-keyOpenRouter key as a string or a function that loads and returns it.
chatgpt-shell-babel-headersAdditional headers to make babel blocks work.
chatgpt-shell–pretty-smerge-mode-hookHook run after entering or leaving ‘chatgpt-shell–pretty-smerge-mode’.
chatgpt-shell-include-local-file-link-contentNon-nil includes linked file content in requests.
chatgpt-shell-compose-auto-transientWhen non-nil automatically display transient menu post compose submission.
chatgpt-shell-source-block-actionsBlock actions for known languages.
chatgpt-shell-default-promptsList of default prompts to choose from.
chatgpt-shell-anthropic-keyAnthropic API key as a string or a function that loads and returns it.
chatgpt-shell-always-create-newNon-nil creates a new shell buffer every time ‘chatgpt-shell’ is invoked.
chatgpt-shell-screenshot-commandThe program to use for capturing screenshots.
chatgpt-shell-prompt-header-eshell-summarize-last-command-outputPrompt header of ‘eshell-summarize-last-command-output‘.
chatgpt-shell-system-promptThe system prompt ‘chatgpt-shell-system-prompts’ index.
chatgpt-shell-transmitted-context-lengthControls the amount of context provided to chatGPT.
chatgpt-shell-root-pathRoot path location to store internal shell files.
chatgpt-shell-prompt-header-whats-wrong-with-last-commandPrompt header of ‘whats-wrong-with-last-command‘.
chatgpt-shell-read-string-functionFunction to read strings from user.
chatgpt-shell-swap-model-filterFilter models to swap from using this function as a filter.
chatgpt-shell-after-command-functionsAbnormal hook (i.e. with parameters) invoked after each command.
chatgpt-shell-system-promptsList of system prompts to choose from.
chatgpt-shell-openai-keyOpenAI key as a string or a function that loads and returns it.
chatgpt-shell-proxyWhen non-nil, use as a proxy (for example http or socks5).
chatgpt-shell-prompt-header-describe-codePrompt header of ‘describe-code‘.
chatgpt-shell-insert-dividersWhether or not to display a divider between requests and responses.
chatgpt-shell-modelsThe list of supported models to swap from.
chatgpt-shell-openrouter-api-url-baseOpenRouter API’s base URL.
chatgpt-shell-language-mappingMaps external language names to Emacs names.
chatgpt-shell-prompt-compose-view-mode-hookHook run after entering or leaving ‘chatgpt-shell-prompt-compose-view-mode’.
chatgpt-shell-streamingWhether or not to stream ChatGPT responses (show chunks as they arrive).
chatgpt-shell-anthropic-api-url-baseAnthropic API’s base URL.
chatgpt-shell-model-temperatureWhat sampling temperature to use, between 0 and 2, or nil.
chatgpt-shell-anthropic-thinking-budget-tokensThe token budget allocated for Anthropic model thinking.
chatgpt-shell-request-timeoutHow long to wait for a request to time out in seconds.
chatgpt-shell-kagi-api-url-baseKagi API’s base URL.

There are more. Browse viaM-x set-variable

chatgpt-shell-display-function (with custom function)

If you’d prefer your own custom display function,

(setq chatgpt-shell-display-function#'my/chatgpt-shell-frame)(defunmy/chatgpt-shell-frame (bname)  (let ((cur-f (selected-frame))        (f (my/find-or-make-frame"chatgpt")))    (select-frame-by-name"chatgpt")    (pop-to-buffer-same-window bname)    (set-frame-position f (/ (display-pixel-width)2)0)    (set-frame-height f (frame-height cur-f))    (set-frame-width f  (frame-width cur-f)1)))(defunmy/find-or-make-frame (fname)  (condition-casenil      (select-frame-by-name fname)    (error (make-frame `((name.,fname))))))

Thanks totuhdo for the custom display function.

chatgpt-shell commands

BindingCommandDescription
chatgpt-shell-japanese-lookupLook Japanese term up.
chatgpt-shell-next-source-blockMove point to the next source block’s body.
chatgpt-shell-prompt-compose-request-entire-snippetIf the response code is incomplete, request the entire snippet.
chatgpt-shell-prompt-compose-request-moreRequest more data. This is useful if you already requested examples.
chatgpt-shell-google-toggle-grounding-with-google-searchToggle the `:grounding-search’ boolean for the currently-selected model.
chatgpt-shell-execute-babel-block-action-at-pointExecute block as org babel.
C-c C-schatgpt-shell-swap-system-promptSwap system prompt from `chatgpt-shell-system-prompts’.
chatgpt-shell-system-prompts-menuChatGPT
chatgpt-shell-prompt-compose-swap-model-versionSwap the compose buffer’s model version.
chatgpt-shell-describe-codeDescribe code from region using ChatGPT.
C-<up> or M-pchatgpt-shell-previous-inputCycle backwards through input history, saving input.
chatgpt-shell-previous-linkMove point to the previous link.
chatgpt-shell-copy-block-at-pointCopy code block at point to the kill ring.
chatgpt-shell-prompt-compose-next-itemJump to and select next item (request, response, block, link, interaction).
C-c C-vchatgpt-shell-swap-modelSwap model version from `chatgpt-shell-models’.
C-x C-schatgpt-shell-save-session-transcriptSave shell transcript to file.
chatgpt-shell-proofread-regionProofread text from region or current paragraph using ChatGPT.
chatgpt-shell-prompt-compose-quit-and-close-frameQuit compose and close frame if it’s the last window.
chatgpt-shell-prompt-compose-other-bufferJump to the shell buffer (compose’s other buffer).
chatgpt-shellStart a ChatGPT shell interactive command.
RETchatgpt-shell-submitSubmit current input.
chatgpt-shell-prompt-compose-swap-system-promptSwap the compose buffer’s system prompt.
chatgpt-shell-describe-imageRequest OpenAI to describe image.
chatgpt-shell-prompt-compose-search-historySearch prompt history, select, and insert to current compose buffer.
chatgpt-shell-prompt-compose-previous-historyInsert previous prompt from history into compose buffer.
chatgpt-shell-delete-interaction-at-pointDelete interaction (request and response) at point.
chatgpt-shell-anthropic-toggle-thinkingToggle Anthropic model, as per `chatgpt-shell-anthropic-thinking’.
chatgpt-shell-refresh-renderingRefresh markdown rendering by re-applying to entire buffer.
chatgpt-shell-prompt-compose-insert-block-at-pointInsert block at point at last known location.
chatgpt-shell-explain-codeDescribe code from region using ChatGPT.
chatgpt-shell-execute-block-action-at-pointExecute block at point.
chatgpt-shell-load-awesome-promptsLoad `chatgpt-shell-system-prompts’ from awesome-chatgpt-prompts.
chatgpt-shell-write-git-commitWrite commit from region using ChatGPT.
chatgpt-shell-restore-session-from-transcriptRestore session from file transcript (or HISTORY).
chatgpt-shell-prompt-compose-next-interactionShow next interaction (request / response).
<backtab> or C-c C-pchatgpt-shell-previous-itemGo to previous item.
chatgpt-shell-fix-error-at-pointFixes flymake error at point.
chatgpt-shell-next-linkMove point to the next link.
chatgpt-shell-prompt-compose-transientChatGPT Shell Compose Transient.
chatgpt-shell-prompt-compose-clear-historyClear compose and associated shell history.
chatgpt-shell-prompt-appending-kill-ringMake a ChatGPT request from the minibuffer appending kill ring.
chatgpt-shell-ollama-load-modelsQuery ollama for the locally installed models and add them to
C-<down> or M-nchatgpt-shell-next-inputCycle forwards through input history.
chatgpt-shell-prompt-compose-view-modeLike `view-mode`, but extended for ChatGPT Compose.
chatgpt-shell-clear-bufferClear the current shell buffer.
chatgpt-shell-insert-local-file-linkSelect and insert a link to a local file.
chatgpt-shell-edit-block-at-pointExecute block at point.
<tab> or C-c C-nchatgpt-shell-next-itemGo to next item.
chatgpt-shell-prompt-compose-send-bufferSend compose buffer content to shell for processing.
C-c C-echatgpt-shell-prompt-composeCompose and send prompt from a dedicated buffer.
chatgpt-shell-rename-bufferRename current shell buffer.
chatgpt-shell-remove-block-overlaysRemove block overlays. Handy for renaming blocks.
chatgpt-shell-send-regionSend region to ChatGPT.
chatgpt-shell-send-and-review-regionSend region to ChatGPT, review before submitting.
C-M-hchatgpt-shell-mark-at-point-dwimMark source block if at point. Mark all output otherwise.
chatgpt-shell-insert-buffer-file-linkSelect and insert a link to a buffer’s local file.
chatgpt-shell–pretty-smerge-modeMinor mode to display overlays for conflict markers.
chatgpt-shell-mark-blockMark current block in compose buffer.
chatgpt-shell-prompt-compose-replyReply as a follow-up and compose another query.
chatgpt-shell-prompt-compose-refreshRefresh compose buffer content with current item from shell.
chatgpt-shell-set-as-primary-shellSet as primary shell when there are multiple sessions.
chatgpt-shell-google-load-modelsQuery Google for the list of Gemini LLM models available.
chatgpt-shell-rename-block-at-pointRename block at point (perhaps a different language).
chatgpt-shell-quick-insertRequest from minibuffer and insert response into current buffer.
chatgpt-shell-reload-default-modelsReload all available models.
S-<return>chatgpt-shell-newlineInsert a newline, and move to left margin of the new line.
chatgpt-shell-generate-unit-testGenerate unit-test for the code from region using ChatGPT.
chatgpt-shell-prompt-compose-view-lastDisplay the last request/response interaction.
chatgpt-shell-prompt-compose-previous-itemJump to and select previous item (request, response, block, link, interaction).
chatgpt-shell-prompt-compose-next-historyInsert next prompt from history into compose buffer.
C-c C-cchatgpt-shell-ctrl-c-ctrl-cIf point in source block, execute it. Otherwise interrupt.
chatgpt-shell-eshell-summarize-last-command-outputAsk ChatGPT to summarize the last command output.
M-rchatgpt-shell-search-historySearch previous input history.
chatgpt-shell-modeMajor mode for ChatGPT shell.
chatgpt-shell-prompt-compose-modeMajor mode for composing ChatGPT prompts from a dedicated buffer.
chatgpt-shell-previous-source-blockMove point to the previous source block’s body.
chatgpt-shell-promptMake a ChatGPT request from the minibuffer.
chatgpt-shell-japanese-ocr-lookupSelect a region of the screen to OCR and look up in Japanese.
chatgpt-shell-refactor-codeRefactor code from region using ChatGPT.
chatgpt-shell-proofread-paragraph-or-regionProofread text from region or current paragraph using ChatGPT.
chatgpt-shell-view-block-at-pointView code block at point (using language’s major mode).
chatgpt-shell-japanese-audio-lookupTranscribe audio at current file (buffer or `dired’) and look up in Japanese.
chatgpt-shell-eshell-whats-wrong-with-last-commandAsk ChatGPT what’s wrong with the last eshell command.
chatgpt-shell-prompt-compose-cancelCancel and close compose buffer.
chatgpt-shell-prompt-compose-retryRetry sending request to shell.
chatgpt-shell-versionShow `chatgpt-shell’ mode version.
chatgpt-shell-prompt-compose-previous-interactionShow previous interaction (request / response).
chatgpt-shell-interruptInterrupt `chatgpt-shell’ from any buffer.
chatgpt-shell-view-at-pointView prompt and output at point in a separate buffer.

Browse all available viaM-x.

Feature requests

  • Please go through this README to see if the feature is already supported.
  • Need custom behaviour? Check out existingissues/feature requests. You may find solutions in discussions.

Pull requests

Pull requests are super welcome. Pleasereach out before getting started to make sure we’re not duplicating effort. Alsosearch existing discussions.

Reporting bugs

Setup isn’t working?

Please share the entire snippet you’ve used to setchatgpt-shell up (but redact your key). Share any errors you encountered. Read on for sharing additional details.

Found runtime/elisp errors?

Please enableM-x toggle-debug-on-error, reproduce the error, and share the stack trace.

Found unexpected behaviour?

Please enable logging(setq chatgpt-shell-logging t) and share the content of the*chatgpt-log* buffer in the bug report.

Babel issues?

Please also share the entire org snippet.

Support my work

👉 Find my work useful?Support this work via GitHub Sponsors orbuy my iOS apps.

My other utilities, packages, apps, writing…

Contributors

Made withcontrib.rocks.

About

A multi-llm Emacs shell (ChatGPT, Claude, DeepSeek, Gemini, Kagi, Ollama, Perplexity) + editing integrations

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

[8]ページ先頭

©2009-2025 Movatter.jp