@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 +10 -2
- package/dist/test/responses.test.js +26 -4
- package/package.json +5 -5
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
|
|
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
|
|
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: {
|
|
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:
|
|
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.
|
|
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.
|
|
33
|
-
"@velum-labs/routekit-registry": "0.16.
|
|
34
|
-
"@velum-labs/routekit-runtime": "0.16.
|
|
35
|
-
"@velum-labs/routekit-tracing": "0.16.
|
|
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",
|