@oh-my-pi/pi-catalog 18.8.6 → 18.8.8

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/CHANGELOG.md CHANGED
@@ -2,6 +2,27 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [18.8.8] - 2026-10-10
6
+
7
+ ### Added
8
+
9
+ - Added the `connection-bound-native-history` rule axis for Responses hosts that reject native history items from an earlier connection, set for GitHub Copilot ([#15148](https://github.com/can1357/oh-my-pi/pull/15148) by [@will-bogusz](https://github.com/will-bogusz))
10
+
11
+ ### Fixed
12
+
13
+ - Fixed Devin's discovered models not marking the account's default model, the one Devin's own CLI starts the account on (SWE-2 High on Pro, SWE-1.6 Slow on Free); when it is an effort lane of a family, the family starts at that effort. Cursor's discovered models no longer carry that marker, so Cursor keeps its existing startup selection ([#15115](https://github.com/can1357/oh-my-pi/pull/15115) by [@will-bogusz](https://github.com/will-bogusz))
14
+
15
+ ## [18.8.7] - 2026-10-09
16
+
17
+ ### Added
18
+
19
+ - Added built-in CoralBricks support with `/login`, live model discovery, per-model reasoning levels and off controls, and bundled offline fallbacks. ([#14146](https://github.com/can1357/oh-my-pi/pull/14146) by [@ryan-brosas](https://github.com/ryan-brosas))
20
+ - Added `gen:models --provider <id>` to update one provider without changing other providers' catalog snapshots. ([#14146](https://github.com/can1357/oh-my-pi/pull/14146) by [@ryan-brosas](https://github.com/ryan-brosas))
21
+
22
+ ### Fixed
23
+
24
+ - Fixed Claude Haiku 5.5 thinking Off to request explicitly disabled thinking on every host serving its adaptive thinking ([#14996](https://github.com/can1357/oh-my-pi/pull/14996) by [@bse-ai](https://github.com/bse-ai)).
25
+
5
26
  ## [18.8.6] - 2026-10-08
6
27
 
7
28
  ### Added
@@ -1,4 +1,4 @@
1
1
  /** Every provider with an `auth/<id>.kdl` policy. */
2
- export type AuthProviderId = "abliteration" | "aiand" | "aimlapi" | "alibaba-coding-plan" | "alibaba-token-plan" | "amazon-bedrock" | "anthropic" | "apple" | "azure" | "baseten" | "bedrock-mantle" | "cerebras" | "charm-hyper" | "cline-pass" | "cloudflare-ai-gateway" | "commandcode" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "exa" | "factory-droid" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google" | "google-antigravity" | "google-gemini-cli" | "google-vertex" | "groq" | "helmcode" | "huggingface" | "kagi" | "kilo" | "kimi-code" | "litellm" | "llama.cpp" | "lm-studio" | "local" | "meta" | "minimax" | "minimax-code" | "minimax-code-cn" | "mistral" | "moonshot" | "muse-code" | "nanogpt" | "novita" | "nvidia" | "ollama" | "ollama-cloud" | "openai" | "openai-codex" | "openai-codex-device" | "opencode-go" | "opencode-zen" | "openrouter" | "parallel" | "perplexity" | "qianfan" | "qwen-portal" | "sakana" | "siliconflow" | "siliconflow-cn" | "singularityapi-dev" | "singularityapi-tech" | "snowflake" | "stencil" | "stepfun" | "synthetic" | "tavily" | "together" | "typesafe" | "umans" | "venice" | "vercel-ai-gateway" | "vllm" | "wafer-serverless" | "web" | "xai" | "xai-oauth" | "xiaomi" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-sgp" | "yolo-auto" | "zai" | "zai-coding-plan" | "zenmux" | "zhipu-coding-plan";
2
+ export type AuthProviderId = "abliteration" | "aiand" | "aimlapi" | "alibaba-coding-plan" | "alibaba-token-plan" | "amazon-bedrock" | "anthropic" | "apple" | "azure" | "baseten" | "bedrock-mantle" | "cerebras" | "charm-hyper" | "cline-pass" | "cloudflare-ai-gateway" | "commandcode" | "coralbricks" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "exa" | "factory-droid" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google" | "google-antigravity" | "google-gemini-cli" | "google-vertex" | "groq" | "helmcode" | "huggingface" | "kagi" | "kilo" | "kimi-code" | "litellm" | "llama.cpp" | "lm-studio" | "local" | "meta" | "minimax" | "minimax-code" | "minimax-code-cn" | "mistral" | "moonshot" | "muse-code" | "nanogpt" | "novita" | "nvidia" | "ollama" | "ollama-cloud" | "openai" | "openai-codex" | "openai-codex-device" | "opencode-go" | "opencode-zen" | "openrouter" | "parallel" | "perplexity" | "qianfan" | "qwen-portal" | "sakana" | "siliconflow" | "siliconflow-cn" | "singularityapi-dev" | "singularityapi-tech" | "snowflake" | "stencil" | "stepfun" | "synthetic" | "tavily" | "together" | "typesafe" | "umans" | "venice" | "vercel-ai-gateway" | "vllm" | "wafer-serverless" | "web" | "xai" | "xai-oauth" | "xiaomi" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-sgp" | "yolo-auto" | "zai" | "zai-coding-plan" | "zenmux" | "zhipu-coding-plan";
3
3
  /** Providers whose policy declares a `login` flow (the `/login` roster). */
4
- export type LoginProviderId = "abliteration" | "aiand" | "alibaba-coding-plan" | "alibaba-token-plan" | "anthropic" | "baseten" | "cerebras" | "charm-hyper" | "cline-pass" | "cloudflare-ai-gateway" | "commandcode" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "exa" | "factory-droid" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google-antigravity" | "google-gemini-cli" | "helmcode" | "huggingface" | "kagi" | "kilo" | "kimi-code" | "litellm" | "llama.cpp" | "lm-studio" | "meta" | "minimax-code" | "minimax-code-cn" | "moonshot" | "muse-code" | "nanogpt" | "novita" | "nvidia" | "ollama" | "ollama-cloud" | "openai-codex" | "openai-codex-device" | "opencode-go" | "opencode-zen" | "openrouter" | "parallel" | "perplexity" | "qianfan" | "qwen-portal" | "sakana" | "siliconflow" | "siliconflow-cn" | "singularityapi-dev" | "singularityapi-tech" | "snowflake" | "stencil" | "stepfun" | "synthetic" | "tavily" | "together" | "typesafe" | "umans" | "venice" | "vercel-ai-gateway" | "vllm" | "wafer-serverless" | "xai" | "xai-oauth" | "xiaomi" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-sgp" | "yolo-auto" | "zai" | "zai-coding-plan" | "zenmux" | "zhipu-coding-plan";
4
+ export type LoginProviderId = "abliteration" | "aiand" | "alibaba-coding-plan" | "alibaba-token-plan" | "anthropic" | "baseten" | "cerebras" | "charm-hyper" | "cline-pass" | "cloudflare-ai-gateway" | "commandcode" | "coralbricks" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "exa" | "factory-droid" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google-antigravity" | "google-gemini-cli" | "helmcode" | "huggingface" | "kagi" | "kilo" | "kimi-code" | "litellm" | "llama.cpp" | "lm-studio" | "meta" | "minimax-code" | "minimax-code-cn" | "moonshot" | "muse-code" | "nanogpt" | "novita" | "nvidia" | "ollama" | "ollama-cloud" | "openai-codex" | "openai-codex-device" | "opencode-go" | "opencode-zen" | "openrouter" | "parallel" | "perplexity" | "qianfan" | "qwen-portal" | "sakana" | "siliconflow" | "siliconflow-cn" | "singularityapi-dev" | "singularityapi-tech" | "snowflake" | "stencil" | "stepfun" | "synthetic" | "tavily" | "together" | "typesafe" | "umans" | "venice" | "vercel-ai-gateway" | "vllm" | "wafer-serverless" | "xai" | "xai-oauth" | "xiaomi" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-sgp" | "yolo-auto" | "zai" | "zai-coding-plan" | "zenmux" | "zhipu-coding-plan";
@@ -1,2 +1,2 @@
1
1
  /** Every chat-model provider with a catalog entry (`default-model` in its provider rules). */
2
- export type KnownProvider = "abliteration" | "aiand" | "aimlapi" | "alibaba-coding-plan" | "alibaba-token-plan" | "amazon-bedrock" | "anthropic" | "apple" | "azure" | "baseten" | "bedrock-mantle" | "cerebras" | "charm-hyper" | "cline-pass" | "cloudflare-ai-gateway" | "commandcode" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "factory-droid" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google" | "google-antigravity" | "google-gemini-cli" | "google-vertex" | "groq" | "helmcode" | "huggingface" | "kilo" | "kimi-code" | "litellm" | "lm-studio" | "local" | "meta" | "minimax" | "minimax-code" | "minimax-code-cn" | "mistral" | "moonshot" | "muse-code" | "nanogpt" | "novita" | "nvidia" | "ollama" | "ollama-cloud" | "openai" | "openai-codex" | "opencode-go" | "opencode-zen" | "openrouter" | "qianfan" | "qwen-portal" | "sakana" | "siliconflow" | "siliconflow-cn" | "singularityapi-dev" | "singularityapi-tech" | "snowflake" | "stepfun" | "synthetic" | "together" | "typesafe" | "umans" | "venice" | "vercel-ai-gateway" | "vllm" | "wafer-serverless" | "web" | "xai" | "xai-oauth" | "xiaomi" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-sgp" | "yolo-auto" | "zai" | "zenmux" | "zhipu-coding-plan";
2
+ export type KnownProvider = "abliteration" | "aiand" | "aimlapi" | "alibaba-coding-plan" | "alibaba-token-plan" | "amazon-bedrock" | "anthropic" | "apple" | "azure" | "baseten" | "bedrock-mantle" | "cerebras" | "charm-hyper" | "cline-pass" | "cloudflare-ai-gateway" | "commandcode" | "coralbricks" | "coreweave" | "cursor" | "deepinfra" | "deepseek" | "devin" | "factory-droid" | "firepass" | "fireworks" | "github-copilot" | "gitlab-duo" | "gitlab-duo-agent" | "gmi-cloud" | "google" | "google-antigravity" | "google-gemini-cli" | "google-vertex" | "groq" | "helmcode" | "huggingface" | "kilo" | "kimi-code" | "litellm" | "lm-studio" | "local" | "meta" | "minimax" | "minimax-code" | "minimax-code-cn" | "mistral" | "moonshot" | "muse-code" | "nanogpt" | "novita" | "nvidia" | "ollama" | "ollama-cloud" | "openai" | "openai-codex" | "opencode-go" | "opencode-zen" | "openrouter" | "qianfan" | "qwen-portal" | "sakana" | "siliconflow" | "siliconflow-cn" | "singularityapi-dev" | "singularityapi-tech" | "snowflake" | "stepfun" | "synthetic" | "together" | "typesafe" | "umans" | "venice" | "vercel-ai-gateway" | "vllm" | "wafer-serverless" | "web" | "xai" | "xai-oauth" | "xiaomi" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-sgp" | "yolo-auto" | "zai" | "zenmux" | "zhipu-coding-plan";
@@ -35,6 +35,22 @@ export interface ModelManagerOptions<TApi extends Api = Api, TModelsDevPayload =
35
35
  cacheTtlMs?: number;
36
36
  /** When true, a successful dynamic fetch is the complete provider catalog and prunes static-only models. */
37
37
  dynamicModelsAuthoritative?: boolean;
38
+ /**
39
+ * When true, a provider's dynamic rows are the deployment's whole truth
40
+ * for input modality: a live text-only row strips the bundled reference's
41
+ * image support instead of OR-merging it back. Declared by providers whose
42
+ * capability flags are authoritative and whose endpoints reject
43
+ * unsupported content (`github-copilot`, `deepinfra`, `coralbricks`).
44
+ */
45
+ dynamicInputAuthoritative?: boolean;
46
+ /** When true, live reasoning capability replaces the fallback, including an explicit false. */
47
+ dynamicReasoningAuthoritative?: boolean;
48
+ /**
49
+ * When true, a live per-million price replaces the fallback even when it is
50
+ * an explicit `0` (a free model or a dropped cache-write charge). Without it,
51
+ * a zero discovery price is treated as unknown and the bundled rate is kept.
52
+ */
53
+ dynamicCostAuthoritative?: boolean;
38
54
  /**
39
55
  * When true, a fresh cache never satisfies an online-eligible refresh: the
40
56
  * dynamic fetch always runs (an explicit `"offline"` strategy is still
@@ -154,6 +154,19 @@ export interface DeepinfraModelManagerConfig {
154
154
  * model availability at runtime is still gated on credentials by the registry.
155
155
  */
156
156
  export declare function deepinfraModelManagerOptions(config?: DeepinfraModelManagerConfig): ModelManagerOptions<"openai-completions">;
157
+ export declare const CORALBRICKS_BASE_URL = "https://inference.coralbricks.ai/v1";
158
+ /** CoralBricks OpenAI-compatible discovery configuration. */
159
+ export interface CoralbricksModelManagerConfig {
160
+ apiKey?: string;
161
+ baseUrl?: string;
162
+ fetch?: FetchImpl;
163
+ }
164
+ /**
165
+ * Builds CoralBricks' model-discovery manager. `/v1/models` is key-protected
166
+ * (401 without a bearer key), so a keyless config serves only the bundled
167
+ * reviewed seed rows; with a key, live rows are authoritative over the bundle.
168
+ */
169
+ export declare function coralbricksModelManagerOptions(config?: CoralbricksModelManagerConfig): ModelManagerOptions<"openai-completions">;
157
170
  export interface XaiModelManagerConfig {
158
171
  apiKey?: string;
159
172
  baseUrl?: string;
@@ -192,6 +192,8 @@ export interface OpenAICompat {
192
192
  supportsMultipleSystemMessages?: boolean;
193
193
  /** Whether the provider supports `reasoning_effort`. Default: auto-detected from URL. */
194
194
  supportsReasoningEffort?: boolean;
195
+ /** Do not infer a thinking dial when discovery supplies no explicit thinking configuration. */
196
+ trustExplicitThinkingOnly?: boolean;
195
197
  /** Optional mapping from pi-ai reasoning levels to provider/model-specific `reasoning_effort` values. */
196
198
  reasoningEffortMap?: Partial<Record<Effort, string>>;
197
199
  /** Whether the provider supports `stream_options: { include_usage: true }` for token usage in streaming responses. Default: true. */
@@ -646,6 +648,8 @@ export interface AnthropicCompat {
646
648
  * deliberately not used to infer these request-shape capabilities.
647
649
  */
648
650
  export interface BedrockCompat {
651
+ /** Explicit disabled-thinking wire form; unset preserves the provider's existing behavior. */
652
+ disabledThinking?: AnthropicCompat["disabledThinking"];
649
653
  /** Whether this endpoint accepts no checkpoints, automatic caching, or explicit cachePoint blocks. */
650
654
  promptCacheMode?: "none" | "automatic" | "explicit";
651
655
  /** Whether this wire may revise already-streamed text (`stream-revision` axis). Unassigned: append-only. */
@@ -684,6 +688,8 @@ export interface BedrockCompat {
684
688
  }
685
689
  /** Fully-resolved Bedrock Converse prompt-cache capabilities, materialized once by `buildModel`. */
686
690
  export interface ResolvedBedrockCompat {
691
+ /** See {@link BedrockCompat.disabledThinking}. */
692
+ disabledThinking?: BedrockCompat["disabledThinking"];
687
693
  promptCacheMode: NonNullable<BedrockCompat["promptCacheMode"]>;
688
694
  /** See {@link BedrockCompat.streamRevision}. */
689
695
  streamRevision?: BedrockCompat["streamRevision"];
@@ -738,6 +744,7 @@ export interface ResolvedOpenAISharedCompat {
738
744
  supportsDeveloperRole: boolean;
739
745
  supportsStrictMode: boolean;
740
746
  supportsReasoningEffort: boolean;
747
+ trustExplicitThinkingOnly?: boolean;
741
748
  reasoningEffortMap: Partial<Record<Effort, string>>;
742
749
  supportsReasoningParams: boolean;
743
750
  supportsSamplingParams: boolean;
@@ -814,7 +821,7 @@ export interface ResolvedOpenAISharedCompat {
814
821
  * `buildModel`; request handlers read fields and never detect, resolve, or
815
822
  * allocate.
816
823
  */
817
- export type ResolvedOpenAICompat = ResolvedOpenAISharedCompat & Required<Omit<OpenAICompat, "supportsDeveloperRole" | "supportsReasoningEffort" | "reasoningEffortMap" | "supportsReasoningParams" | "supportsReasoningSummary" | "statefulResponses" | "supportsSamplingParams" | "supportsPenaltyAndStopParams" | "thinkingFormat" | "kimiApiFormat" | "reasoningDisableMode" | "omitReasoningEffort" | "includeEncryptedReasoning" | "filterReasoningHistory" | "disableReasoningOnForcedToolChoice" | "disableReasoningOnToolChoice" | "disableReasoningWithTools" | "supportsToolChoice" | "supportsForcedToolChoice" | "supportsNamedToolChoice" | "reasoningContentField" | "mistralReasoningContentParts" | "requiresReasoningContentForToolCalls" | "requiresReasoningContentForAllAssistantTurns" | "allowsSyntheticReasoningContentForToolCalls" | "syntheticReasoningContentFallback" | "replayReasoningContent" | "qwenPreserveThinking" | "qwenTemplateReasoningEffort" | "requiresThinkingAsText" | "requiresMistralToolIds" | "requiresToolResultName" | "requiresAssistantAfterToolResult" | "requiresAssistantContentForToolCalls" | "stripDeepseekSpecialTokens" | "streamMarkupHealingPattern" | "reasoningDeltasMayBeCumulative" | "emptyLengthFinishIsContextError" | "usesOpenAIToolCallIdLimit" | "promptCacheSessionHeader" | "supportsPromptCacheBreakpoints" | "promptCacheBreakpointTtl" | "openRouterRouting" | "isOpenRouterHost" | "supportsStrictMode" | "supportsLongPromptCacheRetention" | "alwaysSendMaxTokens" | "clampOutputToModelMax" | "wireModelIdMode" | "vercelGatewayRouting" | "extraBody" | "toolStrictMode" | "toolSchemaFlavor" | "streamFirstEventTimeoutMs" | "streamIdleTimeoutMs" | "streamRevision" | "cacheControlFormat" | "thinkingKeep" | "strictResponsesPairing" | "supportsImageDetailOriginal" | "supportsConfigurationUpdate" | "supportsSteering" | "stripImageInput" | "thinkingLoopGuard" | "whenThinking">> & {
824
+ export type ResolvedOpenAICompat = ResolvedOpenAISharedCompat & Required<Omit<OpenAICompat, "supportsDeveloperRole" | "supportsReasoningEffort" | "trustExplicitThinkingOnly" | "reasoningEffortMap" | "supportsReasoningParams" | "supportsReasoningSummary" | "statefulResponses" | "supportsSamplingParams" | "supportsPenaltyAndStopParams" | "thinkingFormat" | "kimiApiFormat" | "reasoningDisableMode" | "omitReasoningEffort" | "includeEncryptedReasoning" | "filterReasoningHistory" | "disableReasoningOnForcedToolChoice" | "disableReasoningOnToolChoice" | "disableReasoningWithTools" | "supportsToolChoice" | "supportsForcedToolChoice" | "supportsNamedToolChoice" | "reasoningContentField" | "mistralReasoningContentParts" | "requiresReasoningContentForToolCalls" | "requiresReasoningContentForAllAssistantTurns" | "allowsSyntheticReasoningContentForToolCalls" | "syntheticReasoningContentFallback" | "replayReasoningContent" | "qwenPreserveThinking" | "qwenTemplateReasoningEffort" | "requiresThinkingAsText" | "requiresMistralToolIds" | "requiresToolResultName" | "requiresAssistantAfterToolResult" | "requiresAssistantContentForToolCalls" | "stripDeepseekSpecialTokens" | "streamMarkupHealingPattern" | "reasoningDeltasMayBeCumulative" | "emptyLengthFinishIsContextError" | "usesOpenAIToolCallIdLimit" | "promptCacheSessionHeader" | "supportsPromptCacheBreakpoints" | "promptCacheBreakpointTtl" | "openRouterRouting" | "isOpenRouterHost" | "supportsStrictMode" | "supportsLongPromptCacheRetention" | "alwaysSendMaxTokens" | "clampOutputToModelMax" | "wireModelIdMode" | "vercelGatewayRouting" | "extraBody" | "toolStrictMode" | "toolSchemaFlavor" | "streamFirstEventTimeoutMs" | "streamIdleTimeoutMs" | "streamRevision" | "cacheControlFormat" | "thinkingKeep" | "strictResponsesPairing" | "supportsImageDetailOriginal" | "supportsConfigurationUpdate" | "supportsSteering" | "stripImageInput" | "thinkingLoopGuard" | "whenThinking">> & {
818
825
  vercelGatewayRouting?: OpenAICompat["vercelGatewayRouting"];
819
826
  extraBody?: OpenAICompat["extraBody"];
820
827
  cacheControlFormat?: OpenAICompat["cacheControlFormat"];
@@ -871,6 +878,13 @@ export interface ResolvedOpenAIResponsesCompat extends ResolvedOpenAISharedCompa
871
878
  * `PI_MUSE_STORE_RESPONSES`); stored runs retain prompts and outputs on the provider.
872
879
  */
873
880
  storeResponses: boolean;
881
+ /**
882
+ * Whether the host binds native history items (`encrypted_content`, item
883
+ * ids) to the connection that issued them, so a new process must rebuild
884
+ * prior turns from message content until its first successful response.
885
+ * Rule-owned: GitHub Copilot.
886
+ */
887
+ connectionBoundNativeHistory: boolean;
874
888
  streamIdleTimeoutMs?: number;
875
889
  vercelGatewayRouting?: OpenAICompat["vercelGatewayRouting"];
876
890
  /** The model sits behind Vercel AI Gateway's Responses endpoint. */
@@ -1336,7 +1350,7 @@ export interface Model<TApi extends Api = Api> {
1336
1350
  isNew?: boolean;
1337
1351
  /** Upstream marks this model as beta / preview quality. */
1338
1352
  isBeta?: boolean;
1339
- /** Authenticated provider catalog marks this as the account's default model. */
1353
+ /** Authenticated catalog marks this as the account's default; the startup pick prefers it over `default-model`. */
1340
1354
  isProviderDefault?: boolean;
1341
1355
  /** Upstream marks this model as one of its recommended picks. */
1342
1356
  isRecommended?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oh-my-pi/pi-catalog",
3
- "version": "18.8.6",
3
+ "version": "18.8.8",
4
4
  "description": "Model catalog for omp: bundled model database, provider discovery descriptors, model identity, classification, and equivalence",
5
5
  "keywords": [
6
6
  "ai",
@@ -93,12 +93,12 @@
93
93
  "gen:proto": "bun scripts/generate-protocols.ts"
94
94
  },
95
95
  "dependencies": {
96
- "@oh-my-pi/omptype": "18.8.6",
97
- "@oh-my-pi/pi-utils": "18.8.6"
96
+ "@oh-my-pi/omptype": "18.8.8",
97
+ "@oh-my-pi/pi-utils": "18.8.8"
98
98
  },
99
99
  "devDependencies": {
100
100
  "@bgotink/kdl": "0.4.0",
101
- "@oh-my-pi/pi-ai": "18.8.6",
101
+ "@oh-my-pi/pi-ai": "18.8.8",
102
102
  "@types/bun": "^1.3.14"
103
103
  },
104
104
  "engines": {
@@ -18,6 +18,7 @@ export type AuthProviderId =
18
18
  | "cline-pass"
19
19
  | "cloudflare-ai-gateway"
20
20
  | "commandcode"
21
+ | "coralbricks"
21
22
  | "coreweave"
22
23
  | "cursor"
23
24
  | "deepinfra"
@@ -110,6 +111,7 @@ export type LoginProviderId =
110
111
  | "cline-pass"
111
112
  | "cloudflare-ai-gateway"
112
113
  | "commandcode"
114
+ | "coralbricks"
113
115
  | "coreweave"
114
116
  | "cursor"
115
117
  | "deepinfra"
@@ -169,6 +169,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
169
169
  "requires-thinking-as-text": wire("requiresThinkingAsText", ["openai"]),
170
170
  "requires-tool-result-name": wire("requiresToolResultName", ["openai"]),
171
171
  "strict-responses-pairing": wire("strictResponsesPairing", ["openai-responses"]),
172
+ "connection-bound-native-history": wire("connectionBoundNativeHistory", ["openai-responses"]),
172
173
  "stateful-responses": wire("statefulResponses", ["openai-responses"]),
173
174
  "requires-reasoning-off-juice-instruction": wire("requiresReasoningOffJuiceInstruction", ["openai-responses"]),
174
175
  "supports-all-turns-reasoning-context": wire("supportsAllTurnsReasoningContext", ["openai-responses"]),
@@ -229,7 +230,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
229
230
  "allow-anthropic-header-overrides": wire("allowAnthropicHeaderOverrides", ["anthropic"]),
230
231
  "disable-adaptive-thinking": wire("disableAdaptiveThinking", ["anthropic"]),
231
232
  "disable-strict-tools": wire("disableStrictTools", ["anthropic"]),
232
- "disabled-thinking": wire("disabledThinking", ["anthropic"], "scalar", ["omit", "disabled", "adaptive"]),
233
+ "disabled-thinking": wire("disabledThinking", ["anthropic", "bedrock"], "scalar", ["omit", "disabled", "adaptive"]),
233
234
  "effort-beta": wire("effortBeta", ["anthropic"]),
234
235
  "escape-builtin-tool-names": wire("escapeBuiltinToolNames", ["anthropic"]),
235
236
  "fast-mode": wire("fastMode", ["anthropic"]),
@@ -261,7 +262,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
261
262
  // ── wire: devin-agent ──
262
263
  "model-router": wire("modelRouter", ["devin"]),
263
264
  "supports-parallel-tool-calls": wire("supportsParallelToolCalls", ["devin"]),
264
- "trust-explicit-thinking-only": wire("trustExplicitThinkingOnly", ["devin"]),
265
+ "trust-explicit-thinking-only": wire("trustExplicitThinkingOnly", [...OAI, "devin"]),
265
266
 
266
267
  // ── wire: google APIs ──
267
268
  "antigravity-claude-tool-mode": wire("antigravityClaudeToolMode", ["google"]),
@@ -18,6 +18,7 @@ export type KnownProvider =
18
18
  | "cline-pass"
19
19
  | "cloudflare-ai-gateway"
20
20
  | "commandcode"
21
+ | "coralbricks"
21
22
  | "coreweave"
22
23
  | "cursor"
23
24
  | "deepinfra"
@@ -503,6 +503,7 @@ function detectOpenAICompat(
503
503
  supportsDeveloperRole: isOpenAIHost || isAzureHost,
504
504
  supportsMultipleSystemMessages: supportsMultipleSystemMessagesDefault,
505
505
  supportsReasoningEffort: !isGrok && !d.isXiaomiMimo && (!(d.isZai || d.isZhipu) || supportsZaiReasoningEffort),
506
+ trustExplicitThinkingOnly: undefined,
506
507
  // API-conditional: this completions-only Copilot exclusion cannot be a
507
508
  // provider rule without changing Copilot Responses rows.
508
509
  supportsReasoningParams: provider !== "github-copilot",
@@ -732,6 +733,7 @@ function resolveOpenAIResponsesPolicy(
732
733
  hostMatchesUrl(baseUrl, "openrouter") ||
733
734
  hostMatchesUrl(baseUrl, "deepseekFamily"),
734
735
  supportsReasoningEffort: !isXaiHost,
736
+ trustExplicitThinkingOnly: undefined,
735
737
  supportsLongPromptCacheRetention: isOpenAIUrl,
736
738
  supportsPromptCacheBreakpoints,
737
739
  promptCacheBreakpointTtl: supportsPromptCacheBreakpoints ? "30m" : undefined,
@@ -793,6 +795,7 @@ function resolveOpenAIResponsesPolicy(
793
795
  (LOCAL_OPENAI_COMPAT_PROVIDERS[backendProvider] === true || hasLocalLoopbackBaseUrl(baseUrl)),
794
796
  supportsObfuscationOptOut: isOpenAIUrl || provider === "openai",
795
797
  storeResponses: false,
798
+ connectionBoundNativeHistory: false,
796
799
  officialEndpoint: isOfficialOpenAIEndpoint(provider, baseUrl),
797
800
  harmonyLeakMitigation: false,
798
801
  rejectRootObjectUnion: false,
@@ -855,6 +858,7 @@ function pickResponsesOnly(compat: ResolvedOpenAIResponsesCompat): ResponsesOnly
855
858
  supportsImageDetailOriginal: compat.supportsImageDetailOriginal,
856
859
  supportsObfuscationOptOut: compat.supportsObfuscationOptOut,
857
860
  storeResponses: compat.storeResponses,
861
+ connectionBoundNativeHistory: compat.connectionBoundNativeHistory,
858
862
  supportsAllTurnsReasoningContext: compat.supportsAllTurnsReasoningContext,
859
863
  supportsConfigurationUpdate: compat.supportsConfigurationUpdate,
860
864
  supportsSteering: compat.supportsSteering,
@@ -10,4 +10,4 @@ login-order "openai-codex" "anthropic" "zai" "zai-coding-plan" "kimi-code" "open
10
10
  "qianfan" "venice" "siliconflow" "siliconflow-cn" "synthetic" "nanogpt" "wafer-serverless" "coreweave" \
11
11
  "vercel-ai-gateway" "cloudflare-ai-gateway" "snowflake" "litellm" "kilo" "zenmux" "opencode-zen" "opencode-go" \
12
12
  "yolo-auto" "tavily" "kagi" "exa" "parallel" "typesafe" "ollama" "ollama-cloud" "lm-studio" "llama.cpp" "vllm" \
13
- "gmi-cloud" "stencil" "singularityapi-dev" "singularityapi-tech"
13
+ "gmi-cloud" "stencil" "singularityapi-dev" "singularityapi-tech" "coralbricks"
@@ -0,0 +1,13 @@
1
+ // `/v1/models` is key-protected — it answers `401 missing_api_key` without a
2
+ // bearer key and `401 invalid_api_key` to a rejected one (verified
3
+ // 2026-10-02) — so login validates the pasted key there. The probe bills
4
+ // nothing, unlike a chat-completions ping against a prepaid balance.
5
+ auth "coralbricks" {
6
+ name "CoralBricks"
7
+ login "api-key" {
8
+ auth-url "https://www.coralbricks.ai/api-keys"
9
+ instructions "Create or copy your API key from the CoralBricks dashboard (keys look like cb_...)"
10
+ prompt "Paste your CoralBricks API key" placeholder="cb_..."
11
+ validate "models-endpoint" label="CoralBricks" url="https://inference.coralbricks.ai/v1/models"
12
+ }
13
+ }
@@ -308,8 +308,12 @@ class "anthropic" {
308
308
  family "haiku" {
309
309
  thinking-mode "budget"
310
310
  // Haiku 5.5 is the first adaptive Haiku: `budget_tokens` is a 400.
311
+ // An omitted `thinking` is adaptive, but unlike Sonnet/Opus 5.5 it
312
+ // accepts `disabled` at effort `high` or below, so Off is explicit.
313
+ // https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-haiku-5-5#use-effort-to-control-thinking
311
314
  revision ">=5.5 <6" {
312
315
  thinking-mode "anthropic-adaptive"
316
+ disabled-thinking "disabled"
313
317
  }
314
318
  }
315
319
  }
@@ -0,0 +1,62 @@
1
+ // CoralBricks inference gateway deployment contract
2
+ // (https://www.coralbricks.ai/docs.md; catalog snapshot 2026-10-08).
3
+ //
4
+ // Coral serves open-weight models behind an OpenAI-compatible wire at
5
+ // https://inference.coralbricks.ai/v1 with a single bearer API key. The
6
+ // key-protected `GET /v1/models` publishes each row's context window,
7
+ // per-million pricing, and capability flags, and Coral documents those
8
+ // flags as authoritative (unsupported content answers
9
+ // `400 unsupported_content_type` rather than being dropped), so live
10
+ // discovery is the deployment truth and same-id rows on other hosts must
11
+ // not backfill capabilities or limits into this provider's rows.
12
+ provider "coralbricks" {
13
+ default-model "glm-5.3-fast"
14
+ // Official docs authenticate via `CORAL_API_KEY`
15
+ // (https://www.coralbricks.ai/docs.md#authentication); `CORALBRICKS_API_KEY`
16
+ // is the alias the Coral pi provider extension shipped with, kept as a
17
+ // compatibility fallback in precedence order.
18
+ env "CORAL_API_KEY" "CORALBRICKS_API_KEY"
19
+ dynamic-models-authoritative #true
20
+ skip-cross-provider-reference-fills #true
21
+ discovery label="CoralBricks"
22
+
23
+ // Reviewed snapshot of the public catalog
24
+ // (https://www.coralbricks.ai/api/public/models). Coral retired GLM 5.3
25
+ // Flash on 2026-10-07 and renamed the remaining slugs (`glm-5.3-fast`,
26
+ // `deepseek-v4.1-flash-fast`). The public rows list input/output rates
27
+ // only; cache-write rates come from Coral's published pricing and cached
28
+ // reads are $0 on every model. `/v1/models` needs a key, so generation
29
+ // without credentials bundles these rows; successful runtime discovery
30
+ // replaces them.
31
+ seed api="openai-completions" base-url="https://inference.coralbricks.ai/v1" bundle="always" {
32
+ model "glm-5.3-fast" name="GLM 5.3" {
33
+ reasoning #true
34
+ input "text"
35
+ cost input=1.12 output=4.4 cache-read=0 cache-write=1.68
36
+ limits context=1048576 max-tokens=131072
37
+ }
38
+ model "deepseek-v4.1-flash-fast" name="DeepSeek V4.1 Flash" {
39
+ reasoning #true
40
+ input "text" "image"
41
+ cost input=0.3 output=1.2 cache-read=0 cache-write=0.09
42
+ limits context=1048576 max-tokens=131072
43
+ }
44
+ }
45
+
46
+ // DeepSeek V4.1 Flash is the one CoralBricks SKU that advertises a genuine
47
+ // off value (`none` in its reasoning-effort vocabulary, per the reasoning
48
+ // table at https://www.coralbricks.ai/docs.md#reasoning), so a
49
+ // thinking-off request disables reasoning instead of clamping to the
50
+ // lowest effort like the GLM SKUs.
51
+ models "deepseek-v4.1-flash-fast" {
52
+ reasoning-disable-mode "none-effort"
53
+ }
54
+ // Gateway request dialect, matching Coral's plain Chat Completions
55
+ // surface ("unchanged from what your existing SDK expects"): output caps
56
+ // ride `max_tokens`, system prompts ride the `system` role, and no
57
+ // `store` field is sent. Coral accepts unknown fields, so acceptance is
58
+ // not evidence the semantics are honored (same call as charm-hyper).
59
+ supports-developer-role #false
60
+ supports-store #false
61
+ max-tokens-field "max_tokens"
62
+ }
@@ -14,8 +14,8 @@ provider "devin" {
14
14
  // bundle would misstate every other account's entitlements and leave zombie
15
15
  // rows behind (see CREDENTIAL_SCOPED_PROVIDERS in generate-models.ts). Both
16
16
  // SWE-1.6 lanes are verified live against `GetCliModelConfigs`; the
17
- // seed's `default-model` (`swe-1-6`) must resolve synchronously at
18
- // boot, before credential-scoped runtime discovery replaces the seed. Field
17
+ // seed's `default-model` (`swe-1-6`) must resolve synchronously at boot;
18
+ // discovery then replaces the seed and the account default it marks wins. Field
19
19
  // shape mirrors `devinModelSpec` so seeded and discovered rows are
20
20
  // indistinguishable downstream.
21
21
  seed api="devin-agent" base-url="https://server.codeium.com" bundle="always" {
@@ -10,6 +10,10 @@ provider "github-copilot" {
10
10
  // tool schemas and does not support the context-management beta or field.
11
11
  disable-strict-tools #true
12
12
  supports-context-management #false
13
+ // Responses items from an earlier connection answer `401 input item does
14
+ // not belong to this connection`: a resumed session rebuilds prior turns
15
+ // until its first response.
16
+ connection-bound-native-history #true
13
17
  class "anthropic" {
14
18
  revision ">=4 <4.6" {
15
19
  thinking-efforts "minimal" "low" "medium" "high" "xhigh"