@velum-labs/routekit-gateway 0.16.2 → 0.16.3

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/dist/server.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createServer } from "node:http";
2
- import { ProviderFailureError } from "@velum-labs/routekit-contracts";
2
+ import { isCodexPickerEligibleModel, ProviderFailureError } from "@velum-labs/routekit-contracts";
3
3
  import { anthropicModelsResponse, handleAnthropicMessages, handleCountTokens, resolveClaudeModelAlias } from "./adapters/anthropic.js";
4
4
  import { effectiveModel, isStream, withDefaultModel } from "./adapters/chat.js";
5
5
  import { authorizedRequest, parsePrincipalHeader, ROUTEKIT_PRINCIPAL_HEADER } from "./auth.js";
@@ -123,7 +123,15 @@ function withoutStaleCodexIdentity(body, route) {
123
123
  function codexPickerModels(backend, configured, native, includeUnroutedNative) {
124
124
  const nativeBySlug = new Map(native.flatMap((entry) => typeof entry.slug === "string" ? [[entry.slug, entry]] : []));
125
125
  const seen = new Set();
126
- const models = configured.map((entry, priority) => {
126
+ const eligible = configured.filter((entry) => {
127
+ const route = backend.resolveModelRoute?.(entry.id);
128
+ return (entry.id === backend.defaultModel ||
129
+ isCodexPickerEligibleModel({
130
+ provider: route?.provider,
131
+ reasoning: route?.reasoning
132
+ }));
133
+ });
134
+ const models = eligible.map((entry, priority) => {
127
135
  const route = backend.resolveModelRoute?.(entry.id);
128
136
  const slug = route?.provider === "codex" ? route.nativeId : entry.id;
129
137
  seen.add(slug);
@@ -1449,7 +1449,7 @@ test("translates a streamed Responses event sequence", async () => {
1449
1449
  await mock.close();
1450
1450
  }
1451
1451
  });
1452
- test("Codex catalog advertises reasoning summaries only for text-capable wire shapes", async () => {
1452
+ test("Codex catalog filters chat-only OpenRouter models and preserves reasoning summaries", async () => {
1453
1453
  const source = (sourceId, wireShape) => ({
1454
1454
  sourceId,
1455
1455
  discoverModels: async () => [{
@@ -1460,15 +1460,30 @@ test("Codex catalog advertises reasoning summaries only for text-capable wire sh
1460
1460
  wireShape,
1461
1461
  provenance: "provider"
1462
1462
  }
1463
- }],
1463
+ }, ...(sourceId === "openai" ? [{ id: "unknown-model" }] : [])],
1464
1464
  chat: async () => Response.json({}),
1465
1465
  embeddings: async () => Response.json({})
1466
1466
  });
1467
+ const chatOnly = {
1468
+ sourceId: "openrouter",
1469
+ discoverModels: async () => [{ id: "chat-only" }],
1470
+ chat: async () => Response.json({}),
1471
+ embeddings: async () => Response.json({})
1472
+ };
1467
1473
  const backend = await CatalogBackend.create({
1468
- config: { providers: { openai: {}, openrouter: {} } },
1474
+ config: {
1475
+ providers: { openai: {}, openrouter: {} },
1476
+ defaultModel: "openai/gpt-5.5"
1477
+ },
1469
1478
  sources: {
1470
1479
  openai: source("openai", "openai-chat"),
1471
- openrouter: source("openrouter", "openrouter")
1480
+ openrouter: {
1481
+ ...source("openrouter", "openrouter"),
1482
+ discoverModels: async () => [
1483
+ ...(await chatOnly.discoverModels()),
1484
+ ...(await source("openrouter", "openrouter").discoverModels())
1485
+ ]
1486
+ }
1472
1487
  }
1473
1488
  });
1474
1489
  const gateway = await startGateway({ backend });
@@ -1476,8 +1491,15 @@ test("Codex catalog advertises reasoning summaries only for text-capable wire sh
1476
1491
  const response = await fetch(`${gateway.url()}/v1/models`);
1477
1492
  assert.equal(response.status, 200);
1478
1493
  const catalog = (await response.json());
1494
+ assert.deepEqual(catalog.data.map((model) => model.id), [
1495
+ "openai/gpt-5.5",
1496
+ "openai/unknown-model",
1497
+ "openrouter/chat-only",
1498
+ "openrouter/reasoning-model"
1499
+ ]);
1479
1500
  assert.deepEqual(catalog.models.map((model) => [model.slug, model.supports_reasoning_summaries]), [
1480
1501
  ["openai/gpt-5.5", false],
1502
+ ["openai/unknown-model", false],
1481
1503
  ["openrouter/reasoning-model", true]
1482
1504
  ]);
1483
1505
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@velum-labs/routekit-gateway",
3
3
  "private": false,
4
- "version": "0.16.2",
4
+ "version": "0.16.3",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/velum-labs/routekit.git",
@@ -29,10 +29,10 @@
29
29
  "@aws-sdk/client-bedrock": "3.1095.0",
30
30
  "@aws-sdk/client-bedrock-runtime": "3.1095.0",
31
31
  "zod": "4.4.3",
32
- "@velum-labs/routekit-contracts": "0.16.2",
33
- "@velum-labs/routekit-registry": "0.16.2",
34
- "@velum-labs/routekit-runtime": "0.16.2",
35
- "@velum-labs/routekit-tracing": "0.16.2"
32
+ "@velum-labs/routekit-contracts": "0.16.3",
33
+ "@velum-labs/routekit-registry": "0.16.3",
34
+ "@velum-labs/routekit-runtime": "0.16.3",
35
+ "@velum-labs/routekit-tracing": "0.16.3"
36
36
  },
37
37
  "keywords": [
38
38
  "routekit",