4 KiB
API Integrations
Connection Types
The active AI provider is controlled by the connection_type preference. Possible values:
connection_type value |
Provider |
|---|---|
chatgpt_web |
ChatGPT Web (no API key, opens browser window) |
chatgpt_api |
OpenAI API (ChatGPT via API key) |
ollama_api |
Ollama (self-hosted LLM) |
openai_comp_api |
OpenAI-compatible API |
google_gemini_api |
Google Gemini API |
anthropic_api |
Claude (Anthropic) API |
The global default is chatgpt_web. Each special prompt (add_tags, spamfilter, etc.) can independently override this via its own {prefix}_connection_type pref.
Provider Configuration
Each provider has its own settings block in integration_options_config (options/mzta-options-default.js):
ChatGPT Web
Controlled via js/mzta-chatgpt.js. Opens a browser window to chatgpt.com, injects the prompt via DOM automation, and reads back the response. Settings: chatgpt_web_model, chatgpt_web_tempchat, chatgpt_web_project, chatgpt_web_custom_gpt, chatgpt_web_load_wait_time.
Content script js/lib/diff.js is injected into ChatGPT pages for diff-view support.
OpenAI API (chatgpt_api)
- Module:
js/api/openai_responses.js - Worker:
js/workers/model-worker-openai_responses.js - Settings keys:
chatgpt_api_key,chatgpt_model,chatgpt_developer_messages,chatgpt_temperature,chatgpt_store
Ollama (ollama_api)
- Module:
js/api/ollama.js - Worker:
js/workers/model-worker-ollama.js - Settings keys:
ollama_host,ollama_model,ollama_num_ctx,ollama_temperature,ollama_think,ollama_format_json - Requires CORS to be configured on the Ollama server
OpenAI-Compatible (openai_comp_api)
- Module:
js/api/openai_comp.js - Worker:
js/workers/model-worker-openai_comp.js - Settings keys:
openai_comp_host,openai_comp_model,openai_comp_api_key,openai_comp_use_v1,openai_comp_chat_name,openai_comp_temperature - Pre-configured providers:
js/api/openai_comp_configs.js(DeepSeek, Grok, Mistral, OpenRouter, Perplexity)
Google Gemini (google_gemini_api)
- Module:
js/api/google_gemini.js - Worker:
js/workers/model-worker-google_gemini.js - Settings keys:
google_gemini_api_key,google_gemini_model,google_gemini_system_instruction,google_gemini_thinking_budget,google_gemini_temperature
Anthropic / Claude (anthropic_api)
- Module:
js/api/anthropic.js - Worker:
js/workers/model-worker-anthropic.js - Settings keys:
anthropic_api_key,anthropic_model,anthropic_version,anthropic_max_tokens,anthropic_system_prompt,anthropic_temperature
Web Worker Pattern
For all API-based providers (everything except ChatGPT Web), the call goes through a Web Worker:
mzta-background.js
→ creates new Worker('js/workers/model-worker-<provider>.js')
→ postMessage({ prompt, settings })
→ worker makes HTTP fetch to provider API
→ worker postMessage({ result }) back
→ background handles result
This keeps API calls off the main thread and avoids blocking the Thunderbird UI.
Optional Permissions
API calls require host permissions. These are declared as optional_permissions in manifest.json and requested at runtime:
https://*.chatgpt.com/*andhttps://*.openai.com/*for ChatGPThttps://*.anthropic.com/*for Claudehttps://*/*andhttp://*/*for Ollama and OpenAI-compatible endpoints
Adding a New Provider
- Create
js/api/<provider>.jswith the API call logic - Create
js/workers/model-worker-<provider>.jsthat imports and calls the API module - Add a new
connection_typevalue constant - Add settings keys to
integration_options_configinoptions/mzta-options-default.js - Add UI controls to
options/mzta-options.htmlandoptions/mzta-options.js - Add the new
connection_typecase to the dispatch logic inmzta-background.js - Add required host permissions to
manifest.jsonoptional_permissions - Add i18n strings to
_locales/en/messages.json