converse-mcp-server 4.4.0 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +4 -0
- package/README.md +20 -2
- package/docs/API.md +16 -3
- package/docs/PROVIDERS.md +20 -3
- package/package.json +4 -4
- package/src/async/providerStreamNormalizer.js +12 -8
- package/src/config.js +9 -1
- package/src/prompts/helpPrompt.js +2 -0
- package/src/providers/abliteration.js +119 -0
- package/src/providers/index.js +2 -0
- package/src/tools/chat.js +1 -1
- package/src/utils/modelRouting.js +4 -0
package/.env.example
CHANGED
|
@@ -47,6 +47,9 @@ DEEPSEEK_API_KEY=your_deepseek_api_key_here
|
|
|
47
47
|
# append :online to a slug to opt into web search (adds a real per-request cost).
|
|
48
48
|
OPENROUTER_API_KEY=your_openrouter_api_key_here
|
|
49
49
|
|
|
50
|
+
# Get your abliteration.ai API key (ak_...) from: https://abliteration.ai/console/api-keys
|
|
51
|
+
ABLITERATION_API_KEY=your_abliteration_api_key_here
|
|
52
|
+
|
|
50
53
|
# Optional: referer and title for OpenRouter ranking credit (both optional; omitting is valid)
|
|
51
54
|
# OPENROUTER_REFERER=https://github.com/FallDownTheSystem/converse
|
|
52
55
|
# OPENROUTER_TITLE=Converse
|
|
@@ -102,6 +105,7 @@ TYPESAFE_API_KEY=your_typesafe_api_key_here
|
|
|
102
105
|
# MISTRAL_DEFAULT_MODEL=mistral-medium-3-5
|
|
103
106
|
# DEEPSEEK_DEFAULT_MODEL=deepseek-v4-pro
|
|
104
107
|
# OPENROUTER_DEFAULT_MODEL=z-ai/glm-5.2 # any vendor/model slug
|
|
108
|
+
# ABLITERATION_DEFAULT_MODEL=abliterated-model-large-v2
|
|
105
109
|
|
|
106
110
|
# ============================================
|
|
107
111
|
# Server Configuration
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/converse-mcp-server)
|
|
4
4
|
|
|
5
|
-
An MCP (Model Context Protocol) server that lets Claude talk to other AI models. Use it to chat with models from OpenAI, Google, Anthropic, X.AI, Mistral, DeepSeek, or
|
|
5
|
+
An MCP (Model Context Protocol) server that lets Claude talk to other AI models. Use it to chat with models from OpenAI, Google, Anthropic, X.AI, Mistral, DeepSeek, OpenRouter, or Abliteration. You can either talk to one model at a time or get multiple models to weigh in on complex decisions.
|
|
6
6
|
|
|
7
7
|
## 📋 Requirements
|
|
8
8
|
|
|
@@ -25,6 +25,7 @@ You need at least one API key from these providers:
|
|
|
25
25
|
| **Mistral** | [console.mistral.ai](https://console.mistral.ai/) | `wfBMkWL0...` |
|
|
26
26
|
| **DeepSeek** | [platform.deepseek.com](https://platform.deepseek.com/) | `sk-...` |
|
|
27
27
|
| **OpenRouter** | [openrouter.ai/keys](https://openrouter.ai/keys) | `sk-or-...` |
|
|
28
|
+
| **Abliteration** | [abliteration.ai/console/api-keys](https://abliteration.ai/console/api-keys) | `ak_...` |
|
|
28
29
|
| **Codex** | ChatGPT login (system-wide) | Local agentic assistant |
|
|
29
30
|
|
|
30
31
|
**Note:** Codex uses your ChatGPT login (not an API key). If you have an active ChatGPT session, Codex will work automatically. For headless/server deployments, set `CODEX_API_KEY` in your environment.
|
|
@@ -43,6 +44,7 @@ claude mcp add converse \
|
|
|
43
44
|
-e MISTRAL_API_KEY=your_key_here \
|
|
44
45
|
-e DEEPSEEK_API_KEY=your_key_here \
|
|
45
46
|
-e OPENROUTER_API_KEY=your_key_here \
|
|
47
|
+
-e ABLITERATION_API_KEY=ak_your_key_here \
|
|
46
48
|
-e ENABLE_RESPONSE_SUMMARIZATION=true \
|
|
47
49
|
-e SUMMARIZATION_MODEL=gpt-5-nano \
|
|
48
50
|
-s user \
|
|
@@ -67,6 +69,7 @@ Add this configuration to your Claude Desktop settings:
|
|
|
67
69
|
"MISTRAL_API_KEY": "your_key_here",
|
|
68
70
|
"DEEPSEEK_API_KEY": "your_key_here",
|
|
69
71
|
"OPENROUTER_API_KEY": "your_key_here",
|
|
72
|
+
"ABLITERATION_API_KEY": "ak_your_key_here",
|
|
70
73
|
"ENABLE_RESPONSE_SUMMARIZATION": "true",
|
|
71
74
|
"SUMMARIZATION_MODEL": "gpt-5-nano"
|
|
72
75
|
}
|
|
@@ -304,6 +307,16 @@ Thinking mode maps `reasoning_effort` to `none` (off), `high` (enabled levels up
|
|
|
304
307
|
|
|
305
308
|
Any other model works via its full `provider/model` slug or the `openrouter:` namespace — no extra configuration. Append `:online` to a slug to opt into web search (adds a real per-request cost).
|
|
306
309
|
|
|
310
|
+
### Abliteration Models
|
|
311
|
+
|
|
312
|
+
Abliteration provides uncensored ("abliterated") reasoning models through its OpenAI-compatible Chat Completions API at `https://api.abliteration.ai/v1`; see [its documentation](https://docs.abliteration.ai). Use the `abliteration` or `ablit` namespace; set `ABLITERATION_DEFAULT_MODEL` to override the default. Web search is not supported.
|
|
313
|
+
|
|
314
|
+
- **abliterated-model-large-v2** (default; aliases: `abliterated-large`, `abliterated-large-v2`): GLM-5.3-derived, text-only (1M context, 999,990 max output)
|
|
315
|
+
- **abliterated-model-large** (alias: `abliterated-large-v1`): Previous large model, GLM-5.2-derived, text-only (1M context, 999,990 max output)
|
|
316
|
+
- **abliterated-model** (aliases: `abliterated`, `abliterated-base`): Multimodal with image input (256K context, 262,134 max output)
|
|
317
|
+
|
|
318
|
+
All models reason by default and return reasoning traces (`reasoning_content`), streamed as thinking. `reasoning_effort` is clamped to each model's supported levels: large-v2 runs `low`/`high`/`max` and cannot disable reasoning (`none`/`minimal`/`low` → `low`, `medium`/`high` → `high`, `xhigh`/`max` → `max`); large runs `high`/`max` and can disable (`none` → `none`, `minimal`–`high` → `high`, `xhigh`/`max` → `max`); base accepts every level, with `none` disabling reasoning. Only `abliterated-model` accepts images; image requests to the text-only large models are rejected before sending.
|
|
319
|
+
|
|
307
320
|
### Codex Models
|
|
308
321
|
|
|
309
322
|
OpenAI Codex agentic coding assistant. `codex` uses its default model (GPT-6 Astra, or `CODEX_DEFAULT_MODEL`); `codex:<model>` picks one (e.g. `codex:luna`, `codex:astra`, `codex:gpt-5.6-terra`):
|
|
@@ -369,6 +382,7 @@ ANTHROPIC_API_KEY=sk-ant-your_anthropic_key_here
|
|
|
369
382
|
MISTRAL_API_KEY=your_mistral_key_here
|
|
370
383
|
DEEPSEEK_API_KEY=your_deepseek_key_here
|
|
371
384
|
OPENROUTER_API_KEY=sk-or-your_openrouter_key_here
|
|
385
|
+
ABLITERATION_API_KEY=ak_your_key_here
|
|
372
386
|
|
|
373
387
|
# Optional: Server configuration
|
|
374
388
|
PORT=3157
|
|
@@ -402,6 +416,7 @@ ANTHROPIC_DEFAULT_MODEL=claude-opus-5-5
|
|
|
402
416
|
MISTRAL_DEFAULT_MODEL=mistral-medium-3-5
|
|
403
417
|
DEEPSEEK_DEFAULT_MODEL=deepseek-v4-pro
|
|
404
418
|
OPENROUTER_DEFAULT_MODEL=z-ai/glm-5.2 # any vendor/model slug is accepted
|
|
419
|
+
ABLITERATION_DEFAULT_MODEL=abliterated-model-large-v2
|
|
405
420
|
```
|
|
406
421
|
|
|
407
422
|
### Configuration Options
|
|
@@ -506,6 +521,7 @@ Provider priority order (subscription-based local providers first, then API-key
|
|
|
506
521
|
9. Mistral (`mistral` → Mistral Medium 3.5)
|
|
507
522
|
10. DeepSeek (`deepseek` → DeepSeek V4 Pro)
|
|
508
523
|
11. OpenRouter (`openrouter` → GLM 5.2)
|
|
524
|
+
12. Abliteration (`abliteration` / `ablit` → `abliterated-model-large-v2`)
|
|
509
525
|
|
|
510
526
|
**Local agent permissions:** Bare model names and `auto` reach the local agent providers whenever they are set up, not only when named explicitly. The Antigravity CLI runs `agy` with `--dangerously-skip-permissions` because headless calls cannot prompt for tool approval — every tool request is auto-approved, including shell commands and file writes. The Claude Agent SDK runs with `bypassPermissions`. Codex uses `CODEX_SANDBOX_MODE` (read-only by default). A read-only prompt is not an enforced security boundary for these providers, so use them only with trusted prompts and context. To keep a request on a plain API, name the provider: `google:pro`, `anthropic:opus`, `openai:gpt-6-astra`.
|
|
511
527
|
|
|
@@ -532,7 +548,8 @@ If you've cloned the repository locally:
|
|
|
532
548
|
"ANTHROPIC_API_KEY": "your_key_here",
|
|
533
549
|
"MISTRAL_API_KEY": "your_key_here",
|
|
534
550
|
"DEEPSEEK_API_KEY": "your_key_here",
|
|
535
|
-
"OPENROUTER_API_KEY": "your_key_here"
|
|
551
|
+
"OPENROUTER_API_KEY": "your_key_here",
|
|
552
|
+
"ABLITERATION_API_KEY": "ak_your_key_here"
|
|
536
553
|
}
|
|
537
554
|
}
|
|
538
555
|
}
|
|
@@ -747,6 +764,7 @@ converse/
|
|
|
747
764
|
│ │ ├── mistral.js # Mistral AI provider
|
|
748
765
|
│ │ ├── deepseek.js # DeepSeek provider
|
|
749
766
|
│ │ ├── openrouter.js # OpenRouter provider
|
|
767
|
+
│ │ ├── abliteration.js # Abliteration provider
|
|
750
768
|
│ │ ├── openrouter-discovery.js # Request-local OpenRouter slug discovery
|
|
751
769
|
│ │ ├── openai-compatible.js # Base for OpenAI-compatible APIs
|
|
752
770
|
│ │ ├── codex.js # Codex agentic SDK provider
|
package/docs/API.md
CHANGED
|
@@ -564,6 +564,16 @@ Models with adaptive thinking control depth via `reasoning_effort`, which is pas
|
|
|
564
564
|
|
|
565
565
|
Any other model works via its full `provider/model` slug (e.g. `anthropic/claude-sonnet-5`) or the `openrouter:` namespace. Append `:online` to a slug (e.g. `z-ai/glm-5.2:online`) to opt into web search, which adds a real per-request cost.
|
|
566
566
|
|
|
567
|
+
### Abliteration Models
|
|
568
|
+
|
|
569
|
+
| Model | Aliases | Context | Output | Notes |
|
|
570
|
+
|-------|---------|---------|--------|-------|
|
|
571
|
+
| `abliterated-model-large-v2` | `abliterated-large`, `abliterated-large-v2` | 1M | 999,990 | Default; GLM-5.3-derived, text-only |
|
|
572
|
+
| `abliterated-model-large` | `abliterated-large-v1` | 1M | 999,990 | Previous large model, GLM-5.2-derived, text-only |
|
|
573
|
+
| `abliterated-model` | `abliterated`, `abliterated-base` | 256K | 262,134 | Multimodal, image input |
|
|
574
|
+
|
|
575
|
+
All three are uncensored ("abliterated") reasoning models using Abliteration's OpenAI-compatible Chat Completions API at `https://api.abliteration.ai/v1`. Get an API key at [abliteration.ai/console/api-keys](https://abliteration.ai/console/api-keys); docs: [docs.abliteration.ai](https://docs.abliteration.ai). Route with the `abliteration:` namespace (canonical) or `ablit:`. All reason by default and return `reasoning_content`, streamed as thinking. `reasoning_effort` is clamped to each model's supported levels: large-v2 runs `low`/`high`/`max` and cannot disable reasoning (`none`/`minimal`/`low` → `low`, `medium`/`high` → `high`, `xhigh`/`max` → `max`); large runs `high`/`max` and can disable (`none` → `none`, `minimal`–`high` → `high`, `xhigh`/`max` → `max`); base accepts every level, with `none` disabling reasoning. Only `abliterated-model` accepts images; image requests to the text-only large models are rejected before sending. Web search is not supported.
|
|
576
|
+
|
|
567
577
|
### Codex (agentic, local)
|
|
568
578
|
|
|
569
579
|
**Codex** is an agentic coding assistant with direct filesystem access:
|
|
@@ -632,9 +642,9 @@ Reach these only with the `copilot:` namespace (also `github-copilot:`, `copilot
|
|
|
632
642
|
Every entry in `models` takes one of four forms:
|
|
633
643
|
|
|
634
644
|
- **`auto`** — the first available provider's default model.
|
|
635
|
-
- **`provider`** — that provider's default model (hardcoded, or `<PROVIDER>_DEFAULT_MODEL`). Namespaces: `codex`; `gemini`/`agy`/`antigravity`/`gemini-cli` (Antigravity CLI); `claude`/`claude-code`/`claude-sdk` (Claude Agent SDK); `copilot`/`github-copilot`/`copilot-sdk`; `openai`; `google`; `xai`; `anthropic`; `mistral`; `deepseek`; `openrouter`.
|
|
645
|
+
- **`provider`** — that provider's default model (hardcoded, or `<PROVIDER>_DEFAULT_MODEL`). Namespaces: `codex`; `gemini`/`agy`/`antigravity`/`gemini-cli` (Antigravity CLI); `claude`/`claude-code`/`claude-sdk` (Claude Agent SDK); `copilot`/`github-copilot`/`copilot-sdk`; `openai`; `google`; `xai`; `anthropic`; `mistral`; `deepseek`; `openrouter`; `abliteration`; `ablit`.
|
|
636
646
|
- **`provider:model`** — that model on that provider only; the model must be in that provider's list.
|
|
637
|
-
- **Bare `model`** — the first provider, in the order `codex`, `gemini-cli`, `claude`, `openai`, `google`, `xai`, `anthropic`, `mistral`, `deepseek`, `openrouter`, whose list contains the ID or alias and that is set up (API key for API providers; SDK plus login for Codex and the Claude Agent SDK; the `agy` binary for Antigravity). On an authentication or availability error, the next set-up provider serving **the same model** takes over; a provider whose alias points at a different model is never substituted (bare `fable` is Fable 5.1 on the Claude Agent SDK and Fable 5 on the Anthropic API). Copilot never serves bare names.
|
|
647
|
+
- **Bare `model`** — the first provider, in the order `codex`, `gemini-cli`, `claude`, `openai`, `google`, `xai`, `anthropic`, `mistral`, `deepseek`, `openrouter`, `abliteration`, whose list contains the ID or alias and that is set up (API key for API providers; SDK plus login for Codex and the Claude Agent SDK; the `agy` binary for Antigravity). On an authentication or availability error, the next set-up provider serving **the same model** takes over; a provider whose alias points at a different model is never substituted (bare `fable` is Fable 5.1 on the Claude Agent SDK and Fable 5 on the Anthropic API). Copilot never serves bare names.
|
|
638
648
|
|
|
639
649
|
**Unknown names are rejected**, never forwarded: the error lists up to three close matches, e.g. `Unknown model "gtp-6-astra". Did you mean: gpt-6-astra?` or `Unknown openai model "spark" in "openai:spark". Did you mean: codex:spark?`. The exception is OpenRouter: a full `vendor/model` slug (bare or `openrouter:`) is validated against OpenRouter's live catalog.
|
|
640
650
|
|
|
@@ -650,6 +660,7 @@ Every entry in `models` takes one of four forms:
|
|
|
650
660
|
"mistral" // Mistral (-> mistral-medium-3-5)
|
|
651
661
|
"z-ai/glm-5.2" // OpenRouter (full slug)
|
|
652
662
|
"z-ai/glm-5.2:online" // OpenRouter with web search opt-in
|
|
663
|
+
"ablit" // Abliteration (-> abliterated-model-large-v2)
|
|
653
664
|
"fable" // Claude Agent SDK (-> claude-fable-5-1) when set up, otherwise Anthropic API (-> claude-fable-5)
|
|
654
665
|
"opus" // Claude Agent SDK (-> claude-opus-5-5), else Anthropic API
|
|
655
666
|
"anthropic:opus" // Anthropic API only
|
|
@@ -666,7 +677,7 @@ Every entry in `models` takes one of four forms:
|
|
|
666
677
|
- **chat mode**: `["auto"]` selects the first available provider and uses its default model, with failover to the next provider on error.
|
|
667
678
|
- **consensus mode**: `["auto"]` expands to the first 3 available providers.
|
|
668
679
|
|
|
669
|
-
Provider auto-selection priority (subscription-based CLI/SDK providers first, then API-key providers): `codex`, `gemini-cli`, `claude`, `copilot`, `openai`, `google`, `xai`, `anthropic`, `mistral`, `deepseek`, `openrouter`.
|
|
680
|
+
Provider auto-selection priority (subscription-based CLI/SDK providers first, then API-key providers): `codex`, `gemini-cli`, `claude`, `copilot`, `openai`, `google`, `xai`, `anthropic`, `mistral`, `deepseek`, `openrouter`, `abliteration`.
|
|
670
681
|
|
|
671
682
|
## Configuration
|
|
672
683
|
|
|
@@ -714,6 +725,7 @@ ANTHROPIC_DEFAULT_MODEL=claude-opus-5-5
|
|
|
714
725
|
MISTRAL_DEFAULT_MODEL=mistral-medium-3-5
|
|
715
726
|
DEEPSEEK_DEFAULT_MODEL=deepseek-v4-pro
|
|
716
727
|
OPENROUTER_DEFAULT_MODEL=z-ai/glm-5.2 # any vendor/model slug is accepted
|
|
728
|
+
ABLITERATION_DEFAULT_MODEL=abliterated-model-large-v2
|
|
717
729
|
```
|
|
718
730
|
|
|
719
731
|
## Context Processing
|
|
@@ -822,6 +834,7 @@ ANTHROPIC_API_KEY=sk-ant-...
|
|
|
822
834
|
MISTRAL_API_KEY=...
|
|
823
835
|
DEEPSEEK_API_KEY=...
|
|
824
836
|
OPENROUTER_API_KEY=sk-or-...
|
|
837
|
+
ABLITERATION_API_KEY=ak_...
|
|
825
838
|
TYPESAFE_API_KEY=... # decide tool only
|
|
826
839
|
```
|
|
827
840
|
|
package/docs/PROVIDERS.md
CHANGED
|
@@ -99,6 +99,17 @@ This guide documents all supported AI providers in the Converse MCP Server and t
|
|
|
99
99
|
- **Reasoning**: Per-model. `z-ai/glm-5.2` and the `deepseek/deepseek-v4-*` slugs are effort-tiered (`max` → `xhigh`, other enabled levels → `high`, `none` disables); `qwen/qwen3.7-*` and `moonshotai/kimi-k2.6` are enable/disable only (`none` disables, any other level enables); `moonshotai/kimi-k2.7-code` always reasons and cannot be disabled; `openrouter/auto` lets the router choose.
|
|
100
100
|
- **Web search (opt-in, adds cost)**: OpenRouter web search is off by default because it incurs a real per-request charge. Enable it explicitly by appending `:online` to a slug (e.g. `z-ai/glm-5.2:online` or `openrouter:qwen/qwen3.7-max:online`). When enabled, `annotations[].url_citation` citations are captured into metadata. Ordinary requests never attach a web-search plugin.
|
|
101
101
|
|
|
102
|
+
### Abliteration
|
|
103
|
+
- **API Key Format**: `ak_...`
|
|
104
|
+
- **Get Key**: [abliteration.ai/console/api-keys](https://abliteration.ai/console/api-keys) ([documentation](https://docs.abliteration.ai))
|
|
105
|
+
- **Environment Variable**: `ABLITERATION_API_KEY`
|
|
106
|
+
- **API**: OpenAI-compatible Chat Completions API at `https://api.abliteration.ai/v1`
|
|
107
|
+
- **Supported Models**:
|
|
108
|
+
- `abliterated-model-large-v2` (default; aliases: `abliterated-large`, `abliterated-large-v2`) - Uncensored, GLM-5.3-derived reasoning model, text-only (1M context, 999,990 max output)
|
|
109
|
+
- `abliterated-model-large` (alias: `abliterated-large-v1`) - Previous large model, GLM-5.2-derived, text-only (1M context, 999,990 max output)
|
|
110
|
+
- `abliterated-model` (aliases: `abliterated`, `abliterated-base`) - Multimodal with image input (256K context, 262,134 max output)
|
|
111
|
+
- **Reasoning**: All models reason by default and return `reasoning_content`, streamed as thinking. The large-v2 model supports `low`/`high`/`max` and cannot disable reasoning (`none`/`minimal`/`low` → `low`, `medium`/`high` → `high`, `xhigh`/`max` → `max`). The large model supports `high`/`max` and can disable reasoning (`none` → `none`, `minimal`–`high` → `high`, `xhigh`/`max` → `max`). The base model accepts every level, with `none` disabling reasoning.
|
|
112
|
+
|
|
102
113
|
### Codex
|
|
103
114
|
- **API Key Format**: Optional (uses ChatGPT login by default)
|
|
104
115
|
- **Authentication**: ChatGPT login (system-wide) OR `CODEX_API_KEY`
|
|
@@ -265,6 +276,7 @@ DEEPSEEK_API_KEY=your_deepseek_key_here
|
|
|
265
276
|
|
|
266
277
|
# OpenRouter needs only an API key; any provider/model slug works directly
|
|
267
278
|
OPENROUTER_API_KEY=sk-or-your_key_here
|
|
279
|
+
ABLITERATION_API_KEY=ak_your_key_here
|
|
268
280
|
# Optional: referer and title for OpenRouter ranking credit
|
|
269
281
|
OPENROUTER_REFERER=https://github.com/YourUsername/YourApp
|
|
270
282
|
OPENROUTER_TITLE=Converse
|
|
@@ -292,6 +304,7 @@ ANTHROPIC_DEFAULT_MODEL=claude-opus-5-5
|
|
|
292
304
|
MISTRAL_DEFAULT_MODEL=mistral-medium-3-5
|
|
293
305
|
DEEPSEEK_DEFAULT_MODEL=deepseek-v4-pro
|
|
294
306
|
OPENROUTER_DEFAULT_MODEL=z-ai/glm-5.2 # any vendor/model slug is accepted
|
|
307
|
+
ABLITERATION_DEFAULT_MODEL=abliterated-model-large-v2
|
|
295
308
|
```
|
|
296
309
|
|
|
297
310
|
### Claude Configuration (claude_desktop_config.json)
|
|
@@ -307,6 +320,7 @@ OPENROUTER_DEFAULT_MODEL=z-ai/glm-5.2 # any vendor/model slug is accepted
|
|
|
307
320
|
"MISTRAL_API_KEY": "your_key_here",
|
|
308
321
|
"DEEPSEEK_API_KEY": "your_key_here",
|
|
309
322
|
"OPENROUTER_API_KEY": "your_key_here",
|
|
323
|
+
"ABLITERATION_API_KEY": "ak_your_key_here",
|
|
310
324
|
"OPENROUTER_REFERER": "https://github.com/YourUsername/YourApp",
|
|
311
325
|
"OPENROUTER_TITLE": "Converse"
|
|
312
326
|
}
|
|
@@ -324,12 +338,13 @@ All providers support streaming responses for real-time output.
|
|
|
324
338
|
- **Full Support**: OpenAI, Google, X.AI (Grok 4.5), Anthropic (Claude-4 series, Claude-3-Opus)
|
|
325
339
|
- **Mistral**: `mistral-medium-3-5` and `mistral-small-2603` accept images; `mistral-large-2512` is text-only
|
|
326
340
|
- **Via OpenRouter**: Depends on the model — `qwen/qwen3.7-plus`, `moonshotai/kimi-k2.7-code`, and `moonshotai/kimi-k2.6` accept images; `z-ai/glm-5.2` and the `deepseek/deepseek-v4-*` slugs are text-only
|
|
341
|
+
- **Abliteration**: Only `abliterated-model` accepts images; both large models are text-only, and image requests to them are rejected before sending
|
|
327
342
|
- **No Support**: DeepSeek (native), Codex
|
|
328
343
|
|
|
329
344
|
### Web Search
|
|
330
345
|
- **Automatic where supported**: OpenAI, Google, and X.AI (Grok 4.5, via Agent Tools) attach web search on every request for capable models; the model decides whether to use it
|
|
331
346
|
- **OpenRouter (opt-in, adds cost)**: Off by default; append `:online` to a slug to enable it per request (real per-request charge), with citations captured into metadata
|
|
332
|
-
- **No Support**: Anthropic, Mistral, DeepSeek, Codex
|
|
347
|
+
- **No Support**: Anthropic, Mistral, DeepSeek, Codex, Abliteration
|
|
333
348
|
|
|
334
349
|
### Thinking/Reasoning Modes
|
|
335
350
|
- **OpenAI**: GPT-5 family and O3 series models support the `reasoning_effort` parameter (GPT-5.6 accepts `none` through `max`, mapping `minimal` to `low`; GPT-5 Pro is fixed at `high`)
|
|
@@ -341,6 +356,7 @@ All providers support streaming responses for real-time output.
|
|
|
341
356
|
- **Mistral**: `mistral-medium-3-5` and `mistral-small-2603` map `reasoning_effort` to `high` (enabled) or `none` (disabled); `mistral-large-2512` has no adjustable reasoning
|
|
342
357
|
- **DeepSeek**: V4 models use thinking mode via `reasoning_effort` (`none` disables; enabled levels use `high`, `max` uses `max`)
|
|
343
358
|
- **OpenRouter**: Reasoning is per-model (effort-tiered, enable/disable-only, mandatory, or router-chosen — see the OpenRouter section)
|
|
359
|
+
- **Abliteration**: All models reason by default and return reasoning traces (`reasoning_content`), streamed as thinking; see the Abliteration section for `reasoning_effort` clamping
|
|
344
360
|
- **Codex**: Thread-based agentic reasoning with persistent context
|
|
345
361
|
- **Others**: Standard inference only
|
|
346
362
|
|
|
@@ -362,11 +378,11 @@ Routing is derived entirely from each provider's model list (canonical IDs plus
|
|
|
362
378
|
- `gemini`, `agy`, `antigravity`, `gemini-cli` → Gemini via Antigravity CLI
|
|
363
379
|
- `claude`, `claude-code`, `claude-sdk` → Claude Agent SDK
|
|
364
380
|
- `copilot`, `github-copilot`, `copilot-sdk` → Copilot SDK
|
|
365
|
-
- `openai`, `google`, `xai`, `anthropic`, `mistral`, `deepseek`, `openrouter` → the matching API provider
|
|
381
|
+
- `openai`, `google`, `xai`, `anthropic`, `mistral`, `deepseek`, `openrouter`, `abliteration`, `ablit` → the matching API provider
|
|
366
382
|
|
|
367
383
|
2. **`provider:model`** — that model on that provider only (e.g. `codex:astra`, `gemini:pro`, `google:pro`, `anthropic:opus`, `copilot:sonnet`). The model must be in that provider's list; there is no failover to another provider.
|
|
368
384
|
|
|
369
|
-
3. **Bare `model`** — an ID or alias without a namespace goes to the first provider, in this order, whose list contains the name and that is set up: Codex, Antigravity CLI, Claude Agent SDK, OpenAI, Google, X.AI, Anthropic, Mistral, DeepSeek, OpenRouter.
|
|
385
|
+
3. **Bare `model`** — an ID or alias without a namespace goes to the first provider, in this order, whose list contains the name and that is set up: Codex, Antigravity CLI, Claude Agent SDK, OpenAI, Google, X.AI, Anthropic, Mistral, DeepSeek, OpenRouter, Abliteration.
|
|
370
386
|
- "Set up" means an API key for API providers; for Codex, the SDK plus a login file or `CODEX_API_KEY`; for the Claude Agent SDK, the SDK plus a login file, a macOS login, or `CLAUDE_CODE_OAUTH_TOKEN`/`ANTHROPIC_API_KEY`; for Antigravity, the `agy` binary.
|
|
371
387
|
- If that provider fails with an authentication or availability error (including an expired login, which is only detected at call time), the next set-up provider that serves **the same model** takes over. A provider whose alias of that name points at a different model is never substituted (bare `fable` is Fable 5.1 on the Claude Agent SDK and Fable 5 on the Anthropic API; bare `flash` is Gemini 3.8 Flash on Antigravity and Gemini 2.5 Flash on the Google API).
|
|
372
388
|
- Copilot never serves bare names; use `copilot:<model>`.
|
|
@@ -400,6 +416,7 @@ Examples:
|
|
|
400
416
|
"z-ai/glm-5.2:online" // OpenRouter with web search opt-in
|
|
401
417
|
"anthropic/claude-sonnet-5" // OpenRouter (any full slug routes as-is)
|
|
402
418
|
"openrouter/auto" // OpenRouter auto-selection
|
|
419
|
+
"ablit" // Abliteration default model (abliterated-model-large-v2)
|
|
403
420
|
```
|
|
404
421
|
|
|
405
422
|
```json
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "converse-mcp-server",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0",
|
|
4
4
|
"description": "Converse MCP Server - Converse with other LLMs with chat and consensus tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.js",
|
|
@@ -93,20 +93,20 @@
|
|
|
93
93
|
".env.example"
|
|
94
94
|
],
|
|
95
95
|
"dependencies": {
|
|
96
|
-
"@anthropic-ai/claude-agent-sdk": "^0.3.
|
|
96
|
+
"@anthropic-ai/claude-agent-sdk": "^0.3.285",
|
|
97
97
|
"@anthropic-ai/sdk": "^0.129.0",
|
|
98
98
|
"@github/copilot-sdk": "^1.0.15",
|
|
99
99
|
"@google/genai": "^2.24.0",
|
|
100
100
|
"@lydell/node-pty": "1.2.0-beta.15",
|
|
101
101
|
"@mistralai/mistralai": "^2.7.0",
|
|
102
102
|
"@modelcontextprotocol/sdk": "^1.31.0",
|
|
103
|
-
"@openai/codex-sdk": "^0.159.
|
|
103
|
+
"@openai/codex-sdk": "^0.159.2",
|
|
104
104
|
"cors": "^2.8.6",
|
|
105
105
|
"dotenv": "^18.0.4",
|
|
106
106
|
"express": "^5.2.1",
|
|
107
107
|
"lru-cache": "^11.5.3",
|
|
108
108
|
"nanoid": "^6.0.1",
|
|
109
|
-
"openai": "^7.
|
|
109
|
+
"openai": "^7.25.0",
|
|
110
110
|
"p-limit": "^7.3.3",
|
|
111
111
|
"vite": "^8.3.1"
|
|
112
112
|
},
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* - error: Error event with recovery information
|
|
10
10
|
*
|
|
11
11
|
* This normalizer enables seamless provider switching and uniform async processing
|
|
12
|
-
* across all supported LLM providers (OpenAI, Google, XAI, Anthropic, Mistral, DeepSeek, OpenRouter).
|
|
12
|
+
* across all supported LLM providers (OpenAI, Google, XAI, Anthropic, Mistral, DeepSeek, OpenRouter, Abliteration).
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
import { debugLog, debugError } from '../utils/console.js';
|
|
@@ -40,8 +40,11 @@ class ProviderStreamNormalizer {
|
|
|
40
40
|
google: this.normalizeGoogleStream.bind(this),
|
|
41
41
|
anthropic: this.normalizeAnthropicStream.bind(this),
|
|
42
42
|
mistral: this.normalizeMistralStream.bind(this),
|
|
43
|
-
deepseek:
|
|
43
|
+
deepseek: (stream, context) =>
|
|
44
|
+
this.normalizeChatCompletionsStream(stream, context, 'deepseek'),
|
|
44
45
|
openrouter: this.normalizeOpenRouterStream.bind(this),
|
|
46
|
+
abliteration: (stream, context) =>
|
|
47
|
+
this.normalizeChatCompletionsStream(stream, context, 'abliteration'),
|
|
45
48
|
codex: this.normalizeCodexStream.bind(this),
|
|
46
49
|
copilot: this.normalizePassthroughStream.bind(this),
|
|
47
50
|
claude: this.normalizePassthroughStream.bind(this),
|
|
@@ -507,10 +510,11 @@ class ProviderStreamNormalizer {
|
|
|
507
510
|
}
|
|
508
511
|
|
|
509
512
|
/**
|
|
510
|
-
* Normalize
|
|
513
|
+
* Normalize the event stream of a provider built on the shared
|
|
514
|
+
* OpenAI-compatible Chat Completions base (DeepSeek, Abliteration), where
|
|
515
|
+
* streamed `reasoning_content` arrives as separate thinking events.
|
|
511
516
|
*/
|
|
512
|
-
async *
|
|
513
|
-
const provider = 'deepseek';
|
|
517
|
+
async *normalizeChatCompletionsStream(stream, context, provider) {
|
|
514
518
|
const model = context.model || 'unknown';
|
|
515
519
|
const startTime = Date.now();
|
|
516
520
|
|
|
@@ -530,7 +534,7 @@ class ProviderStreamNormalizer {
|
|
|
530
534
|
continue;
|
|
531
535
|
}
|
|
532
536
|
|
|
533
|
-
// Handle delta events
|
|
537
|
+
// Handle delta events
|
|
534
538
|
if (event.type === 'delta') {
|
|
535
539
|
accumulatedContent += event.content || '';
|
|
536
540
|
yield this.createDeltaEvent(event.content || '', provider, model, {
|
|
@@ -546,7 +550,7 @@ class ProviderStreamNormalizer {
|
|
|
546
550
|
continue;
|
|
547
551
|
}
|
|
548
552
|
|
|
549
|
-
// Handle usage events (with
|
|
553
|
+
// Handle usage events (with reasoning token counts when reported)
|
|
550
554
|
if (event.type === 'usage') {
|
|
551
555
|
accumulatedUsage = event.usage;
|
|
552
556
|
if (event.usage.reasoning_tokens) {
|
|
@@ -590,7 +594,7 @@ class ProviderStreamNormalizer {
|
|
|
590
594
|
}
|
|
591
595
|
}
|
|
592
596
|
} catch (error) {
|
|
593
|
-
debugError(
|
|
597
|
+
debugError(`[StreamNormalizer] ${provider} stream error:`, error);
|
|
594
598
|
yield this.createErrorEvent(error, provider);
|
|
595
599
|
throw error;
|
|
596
600
|
}
|
package/src/config.js
CHANGED
|
@@ -214,6 +214,12 @@ const CONFIG_SCHEMA = {
|
|
|
214
214
|
secret: true,
|
|
215
215
|
description: 'OpenRouter API key',
|
|
216
216
|
},
|
|
217
|
+
ABLITERATION_API_KEY: {
|
|
218
|
+
type: 'string',
|
|
219
|
+
required: false,
|
|
220
|
+
secret: true,
|
|
221
|
+
description: 'abliteration.ai API key',
|
|
222
|
+
},
|
|
217
223
|
TYPESAFE_API_KEY: {
|
|
218
224
|
type: 'string',
|
|
219
225
|
required: false,
|
|
@@ -438,6 +444,8 @@ function validateApiKeyFormat(provider, apiKey) {
|
|
|
438
444
|
return apiKey.length >= 32; // DeepSeek keys are typically 32+ chars
|
|
439
445
|
case 'openrouter':
|
|
440
446
|
return apiKey.startsWith('sk-or-') && apiKey.length >= 40;
|
|
447
|
+
case 'abliteration':
|
|
448
|
+
return apiKey.startsWith('ak_') && apiKey.length > 10;
|
|
441
449
|
default:
|
|
442
450
|
return apiKey.length >= 10; // Basic minimum length check
|
|
443
451
|
}
|
|
@@ -713,7 +721,7 @@ export async function loadConfig() {
|
|
|
713
721
|
|
|
714
722
|
if (availableKeys.length === 0 && !hasVertexAI && !hasSdkProvider) {
|
|
715
723
|
errors.push(
|
|
716
|
-
'At least one API key must be configured: OPENAI_API_KEY, XAI_API_KEY, GOOGLE_API_KEY, GEMINI_API_KEY, ANTHROPIC_API_KEY, MISTRAL_API_KEY, DEEPSEEK_API_KEY, OPENROUTER_API_KEY, or TYPESAFE_API_KEY. Alternatively, configure Google Vertex AI or use an SDK-based provider (codex, claude, copilot) or the Antigravity CLI (gemini-cli).',
|
|
724
|
+
'At least one API key must be configured: OPENAI_API_KEY, XAI_API_KEY, GOOGLE_API_KEY, GEMINI_API_KEY, ANTHROPIC_API_KEY, MISTRAL_API_KEY, DEEPSEEK_API_KEY, OPENROUTER_API_KEY, ABLITERATION_API_KEY, or TYPESAFE_API_KEY. Alternatively, configure Google Vertex AI or use an SDK-based provider (codex, claude, copilot) or the Antigravity CLI (gemini-cli).',
|
|
717
725
|
);
|
|
718
726
|
}
|
|
719
727
|
|
|
@@ -374,6 +374,7 @@ export function generateHelpContent(config = null) {
|
|
|
374
374
|
mistral: providers.mistral?.getSupportedModels() || {},
|
|
375
375
|
deepseek: providers.deepseek?.getSupportedModels() || {},
|
|
376
376
|
openrouter: providers.openrouter?.getSupportedModels() || {},
|
|
377
|
+
abliteration: providers.abliteration?.getSupportedModels() || {},
|
|
377
378
|
// CLI providers - use safeGetModels (may throw if CLI not installed)
|
|
378
379
|
codex: safeGetModels(providers.codex, 'codex'),
|
|
379
380
|
claude: safeGetModels(providers.claude, 'claude'),
|
|
@@ -487,6 +488,7 @@ ${formatProviderModels('Anthropic', allModels.anthropic)}
|
|
|
487
488
|
${formatProviderModels('Mistral', allModels.mistral)}
|
|
488
489
|
${formatProviderModels('DeepSeek', allModels.deepseek)}
|
|
489
490
|
${formatProviderModels('OpenRouter', allModels.openrouter)}
|
|
491
|
+
${formatProviderModels('Abliteration', allModels.abliteration)}
|
|
490
492
|
${formatProviderModels('Codex', allModels.codex)}
|
|
491
493
|
${formatProviderModels('Claude CLI', allModels.claude)}
|
|
492
494
|
${formatProviderModels('Gemini (Antigravity CLI)', allModels['gemini-cli'])}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abliteration Provider
|
|
3
|
+
*
|
|
4
|
+
* Provider implementation for abliteration.ai models using its OpenAI-compatible
|
|
5
|
+
* Chat Completions API.
|
|
6
|
+
* Implements the unified interface: async invoke(messages, options) => { content, stop_reason, rawResponse }
|
|
7
|
+
*
|
|
8
|
+
* Chat Completions is used rather than the Responses surface: abliteration.ai's
|
|
9
|
+
* /v1/responses is stateless (no previous_response_id to gain from), rejects
|
|
10
|
+
* `max` effort on the base model, while Chat Completions accepts every effort
|
|
11
|
+
* tier on all models and returns the trace as `reasoning_content`, which the
|
|
12
|
+
* shared OpenAI-compatible base already surfaces.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { createOpenAICompatibleProvider } from './openai-compatible.js';
|
|
16
|
+
import { debugLog } from '../utils/console.js';
|
|
17
|
+
import {
|
|
18
|
+
clampReasoningEffort,
|
|
19
|
+
EFFORT_LADDER,
|
|
20
|
+
} from '../utils/reasoningEffort.js';
|
|
21
|
+
|
|
22
|
+
// All three models always reason by default. `reasoningTiers` lists the
|
|
23
|
+
// distinct depths each model actually runs; the API accepts the whole ladder
|
|
24
|
+
// but silently collapses it onto these, so clamping here keeps the requested
|
|
25
|
+
// tier and the tier that runs in agreement.
|
|
26
|
+
const SUPPORTED_MODELS = {
|
|
27
|
+
'abliterated-model-large-v2': {
|
|
28
|
+
modelName: 'abliterated-model-large-v2',
|
|
29
|
+
friendlyName: 'Abliterated Large V2',
|
|
30
|
+
contextWindow: 1000000,
|
|
31
|
+
maxOutputTokens: 999990,
|
|
32
|
+
supportsStreaming: true,
|
|
33
|
+
supportsImages: false, // Text-only; image content is rejected with a 400
|
|
34
|
+
supportsWebSearch: false,
|
|
35
|
+
supportsReasoning: true,
|
|
36
|
+
// Cannot disable reasoning: `none` would run at low with the trace hidden,
|
|
37
|
+
// so it clamps up to an explicit `low` that keeps the trace visible.
|
|
38
|
+
reasoningTiers: ['low', 'high', 'max'],
|
|
39
|
+
supportsJsonOutput: true,
|
|
40
|
+
supportsFunctionCalling: true,
|
|
41
|
+
timeout: 1800000,
|
|
42
|
+
description:
|
|
43
|
+
'Abliterated Large V2 - uncensored GLM-5.3 derived reasoning model with 1M context',
|
|
44
|
+
aliases: ['abliterated-large', 'abliterated-large-v2'],
|
|
45
|
+
},
|
|
46
|
+
'abliterated-model-large': {
|
|
47
|
+
modelName: 'abliterated-model-large',
|
|
48
|
+
friendlyName: 'Abliterated Large',
|
|
49
|
+
contextWindow: 1000000,
|
|
50
|
+
maxOutputTokens: 999990,
|
|
51
|
+
supportsStreaming: true,
|
|
52
|
+
supportsImages: false, // Text-only; image content is rejected with a 400
|
|
53
|
+
supportsWebSearch: false,
|
|
54
|
+
supportsReasoning: true,
|
|
55
|
+
reasoningTiers: ['none', 'high', 'max'],
|
|
56
|
+
supportsJsonOutput: true,
|
|
57
|
+
supportsFunctionCalling: true,
|
|
58
|
+
timeout: 1800000,
|
|
59
|
+
description:
|
|
60
|
+
'Abliterated Large - previous uncensored GLM-5.2 derived reasoning model with 1M context',
|
|
61
|
+
aliases: ['abliterated-large-v1'],
|
|
62
|
+
},
|
|
63
|
+
'abliterated-model': {
|
|
64
|
+
modelName: 'abliterated-model',
|
|
65
|
+
friendlyName: 'Abliterated Model',
|
|
66
|
+
contextWindow: 262144,
|
|
67
|
+
maxOutputTokens: 262134,
|
|
68
|
+
supportsStreaming: true,
|
|
69
|
+
supportsImages: true,
|
|
70
|
+
supportsWebSearch: false,
|
|
71
|
+
supportsReasoning: true,
|
|
72
|
+
reasoningTiers: EFFORT_LADDER,
|
|
73
|
+
supportsJsonOutput: true,
|
|
74
|
+
supportsFunctionCalling: true,
|
|
75
|
+
timeout: 900000,
|
|
76
|
+
description:
|
|
77
|
+
'Abliterated Model - uncensored multimodal reasoning model with 256K context',
|
|
78
|
+
aliases: ['abliterated', 'abliterated-base'],
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* abliteration.ai API keys are issued as `ak_...` tokens.
|
|
84
|
+
*/
|
|
85
|
+
function validateApiKey(apiKey) {
|
|
86
|
+
if (!apiKey || typeof apiKey !== 'string') {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return apiKey.startsWith('ak_') && apiKey.length > 10;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Attach `reasoning_effort` clamped onto the tiers the resolved model runs.
|
|
95
|
+
* Capability-gated: an unknown pass-through ID never receives the field and
|
|
96
|
+
* runs at the server's default depth.
|
|
97
|
+
*/
|
|
98
|
+
async function transformRequest(requestPayload, context = {}) {
|
|
99
|
+
const { modelConfig, reasoningEffort } = context;
|
|
100
|
+
|
|
101
|
+
if (modelConfig?.supportsReasoning && reasoningEffort) {
|
|
102
|
+
requestPayload.reasoning_effort = clampReasoningEffort(
|
|
103
|
+
reasoningEffort,
|
|
104
|
+
modelConfig.reasoningTiers,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
debugLog('[Abliteration] Request payload prepared');
|
|
109
|
+
return requestPayload;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export const abliterationProvider = createOpenAICompatibleProvider({
|
|
113
|
+
baseURL: 'https://api.abliteration.ai/v1',
|
|
114
|
+
providerName: 'Abliteration',
|
|
115
|
+
supportedModels: SUPPORTED_MODELS,
|
|
116
|
+
defaultModel: 'abliterated-model-large-v2',
|
|
117
|
+
validateApiKey,
|
|
118
|
+
transformRequest,
|
|
119
|
+
});
|
package/src/providers/index.js
CHANGED
|
@@ -17,6 +17,7 @@ import { codexProvider } from './codex.js';
|
|
|
17
17
|
import { geminiCliProvider } from './gemini-cli.js';
|
|
18
18
|
import { claudeProvider } from './claude.js';
|
|
19
19
|
import { copilotProvider } from './copilot.js';
|
|
20
|
+
import { abliterationProvider } from './abliteration.js';
|
|
20
21
|
|
|
21
22
|
/**
|
|
22
23
|
* Provider registry map
|
|
@@ -34,6 +35,7 @@ const providers = {
|
|
|
34
35
|
mistral: mistralProvider,
|
|
35
36
|
deepseek: deepseekProvider,
|
|
36
37
|
openrouter: openrouterProvider,
|
|
38
|
+
abliteration: abliterationProvider,
|
|
37
39
|
codex: codexProvider,
|
|
38
40
|
claude: claudeProvider,
|
|
39
41
|
copilot: copilotProvider,
|
package/src/tools/chat.js
CHANGED
|
@@ -1165,7 +1165,7 @@ chatTool.inputSchema = {
|
|
|
1165
1165
|
items: { type: 'string' },
|
|
1166
1166
|
minItems: 1,
|
|
1167
1167
|
description:
|
|
1168
|
-
'Models to use. Examples: ["auto"] (recommended), ["codex"], ["codex", "gemini", "claude"], ["codex:astra"], ["gpt-6-astra"]. Forms: "provider" (its default model), "provider:model" (that provider only), or a bare "model" (served by the first configured provider that offers it, local CLI providers first, failing over to the next). Providers: codex, gemini (agy), claude, copilot, openai, google, xai, anthropic, mistral, deepseek, openrouter. Unknown names are rejected with suggestions. In mode "chat" each model answers independently; in "consensus" they refine after seeing each other; in "roundtable" they speak in the given ORDER, each seeing the transcript. Default: ["auto"].',
|
|
1168
|
+
'Models to use. Examples: ["auto"] (recommended), ["codex"], ["codex", "gemini", "claude"], ["codex:astra"], ["gpt-6-astra"]. Forms: "provider" (its default model), "provider:model" (that provider only), or a bare "model" (served by the first configured provider that offers it, local CLI providers first, failing over to the next). Providers: codex, gemini (agy), claude, copilot, openai, google, xai, anthropic, mistral, deepseek, openrouter, abliteration. Unknown names are rejected with suggestions. In mode "chat" each model answers independently; in "consensus" they refine after seeing each other; in "roundtable" they speak in the given ORDER, each seeing the transcript. Default: ["auto"].',
|
|
1169
1169
|
},
|
|
1170
1170
|
mode: {
|
|
1171
1171
|
type: 'string',
|
|
@@ -40,6 +40,7 @@ export const PROVIDER_PRIORITY = [
|
|
|
40
40
|
'mistral',
|
|
41
41
|
'deepseek',
|
|
42
42
|
'openrouter',
|
|
43
|
+
'abliteration',
|
|
43
44
|
];
|
|
44
45
|
|
|
45
46
|
/**
|
|
@@ -70,6 +71,7 @@ export const PROVIDER_NAMESPACES = {
|
|
|
70
71
|
mistral: ['mistral'],
|
|
71
72
|
deepseek: ['deepseek'],
|
|
72
73
|
openrouter: ['openrouter'],
|
|
74
|
+
abliteration: ['abliteration', 'ablit'],
|
|
73
75
|
};
|
|
74
76
|
|
|
75
77
|
/**
|
|
@@ -89,6 +91,7 @@ export const DEFAULT_MODEL_ENV_VARS = {
|
|
|
89
91
|
mistral: 'MISTRAL_DEFAULT_MODEL',
|
|
90
92
|
deepseek: 'DEEPSEEK_DEFAULT_MODEL',
|
|
91
93
|
openrouter: 'OPENROUTER_DEFAULT_MODEL',
|
|
94
|
+
abliteration: 'ABLITERATION_DEFAULT_MODEL',
|
|
92
95
|
};
|
|
93
96
|
|
|
94
97
|
/**
|
|
@@ -583,6 +586,7 @@ const API_KEY_ENV_VARS = {
|
|
|
583
586
|
mistral: 'MISTRAL_API_KEY',
|
|
584
587
|
deepseek: 'DEEPSEEK_API_KEY',
|
|
585
588
|
openrouter: 'OPENROUTER_API_KEY',
|
|
589
|
+
abliteration: 'ABLITERATION_API_KEY',
|
|
586
590
|
};
|
|
587
591
|
|
|
588
592
|
const LOCAL_PROVIDER_SETUP_HINTS = {
|