ai-consultants 5.0.0 → 5.1.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 CHANGED
@@ -130,8 +130,8 @@ GEMINI_API_MODEL=gemini-3.1-pro-preview
130
130
  # GEMINI_REASONING_EFFORT=
131
131
 
132
132
  # Codex - The Pragmatist
133
- CODEX_MODEL=gpt-5.6-sol
134
- CODEX_API_MAX_TOKENS=4096
133
+ CODEX_MODEL=gpt-6-astra
134
+ CODEX_API_MAX_TOKENS=16384
135
135
  CODEX_TIMEOUT=180
136
136
  CODEX_CMD=codex
137
137
  # Reasoning effort for the codex CLI (and API mode). Passed as
@@ -158,9 +158,9 @@ KIMI_TIMEOUT=180
158
158
  KIMI_CMD=kimi
159
159
 
160
160
  # Claude - The Synthesizer
161
- CLAUDE_MODEL=claude-opus-5 # ai-consultants:default
162
- # Fable 5 is catalogued and priced but remains an explicit CLAUDE_MODEL opt-in
163
- # after its local smoke timed out.
161
+ CLAUDE_MODEL=claude-fable-5-1 # ai-consultants:default
162
+ # For the lower-cost standard/medium Claude tier, set CLAUDE_MODEL to
163
+ # claude-opus-5 (or apply_model_tier standard for a single run).
164
164
  CLAUDE_TIMEOUT=240
165
165
  CLAUDE_CMD=claude
166
166
  CLAUDE_API_MAX_TOKENS=16384
package/CLAUDE.md CHANGED
@@ -6,7 +6,7 @@ AI Consultants is a multi-model coverage system that queries up to 10 AI consult
6
6
 
7
7
  **Self-Exclusion**: The invoking agent is automatically excluded from both the panel and synthesis. Claude Code won't query or synthesize with Claude, Codex CLI won't query or synthesize with Codex, etc.
8
8
 
9
- **Version**: 5.0.0
9
+ **Version**: 5.1.0
10
10
 
11
11
  ## Distribution
12
12
 
@@ -349,9 +349,9 @@ Three normal tiers plus a `maximum` tier are configurable via `apply_model_tier(
349
349
 
350
350
  | Tier | Description | Example Models |
351
351
  |------|-------------|----------------|
352
- | **premium** | Latest flagship models | claude-opus-5, Gemini 3.7 Flash (High), gpt-5.6-sol |
353
- | **maximum** | All 10 consultants; maximum targets and highest provider effort | K3-256k, Qwen3.8-Max, MiniMax M3; Grok xhigh, GLM/DeepSeek max |
354
- | **standard** | Good quality at reasonable cost | claude-sonnet-5, Gemini 3.7 Flash (High), gpt-5.6-terra |
352
+ | **premium** | Latest flagship models | claude-fable-5-1, Gemini 3.7 Flash (High), gpt-6-astra |
353
+ | **maximum** | All 10 consultants; maximum targets and highest provider effort | claude-fable-5-1, K3-256k, Qwen3.8-Max, MiniMax M3; Grok xhigh, GLM/DeepSeek max |
354
+ | **standard** | Good quality at reasonable cost | claude-opus-5, Gemini 3.7 Flash (High), gpt-5.6-terra |
355
355
  | **economy** | Optimized for speed and low cost | claude-haiku-4-5, Gemini 3.7 Flash (Low), gpt-5.6-luna |
356
356
 
357
357
  **Default models are now premium tier** for maximum quality.
@@ -383,14 +383,14 @@ Three new presets leverage the model tiers:
383
383
  ./scripts/consult_all.sh --preset fast "quick syntax question"
384
384
  ```
385
385
 
386
- ### Premium Model Defaults (August 2026)
386
+ ### Premium Model Defaults (September 2026)
387
387
  All consultants now use premium models by default:
388
388
 
389
389
  | Consultant | Default Model |
390
390
  |------------|---------------|
391
- | Claude | claude-opus-5 |
391
+ | Claude | claude-fable-5-1 |
392
392
  | Gemini | Gemini 3.7 Flash (High) (via agy CLI); API: gemini-3.1-pro-preview |
393
- | Codex | gpt-5.6-sol |
393
+ | Codex | gpt-6-astra |
394
394
  | Mistral | CLI: mistral-medium-3.5; API: mistral-large-3 |
395
395
  | DeepSeek | deepseek-v4-pro |
396
396
  | GLM | glm-5.3-flash |
@@ -586,11 +586,11 @@ for f in scripts/*.sh scripts/lib/*.sh; do bash -n "$f" && echo "OK: $f"; done
586
586
  | `ENABLE_SMART_ROUTING` | false | Intelligent routing by category |
587
587
  | `ENABLE_COST_TRACKING` | true | Track costs |
588
588
  | `MAX_SESSION_COST` | 1.00 | Max budget ($) |
589
- | `CLAUDE_MODEL` | claude-opus-5 | Claude model (v2.5) |
589
+ | `CLAUDE_MODEL` | claude-fable-5-1 | Claude model (use claude-opus-5 for lower-cost standard) |
590
590
  | `CLAUDE_API_MAX_TOKENS` | 16384 | Claude API thinking + visible-output budget |
591
591
  | `GEMINI_MODEL` | Gemini 3.7 Flash (High) | Gemini agy CLI model |
592
592
  | `GEMINI_API_MODEL` | gemini-3.1-pro-preview | Gemini API-mode model ID (v2.15) |
593
- | `CODEX_MODEL` | gpt-5.6-sol | Codex model (v2.5) |
593
+ | `CODEX_MODEL` | gpt-6-astra | Codex model (v2.5) |
594
594
  | `MISTRAL_MODEL` | mistral-large-3 | Mistral model (v2.5) |
595
595
  | `MISTRAL_CLI_MODEL` | mistral-medium-3.5 | Vibe CLI model alias |
596
596
  | `SYNTHESIS_STRATEGY` | coverage | Synthesis strategy (coverage=union of distinct points) |
@@ -760,6 +760,15 @@ curl -fsSL https://raw.githubusercontent.com/matteoscurati/ai-consultants/main/s
760
760
 
761
761
  ## Changelog
762
762
 
763
+ ### v5.1.0 (2026-09-09)
764
+
765
+ - **Fable and Astra model policy.** `scripts/config.sh` and `scripts/configure.sh` align default/premium/maximum with Fable 5.1 and Astra, retain Opus 5/Terra for standard and Haiku/Luna for economy, and migrate exact historical unpinned Codex defaults while recording their origin. `resolve_codex_effort` applies implicit high per request so a later tier cannot inherit an automatically exported value.
766
+ - **Completion and identity are independent checks.** `scripts/lib/claude_stream.jq` derives content identity from assistant text events, keeps billing participants separate, rejects incomplete/error/max-token streams and preserves available accounting. `query_codex.sh` reads usage from JSON events while keeping the final-message file as the answer. Requested-only Codex identity remains truthful and is not an invented promotion blocker.
767
+ - **Grok sandbox checks precede fallback decisions.** `scripts/lib/grok_sandbox.sh` supplies passive socket and diagnostic checks shared with doctor/OAuth. Hidden `--no-memory` is supported by the installed parser even though omitted from help: the earlier diagnosis of an unsupported flag was incorrect. It remains mandatory in dispatch. Metadata annotation cannot replace the adapter's status when its same-directory temporary file fails.
768
+ - **Accounting and configuration.** Fable and Astra both have catalog-independent rate fallbacks. Astra estimates disclose long-context multipliers and excluded cache/service adjustments; no estimate is called a provider invoice. Explicit `AI_CONSULTANTS_CONFIG_DIR` selects private configuration; project dotenv discovery and credential import are not added.
769
+ - **Validation scope.** CLI-only acceptance was selected explicitly. The three provider smoke results retain their actual commit and identity provenance; API paths retain automated tests without a live-promotion claim. The maintainer Breadth v1 harness is included in the repository but excluded from npm, and its frozen inputs are unchanged. No completed P1 benchmark or coverage-gain claim is made.
770
+
771
+
763
772
  ### v5.0.0
764
773
 
765
774
  - **Coverage claims are now locally auditable instead of resting on synthesis prose.** `scripts/lib/coverage_integrity.sh` normalizes successful structured envelopes into deterministic `<consultant-slug>:<index>` findings, overwriting any provider-supplied IDs. `scripts/synthesize.sh` asks the synthesizer to cite those IDs, then independently compares expected and represented IDs. Missing/duplicate/non-normalizable sources produce `DEGRADED`; unknown IDs and structural failures produce `FAILED`; invented IDs are removed from published coverage. The legacy `coverage`, `weighted_recommendation`, risk, action, and individual-response fields remain present.
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # AI Consultants v5.0.0
1
+ # AI Consultants v5.1.0
2
2
 
3
3
  > **Coverage, not a single guess.** A panel of up to 10 frontier models from different vendors fans out on your question in parallel and hands you the *union* of what they collectively see — the risks, edge cases, and approaches a single model misses.
4
4
 
5
- [![Version](https://img.shields.io/badge/version-5.0.0-blue.svg)](https://github.com/matteoscurati/ai-consultants)
5
+ [![Version](https://img.shields.io/badge/version-5.1.0-blue.svg)](https://github.com/matteoscurati/ai-consultants)
6
6
  [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
7
7
  [![Claude Code Skill](https://img.shields.io/badge/Claude%20Code-Skill-orange.svg)](https://docs.anthropic.com/en/docs/claude-code/skills)
8
8
  [![GitHub stars](https://img.shields.io/github/stars/matteoscurati/ai-consultants?style=social)](https://github.com/matteoscurati/ai-consultants)
@@ -483,10 +483,10 @@ and cannot support a comprehensive coverage claim.
483
483
 
484
484
  | Consultant | `max_quality` | Premium | Standard | Economy |
485
485
  |------------|---------------|---------|----------|---------|
486
- | Claude | claude-opus-5 | claude-opus-5 | claude-sonnet-5 | claude-haiku-4-5 |
486
+ | Claude | claude-fable-5-1 | claude-fable-5-1 | claude-opus-5 | claude-haiku-4-5 |
487
487
  | Gemini CLI | Gemini 3.7 Flash (High) | Gemini 3.7 Flash (High) | Gemini 3.7 Flash (High) | Gemini 3.7 Flash (Low) |
488
488
  | Gemini API | gemini-3.1-pro-preview | gemini-3.1-pro-preview | gemini-3.1-pro-preview | gemini-3.1-pro-preview |
489
- | Codex | gpt-5.6-sol | gpt-5.6-sol | gpt-5.6-terra | gpt-5.6-luna |
489
+ | Codex | gpt-6-astra | gpt-6-astra | gpt-5.6-terra | gpt-5.6-luna |
490
490
  | Mistral CLI | mistral-medium-3.5 | mistral-medium-3.5 | mistral-medium-3.5 | devstral-small-2 |
491
491
  | Mistral API | mistral-large-3 | mistral-large-3 | mistral-large-3 | mistral-large-3 |
492
492
  | DeepSeek | deepseek-v4-pro | deepseek-v4-pro | deepseek-v4-flash | deepseek-v4-flash |
@@ -501,8 +501,9 @@ smoke through the `agy` adapter and is now the CLI default; Low is the CLI
501
501
  economy target. The Google API model remains `gemini-3.1-pro-preview`, while
502
502
  `gemini-3.7-flash` stays an API-only opt-in until that separate transport is
503
503
  verified. The new Mistral API IDs (`mistral-medium-3-5`,
504
- `mistral-large-2512`, `mistral-small-2603`) and Claude Fable 5 likewise remain
505
- catalogued opt-ins. Selecting a preset later intentionally reapplies that
504
+ `mistral-large-2512`, `mistral-small-2603`) remain catalogued opt-ins. Claude
505
+ Fable 5.1 is the default/premium/maximum target; use
506
+ `CLAUDE_MODEL=claude-opus-5` for the lower-cost standard override. Selecting a preset later intentionally reapplies that
506
507
  preset's tier and can replace an explicit model override for the run.
507
508
  Qwen3.8-Max is likewise selected by `max_quality` only when API mode already
508
509
  points at an authenticated OpenAI-compatible Token Plan `/chat/completions`
@@ -609,11 +610,11 @@ Auto-selected `*_USE_API` values are marked `# ai-consultants:auto`, allowing a
609
610
  later run to adapt when a CLI or credential changes. Environment variables,
610
611
  `--set`, and unmarked values remain explicit user choices, except for the exact
611
612
  historical generated Claude default described below.
612
- Managed model defaults use `# ai-consultants:default`; `configure` upgrades the
613
- historical unmarked `CLAUDE_MODEL=claude-opus-4-8` default to Opus 5 and upgrades
614
- the exact managed Gemini CLI, GLM, and Grok defaults. To keep
615
- 4.8 intentionally, run
616
- `ai-consultants configure --set CLAUDE_MODEL=claude-opus-4-8`; explicit model
613
+ Managed model defaults use `# ai-consultants:default`; `configure` upgrades
614
+ un-pinned historical `CLAUDE_MODEL=claude-opus-4-8` and `claude-opus-5` defaults
615
+ to Fable 5.1, along with the exact managed Gemini CLI, GLM, and Grok defaults.
616
+ To keep the lower-cost Opus 5 choice, run
617
+ `ai-consultants configure --set CLAUDE_MODEL=claude-opus-5`; explicit model
617
618
  overrides are stored with `# ai-consultants:pin`.
618
619
 
619
620
  Enter credentials through `--interactive`/`--advanced` or export them before the
package/SKILL.md CHANGED
@@ -5,10 +5,10 @@ license: MIT
5
5
  compatibility: Requires bash, jq, and at least 2 AI CLI tools (agy, codex, vibe, etc.). macOS and Linux.
6
6
  metadata:
7
7
  author: matteoscurati
8
- version: 5.0.0
8
+ version: 5.1.0
9
9
  ---
10
10
 
11
- # AI Consultants v5.0.0 - AI Expert Panel
11
+ # AI Consultants v5.1.0 - AI Expert Panel
12
12
 
13
13
  **Coverage, not a single guess.** Convene a panel of AI "consultants" from different vendors for coding questions: they fan out in parallel and you get the *union* of what they collectively see — the risks, edge cases, and approaches a single model misses. Each consultant has a **configurable persona** that decorrelates its analysis.
14
14
 
@@ -106,7 +106,8 @@ smoke-tested K3-256k and MiniMax M3 targets, plus Qwen3.8-Max when an authentica
106
106
  already configured. Gemini 3.7 Flash High is the exact-transport-smoked `agy`
107
107
  default for maximum, premium, and standard CLI tiers; Low serves economy. The
108
108
  Gemini API target remains 3.1 Pro until `gemini-3.7-flash` completes a separate
109
- API smoke. Claude Fable 5 and the new Mistral API IDs remain explicit opt-ins.
109
+ API smoke. Claude Fable 5.1 is the default/premium/maximum target; the new
110
+ Mistral API IDs remain explicit opt-ins.
110
111
  Grok, GLM, and DeepSeek receive their
111
112
  highest accepted reasoning effort in this preset (`xhigh`, `max`, and `max`
112
113
  respectively); no failed target is silently replaced.
@@ -1,4 +1,4 @@
1
- # Cost Rates - AI Consultants v5.0.0
1
+ # Cost Rates - AI Consultants v5.1.0
2
2
 
3
3
  This page documents the per-token rates used by the cost tracking system.
4
4
 
@@ -28,12 +28,14 @@ models programmatically.
28
28
  | Gemini 3.1 Pro (High) | CLI opt-in | $0.002 | Gemini (agy CLI) |
29
29
  | gemini-3.1-pro-preview | API default | $0.00125 | Gemini API |
30
30
  | Gemini 3.6 Flash (High/Low) | Legacy CLI pins | $0.0015 | Gemini |
31
- | gpt-5.6-sol | Premium | $0.005 | Codex |
31
+ | gpt-6-astra | Maximum/Premium | $0.010 | Codex |
32
+ | gpt-5.6-sol | Explicit override | $0.004 | Codex |
32
33
  | gpt-5.6-terra | Standard | $0.002 | Codex |
33
34
  | gpt-5.6-luna | Economy | $0.0002 | Codex |
34
- | claude-opus-5 | Premium | $0.005 | Claude |
35
- | claude-fable-5 | Opt-in | $0.010 | Claude |
36
- | claude-sonnet-5 | Standard | $0.003 | Claude |
35
+ | claude-fable-5-1 | Maximum/Premium | $0.010 | Claude |
36
+ | claude-opus-5 | Standard | $0.005 | Claude |
37
+ | claude-fable-5 | Legacy pins | $0.010 | Claude |
38
+ | claude-sonnet-5 | Legacy pins | $0.003 | Claude |
37
39
  | claude-haiku-4-5 | Economy | $0.001 | Claude |
38
40
  | mistral-large-3 | Premium | $0.002 | Mistral |
39
41
  | mistral-medium-3.5 / mistral-medium-3-5 | Premium CLI / API opt-in | $0.0015 | Mistral |
@@ -70,12 +72,14 @@ models programmatically.
70
72
  | Gemini 3.1 Pro (High) | CLI opt-in | $0.012 | Gemini (agy CLI) |
71
73
  | gemini-3.1-pro-preview | API default | $0.005 | Gemini API |
72
74
  | Gemini 3.6 Flash (High/Low) | Legacy CLI pins | $0.0075 | Gemini |
73
- | gpt-5.6-sol | Premium | $0.030 | Codex |
75
+ | gpt-6-astra | Maximum/Premium | $0.050 | Codex |
76
+ | gpt-5.6-sol | Explicit override | $0.020 | Codex |
74
77
  | gpt-5.6-terra | Standard | $0.012 | Codex |
75
78
  | gpt-5.6-luna | Economy | $0.0012 | Codex |
76
- | claude-opus-5 | Premium | $0.025 | Claude |
77
- | claude-fable-5 | Opt-in | $0.050 | Claude |
78
- | claude-sonnet-5 | Standard | $0.015 | Claude |
79
+ | claude-fable-5-1 | Maximum/Premium | $0.050 | Claude |
80
+ | claude-opus-5 | Standard | $0.025 | Claude |
81
+ | claude-fable-5 | Legacy pins | $0.050 | Claude |
82
+ | claude-sonnet-5 | Legacy pins | $0.015 | Claude |
79
83
  | claude-haiku-4-5 | Economy | $0.005 | Claude |
80
84
  | mistral-large-3 | Premium | $0.006 | Mistral |
81
85
  | mistral-medium-3.5 / mistral-medium-3-5 | Premium CLI / API opt-in | $0.0075 | Mistral |
@@ -369,3 +369,23 @@ jq 'has("consultant") and has("response") and has("confidence")' output.json
369
369
  }
370
370
  }
371
371
  ```
372
+
373
+ ### Codex cost and cached-input metadata
374
+
375
+ When present, `metadata.cost_source` is `unavailable` without token data, otherwise
376
+ `estimated-standard-rates` or `estimated-long-context-standard-rates`.
377
+ `metadata.cost_note` discloses excluded cache/service adjustments; an estimate
378
+ is not a provider invoice. `metadata.tokens_cached_input`, when supplied by
379
+ CLI telemetry, is the cached subset of `tokens_input` and is not added again.
380
+ Unknown splits use the documented estimation heuristic; they cannot establish
381
+ an exact long-context bill. Astra maximum/premium uses `high` by default,
382
+ including in max_quality; valid explicit Codex effort always takes precedence.
383
+
384
+ ### Claude streaming billing metadata
385
+
386
+ `metadata.billing_models` is an optional array of provider billing model IDs.
387
+ It does not attest the content model. Claude content identity comes only from
388
+ response-bearing assistant events; successful terminal completion is a separate
389
+ requirement. `provider_cost_usd`, when present, is the provider's terminal cost.
390
+ Token accounting prefers a supplied per-model billing aggregate over terminal
391
+ usage, without adding those two summaries together; absent usage is estimated.
package/docs/SETUP.md CHANGED
@@ -592,10 +592,16 @@ shell history or observed by other local processes. Use `--interactive`,
592
592
  ### Using .env file
593
593
 
594
594
  ```bash
595
- cp .env.example .env
595
+ mkdir -p "${XDG_CONFIG_HOME:-$HOME/.config}/ai-consultants"
596
+ # For a new configuration only; keep existing credentials/settings if present.
597
+ cp -n .env.example "${XDG_CONFIG_HOME:-$HOME/.config}/ai-consultants/.env"
598
+ chmod 600 "${XDG_CONFIG_HOME:-$HOME/.config}/ai-consultants/.env"
596
599
  ```
597
600
 
598
- Edit `.env`:
601
+ Edit that user configuration `.env`. A different existing private directory must
602
+ be selected explicitly with `AI_CONSULTANTS_CONFIG_DIR`; project `.env` files
603
+ are not discovered automatically:
604
+
599
605
 
600
606
  ```bash
601
607
  # Enable/disable consultants (10 available)
@@ -797,3 +803,50 @@ less "$output_dir/report.md"
797
803
  ```
798
804
 
799
805
  See [README.md](../README.md) for usage examples and full documentation.
806
+
807
+ For a configuration outside the standard user config directory, set
808
+ `AI_CONSULTANTS_CONFIG_DIR=/absolute/private/config-directory` explicitly.
809
+ The loader does not discover project `.env` files. Keep credentials in your
810
+ existing private configuration; do not copy them into this repository.
811
+
812
+ Claude CLI uses `stream-json --verbose`. Only response-bearing assistant
813
+ messages attest the content model; terminal `modelUsage` records billing
814
+ participants separately. A missing or conflicting content model remains
815
+ `requested-only` and cannot pass a model-promotion gate. Successful terminal
816
+ completion is required even when partial response text or billing is available.
817
+
818
+ Codex defaults to `gpt-6-astra`; premium and maximum select Astra, standard
819
+ selects `gpt-5.6-terra`, economy selects `gpt-5.6-luna`. Sol remains an explicit
820
+ `CODEX_MODEL=gpt-5.6-sol` override. Configure migrates exact unpinned persisted
821
+ `gpt-5.5` and `gpt-5.6-sol` values to Astra and records `migrated-from` provenance.
822
+ Use `# ai-consultants:pin`, an environment override or `--set` to keep a model.
823
+
824
+ Astra uses `high` effort when no effort is configured. Explicit `low`, `medium`,
825
+ `high`, `xhigh`, and `max` prevail; `none`/`minimal` fail before dispatch.
826
+ The default completion budget is 16384 tokens, including reasoning; override
827
+ `CODEX_API_MAX_TOKENS` explicitly as needed. The text-only Chat Completions
828
+ request uses `max_completion_tokens` and `reasoning_effort`, without tools.
829
+ See the [official migration guide](https://developers.openai.com/api/docs/guides/latest-model).
830
+ CLI JSON events supply token telemetry; the final message file supplies content.
831
+ A CLI `-m` selection remains `requested-only`, not provider attestation.
832
+
833
+ [Astra Standard pricing](https://developers.openai.com/api/docs/models/gpt-6-astra)
834
+ is $10/M input and $50/M output. More than 272K input tokens doubles input
835
+ and multiplies output by 1.5 for the whole request. Reported cost is an estimate
836
+ unless a provider cost is supplied: cache writes, cached-input discounts and
837
+ service processing rates can change the invoice.
838
+
839
+ Grok CLI and doctor passively inspect the container-runtime socket deny paths,
840
+ including Docker Desktop locations. Symlink endpoints (including dangling links)
841
+ block CLI dispatch because the sandbox cannot safely resolve those deny rules.
842
+ Absent paths and ordinary socket files pass this check. Nothing is removed and
843
+ Docker configuration is never changed. Runtime `sandbox_profile_refused` and
844
+ `sandbox_not_applied` diagnostics fail even with exit zero; they cannot trigger
845
+ retry or API fallback. OAuth synchronization and per-run isolation remain active.
846
+
847
+
848
+ Grok compatibility includes a provider-free parser probe of the complete advisory
849
+ argument list. Hidden flags such as `--no-memory` are still required in the
850
+ actual request even when omitted from public help. Unsupported mandatory flags
851
+ block dispatch; the optional `--no-auto-update` guard is used when its parser
852
+ probe succeeds, including on CLIs that hide it from help.
@@ -1,9 +1,13 @@
1
1
  {
2
- "version": "5.0.0",
2
+ "version": "5.1.0",
3
3
  "updated": "2026-08-23",
4
4
  "models": {
5
5
  "_comment_units": "All rates are USD per 1,000 tokens (per-1K). lib/costs.sh computes cost as (token_count / 1000) * rate, so every value here MUST be a per-1K rate = (provider $/1M price) / 1000. Do NOT paste $/MTok figures directly.",
6
- "_comment_premium": "Premium tier models - Aug 2026",
6
+ "_comment_premium": "Premium tier models - Sep 2026",
7
+ "claude-fable-5-1": {
8
+ "input": 0.01,
9
+ "output": 0.05
10
+ },
7
11
  "claude-opus-5": {
8
12
  "input": 0.005,
9
13
  "output": 0.025
@@ -41,9 +45,15 @@
41
45
  "input": 0.00075,
42
46
  "output": 0.00375
43
47
  },
48
+ "gpt-6-astra": {
49
+ "input": 0.01,
50
+ "output": 0.05,
51
+ "provider": "OpenAI",
52
+ "notes": "Standard estimate; >272K input: 2x input, 1.5x output for full request. Cache/service adjustments excluded."
53
+ },
44
54
  "gpt-5.6-sol": {
45
- "input": 0.005,
46
- "output": 0.030
55
+ "input": 0.004,
56
+ "output": 0.020
47
57
  },
48
58
  "gpt-5.6-terra": {
49
59
  "input": 0.002,
@@ -419,10 +429,10 @@
419
429
  "kimi-code/k3-256k"
420
430
  ],
421
431
  "consultant_fallbacks": {
422
- "_comment": "Premium defaults - Updated Aug 2026",
423
- "claude": "claude-opus-5",
432
+ "_comment": "Premium defaults - Updated Sep 2026",
433
+ "claude": "claude-fable-5-1",
424
434
  "gemini": "Gemini 3.7 Flash (High)",
425
- "codex": "gpt-5.6-sol",
435
+ "codex": "gpt-6-astra",
426
436
  "mistral": "mistral-large-3",
427
437
  "deepseek": "deepseek-v4-pro",
428
438
  "glm": "glm-5.3-flash",
@@ -434,9 +444,9 @@
434
444
  "model_tiers": {
435
445
  "_comment": "Model tiers for apply_model_tier() function",
436
446
  "maximum": {
437
- "claude": "claude-opus-5",
447
+ "claude": "claude-fable-5-1",
438
448
  "gemini": "Gemini 3.7 Flash (High)",
439
- "codex": "gpt-5.6-sol",
449
+ "codex": "gpt-6-astra",
440
450
  "mistral": "mistral-medium-3.5",
441
451
  "deepseek": "deepseek-v4-pro",
442
452
  "glm": "glm-5.3-flash",
@@ -446,9 +456,9 @@
446
456
  "minimax": "MiniMax-M3"
447
457
  },
448
458
  "premium": {
449
- "claude": "claude-opus-5",
459
+ "claude": "claude-fable-5-1",
450
460
  "gemini": "Gemini 3.7 Flash (High)",
451
- "codex": "gpt-5.6-sol",
461
+ "codex": "gpt-6-astra",
452
462
  "mistral": "mistral-medium-3.5",
453
463
  "deepseek": "deepseek-v4-pro",
454
464
  "glm": "glm-5.3-flash",
@@ -458,7 +468,7 @@
458
468
  "minimax": "MiniMax-M2.7"
459
469
  },
460
470
  "standard": {
461
- "claude": "claude-sonnet-5",
471
+ "claude": "claude-opus-5",
462
472
  "gemini": "Gemini 3.7 Flash (High)",
463
473
  "codex": "gpt-5.6-terra",
464
474
  "mistral": "mistral-medium-3.5",
@@ -501,7 +511,7 @@
501
511
  "gemini_cli": ["Gemini 3.1 Pro (High)", "Gemini 3.6 Flash (High)", "Gemini 3.6 Flash (Low)"],
502
512
  "gemini_api": ["gemini-3.7-flash"],
503
513
  "mistral_api": ["mistral-medium-3-5", "mistral-large-2512", "mistral-small-2603"],
504
- "claude": ["claude-fable-5"]
514
+ "claude": []
505
515
  },
506
516
  "default_rate": {
507
517
  "input": 0.005,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-consultants",
3
- "version": "5.0.0",
3
+ "version": "5.1.0",
4
4
  "description": "A cross-vendor panel of up to 10 AI models that returns the coverage union of their distinct perspectives",
5
5
  "bin": {
6
6
  "ai-consultants": "bin/ai-consultants"
@@ -13,6 +13,7 @@
13
13
  "!scripts/lib/test_helpers.sh",
14
14
  "!scripts/release.sh",
15
15
  "!scripts/experiment/",
16
+ "!benchmarks/",
16
17
  "templates/",
17
18
  ".env.example",
18
19
  ".claude/commands/",
@@ -56,9 +56,10 @@ for API keys; command-line arguments may be visible in shell history and process
56
56
  inspection.
57
57
  Model defaults carry an `# ai-consultants:default` marker. On rewrite,
58
58
  `configure` upgrades the historical unmarked
59
- `CLAUDE_MODEL=claude-opus-4-8` generated default to Opus 5. An explicit model
60
- override supplied with `--set` is stored with `# ai-consultants:pin`, so
61
- `--set CLAUDE_MODEL=claude-opus-4-8` keeps the legacy model intentionally.
59
+ `CLAUDE_MODEL=claude-opus-4-8` and `claude-opus-5` generated defaults to
60
+ Fable 5.1. An explicit model override supplied with `--set` is stored with
61
+ `# ai-consultants:pin`, so `--set CLAUDE_MODEL=claude-opus-5` keeps the
62
+ lower-cost standard model intentionally.
62
63
  The exhaustive parameter contract is [`.env.example`](../.env.example); the
63
64
  configurator derives its accepted keys from that template, while
64
65
  [`scripts/config.sh`](../scripts/config.sh) remains the runtime source of truth.
@@ -240,9 +241,10 @@ ENABLE_DEEPSEEK=false
240
241
 
241
242
  ```bash
242
243
  GEMINI_MODEL=Gemini 3.7 Flash (High) # verified agy CLI default; API mode uses GEMINI_API_MODEL
243
- CODEX_MODEL=gpt-5.6-sol
244
- CODEX_API_MAX_TOKENS=4096
245
- CLAUDE_MODEL=claude-opus-5
244
+ CODEX_MODEL=gpt-6-astra
245
+ CODEX_API_MAX_TOKENS=16384
246
+ CLAUDE_MODEL=claude-fable-5-1
247
+ # Lower-cost standard override: CLAUDE_MODEL=claude-opus-5
246
248
  CLAUDE_API_MAX_TOKENS=16384 # API only: adaptive thinking + visible output
247
249
  MISTRAL_MODEL=mistral-large-3
248
250
  MISTRAL_CLI_MODEL=mistral-medium-3.5
package/scripts/config.sh CHANGED
@@ -159,10 +159,10 @@ export GEMINI_USE_API
159
159
  # CODEX CONFIGURATION - The Pragmatist
160
160
  # =============================================================================
161
161
 
162
- # Model: "gpt-5.6-sol" (default), "gpt-5.6-terra", "gpt-5.6-luna", etc.
163
- CODEX_MODEL="${CODEX_MODEL:-gpt-5.6-sol}"
162
+ # Model: "gpt-6-astra" (default), "gpt-5.6-terra", "gpt-5.6-luna", etc.
163
+ CODEX_MODEL="${CODEX_MODEL:-gpt-6-astra}"
164
164
  CODEX_TIMEOUT_SECONDS="${CODEX_TIMEOUT:-180}"
165
- CODEX_API_MAX_TOKENS="${CODEX_API_MAX_TOKENS:-4096}"
165
+ CODEX_API_MAX_TOKENS="${CODEX_API_MAX_TOKENS:-16384}"
166
166
  CODEX_CMD="${CODEX_CMD:-codex}"
167
167
 
168
168
  # =============================================================================
@@ -305,7 +305,7 @@ KIMI_CMD="${KIMI_CMD:-kimi}"
305
305
  # CLAUDE CONFIGURATION - The Synthesizer (v2.2)
306
306
  # =============================================================================
307
307
 
308
- CLAUDE_MODEL="${CLAUDE_MODEL:-claude-opus-5}"
308
+ CLAUDE_MODEL="${CLAUDE_MODEL:-claude-fable-5-1}"
309
309
  CLAUDE_API_MAX_TOKENS="${CLAUDE_API_MAX_TOKENS:-16384}"
310
310
  CLAUDE_TIMEOUT_SECONDS="${CLAUDE_TIMEOUT:-240}"
311
311
  CLAUDE_CMD="${CLAUDE_CMD:-claude}"
@@ -618,9 +618,9 @@ get_model_for_tier() {
618
618
  case "$tier" in
619
619
  maximum|max_quality|max-quality)
620
620
  case "$consultant" in
621
- claude) echo "claude-opus-5" ;;
621
+ claude) echo "claude-fable-5-1" ;;
622
622
  gemini) [[ "$transport" == "api" ]] && echo "gemini-3.1-pro-preview" || echo "Gemini 3.7 Flash (High)" ;;
623
- codex) echo "gpt-5.6-sol" ;;
623
+ codex) echo "gpt-6-astra" ;;
624
624
  mistral) [[ "$transport" == "api" ]] && echo "mistral-large-3" || echo "mistral-medium-3.5" ;;
625
625
  deepseek) echo "deepseek-v4-pro" ;;
626
626
  glm) echo "glm-5.3-flash" ;;
@@ -633,9 +633,9 @@ get_model_for_tier() {
633
633
  ;;
634
634
  premium|max|best)
635
635
  case "$consultant" in
636
- claude) echo "claude-opus-5" ;;
636
+ claude) echo "claude-fable-5-1" ;;
637
637
  gemini) [[ "$transport" == "api" ]] && echo "gemini-3.1-pro-preview" || echo "Gemini 3.7 Flash (High)" ;;
638
- codex) echo "gpt-5.6-sol" ;;
638
+ codex) echo "gpt-6-astra" ;;
639
639
  mistral) [[ "$transport" == "api" ]] && echo "mistral-large-3" || echo "mistral-medium-3.5" ;;
640
640
  deepseek) echo "deepseek-v4-pro" ;;
641
641
  glm) echo "glm-5.3-flash" ;;
@@ -648,7 +648,7 @@ get_model_for_tier() {
648
648
  ;;
649
649
  standard|medium|balanced)
650
650
  case "$consultant" in
651
- claude) echo "claude-sonnet-5" ;;
651
+ claude) echo "claude-opus-5" ;;
652
652
  gemini) [[ "$transport" == "api" ]] && echo "gemini-3.1-pro-preview" || echo "Gemini 3.7 Flash (High)" ;;
653
653
  codex) echo "gpt-5.6-terra" ;;
654
654
  mistral) [[ "$transport" == "api" ]] && echo "mistral-large-3" || echo "mistral-medium-3.5" ;;
@@ -1035,4 +1035,4 @@ list_presets() {
1035
1035
  # VERSION
1036
1036
  # =============================================================================
1037
1037
 
1038
- AI_CONSULTANTS_VERSION="5.0.0"
1038
+ AI_CONSULTANTS_VERSION="5.1.0"
@@ -259,13 +259,22 @@ is_pin_managed_key() {
259
259
  [[ "$1" == *_MODEL ]]
260
260
  }
261
261
 
262
+ # Pin wins over default, including hand-edited lines carrying both markers.
262
263
  # Merge existing persistent values first, then current environment overrides.
263
264
  while IFS= read -r key; do
264
265
  if [[ -f "$OUTPUT_FILE" ]] && value=$(read_value "$OUTPUT_FILE" "$key"); then
265
- if has_value_marker "$OUTPUT_FILE" "$key" "$DEFAULT_MARKER"; then
266
- set_value "$key" "$value $DEFAULT_MARKER"
267
- elif has_value_marker "$OUTPUT_FILE" "$key" "$PIN_MARKER"; then
266
+ if has_value_marker "$OUTPUT_FILE" "$key" "$PIN_MARKER"; then
268
267
  set_value "$key" "$value $PIN_MARKER"
268
+ elif has_value_marker "$OUTPUT_FILE" "$key" "$DEFAULT_MARKER"; then
269
+ provenance=$(awk -v key="$key" '
270
+ { sub(/\r$/, ""); sub(/^[[:space:]]*(export[[:space:]]+)?/, "") }
271
+ index($0, key "=") == 1 {
272
+ origin=""
273
+ if (match($0, /migrated-from=gpt-5[.]5|migrated-from=gpt-5[.]6-sol/))
274
+ origin=substr($0, RSTART+14, RLENGTH-14)
275
+ }
276
+ END { printf "%s", origin }' "$OUTPUT_FILE")
277
+ set_value "$key" "$value $DEFAULT_MARKER${provenance:+ migrated-from=$provenance}"
269
278
  else
270
279
  set_value "$key" "$value"
271
280
  fi
@@ -279,24 +288,28 @@ while IFS= read -r key; do
279
288
  fi
280
289
  done < <(list_parameters)
281
290
 
282
- # Before model defaults had provenance markers, `init` copied the then-current
283
- # Claude default as an ordinary-looking value. Refresh that exact historical
284
- # default when configure rewrites the file. A real legacy pin is preserved by
285
- # `--set CLAUDE_MODEL=claude-opus-4-8`, which records the pin marker.
286
- if [[ "$(read_value "$WORK_FILE" CLAUDE_MODEL 2>/dev/null || true)" == "claude-opus-4-8" ]] \
287
- && ! has_value_marker "$WORK_FILE" CLAUDE_MODEL "$PIN_MARKER"; then
288
- set_value CLAUDE_MODEL "claude-opus-5 $DEFAULT_MARKER"
289
- echo "Migrated managed Claude default: claude-opus-4-8 -> claude-opus-5" >&2
290
- fi
291
+ # Promote only the historical generated Claude defaults. Both the old unmarked
292
+ # Opus 4.8 scaffold and every unpinned Opus 5 value are managed defaults;
293
+ # explicit # ai-consultants:pin overrides always remain user-owned.
294
+ case "$(read_value "$WORK_FILE" CLAUDE_MODEL 2>/dev/null || true)" in
295
+ claude-opus-4-8|claude-opus-5)
296
+ if ! has_value_marker "$WORK_FILE" CLAUDE_MODEL "$PIN_MARKER"; then
297
+ set_value CLAUDE_MODEL "claude-fable-5-1 $DEFAULT_MARKER"
298
+ echo "Migrated managed Claude default to claude-fable-5-1" >&2
299
+ fi
300
+ ;;
301
+ esac
291
302
 
292
- # Same shape for Codex: `init` once wrote gpt-5.5 as an unmarked value, so
293
- # configure treated it as a deliberate pin and never reached gpt-5.6-sol. A
294
- # real pin is preserved by `--set CODEX_MODEL=gpt-5.5`.
295
- if [[ "$(read_value "$WORK_FILE" CODEX_MODEL 2>/dev/null || true)" == "gpt-5.5" ]] \
296
- && ! has_value_marker "$WORK_FILE" CODEX_MODEL "$PIN_MARKER"; then
297
- set_value CODEX_MODEL "gpt-5.6-sol $DEFAULT_MARKER"
298
- echo "Migrated managed Codex default: gpt-5.5 -> gpt-5.6-sol" >&2
299
- fi
303
+ # Migrate exact unpinned persisted defaults; environment and --set remain pins.
304
+ old_codex_model=$(read_value "$WORK_FILE" CODEX_MODEL 2>/dev/null || true)
305
+ case "$old_codex_model" in
306
+ gpt-5.5|gpt-5.6-sol)
307
+ if ! has_value_marker "$WORK_FILE" CODEX_MODEL "$PIN_MARKER"; then
308
+ set_value CODEX_MODEL "gpt-6-astra $DEFAULT_MARKER migrated-from=$old_codex_model"
309
+ echo "Migrated managed Codex default: $old_codex_model -> gpt-6-astra" >&2
310
+ fi
311
+ ;;
312
+ esac
300
313
 
301
314
  # Migrate only the exact catalog defaults previously generated by this tool.
302
315
  # A # ai-consultants:pin marker is the durable escape hatch for users who want
package/scripts/doctor.sh CHANGED
@@ -23,6 +23,7 @@
23
23
  set -euo pipefail
24
24
 
25
25
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
26
+ source "$SCRIPT_DIR/lib/grok_sandbox.sh"
26
27
  source "$SCRIPT_DIR/lib/common.sh"
27
28
 
28
29
  # --- Parameters ---
@@ -229,6 +230,17 @@ check_cli_consultant() {
229
230
  return 0
230
231
  fi
231
232
 
233
+ if [[ "$env_var" == GROK ]]; then
234
+ source "$SCRIPT_DIR/lib/grok_sandbox.sh"
235
+ local sandbox_diagnostic
236
+ if ! sandbox_diagnostic=$(grok_sandbox_preflight); then
237
+ _print " ✗ $name: $sandbox_diagnostic"
238
+ add_issue "sandbox" "$sandbox_diagnostic" "Inspect the runtime socket before using Grok strict sandbox"
239
+ check_fail
240
+ return 0
241
+ fi
242
+ fi
243
+
232
244
  # Check if installed
233
245
  if ! command -v "$cmd" &> /dev/null; then
234
246
  _print " ✗ $name: NOT INSTALLED (enabled but missing)"
@@ -684,3 +684,24 @@ check_rate_limit() {
684
684
 
685
685
  return 0
686
686
  }
687
+
688
+ # Resolve per request, without exporting automatic effort into later tiers.
689
+ resolve_codex_effort() {
690
+ local model="$1" effort="${2:-}"
691
+ [[ "$model" != gpt-6-astra || -n "$effort" ]] || effort=high
692
+ [[ -n "$effort" ]] || return 0
693
+ effort=$(validate_reasoning_effort "$effort" Codex) || return 1
694
+ if [[ "$model" == gpt-6-astra && ( "$effort" == none || "$effort" == minimal ) ]]; then
695
+ log_error "[Codex] Astra requires low|medium|high|xhigh|max reasoning effort"
696
+ return 1
697
+ fi
698
+ printf '%s' "$effort"
699
+ }
700
+
701
+ # Codex-only wire adaptation; other OpenAI-compatible providers keep their body.
702
+ build_codex_request() {
703
+ local model="$2" effort
704
+ effort=$(resolve_codex_effort "$model" "${4:-}") || return 1
705
+ build_openai_request "$1" "$model" "${3:-16384}" "$effort" |
706
+ jq '.max_completion_tokens = .max_tokens | del(.max_tokens)'
707
+ }