@oh-my-pi/pi-catalog 18.0.4 → 18.0.6

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,17 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [18.0.5] - 2026-08-25
6
+
7
+ ### Added
8
+
9
+ - Added built-in DeepInfra provider support (`deepinfra`, `DEEPINFRA_API_KEY`) with live model discovery, including chat models, context windows, pricing, cache-read pricing, vision input, and reasoning-effort capabilities.
10
+ - Added built-in Yolo-Auto provider support with the flat-rate `deepseek-flash-v4` model and live model discovery.
11
+
12
+ ### Fixed
13
+
14
+ - Fixed the Synthetic provider’s default model to use `hf:zai-org/GLM-5.2` instead of the retired `hf:zai-org/GLM-5.1`.
15
+
5
16
  ## [18.0.4] - 2026-08-24
6
17
 
7
18
  ### Fixed
@@ -97,6 +97,16 @@ export declare const CATALOG_PROVIDERS: readonly [{
97
97
  readonly envVars: readonly ["CURSOR_API_KEY"];
98
98
  readonly oauthProvider: "cursor";
99
99
  };
100
+ }, {
101
+ readonly id: "deepinfra";
102
+ readonly defaultModel: "deepseek-ai/DeepSeek-V4-Flash-0731";
103
+ readonly envVars: readonly ["DEEPINFRA_API_KEY"];
104
+ readonly createModelManagerOptions: (config: ModelManagerConfig) => import("../index.js").ModelManagerOptions<"openai-completions", unknown>;
105
+ readonly dynamicModelsAuthoritative: true;
106
+ readonly catalogDiscovery: {
107
+ readonly label: "DeepInfra";
108
+ readonly allowUnauthenticated: true;
109
+ };
100
110
  }, {
101
111
  readonly id: "deepseek";
102
112
  readonly defaultModel: "deepseek-v4-pro";
@@ -361,7 +371,7 @@ export declare const CATALOG_PROVIDERS: readonly [{
361
371
  readonly dynamicModelsAuthoritative: true;
362
372
  }, {
363
373
  readonly id: "synthetic";
364
- readonly defaultModel: "hf:zai-org/GLM-5.1";
374
+ readonly defaultModel: "hf:zai-org/GLM-5.2";
365
375
  readonly envVars: readonly ["SYNTHETIC_API_KEY"];
366
376
  readonly createModelManagerOptions: (config: ModelManagerConfig) => import("../index.js").ModelManagerOptions<"openai-completions", unknown>;
367
377
  readonly dynamicModelsAuthoritative: true;
@@ -469,6 +479,15 @@ export declare const CATALOG_PROVIDERS: readonly [{
469
479
  readonly defaultModel: "mimo-v2.5";
470
480
  readonly envVars: readonly ["XIAOMI_TOKEN_PLAN_SGP_API_KEY"];
471
481
  readonly createModelManagerOptions: (config: ModelManagerConfig) => import("../index.js").ModelManagerOptions<"openai-completions", unknown>;
482
+ }, {
483
+ readonly id: "yolo-auto";
484
+ readonly defaultModel: "deepseek-flash-v4";
485
+ readonly envVars: readonly ["YOLO_AUTO_API_KEY"];
486
+ readonly createModelManagerOptions: (config: ModelManagerConfig) => import("../index.js").ModelManagerOptions<"openai-completions", unknown>;
487
+ readonly dynamicModelsAuthoritative: true;
488
+ readonly catalogDiscovery: {
489
+ readonly label: "Yolo-Auto";
490
+ };
472
491
  }, {
473
492
  readonly id: "zai";
474
493
  readonly defaultModel: "glm-5.3";
@@ -161,6 +161,19 @@ export interface NovitaModelManagerConfig {
161
161
  }
162
162
  /** Builds Novita's public model-discovery manager. */
163
163
  export declare function novitaModelManagerOptions(config?: NovitaModelManagerConfig): ModelManagerOptions<"openai-completions">;
164
+ export declare const DEEPINFRA_BASE_URL = "https://api.deepinfra.com/v1/openai";
165
+ /** DeepInfra OpenAI-compatible discovery configuration. */
166
+ export interface DeepinfraModelManagerConfig {
167
+ apiKey?: string;
168
+ baseUrl?: string;
169
+ fetch?: FetchImpl;
170
+ }
171
+ /**
172
+ * Builds DeepInfra's model-discovery manager. The catalog endpoint is public,
173
+ * so discovery (and keyless `gen:models` generation) works without an API key;
174
+ * model availability at runtime is still gated on credentials by the registry.
175
+ */
176
+ export declare function deepinfraModelManagerOptions(config?: DeepinfraModelManagerConfig): ModelManagerOptions<"openai-completions">;
164
177
  export interface XaiModelManagerConfig {
165
178
  apiKey?: string;
166
179
  baseUrl?: string;
@@ -528,6 +541,29 @@ export interface AiandModelManagerConfig {
528
541
  * pricing metadata, so discovery is authoritative over the bundled seed.
529
542
  */
530
543
  export declare function aiandModelManagerOptions(config?: AiandModelManagerConfig): ModelManagerOptions<"openai-completions">;
544
+ /**
545
+ * Documented Yolo-Auto catalog (yolo-auto.com/docs, 2026-08) bundled so the
546
+ * provider is usable when generation and first boot have no live key. The
547
+ * flat-rate `/v1/models` response is authoritative once discovery runs.
548
+ * The compat block mirrors the provider's documented wire surface: the API
549
+ * speaks the generic chat template with `reasoning_effort` support and rejects
550
+ * the `developer` role and `store` param.
551
+ */
552
+ export declare const YOLO_AUTO_STATIC_MODELS: readonly ModelSpec<"openai-completions">[];
553
+ export interface YoloAutoModelManagerConfig {
554
+ apiKey?: string;
555
+ baseUrl?: string;
556
+ fetch?: FetchImpl;
557
+ }
558
+ /**
559
+ * Yolo-Auto model manager: OpenAI-compatible chat completions at the
560
+ * flat-rate `deepseek-flash-v4` endpoint. Live `/v1/models` discovery replaces the
561
+ * bundled seed once a key is stored or present in `YOLO_AUTO_API_KEY`. Models
562
+ * the provider adds later inherit metadata (reasoning, thinking, context)
563
+ * from the global bundled reference index, so new ids work without a per-id
564
+ * code change.
565
+ */
566
+ export declare function yoloAutoModelManagerOptions(config?: YoloAutoModelManagerConfig): ModelManagerOptions<"openai-completions">;
531
567
  export interface QwenPortalModelManagerConfig {
532
568
  apiKey?: string;
533
569
  baseUrl?: string;
@@ -121,8 +121,8 @@ export interface Usage {
121
121
  total: number;
122
122
  };
123
123
  }
124
- export type OpenAIReasoningFormat = "openai" | "openrouter" | "zai" | "kimi" | "qwen" | "qwen-chat-template";
125
- export type OpenAIReasoningDisableMode = "omit" | "lowest-effort" | "none-effort" | "openrouter-enabled-false" | "venice-disable-thinking" | "zai-thinking-disabled" | "qwen-enable-thinking-false" | "qwen-template-false";
124
+ export type OpenAIReasoningFormat = "openai" | "openrouter" | "zai" | "kimi" | "qwen" | "qwen-chat-template" | "chat-template";
125
+ export type OpenAIReasoningDisableMode = "omit" | "lowest-effort" | "none-effort" | "openrouter-enabled-false" | "venice-disable-thinking" | "zai-thinking-disabled" | "qwen-enable-thinking-false" | "qwen-template-false" | "chat-template-thinking-false";
126
126
  export type OpenAIStreamMarkupHealingPattern = "kimi" | "dsml" | "qwen" | "thinking";
127
127
  /**
128
128
  * Compatibility settings for openai-completions API.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@oh-my-pi/pi-catalog",
4
- "version": "18.0.4",
4
+ "version": "18.0.6",
5
5
  "description": "Model catalog for omp: bundled model database, provider discovery descriptors, model identity, classification, and equivalence",
6
6
  "homepage": "https://omp.sh",
7
7
  "author": "Stencil Labs, Inc.",
@@ -34,11 +34,11 @@
34
34
  "gen:proto": "bun scripts/generate-protocols.ts"
35
35
  },
36
36
  "dependencies": {
37
- "@oh-my-pi/omptype": "18.0.4",
38
- "@oh-my-pi/pi-utils": "18.0.4"
37
+ "@oh-my-pi/omptype": "18.0.6",
38
+ "@oh-my-pi/pi-utils": "18.0.6"
39
39
  },
40
40
  "devDependencies": {
41
- "@oh-my-pi/pi-ai": "18.0.4",
41
+ "@oh-my-pi/pi-ai": "18.0.6",
42
42
  "@types/bun": "^1.3.14"
43
43
  },
44
44
  "engines": {
@@ -94,6 +94,8 @@ function resolveReasoningDisableMode(
94
94
  return "qwen-enable-thinking-false";
95
95
  case "qwen-chat-template":
96
96
  return "qwen-template-false";
97
+ case "chat-template":
98
+ return "chat-template-thinking-false";
97
99
  default:
98
100
  return "lowest-effort";
99
101
  }
@@ -22,6 +22,7 @@ const DEFAULT_MODEL_PROVIDER_ORDER = [
22
22
  "fireworks",
23
23
  "cerebras",
24
24
  "baseten",
25
+ "deepinfra",
25
26
  "openrouter",
26
27
  "aimlapi",
27
28
  "together",
@@ -492,9 +492,17 @@ function mergeDynamicModel<TApi extends Api>(existingModel: Model<TApi>, dynamic
492
492
  // dynamic discovery also pre-applies the correct image fallback for omitted
493
493
  // `supports.vision`, so its explicit `false` must not be OR-upgraded by the
494
494
  // canonical bundled model.
495
+ // DeepInfra's discovery is authoritative (`dynamicModelsAuthoritative`) and
496
+ // its `vision`/`vlm` tags are the catalog's whole truth for modality. Every
497
+ // row shares the single DeepInfra endpoint, so `endpointChanged` never fires
498
+ // there: without this carve-out a model that dropped those tags would keep
499
+ // the bundled reference's image support and the agent would go on sending
500
+ // images to a now text-only route.
495
501
  const endpointChanged = existingModel.baseUrl !== dynamicModel.baseUrl;
496
502
  const dynamicInputAuthoritative =
497
- endpointChanged || (existingModel.provider === "github-copilot" && dynamicModel.provider === "github-copilot");
503
+ endpointChanged ||
504
+ (existingModel.provider === "github-copilot" && dynamicModel.provider === "github-copilot") ||
505
+ (existingModel.provider === "deepinfra" && dynamicModel.provider === "deepinfra");
498
506
  const supportsImage = dynamicInputAuthoritative
499
507
  ? dynamicModel.input.includes("image")
500
508
  : existingModel.input.includes("image") || dynamicModel.input.includes("image");
@@ -329,6 +329,14 @@ function getModelDefinedEfforts<TApi extends Api>(
329
329
  spec: ModelSpec<TApi>,
330
330
  compat: CompatOf<TApi>,
331
331
  ): readonly Effort[] | undefined {
332
+ if (
333
+ isOpenAICompatReasoningApi(spec.api) &&
334
+ isChatTemplateThinkingFormat(compat) &&
335
+ spec.thinking?.mode === "effort" &&
336
+ spec.thinking.efforts.length > 0
337
+ ) {
338
+ return spec.thinking.efforts;
339
+ }
332
340
  if (isGlm53ReasoningEffortModelId(spec.id)) {
333
341
  // GLM-5.3+ exposes a uniform wire-exact low/high/max ladder on every
334
342
  // host — unlike GLM-5.2, whose reasoning_effort dialect is
@@ -519,6 +527,9 @@ function isQwenTemplateReasoningEffortCompat(compat: CompatOf<Api>): boolean {
519
527
  compat !== undefined && "qwenTemplateReasoningEffort" in compat && compat.qwenTemplateReasoningEffort === true
520
528
  );
521
529
  }
530
+ function isChatTemplateThinkingFormat(compat: CompatOf<Api>): boolean {
531
+ return compat !== undefined && "thinkingFormat" in compat && compat.thinkingFormat === "chat-template";
532
+ }
522
533
 
523
534
  function inferDetectedEffortMap<TApi extends Api>(
524
535
  spec: ModelSpec<TApi>,