@copilotkit/aimock 1.45.0 → 1.46.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +24 -0
- package/README.md +7 -1
- package/dist/agui-mock.cjs +25 -25
- package/dist/agui-mock.cjs.map +1 -1
- package/dist/agui-mock.d.cts.map +1 -1
- package/dist/agui-mock.d.ts.map +1 -1
- package/dist/agui-mock.js +25 -25
- package/dist/agui-mock.js.map +1 -1
- package/dist/agui-types.d.ts.map +1 -1
- package/dist/aimock-cli.cjs +15 -1
- package/dist/aimock-cli.cjs.map +1 -1
- package/dist/aimock-cli.d.cts.map +1 -1
- package/dist/aimock-cli.d.ts.map +1 -1
- package/dist/aimock-cli.js +16 -2
- package/dist/aimock-cli.js.map +1 -1
- package/dist/api-key-auth.cjs +10 -9
- package/dist/api-key-auth.cjs.map +1 -1
- package/dist/api-key-auth.d.cts.map +1 -1
- package/dist/api-key-auth.d.ts.map +1 -1
- package/dist/api-key-auth.js +11 -10
- package/dist/api-key-auth.js.map +1 -1
- package/dist/batches.cjs +2 -4
- package/dist/batches.cjs.map +1 -1
- package/dist/batches.d.cts.map +1 -1
- package/dist/batches.d.ts.map +1 -1
- package/dist/batches.js +2 -4
- package/dist/batches.js.map +1 -1
- package/dist/bedrock-converse.cjs +61 -80
- package/dist/bedrock-converse.cjs.map +1 -1
- package/dist/bedrock-converse.d.cts.map +1 -1
- package/dist/bedrock-converse.d.ts.map +1 -1
- package/dist/bedrock-converse.js +58 -77
- package/dist/bedrock-converse.js.map +1 -1
- package/dist/bedrock.cjs +65 -97
- package/dist/bedrock.cjs.map +1 -1
- package/dist/bedrock.d.cts.map +1 -1
- package/dist/bedrock.d.ts.map +1 -1
- package/dist/bedrock.js +62 -94
- package/dist/bedrock.js.map +1 -1
- package/dist/byteplus-video.cjs +11 -10
- package/dist/byteplus-video.cjs.map +1 -1
- package/dist/byteplus-video.d.cts.map +1 -1
- package/dist/byteplus-video.d.ts.map +1 -1
- package/dist/byteplus-video.js +5 -4
- package/dist/byteplus-video.js.map +1 -1
- package/dist/chaos.cjs +5 -4
- package/dist/chaos.cjs.map +1 -1
- package/dist/chaos.d.cts.map +1 -1
- package/dist/chaos.d.ts.map +1 -1
- package/dist/chaos.js +5 -4
- package/dist/chaos.js.map +1 -1
- package/dist/cli.cjs +15 -0
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +15 -0
- package/dist/cli.js.map +1 -1
- package/dist/cohere.cjs +49 -74
- package/dist/cohere.cjs.map +1 -1
- package/dist/cohere.d.cts.map +1 -1
- package/dist/cohere.d.ts.map +1 -1
- package/dist/cohere.js +47 -72
- package/dist/cohere.js.map +1 -1
- package/dist/config-loader.cjs +29 -1
- package/dist/config-loader.cjs.map +1 -1
- package/dist/config-loader.d.cts +7 -1
- package/dist/config-loader.d.cts.map +1 -1
- package/dist/config-loader.d.ts +7 -1
- package/dist/config-loader.d.ts.map +1 -1
- package/dist/config-loader.js +29 -2
- package/dist/config-loader.js.map +1 -1
- package/dist/count-tokens.cjs +146 -0
- package/dist/count-tokens.cjs.map +1 -0
- package/dist/count-tokens.js +146 -0
- package/dist/count-tokens.js.map +1 -0
- package/dist/elevenlabs-audio.cjs +36 -34
- package/dist/elevenlabs-audio.cjs.map +1 -1
- package/dist/elevenlabs-audio.d.cts.map +1 -1
- package/dist/elevenlabs-audio.d.ts.map +1 -1
- package/dist/elevenlabs-audio.js +33 -31
- package/dist/elevenlabs-audio.js.map +1 -1
- package/dist/elevenlabs-voice.cjs +38 -37
- package/dist/elevenlabs-voice.cjs.map +1 -1
- package/dist/elevenlabs-voice.d.cts.map +1 -1
- package/dist/elevenlabs-voice.d.ts.map +1 -1
- package/dist/elevenlabs-voice.js +33 -32
- package/dist/elevenlabs-voice.js.map +1 -1
- package/dist/embedding-request.cjs +16 -0
- package/dist/embedding-request.cjs.map +1 -0
- package/dist/embedding-request.js +14 -0
- package/dist/embedding-request.js.map +1 -0
- package/dist/embeddings.cjs +30 -20
- package/dist/embeddings.cjs.map +1 -1
- package/dist/embeddings.d.cts.map +1 -1
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/embeddings.js +30 -20
- package/dist/embeddings.js.map +1 -1
- package/dist/fal-audio.cjs +45 -43
- package/dist/fal-audio.cjs.map +1 -1
- package/dist/fal-audio.d.cts.map +1 -1
- package/dist/fal-audio.d.ts.map +1 -1
- package/dist/fal-audio.js +42 -40
- package/dist/fal-audio.js.map +1 -1
- package/dist/fal.cjs +17 -15
- package/dist/fal.cjs.map +1 -1
- package/dist/fal.js +16 -14
- package/dist/fal.js.map +1 -1
- package/dist/files.cjs +2 -4
- package/dist/files.cjs.map +1 -1
- package/dist/files.d.cts.map +1 -1
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +2 -4
- package/dist/files.js.map +1 -1
- package/dist/fine-tuning.cjs +2 -4
- package/dist/fine-tuning.cjs.map +1 -1
- package/dist/fine-tuning.d.cts.map +1 -1
- package/dist/fine-tuning.d.ts.map +1 -1
- package/dist/fine-tuning.js +2 -4
- package/dist/fine-tuning.js.map +1 -1
- package/dist/fixture-loader.cjs +37 -42
- package/dist/fixture-loader.cjs.map +1 -1
- package/dist/fixture-loader.d.cts.map +1 -1
- package/dist/fixture-loader.d.ts.map +1 -1
- package/dist/fixture-loader.js +37 -42
- package/dist/fixture-loader.js.map +1 -1
- package/dist/gemini-embeddings.cjs +26 -24
- package/dist/gemini-embeddings.cjs.map +1 -1
- package/dist/gemini-embeddings.js +26 -24
- package/dist/gemini-embeddings.js.map +1 -1
- package/dist/gemini-interactions.cjs +50 -35
- package/dist/gemini-interactions.cjs.map +1 -1
- package/dist/gemini-interactions.d.cts +0 -1
- package/dist/gemini-interactions.d.cts.map +1 -1
- package/dist/gemini-interactions.d.ts +0 -1
- package/dist/gemini-interactions.d.ts.map +1 -1
- package/dist/gemini-interactions.js +49 -34
- package/dist/gemini-interactions.js.map +1 -1
- package/dist/gemini.cjs +57 -67
- package/dist/gemini.cjs.map +1 -1
- package/dist/gemini.d.cts.map +1 -1
- package/dist/gemini.d.ts.map +1 -1
- package/dist/gemini.js +56 -67
- package/dist/gemini.js.map +1 -1
- package/dist/grok-video.cjs +14 -12
- package/dist/grok-video.cjs.map +1 -1
- package/dist/grok-video.d.cts.map +1 -1
- package/dist/grok-video.d.ts.map +1 -1
- package/dist/grok-video.js +8 -6
- package/dist/grok-video.js.map +1 -1
- package/dist/helpers.cjs +11 -68
- package/dist/helpers.cjs.map +1 -1
- package/dist/helpers.d.cts.map +1 -1
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +12 -67
- package/dist/helpers.js.map +1 -1
- package/dist/images.cjs +30 -28
- package/dist/images.cjs.map +1 -1
- package/dist/images.d.cts.map +1 -1
- package/dist/images.d.ts.map +1 -1
- package/dist/images.js +27 -25
- package/dist/images.js.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/journal.cjs +3 -1
- package/dist/journal.cjs.map +1 -1
- package/dist/journal.d.cts.map +1 -1
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +2 -1
- package/dist/journal.js.map +1 -1
- package/dist/llmock.cjs +3 -0
- package/dist/llmock.cjs.map +1 -1
- package/dist/llmock.d.cts.map +1 -1
- package/dist/llmock.d.ts.map +1 -1
- package/dist/llmock.js +3 -0
- package/dist/llmock.js.map +1 -1
- package/dist/mcp-fakes.d.cts.map +1 -1
- package/dist/mcp-handler.cjs +14 -4
- package/dist/mcp-handler.cjs.map +1 -1
- package/dist/mcp-handler.js +14 -4
- package/dist/mcp-handler.js.map +1 -1
- package/dist/mcp-recorder.cjs +2 -1
- package/dist/mcp-recorder.cjs.map +1 -1
- package/dist/mcp-recorder.js +3 -2
- package/dist/mcp-recorder.js.map +1 -1
- package/dist/messages.cjs +111 -96
- package/dist/messages.cjs.map +1 -1
- package/dist/messages.d.cts.map +1 -1
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +109 -95
- package/dist/messages.js.map +1 -1
- package/dist/metrics.cjs +5 -2
- package/dist/metrics.cjs.map +1 -1
- package/dist/metrics.d.cts.map +1 -1
- package/dist/metrics.d.ts.map +1 -1
- package/dist/metrics.js +6 -3
- package/dist/metrics.js.map +1 -1
- package/dist/model-utils.cjs +1 -0
- package/dist/model-utils.cjs.map +1 -1
- package/dist/model-utils.js +1 -1
- package/dist/model-utils.js.map +1 -1
- package/dist/moderation.cjs +15 -12
- package/dist/moderation.cjs.map +1 -1
- package/dist/moderation.js +14 -11
- package/dist/moderation.js.map +1 -1
- package/dist/ollama.cjs +128 -68
- package/dist/ollama.cjs.map +1 -1
- package/dist/ollama.d.cts.map +1 -1
- package/dist/ollama.d.ts.map +1 -1
- package/dist/ollama.js +124 -64
- package/dist/ollama.js.map +1 -1
- package/dist/openapi.cjs +323 -3
- package/dist/openapi.cjs.map +1 -1
- package/dist/openapi.d.cts.map +1 -1
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +324 -4
- package/dist/openapi.js.map +1 -1
- package/dist/openrouter-chat.cjs +11 -155
- package/dist/openrouter-chat.cjs.map +1 -1
- package/dist/openrouter-chat.js +11 -155
- package/dist/openrouter-chat.js.map +1 -1
- package/dist/openrouter-video.cjs +76 -71
- package/dist/openrouter-video.cjs.map +1 -1
- package/dist/openrouter-video.d.cts.map +1 -1
- package/dist/openrouter-video.d.ts.map +1 -1
- package/dist/openrouter-video.js +63 -58
- package/dist/openrouter-video.js.map +1 -1
- package/dist/recorder.cjs +176 -95
- package/dist/recorder.cjs.map +1 -1
- package/dist/recorder.d.cts.map +1 -1
- package/dist/recorder.d.ts.map +1 -1
- package/dist/recorder.js +176 -95
- package/dist/recorder.js.map +1 -1
- package/dist/rerank.cjs +13 -11
- package/dist/rerank.cjs.map +1 -1
- package/dist/rerank.js +12 -10
- package/dist/rerank.js.map +1 -1
- package/dist/response/catalog/anthropic-page.cjs +39 -0
- package/dist/response/catalog/anthropic-page.cjs.map +1 -0
- package/dist/response/catalog/anthropic-page.js +38 -0
- package/dist/response/catalog/anthropic-page.js.map +1 -0
- package/dist/response/catalog/collect.cjs +61 -0
- package/dist/response/catalog/collect.cjs.map +1 -0
- package/dist/response/catalog/collect.js +59 -0
- package/dist/response/catalog/collect.js.map +1 -0
- package/dist/response/catalog/gemini-page.cjs +25 -0
- package/dist/response/catalog/gemini-page.cjs.map +1 -0
- package/dist/response/catalog/gemini-page.js +24 -0
- package/dist/response/catalog/gemini-page.js.map +1 -0
- package/dist/response/catalog/render.cjs +182 -0
- package/dist/response/catalog/render.cjs.map +1 -0
- package/dist/response/catalog/render.js +171 -0
- package/dist/response/catalog/render.js.map +1 -0
- package/dist/response/errors.cjs +225 -0
- package/dist/response/errors.cjs.map +1 -0
- package/dist/response/errors.js +224 -0
- package/dist/response/errors.js.map +1 -0
- package/dist/response/finish.cjs +39 -0
- package/dist/response/finish.cjs.map +1 -0
- package/dist/response/finish.js +35 -0
- package/dist/response/finish.js.map +1 -0
- package/dist/response/policy.cjs +126 -0
- package/dist/response/policy.cjs.map +1 -0
- package/dist/response/policy.js +120 -0
- package/dist/response/policy.js.map +1 -0
- package/dist/response/profiles.cjs +69 -0
- package/dist/response/profiles.cjs.map +1 -0
- package/dist/response/profiles.js +65 -0
- package/dist/response/profiles.js.map +1 -0
- package/dist/response/usage/codecs/anthropic.cjs +52 -0
- package/dist/response/usage/codecs/anthropic.cjs.map +1 -0
- package/dist/response/usage/codecs/anthropic.js +50 -0
- package/dist/response/usage/codecs/anthropic.js.map +1 -0
- package/dist/response/usage/codecs/cohere.cjs +36 -0
- package/dist/response/usage/codecs/cohere.cjs.map +1 -0
- package/dist/response/usage/codecs/cohere.js +35 -0
- package/dist/response/usage/codecs/cohere.js.map +1 -0
- package/dist/response/usage/codecs/converse.cjs +16 -0
- package/dist/response/usage/codecs/converse.cjs.map +1 -0
- package/dist/response/usage/codecs/converse.js +15 -0
- package/dist/response/usage/codecs/converse.js.map +1 -0
- package/dist/response/usage/codecs/gemini.cjs +31 -0
- package/dist/response/usage/codecs/gemini.cjs.map +1 -0
- package/dist/response/usage/codecs/gemini.js +31 -0
- package/dist/response/usage/codecs/gemini.js.map +1 -0
- package/dist/response/usage/codecs/interactions.cjs +22 -0
- package/dist/response/usage/codecs/interactions.cjs.map +1 -0
- package/dist/response/usage/codecs/interactions.js +21 -0
- package/dist/response/usage/codecs/interactions.js.map +1 -0
- package/dist/response/usage/codecs/ollama.cjs +17 -0
- package/dist/response/usage/codecs/ollama.cjs.map +1 -0
- package/dist/response/usage/codecs/ollama.js +17 -0
- package/dist/response/usage/codecs/ollama.js.map +1 -0
- package/dist/response/usage/codecs/openai.cjs +52 -0
- package/dist/response/usage/codecs/openai.cjs.map +1 -0
- package/dist/response/usage/codecs/openai.js +50 -0
- package/dist/response/usage/codecs/openai.js.map +1 -0
- package/dist/response/usage/codecs/openrouter.cjs +68 -0
- package/dist/response/usage/codecs/openrouter.cjs.map +1 -0
- package/dist/response/usage/codecs/openrouter.js +67 -0
- package/dist/response/usage/codecs/openrouter.js.map +1 -0
- package/dist/response/usage/codecs/realtime.cjs +19 -0
- package/dist/response/usage/codecs/realtime.cjs.map +1 -0
- package/dist/response/usage/codecs/realtime.js +18 -0
- package/dist/response/usage/codecs/realtime.js.map +1 -0
- package/dist/response/usage/codecs/responses.cjs +21 -0
- package/dist/response/usage/codecs/responses.cjs.map +1 -0
- package/dist/response/usage/codecs/responses.js +20 -0
- package/dist/response/usage/codecs/responses.js.map +1 -0
- package/dist/response/usage/estimate.cjs +23 -0
- package/dist/response/usage/estimate.cjs.map +1 -0
- package/dist/response/usage/estimate.js +21 -0
- package/dist/response/usage/estimate.js.map +1 -0
- package/dist/response/usage/fields.cjs +72 -0
- package/dist/response/usage/fields.cjs.map +1 -0
- package/dist/response/usage/fields.js +70 -0
- package/dist/response/usage/fields.js.map +1 -0
- package/dist/response/usage/recording.cjs +52 -0
- package/dist/response/usage/recording.cjs.map +1 -0
- package/dist/response/usage/recording.js +52 -0
- package/dist/response/usage/recording.js.map +1 -0
- package/dist/responses.cjs +45 -58
- package/dist/responses.cjs.map +1 -1
- package/dist/responses.d.cts.map +1 -1
- package/dist/responses.d.ts.map +1 -1
- package/dist/responses.js +44 -57
- package/dist/responses.js.map +1 -1
- package/dist/route-registry.cjs +45 -0
- package/dist/route-registry.cjs.map +1 -1
- package/dist/route-registry.d.cts.map +1 -1
- package/dist/route-registry.d.ts.map +1 -1
- package/dist/route-registry.js +41 -1
- package/dist/route-registry.js.map +1 -1
- package/dist/router.cjs +4 -0
- package/dist/router.cjs.map +1 -1
- package/dist/router.d.cts.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +3 -0
- package/dist/router.js.map +1 -1
- package/dist/search.cjs +13 -11
- package/dist/search.cjs.map +1 -1
- package/dist/search.js +12 -10
- package/dist/search.js.map +1 -1
- package/dist/server.cjs +222 -146
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +223 -147
- package/dist/server.js.map +1 -1
- package/dist/speech.cjs +20 -18
- package/dist/speech.cjs.map +1 -1
- package/dist/speech.d.cts.map +1 -1
- package/dist/speech.d.ts.map +1 -1
- package/dist/speech.js +19 -17
- package/dist/speech.js.map +1 -1
- package/dist/sse-writer.cjs +7 -0
- package/dist/sse-writer.cjs.map +1 -1
- package/dist/sse-writer.d.cts.map +1 -1
- package/dist/sse-writer.d.ts.map +1 -1
- package/dist/sse-writer.js +7 -1
- package/dist/sse-writer.js.map +1 -1
- package/dist/stream-collapse.cjs +118 -11
- package/dist/stream-collapse.cjs.map +1 -1
- package/dist/stream-collapse.d.cts +10 -9
- package/dist/stream-collapse.d.cts.map +1 -1
- package/dist/stream-collapse.d.ts +10 -9
- package/dist/stream-collapse.d.ts.map +1 -1
- package/dist/stream-collapse.js +118 -11
- package/dist/stream-collapse.js.map +1 -1
- package/dist/transcription.cjs +12 -10
- package/dist/transcription.cjs.map +1 -1
- package/dist/transcription.d.cts.map +1 -1
- package/dist/transcription.d.ts.map +1 -1
- package/dist/transcription.js +11 -9
- package/dist/transcription.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +62 -3
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +62 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vector-mock.cjs +3 -8
- package/dist/vector-mock.cjs.map +1 -1
- package/dist/vector-mock.d.cts.map +1 -1
- package/dist/vector-mock.d.ts.map +1 -1
- package/dist/vector-mock.js +3 -8
- package/dist/vector-mock.js.map +1 -1
- package/dist/vector-stores.cjs +2 -4
- package/dist/vector-stores.cjs.map +1 -1
- package/dist/vector-stores.d.cts.map +1 -1
- package/dist/vector-stores.d.ts.map +1 -1
- package/dist/vector-stores.js +2 -4
- package/dist/vector-stores.js.map +1 -1
- package/dist/veo-video.cjs +16 -14
- package/dist/veo-video.cjs.map +1 -1
- package/dist/veo-video.js +10 -8
- package/dist/veo-video.js.map +1 -1
- package/dist/video.cjs +21 -19
- package/dist/video.cjs.map +1 -1
- package/dist/video.d.cts.map +1 -1
- package/dist/video.d.ts.map +1 -1
- package/dist/video.js +20 -18
- package/dist/video.js.map +1 -1
- package/dist/ws-gemini-live.cjs +11 -3
- package/dist/ws-gemini-live.cjs.map +1 -1
- package/dist/ws-gemini-live.d.cts +0 -1
- package/dist/ws-gemini-live.d.cts.map +1 -1
- package/dist/ws-gemini-live.d.ts +0 -1
- package/dist/ws-gemini-live.d.ts.map +1 -1
- package/dist/ws-gemini-live.js +10 -2
- package/dist/ws-gemini-live.js.map +1 -1
- package/dist/ws-live.cjs +6 -5
- package/dist/ws-live.cjs.map +1 -1
- package/dist/ws-live.js +5 -4
- package/dist/ws-live.js.map +1 -1
- package/dist/ws-realtime.cjs +28 -54
- package/dist/ws-realtime.cjs.map +1 -1
- package/dist/ws-realtime.d.cts.map +1 -1
- package/dist/ws-realtime.d.ts.map +1 -1
- package/dist/ws-realtime.js +25 -51
- package/dist/ws-realtime.js.map +1 -1
- package/dist/ws-responses.cjs +8 -6
- package/dist/ws-responses.cjs.map +1 -1
- package/dist/ws-responses.js +7 -5
- package/dist/ws-responses.js.map +1 -1
- package/package.json +4 -1
- package/skills/write-fixtures/SKILL.md +25 -16
package/dist/rerank.cjs
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
const require_errors = require('./response/errors.cjs');
|
|
2
|
+
const require_policy = require('./response/policy.cjs');
|
|
1
3
|
const require_helpers = require('./helpers.cjs');
|
|
2
4
|
|
|
3
5
|
//#region src/rerank.ts
|
|
@@ -21,11 +23,11 @@ async function handleRerank(req, res, raw, fixtures, journal, defaults, setCorsH
|
|
|
21
23
|
}
|
|
22
24
|
});
|
|
23
25
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
24
|
-
res.end(
|
|
26
|
+
res.end(require_errors.renderError("openai", "validation", {
|
|
25
27
|
message: `Malformed JSON: ${detail}`,
|
|
26
28
|
type: "invalid_request_error",
|
|
27
29
|
code: "invalid_json"
|
|
28
|
-
}
|
|
30
|
+
}).body);
|
|
29
31
|
return;
|
|
30
32
|
}
|
|
31
33
|
if (!require_helpers.isJsonObject(body)) {
|
|
@@ -41,10 +43,10 @@ async function handleRerank(req, res, raw, fixtures, journal, defaults, setCorsH
|
|
|
41
43
|
}
|
|
42
44
|
});
|
|
43
45
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
44
|
-
res.end(
|
|
46
|
+
res.end(require_errors.renderError("openai", "validation", {
|
|
45
47
|
message: "Request body must be a JSON object",
|
|
46
48
|
type: "invalid_request_error"
|
|
47
|
-
}
|
|
49
|
+
}).body);
|
|
48
50
|
return;
|
|
49
51
|
}
|
|
50
52
|
const normalizedQuery = require_helpers.normalizeTextInput(body.query ?? "");
|
|
@@ -61,10 +63,10 @@ async function handleRerank(req, res, raw, fixtures, journal, defaults, setCorsH
|
|
|
61
63
|
}
|
|
62
64
|
});
|
|
63
65
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
64
|
-
res.end(
|
|
66
|
+
res.end(require_errors.renderError("openai", "validation", {
|
|
65
67
|
message: "Invalid parameter: 'query' must be a string or an array of strings",
|
|
66
68
|
type: "invalid_request_error"
|
|
67
|
-
}
|
|
69
|
+
}).body);
|
|
68
70
|
return;
|
|
69
71
|
}
|
|
70
72
|
const query = normalizedQuery;
|
|
@@ -77,7 +79,7 @@ async function handleRerank(req, res, raw, fixtures, journal, defaults, setCorsH
|
|
|
77
79
|
}
|
|
78
80
|
if (matchedFixture) logger.debug(`Rerank fixture matched for query "${query.slice(0, 80)}"`);
|
|
79
81
|
else logger.debug(`No rerank fixture matched for query "${query.slice(0, 80)}" — returning empty`);
|
|
80
|
-
if (!matchedFixture &&
|
|
82
|
+
if (!matchedFixture && require_policy.resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
|
|
81
83
|
const strictMessage = require_helpers.strictNoMatchMessage(0);
|
|
82
84
|
logger.error(require_helpers.strictNoMatchLogLine(req.method ?? "POST", req.url ?? "/v2/rerank", 0));
|
|
83
85
|
journal.add({
|
|
@@ -89,15 +91,15 @@ async function handleRerank(req, res, raw, fixtures, journal, defaults, setCorsH
|
|
|
89
91
|
response: {
|
|
90
92
|
status: 503,
|
|
91
93
|
fixture: null,
|
|
92
|
-
...
|
|
94
|
+
...require_policy.strictOverrideField(defaults.strict, req.headers)
|
|
93
95
|
}
|
|
94
96
|
});
|
|
95
97
|
res.writeHead(503, { "Content-Type": "application/json" });
|
|
96
|
-
res.end(
|
|
98
|
+
res.end(require_errors.renderError("openai", "strict-miss", {
|
|
97
99
|
message: strictMessage,
|
|
98
100
|
type: "invalid_request_error",
|
|
99
101
|
code: "no_fixture_match"
|
|
100
|
-
}
|
|
102
|
+
}).body);
|
|
101
103
|
return;
|
|
102
104
|
}
|
|
103
105
|
const results = matchedResults.map((r) => ({
|
|
@@ -113,7 +115,7 @@ async function handleRerank(req, res, raw, fixtures, journal, defaults, setCorsH
|
|
|
113
115
|
response: {
|
|
114
116
|
status: 200,
|
|
115
117
|
fixture: null,
|
|
116
|
-
...
|
|
118
|
+
...require_policy.strictOverrideField(defaults.strict, req.headers)
|
|
117
119
|
}
|
|
118
120
|
});
|
|
119
121
|
res.writeHead(200, { "Content-Type": "application/json" });
|
package/dist/rerank.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rerank.cjs","names":["flattenHeaders","isJsonObject","normalizeTextInput","matchesPattern","
|
|
1
|
+
{"version":3,"file":"rerank.cjs","names":["flattenHeaders","renderError","isJsonObject","normalizeTextInput","matchesPattern","resolveRequestDecisions","strictNoMatchMessage","strictNoMatchLogLine","strictOverrideField","generateId"],"sources":["../src/rerank.ts"],"sourcesContent":["/**\n * Reranking API support for LLMock.\n *\n * Handles POST /v2/rerank requests (Cohere rerank-compatible). Matches\n * fixtures by comparing the request `query` field against registered\n * patterns. First match wins; no match returns empty results.\n */\n\nimport type * as http from \"node:http\";\nimport { resolveRequestDecisions, strictOverrideField } from \"./response/policy.js\";\nimport { renderError } from \"./response/errors.js\";\nimport {\n flattenHeaders,\n generateId,\n isJsonObject,\n matchesPattern,\n normalizeTextInput,\n strictNoMatchLogLine,\n strictNoMatchMessage,\n} from \"./helpers.js\";\nimport type { Journal } from \"./journal.js\";\nimport type { Logger } from \"./logger.js\";\n\n// ─── Rerank types ─────────────────────────────────────────────────────────\n\nexport interface RerankResult {\n index: number;\n relevance_score: number;\n}\n\nexport interface RerankFixture {\n match: string | RegExp;\n results: RerankResult[];\n}\n\n// ─── Request handler ──────────────────────────────────────────────────────\n\nexport async function handleRerank(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n raw: string,\n fixtures: RerankFixture[],\n journal: Journal,\n defaults: { logger: Logger; strict?: boolean },\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const { logger } = defaults;\n setCorsHeaders(res);\n\n let body: { query?: unknown; model?: string };\n try {\n body = JSON.parse(raw) as { query?: unknown; model?: string };\n } catch (parseErr) {\n const detail = parseErr instanceof Error ? parseErr.message : \"unknown\";\n journal.add({\n method: req.method ?? \"POST\",\n path: req.url ?? \"/v2/rerank\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"rerank\",\n response: { status: 400, fixture: null },\n });\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n renderError(\"openai\", \"validation\", {\n message: `Malformed JSON: ${detail}`,\n type: \"invalid_request_error\",\n code: \"invalid_json\",\n }).body,\n );\n return;\n }\n\n // Reject bodies that parsed but are not a JSON object (e.g. `null`) before\n // touching fields — otherwise `body.query` throws a TypeError that surfaces\n // as a 500 instead of a 400.\n if (!isJsonObject(body)) {\n journal.add({\n method: req.method ?? \"POST\",\n path: req.url ?? \"/v2/rerank\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"rerank\",\n response: { status: 400, fixture: null },\n });\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n renderError(\"openai\", \"validation\", {\n message: \"Request body must be a JSON object\",\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n const rawQuery: unknown = body.query ?? \"\";\n const normalizedQuery = normalizeTextInput(rawQuery);\n if (normalizedQuery === null) {\n journal.add({\n method: req.method ?? \"POST\",\n path: req.url ?? \"/v2/rerank\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"rerank\",\n response: { status: 400, fixture: null },\n });\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n renderError(\"openai\", \"validation\", {\n message: \"Invalid parameter: 'query' must be a string or an array of strings\",\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n const query = normalizedQuery;\n\n // Find first matching fixture\n let matchedResults: RerankResult[] = [];\n let matchedFixture: RerankFixture | null = null;\n\n for (const fixture of fixtures) {\n if (matchesPattern(query, fixture.match)) {\n matchedFixture = fixture;\n matchedResults = fixture.results;\n break;\n }\n }\n\n if (matchedFixture) {\n logger.debug(`Rerank fixture matched for query \"${query.slice(0, 80)}\"`);\n } else {\n logger.debug(`No rerank fixture matched for query \"${query.slice(0, 80)}\" — returning empty`);\n }\n\n // Strict mode turns the lenient default (empty results) into a no-match\n // error, like every other fixture-matching handler. These fixtures carry no\n // sequence/turn state, so the skipped count is always 0.\n if (!matchedFixture && resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {\n const strictMessage = strictNoMatchMessage(0);\n logger.error(strictNoMatchLogLine(req.method ?? \"POST\", req.url ?? \"/v2/rerank\", 0));\n journal.add({\n method: req.method ?? \"POST\",\n path: req.url ?? \"/v2/rerank\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"rerank\",\n response: {\n status: 503,\n fixture: null,\n ...strictOverrideField(defaults.strict, req.headers),\n },\n });\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(\n renderError(\"openai\", \"strict-miss\", {\n message: strictMessage,\n type: \"invalid_request_error\",\n code: \"no_fixture_match\",\n }).body,\n );\n return;\n }\n\n // Build response (Cohere rerank v2 format: index + relevance_score only)\n const results = matchedResults.map((r) => ({\n index: r.index,\n relevance_score: r.relevance_score,\n }));\n\n journal.add({\n method: req.method ?? \"POST\",\n path: req.url ?? \"/v2/rerank\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"rerank\",\n response: {\n status: 200,\n fixture: null,\n ...strictOverrideField(defaults.strict, req.headers),\n },\n });\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n id: generateId(\"rerank\"),\n results,\n meta: {\n billed_units: { search_units: 0 },\n },\n }),\n );\n}\n"],"mappings":"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"}
|
package/dist/rerank.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { renderError } from "./response/errors.js";
|
|
2
|
+
import { resolveRequestDecisions, strictOverrideField } from "./response/policy.js";
|
|
3
|
+
import { flattenHeaders, generateId, isJsonObject, matchesPattern, normalizeTextInput, strictNoMatchLogLine, strictNoMatchMessage } from "./helpers.js";
|
|
2
4
|
|
|
3
5
|
//#region src/rerank.ts
|
|
4
6
|
async function handleRerank(req, res, raw, fixtures, journal, defaults, setCorsHeaders) {
|
|
@@ -21,11 +23,11 @@ async function handleRerank(req, res, raw, fixtures, journal, defaults, setCorsH
|
|
|
21
23
|
}
|
|
22
24
|
});
|
|
23
25
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
24
|
-
res.end(
|
|
26
|
+
res.end(renderError("openai", "validation", {
|
|
25
27
|
message: `Malformed JSON: ${detail}`,
|
|
26
28
|
type: "invalid_request_error",
|
|
27
29
|
code: "invalid_json"
|
|
28
|
-
}
|
|
30
|
+
}).body);
|
|
29
31
|
return;
|
|
30
32
|
}
|
|
31
33
|
if (!isJsonObject(body)) {
|
|
@@ -41,10 +43,10 @@ async function handleRerank(req, res, raw, fixtures, journal, defaults, setCorsH
|
|
|
41
43
|
}
|
|
42
44
|
});
|
|
43
45
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
44
|
-
res.end(
|
|
46
|
+
res.end(renderError("openai", "validation", {
|
|
45
47
|
message: "Request body must be a JSON object",
|
|
46
48
|
type: "invalid_request_error"
|
|
47
|
-
}
|
|
49
|
+
}).body);
|
|
48
50
|
return;
|
|
49
51
|
}
|
|
50
52
|
const normalizedQuery = normalizeTextInput(body.query ?? "");
|
|
@@ -61,10 +63,10 @@ async function handleRerank(req, res, raw, fixtures, journal, defaults, setCorsH
|
|
|
61
63
|
}
|
|
62
64
|
});
|
|
63
65
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
64
|
-
res.end(
|
|
66
|
+
res.end(renderError("openai", "validation", {
|
|
65
67
|
message: "Invalid parameter: 'query' must be a string or an array of strings",
|
|
66
68
|
type: "invalid_request_error"
|
|
67
|
-
}
|
|
69
|
+
}).body);
|
|
68
70
|
return;
|
|
69
71
|
}
|
|
70
72
|
const query = normalizedQuery;
|
|
@@ -77,7 +79,7 @@ async function handleRerank(req, res, raw, fixtures, journal, defaults, setCorsH
|
|
|
77
79
|
}
|
|
78
80
|
if (matchedFixture) logger.debug(`Rerank fixture matched for query "${query.slice(0, 80)}"`);
|
|
79
81
|
else logger.debug(`No rerank fixture matched for query "${query.slice(0, 80)}" — returning empty`);
|
|
80
|
-
if (!matchedFixture &&
|
|
82
|
+
if (!matchedFixture && resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
|
|
81
83
|
const strictMessage = strictNoMatchMessage(0);
|
|
82
84
|
logger.error(strictNoMatchLogLine(req.method ?? "POST", req.url ?? "/v2/rerank", 0));
|
|
83
85
|
journal.add({
|
|
@@ -93,11 +95,11 @@ async function handleRerank(req, res, raw, fixtures, journal, defaults, setCorsH
|
|
|
93
95
|
}
|
|
94
96
|
});
|
|
95
97
|
res.writeHead(503, { "Content-Type": "application/json" });
|
|
96
|
-
res.end(
|
|
98
|
+
res.end(renderError("openai", "strict-miss", {
|
|
97
99
|
message: strictMessage,
|
|
98
100
|
type: "invalid_request_error",
|
|
99
101
|
code: "no_fixture_match"
|
|
100
|
-
}
|
|
102
|
+
}).body);
|
|
101
103
|
return;
|
|
102
104
|
}
|
|
103
105
|
const results = matchedResults.map((r) => ({
|
package/dist/rerank.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rerank.js","names":[],"sources":["../src/rerank.ts"],"sourcesContent":["/**\n * Reranking API support for LLMock.\n *\n * Handles POST /v2/rerank requests (Cohere rerank-compatible). Matches\n * fixtures by comparing the request `query` field against registered\n * patterns. First match wins; no match returns empty results.\n */\n\nimport type * as http from \"node:http\";\nimport {\n flattenHeaders,\n generateId,\n isJsonObject,\n matchesPattern,\n normalizeTextInput,\n
|
|
1
|
+
{"version":3,"file":"rerank.js","names":[],"sources":["../src/rerank.ts"],"sourcesContent":["/**\n * Reranking API support for LLMock.\n *\n * Handles POST /v2/rerank requests (Cohere rerank-compatible). Matches\n * fixtures by comparing the request `query` field against registered\n * patterns. First match wins; no match returns empty results.\n */\n\nimport type * as http from \"node:http\";\nimport { resolveRequestDecisions, strictOverrideField } from \"./response/policy.js\";\nimport { renderError } from \"./response/errors.js\";\nimport {\n flattenHeaders,\n generateId,\n isJsonObject,\n matchesPattern,\n normalizeTextInput,\n strictNoMatchLogLine,\n strictNoMatchMessage,\n} from \"./helpers.js\";\nimport type { Journal } from \"./journal.js\";\nimport type { Logger } from \"./logger.js\";\n\n// ─── Rerank types ─────────────────────────────────────────────────────────\n\nexport interface RerankResult {\n index: number;\n relevance_score: number;\n}\n\nexport interface RerankFixture {\n match: string | RegExp;\n results: RerankResult[];\n}\n\n// ─── Request handler ──────────────────────────────────────────────────────\n\nexport async function handleRerank(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n raw: string,\n fixtures: RerankFixture[],\n journal: Journal,\n defaults: { logger: Logger; strict?: boolean },\n setCorsHeaders: (res: http.ServerResponse) => void,\n): Promise<void> {\n const { logger } = defaults;\n setCorsHeaders(res);\n\n let body: { query?: unknown; model?: string };\n try {\n body = JSON.parse(raw) as { query?: unknown; model?: string };\n } catch (parseErr) {\n const detail = parseErr instanceof Error ? parseErr.message : \"unknown\";\n journal.add({\n method: req.method ?? \"POST\",\n path: req.url ?? \"/v2/rerank\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"rerank\",\n response: { status: 400, fixture: null },\n });\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n renderError(\"openai\", \"validation\", {\n message: `Malformed JSON: ${detail}`,\n type: \"invalid_request_error\",\n code: \"invalid_json\",\n }).body,\n );\n return;\n }\n\n // Reject bodies that parsed but are not a JSON object (e.g. `null`) before\n // touching fields — otherwise `body.query` throws a TypeError that surfaces\n // as a 500 instead of a 400.\n if (!isJsonObject(body)) {\n journal.add({\n method: req.method ?? \"POST\",\n path: req.url ?? \"/v2/rerank\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"rerank\",\n response: { status: 400, fixture: null },\n });\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n renderError(\"openai\", \"validation\", {\n message: \"Request body must be a JSON object\",\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n\n const rawQuery: unknown = body.query ?? \"\";\n const normalizedQuery = normalizeTextInput(rawQuery);\n if (normalizedQuery === null) {\n journal.add({\n method: req.method ?? \"POST\",\n path: req.url ?? \"/v2/rerank\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"rerank\",\n response: { status: 400, fixture: null },\n });\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n renderError(\"openai\", \"validation\", {\n message: \"Invalid parameter: 'query' must be a string or an array of strings\",\n type: \"invalid_request_error\",\n }).body,\n );\n return;\n }\n const query = normalizedQuery;\n\n // Find first matching fixture\n let matchedResults: RerankResult[] = [];\n let matchedFixture: RerankFixture | null = null;\n\n for (const fixture of fixtures) {\n if (matchesPattern(query, fixture.match)) {\n matchedFixture = fixture;\n matchedResults = fixture.results;\n break;\n }\n }\n\n if (matchedFixture) {\n logger.debug(`Rerank fixture matched for query \"${query.slice(0, 80)}\"`);\n } else {\n logger.debug(`No rerank fixture matched for query \"${query.slice(0, 80)}\" — returning empty`);\n }\n\n // Strict mode turns the lenient default (empty results) into a no-match\n // error, like every other fixture-matching handler. These fixtures carry no\n // sequence/turn state, so the skipped count is always 0.\n if (!matchedFixture && resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {\n const strictMessage = strictNoMatchMessage(0);\n logger.error(strictNoMatchLogLine(req.method ?? \"POST\", req.url ?? \"/v2/rerank\", 0));\n journal.add({\n method: req.method ?? \"POST\",\n path: req.url ?? \"/v2/rerank\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"rerank\",\n response: {\n status: 503,\n fixture: null,\n ...strictOverrideField(defaults.strict, req.headers),\n },\n });\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(\n renderError(\"openai\", \"strict-miss\", {\n message: strictMessage,\n type: \"invalid_request_error\",\n code: \"no_fixture_match\",\n }).body,\n );\n return;\n }\n\n // Build response (Cohere rerank v2 format: index + relevance_score only)\n const results = matchedResults.map((r) => ({\n index: r.index,\n relevance_score: r.relevance_score,\n }));\n\n journal.add({\n method: req.method ?? \"POST\",\n path: req.url ?? \"/v2/rerank\",\n headers: flattenHeaders(req.headers),\n body: null,\n service: \"rerank\",\n response: {\n status: 200,\n fixture: null,\n ...strictOverrideField(defaults.strict, req.headers),\n },\n });\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n id: generateId(\"rerank\"),\n results,\n meta: {\n billed_units: { search_units: 0 },\n },\n }),\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/response/catalog/anthropic-page.ts
|
|
3
|
+
/** Cursor paging and lifecycle filtering for the native Anthropic catalog. */
|
|
4
|
+
function anthropicPage(ids, query) {
|
|
5
|
+
const rawLimit = query.get("limit");
|
|
6
|
+
const limit = rawLimit === null ? 20 : Number(rawLimit);
|
|
7
|
+
if (rawLimit !== null && (!/^\d+$/.test(rawLimit) || !Number.isInteger(limit) || limit < 1 || limit > 1e3)) return { error: "limit must be an integer between 1 and 1000" };
|
|
8
|
+
const lifecycle = [...new Set([...query.getAll("lifecycle"), ...query.getAll("lifecycle[]")])];
|
|
9
|
+
if (lifecycle.length > 3 || lifecycle.some((value) => ![
|
|
10
|
+
"active",
|
|
11
|
+
"deprecated",
|
|
12
|
+
"retired"
|
|
13
|
+
].includes(value))) return { error: "lifecycle must contain active, deprecated, or retired" };
|
|
14
|
+
const empty = () => ({
|
|
15
|
+
ids: [],
|
|
16
|
+
hasMore: false,
|
|
17
|
+
firstId: null,
|
|
18
|
+
lastId: null
|
|
19
|
+
});
|
|
20
|
+
const after = query.get("after_id");
|
|
21
|
+
const before = query.get("before_id");
|
|
22
|
+
const afterIndex = after === null ? -1 : ids.indexOf(after);
|
|
23
|
+
const beforeIndex = before === null ? ids.length : ids.indexOf(before);
|
|
24
|
+
if (after !== null && afterIndex === -1) return { error: `Model with id ${after} not found` };
|
|
25
|
+
if (before !== null && beforeIndex === -1) return { error: `Model with id ${before} not found` };
|
|
26
|
+
if (lifecycle.length > 0 && !lifecycle.includes("active")) return { page: empty() };
|
|
27
|
+
const available = ids.slice(afterIndex + 1, beforeIndex);
|
|
28
|
+
const selected = before !== null ? available.slice(-limit) : available.slice(0, limit);
|
|
29
|
+
return { page: {
|
|
30
|
+
ids: selected,
|
|
31
|
+
hasMore: available.length > selected.length,
|
|
32
|
+
firstId: selected[0] ?? null,
|
|
33
|
+
lastId: selected.at(-1) ?? null
|
|
34
|
+
} };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
//#endregion
|
|
38
|
+
exports.anthropicPage = anthropicPage;
|
|
39
|
+
//# sourceMappingURL=anthropic-page.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-page.cjs","names":[],"sources":["../../../src/response/catalog/anthropic-page.ts"],"sourcesContent":["export interface AnthropicCatalogPage {\n ids: string[];\n hasMore: boolean;\n firstId: string | null;\n lastId: string | null;\n}\n\n/** Cursor paging and lifecycle filtering for the native Anthropic catalog. */\nexport function anthropicPage(\n ids: readonly string[],\n query: URLSearchParams,\n): { page: AnthropicCatalogPage; error?: never } | { error: string; page?: never } {\n const rawLimit = query.get(\"limit\");\n const limit = rawLimit === null ? 20 : Number(rawLimit);\n if (\n rawLimit !== null &&\n (!/^\\d+$/.test(rawLimit) || !Number.isInteger(limit) || limit < 1 || limit > 1000)\n )\n return { error: \"limit must be an integer between 1 and 1000\" };\n const lifecycle = [...new Set([...query.getAll(\"lifecycle\"), ...query.getAll(\"lifecycle[]\")])];\n if (\n lifecycle.length > 3 ||\n lifecycle.some((value) => ![\"active\", \"deprecated\", \"retired\"].includes(value))\n )\n return { error: \"lifecycle must contain active, deprecated, or retired\" };\n const empty = (): AnthropicCatalogPage => ({\n ids: [],\n hasMore: false,\n firstId: null,\n lastId: null,\n });\n const after = query.get(\"after_id\");\n const before = query.get(\"before_id\");\n const afterIndex = after === null ? -1 : ids.indexOf(after);\n const beforeIndex = before === null ? ids.length : ids.indexOf(before);\n if (after !== null && afterIndex === -1) return { error: `Model with id ${after} not found` };\n if (before !== null && beforeIndex === -1) return { error: `Model with id ${before} not found` };\n if (lifecycle.length > 0 && !lifecycle.includes(\"active\")) return { page: empty() };\n const available = ids.slice(afterIndex + 1, beforeIndex);\n // The SDK continues backward whenever before_id is present, retaining after_id.\n const selected = before !== null ? available.slice(-limit) : available.slice(0, limit);\n return {\n page: {\n ids: selected,\n hasMore: available.length > selected.length,\n firstId: selected[0] ?? null,\n lastId: selected.at(-1) ?? null,\n },\n };\n}\n"],"mappings":";;;AAQA,SAAgB,cACd,KACA,OACiF;CACjF,MAAM,WAAW,MAAM,IAAI,QAAQ;CACnC,MAAM,QAAQ,aAAa,OAAO,KAAK,OAAO,SAAS;AACvD,KACE,aAAa,SACZ,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,UAAU,MAAM,IAAI,QAAQ,KAAK,QAAQ,KAE7E,QAAO,EAAE,OAAO,+CAA+C;CACjE,MAAM,YAAY,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,MAAM,OAAO,YAAY,EAAE,GAAG,MAAM,OAAO,cAAc,CAAC,CAAC,CAAC;AAC9F,KACE,UAAU,SAAS,KACnB,UAAU,MAAM,UAAU,CAAC;EAAC;EAAU;EAAc;EAAU,CAAC,SAAS,MAAM,CAAC,CAE/E,QAAO,EAAE,OAAO,yDAAyD;CAC3E,MAAM,eAAqC;EACzC,KAAK,EAAE;EACP,SAAS;EACT,SAAS;EACT,QAAQ;EACT;CACD,MAAM,QAAQ,MAAM,IAAI,WAAW;CACnC,MAAM,SAAS,MAAM,IAAI,YAAY;CACrC,MAAM,aAAa,UAAU,OAAO,KAAK,IAAI,QAAQ,MAAM;CAC3D,MAAM,cAAc,WAAW,OAAO,IAAI,SAAS,IAAI,QAAQ,OAAO;AACtE,KAAI,UAAU,QAAQ,eAAe,GAAI,QAAO,EAAE,OAAO,iBAAiB,MAAM,aAAa;AAC7F,KAAI,WAAW,QAAQ,gBAAgB,GAAI,QAAO,EAAE,OAAO,iBAAiB,OAAO,aAAa;AAChG,KAAI,UAAU,SAAS,KAAK,CAAC,UAAU,SAAS,SAAS,CAAE,QAAO,EAAE,MAAM,OAAO,EAAE;CACnF,MAAM,YAAY,IAAI,MAAM,aAAa,GAAG,YAAY;CAExD,MAAM,WAAW,WAAW,OAAO,UAAU,MAAM,CAAC,MAAM,GAAG,UAAU,MAAM,GAAG,MAAM;AACtF,QAAO,EACL,MAAM;EACJ,KAAK;EACL,SAAS,UAAU,SAAS,SAAS;EACrC,SAAS,SAAS,MAAM;EACxB,QAAQ,SAAS,GAAG,GAAG,IAAI;EAC5B,EACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//#region src/response/catalog/anthropic-page.ts
|
|
2
|
+
/** Cursor paging and lifecycle filtering for the native Anthropic catalog. */
|
|
3
|
+
function anthropicPage(ids, query) {
|
|
4
|
+
const rawLimit = query.get("limit");
|
|
5
|
+
const limit = rawLimit === null ? 20 : Number(rawLimit);
|
|
6
|
+
if (rawLimit !== null && (!/^\d+$/.test(rawLimit) || !Number.isInteger(limit) || limit < 1 || limit > 1e3)) return { error: "limit must be an integer between 1 and 1000" };
|
|
7
|
+
const lifecycle = [...new Set([...query.getAll("lifecycle"), ...query.getAll("lifecycle[]")])];
|
|
8
|
+
if (lifecycle.length > 3 || lifecycle.some((value) => ![
|
|
9
|
+
"active",
|
|
10
|
+
"deprecated",
|
|
11
|
+
"retired"
|
|
12
|
+
].includes(value))) return { error: "lifecycle must contain active, deprecated, or retired" };
|
|
13
|
+
const empty = () => ({
|
|
14
|
+
ids: [],
|
|
15
|
+
hasMore: false,
|
|
16
|
+
firstId: null,
|
|
17
|
+
lastId: null
|
|
18
|
+
});
|
|
19
|
+
const after = query.get("after_id");
|
|
20
|
+
const before = query.get("before_id");
|
|
21
|
+
const afterIndex = after === null ? -1 : ids.indexOf(after);
|
|
22
|
+
const beforeIndex = before === null ? ids.length : ids.indexOf(before);
|
|
23
|
+
if (after !== null && afterIndex === -1) return { error: `Model with id ${after} not found` };
|
|
24
|
+
if (before !== null && beforeIndex === -1) return { error: `Model with id ${before} not found` };
|
|
25
|
+
if (lifecycle.length > 0 && !lifecycle.includes("active")) return { page: empty() };
|
|
26
|
+
const available = ids.slice(afterIndex + 1, beforeIndex);
|
|
27
|
+
const selected = before !== null ? available.slice(-limit) : available.slice(0, limit);
|
|
28
|
+
return { page: {
|
|
29
|
+
ids: selected,
|
|
30
|
+
hasMore: available.length > selected.length,
|
|
31
|
+
firstId: selected[0] ?? null,
|
|
32
|
+
lastId: selected.at(-1) ?? null
|
|
33
|
+
} };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
export { anthropicPage };
|
|
38
|
+
//# sourceMappingURL=anthropic-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-page.js","names":[],"sources":["../../../src/response/catalog/anthropic-page.ts"],"sourcesContent":["export interface AnthropicCatalogPage {\n ids: string[];\n hasMore: boolean;\n firstId: string | null;\n lastId: string | null;\n}\n\n/** Cursor paging and lifecycle filtering for the native Anthropic catalog. */\nexport function anthropicPage(\n ids: readonly string[],\n query: URLSearchParams,\n): { page: AnthropicCatalogPage; error?: never } | { error: string; page?: never } {\n const rawLimit = query.get(\"limit\");\n const limit = rawLimit === null ? 20 : Number(rawLimit);\n if (\n rawLimit !== null &&\n (!/^\\d+$/.test(rawLimit) || !Number.isInteger(limit) || limit < 1 || limit > 1000)\n )\n return { error: \"limit must be an integer between 1 and 1000\" };\n const lifecycle = [...new Set([...query.getAll(\"lifecycle\"), ...query.getAll(\"lifecycle[]\")])];\n if (\n lifecycle.length > 3 ||\n lifecycle.some((value) => ![\"active\", \"deprecated\", \"retired\"].includes(value))\n )\n return { error: \"lifecycle must contain active, deprecated, or retired\" };\n const empty = (): AnthropicCatalogPage => ({\n ids: [],\n hasMore: false,\n firstId: null,\n lastId: null,\n });\n const after = query.get(\"after_id\");\n const before = query.get(\"before_id\");\n const afterIndex = after === null ? -1 : ids.indexOf(after);\n const beforeIndex = before === null ? ids.length : ids.indexOf(before);\n if (after !== null && afterIndex === -1) return { error: `Model with id ${after} not found` };\n if (before !== null && beforeIndex === -1) return { error: `Model with id ${before} not found` };\n if (lifecycle.length > 0 && !lifecycle.includes(\"active\")) return { page: empty() };\n const available = ids.slice(afterIndex + 1, beforeIndex);\n // The SDK continues backward whenever before_id is present, retaining after_id.\n const selected = before !== null ? available.slice(-limit) : available.slice(0, limit);\n return {\n page: {\n ids: selected,\n hasMore: available.length > selected.length,\n firstId: selected[0] ?? null,\n lastId: selected.at(-1) ?? null,\n },\n };\n}\n"],"mappings":";;AAQA,SAAgB,cACd,KACA,OACiF;CACjF,MAAM,WAAW,MAAM,IAAI,QAAQ;CACnC,MAAM,QAAQ,aAAa,OAAO,KAAK,OAAO,SAAS;AACvD,KACE,aAAa,SACZ,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,UAAU,MAAM,IAAI,QAAQ,KAAK,QAAQ,KAE7E,QAAO,EAAE,OAAO,+CAA+C;CACjE,MAAM,YAAY,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,MAAM,OAAO,YAAY,EAAE,GAAG,MAAM,OAAO,cAAc,CAAC,CAAC,CAAC;AAC9F,KACE,UAAU,SAAS,KACnB,UAAU,MAAM,UAAU,CAAC;EAAC;EAAU;EAAc;EAAU,CAAC,SAAS,MAAM,CAAC,CAE/E,QAAO,EAAE,OAAO,yDAAyD;CAC3E,MAAM,eAAqC;EACzC,KAAK,EAAE;EACP,SAAS;EACT,SAAS;EACT,QAAQ;EACT;CACD,MAAM,QAAQ,MAAM,IAAI,WAAW;CACnC,MAAM,SAAS,MAAM,IAAI,YAAY;CACrC,MAAM,aAAa,UAAU,OAAO,KAAK,IAAI,QAAQ,MAAM;CAC3D,MAAM,cAAc,WAAW,OAAO,IAAI,SAAS,IAAI,QAAQ,OAAO;AACtE,KAAI,UAAU,QAAQ,eAAe,GAAI,QAAO,EAAE,OAAO,iBAAiB,MAAM,aAAa;AAC7F,KAAI,WAAW,QAAQ,gBAAgB,GAAI,QAAO,EAAE,OAAO,iBAAiB,OAAO,aAAa;AAChG,KAAI,UAAU,SAAS,KAAK,CAAC,UAAU,SAAS,SAAS,CAAE,QAAO,EAAE,MAAM,OAAO,EAAE;CACnF,MAAM,YAAY,IAAI,MAAM,aAAa,GAAG,YAAY;CAExD,MAAM,WAAW,WAAW,OAAO,UAAU,MAAM,CAAC,MAAM,GAAG,UAAU,MAAM,GAAG,MAAM;AACtF,QAAO,EACL,MAAM;EACJ,KAAK;EACL,SAAS,UAAU,SAAS,SAAS;EACrC,SAAS,SAAS,MAAM;EACxB,QAAQ,SAAS,GAAG,GAAG,IAAI;EAC5B,EACF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const require_model_utils = require('../../model-utils.cjs');
|
|
2
|
+
|
|
3
|
+
//#region src/response/catalog/collect.ts
|
|
4
|
+
const MODEL_PREFIXES = [
|
|
5
|
+
{
|
|
6
|
+
provider: "anthropic",
|
|
7
|
+
pattern: /^claude-/
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
provider: "google",
|
|
11
|
+
pattern: /^gemini-/
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
provider: "openai",
|
|
15
|
+
pattern: /^(?:gpt-|chatgpt-|o[134](?:$|-)|text-embedding-|dall-e-|whisper-|tts-)/
|
|
16
|
+
}
|
|
17
|
+
];
|
|
18
|
+
/** Explicit provider segments win; unknown families remain visible everywhere. */
|
|
19
|
+
function providerOf(id) {
|
|
20
|
+
const normalized = id.toLowerCase();
|
|
21
|
+
const provider = normalized.split("/", 1)[0];
|
|
22
|
+
if (normalized.includes("/") && (provider === "anthropic" || provider === "openai" || provider === "google")) return provider;
|
|
23
|
+
const family = require_model_utils.stripProviderPrefix(normalized);
|
|
24
|
+
return MODEL_PREFIXES.find(({ pattern }) => pattern.test(family))?.provider;
|
|
25
|
+
}
|
|
26
|
+
function idsFor(ids, provider) {
|
|
27
|
+
return ids.filter((id) => {
|
|
28
|
+
const actual = providerOf(id);
|
|
29
|
+
return actual === void 0 || actual === provider;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** Models that the existing OpenRouter video surface cannot serve. */
|
|
33
|
+
const OPENROUTER_VIDEO_SUNSET_MODELS = new Set(["openai/sora-2"]);
|
|
34
|
+
/** Ordered fixture IDs; callers own warnings and transport decisions. */
|
|
35
|
+
function collect(fixtures, selection) {
|
|
36
|
+
const ids = [];
|
|
37
|
+
const seen = /* @__PURE__ */ new Set();
|
|
38
|
+
let sawVideoFixture = false;
|
|
39
|
+
for (const fixture of fixtures) {
|
|
40
|
+
const { endpoint, model } = fixture.match;
|
|
41
|
+
if (selection === "chat" && endpoint !== void 0 && endpoint !== "chat") continue;
|
|
42
|
+
if (selection === "video-active") {
|
|
43
|
+
if (endpoint !== "video") continue;
|
|
44
|
+
sawVideoFixture = true;
|
|
45
|
+
if (typeof model === "string" && OPENROUTER_VIDEO_SUNSET_MODELS.has(model)) continue;
|
|
46
|
+
}
|
|
47
|
+
if (typeof model !== "string" || model.length === 0 || seen.has(model)) continue;
|
|
48
|
+
seen.add(model);
|
|
49
|
+
ids.push(model);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
ids,
|
|
53
|
+
diagnostics: { sawVideoFixture }
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
//#endregion
|
|
58
|
+
exports.OPENROUTER_VIDEO_SUNSET_MODELS = OPENROUTER_VIDEO_SUNSET_MODELS;
|
|
59
|
+
exports.collect = collect;
|
|
60
|
+
exports.idsFor = idsFor;
|
|
61
|
+
//# sourceMappingURL=collect.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.cjs","names":["stripProviderPrefix"],"sources":["../../../src/response/catalog/collect.ts"],"sourcesContent":["import type { Fixture } from \"../../types.js\";\nimport { stripProviderPrefix } from \"../../model-utils.js\";\n\nexport type ModelProvider = \"anthropic\" | \"openai\" | \"google\";\n\nconst MODEL_PREFIXES: readonly { provider: ModelProvider; pattern: RegExp }[] = [\n { provider: \"anthropic\", pattern: /^claude-/ },\n { provider: \"google\", pattern: /^gemini-/ },\n {\n provider: \"openai\",\n pattern: /^(?:gpt-|chatgpt-|o[134](?:$|-)|text-embedding-|dall-e-|whisper-|tts-)/,\n },\n];\n\n/** Explicit provider segments win; unknown families remain visible everywhere. */\nexport function providerOf(id: string): ModelProvider | undefined {\n const normalized = id.toLowerCase();\n const provider = normalized.split(\"/\", 1)[0];\n if (\n normalized.includes(\"/\") &&\n (provider === \"anthropic\" || provider === \"openai\" || provider === \"google\")\n )\n return provider;\n const family = stripProviderPrefix(normalized);\n return MODEL_PREFIXES.find(({ pattern }) => pattern.test(family))?.provider;\n}\n\nexport function idsFor(ids: readonly string[], provider: \"anthropic\" | \"google\"): string[] {\n return ids.filter((id) => {\n const actual = providerOf(id);\n return actual === undefined || actual === provider;\n });\n}\n\nexport type CatalogSelection = \"all\" | \"chat\" | \"video-active\";\n\n/** Models that the existing OpenRouter video surface cannot serve. */\nexport const OPENROUTER_VIDEO_SUNSET_MODELS: ReadonlySet<string> = new Set([\"openai/sora-2\"]);\n\n/** Ordered fixture IDs; callers own warnings and transport decisions. */\nexport function collect(fixtures: readonly Fixture[], selection: CatalogSelection) {\n const ids: string[] = [];\n const seen = new Set<string>();\n let sawVideoFixture = false;\n for (const fixture of fixtures) {\n const { endpoint, model } = fixture.match;\n if (selection === \"chat\" && endpoint !== undefined && endpoint !== \"chat\") continue;\n if (selection === \"video-active\") {\n if (endpoint !== \"video\") continue;\n sawVideoFixture = true;\n if (typeof model === \"string\" && OPENROUTER_VIDEO_SUNSET_MODELS.has(model)) continue;\n }\n if (typeof model !== \"string\" || model.length === 0 || seen.has(model)) continue;\n seen.add(model);\n ids.push(model);\n }\n return { ids, diagnostics: { sawVideoFixture } };\n}\n"],"mappings":";;;AAKA,MAAM,iBAA0E;CAC9E;EAAE,UAAU;EAAa,SAAS;EAAY;CAC9C;EAAE,UAAU;EAAU,SAAS;EAAY;CAC3C;EACE,UAAU;EACV,SAAS;EACV;CACF;;AAGD,SAAgB,WAAW,IAAuC;CAChE,MAAM,aAAa,GAAG,aAAa;CACnC,MAAM,WAAW,WAAW,MAAM,KAAK,EAAE,CAAC;AAC1C,KACE,WAAW,SAAS,IAAI,KACvB,aAAa,eAAe,aAAa,YAAY,aAAa,UAEnE,QAAO;CACT,MAAM,SAASA,wCAAoB,WAAW;AAC9C,QAAO,eAAe,MAAM,EAAE,cAAc,QAAQ,KAAK,OAAO,CAAC,EAAE;;AAGrE,SAAgB,OAAO,KAAwB,UAA4C;AACzF,QAAO,IAAI,QAAQ,OAAO;EACxB,MAAM,SAAS,WAAW,GAAG;AAC7B,SAAO,WAAW,UAAa,WAAW;GAC1C;;;AAMJ,MAAa,iCAAsD,IAAI,IAAI,CAAC,gBAAgB,CAAC;;AAG7F,SAAgB,QAAQ,UAA8B,WAA6B;CACjF,MAAM,MAAgB,EAAE;CACxB,MAAM,uBAAO,IAAI,KAAa;CAC9B,IAAI,kBAAkB;AACtB,MAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,EAAE,UAAU,UAAU,QAAQ;AACpC,MAAI,cAAc,UAAU,aAAa,UAAa,aAAa,OAAQ;AAC3E,MAAI,cAAc,gBAAgB;AAChC,OAAI,aAAa,QAAS;AAC1B,qBAAkB;AAClB,OAAI,OAAO,UAAU,YAAY,+BAA+B,IAAI,MAAM,CAAE;;AAE9E,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,KAAK,KAAK,IAAI,MAAM,CAAE;AACxE,OAAK,IAAI,MAAM;AACf,MAAI,KAAK,MAAM;;AAEjB,QAAO;EAAE;EAAK,aAAa,EAAE,iBAAiB;EAAE"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { stripProviderPrefix } from "../../model-utils.js";
|
|
2
|
+
|
|
3
|
+
//#region src/response/catalog/collect.ts
|
|
4
|
+
const MODEL_PREFIXES = [
|
|
5
|
+
{
|
|
6
|
+
provider: "anthropic",
|
|
7
|
+
pattern: /^claude-/
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
provider: "google",
|
|
11
|
+
pattern: /^gemini-/
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
provider: "openai",
|
|
15
|
+
pattern: /^(?:gpt-|chatgpt-|o[134](?:$|-)|text-embedding-|dall-e-|whisper-|tts-)/
|
|
16
|
+
}
|
|
17
|
+
];
|
|
18
|
+
/** Explicit provider segments win; unknown families remain visible everywhere. */
|
|
19
|
+
function providerOf(id) {
|
|
20
|
+
const normalized = id.toLowerCase();
|
|
21
|
+
const provider = normalized.split("/", 1)[0];
|
|
22
|
+
if (normalized.includes("/") && (provider === "anthropic" || provider === "openai" || provider === "google")) return provider;
|
|
23
|
+
const family = stripProviderPrefix(normalized);
|
|
24
|
+
return MODEL_PREFIXES.find(({ pattern }) => pattern.test(family))?.provider;
|
|
25
|
+
}
|
|
26
|
+
function idsFor(ids, provider) {
|
|
27
|
+
return ids.filter((id) => {
|
|
28
|
+
const actual = providerOf(id);
|
|
29
|
+
return actual === void 0 || actual === provider;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** Models that the existing OpenRouter video surface cannot serve. */
|
|
33
|
+
const OPENROUTER_VIDEO_SUNSET_MODELS = new Set(["openai/sora-2"]);
|
|
34
|
+
/** Ordered fixture IDs; callers own warnings and transport decisions. */
|
|
35
|
+
function collect(fixtures, selection) {
|
|
36
|
+
const ids = [];
|
|
37
|
+
const seen = /* @__PURE__ */ new Set();
|
|
38
|
+
let sawVideoFixture = false;
|
|
39
|
+
for (const fixture of fixtures) {
|
|
40
|
+
const { endpoint, model } = fixture.match;
|
|
41
|
+
if (selection === "chat" && endpoint !== void 0 && endpoint !== "chat") continue;
|
|
42
|
+
if (selection === "video-active") {
|
|
43
|
+
if (endpoint !== "video") continue;
|
|
44
|
+
sawVideoFixture = true;
|
|
45
|
+
if (typeof model === "string" && OPENROUTER_VIDEO_SUNSET_MODELS.has(model)) continue;
|
|
46
|
+
}
|
|
47
|
+
if (typeof model !== "string" || model.length === 0 || seen.has(model)) continue;
|
|
48
|
+
seen.add(model);
|
|
49
|
+
ids.push(model);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
ids,
|
|
53
|
+
diagnostics: { sawVideoFixture }
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
//#endregion
|
|
58
|
+
export { OPENROUTER_VIDEO_SUNSET_MODELS, collect, idsFor };
|
|
59
|
+
//# sourceMappingURL=collect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.js","names":[],"sources":["../../../src/response/catalog/collect.ts"],"sourcesContent":["import type { Fixture } from \"../../types.js\";\nimport { stripProviderPrefix } from \"../../model-utils.js\";\n\nexport type ModelProvider = \"anthropic\" | \"openai\" | \"google\";\n\nconst MODEL_PREFIXES: readonly { provider: ModelProvider; pattern: RegExp }[] = [\n { provider: \"anthropic\", pattern: /^claude-/ },\n { provider: \"google\", pattern: /^gemini-/ },\n {\n provider: \"openai\",\n pattern: /^(?:gpt-|chatgpt-|o[134](?:$|-)|text-embedding-|dall-e-|whisper-|tts-)/,\n },\n];\n\n/** Explicit provider segments win; unknown families remain visible everywhere. */\nexport function providerOf(id: string): ModelProvider | undefined {\n const normalized = id.toLowerCase();\n const provider = normalized.split(\"/\", 1)[0];\n if (\n normalized.includes(\"/\") &&\n (provider === \"anthropic\" || provider === \"openai\" || provider === \"google\")\n )\n return provider;\n const family = stripProviderPrefix(normalized);\n return MODEL_PREFIXES.find(({ pattern }) => pattern.test(family))?.provider;\n}\n\nexport function idsFor(ids: readonly string[], provider: \"anthropic\" | \"google\"): string[] {\n return ids.filter((id) => {\n const actual = providerOf(id);\n return actual === undefined || actual === provider;\n });\n}\n\nexport type CatalogSelection = \"all\" | \"chat\" | \"video-active\";\n\n/** Models that the existing OpenRouter video surface cannot serve. */\nexport const OPENROUTER_VIDEO_SUNSET_MODELS: ReadonlySet<string> = new Set([\"openai/sora-2\"]);\n\n/** Ordered fixture IDs; callers own warnings and transport decisions. */\nexport function collect(fixtures: readonly Fixture[], selection: CatalogSelection) {\n const ids: string[] = [];\n const seen = new Set<string>();\n let sawVideoFixture = false;\n for (const fixture of fixtures) {\n const { endpoint, model } = fixture.match;\n if (selection === \"chat\" && endpoint !== undefined && endpoint !== \"chat\") continue;\n if (selection === \"video-active\") {\n if (endpoint !== \"video\") continue;\n sawVideoFixture = true;\n if (typeof model === \"string\" && OPENROUTER_VIDEO_SUNSET_MODELS.has(model)) continue;\n }\n if (typeof model !== \"string\" || model.length === 0 || seen.has(model)) continue;\n seen.add(model);\n ids.push(model);\n }\n return { ids, diagnostics: { sawVideoFixture } };\n}\n"],"mappings":";;;AAKA,MAAM,iBAA0E;CAC9E;EAAE,UAAU;EAAa,SAAS;EAAY;CAC9C;EAAE,UAAU;EAAU,SAAS;EAAY;CAC3C;EACE,UAAU;EACV,SAAS;EACV;CACF;;AAGD,SAAgB,WAAW,IAAuC;CAChE,MAAM,aAAa,GAAG,aAAa;CACnC,MAAM,WAAW,WAAW,MAAM,KAAK,EAAE,CAAC;AAC1C,KACE,WAAW,SAAS,IAAI,KACvB,aAAa,eAAe,aAAa,YAAY,aAAa,UAEnE,QAAO;CACT,MAAM,SAAS,oBAAoB,WAAW;AAC9C,QAAO,eAAe,MAAM,EAAE,cAAc,QAAQ,KAAK,OAAO,CAAC,EAAE;;AAGrE,SAAgB,OAAO,KAAwB,UAA4C;AACzF,QAAO,IAAI,QAAQ,OAAO;EACxB,MAAM,SAAS,WAAW,GAAG;AAC7B,SAAO,WAAW,UAAa,WAAW;GAC1C;;;AAMJ,MAAa,iCAAsD,IAAI,IAAI,CAAC,gBAAgB,CAAC;;AAG7F,SAAgB,QAAQ,UAA8B,WAA6B;CACjF,MAAM,MAAgB,EAAE;CACxB,MAAM,uBAAO,IAAI,KAAa;CAC9B,IAAI,kBAAkB;AACtB,MAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,EAAE,UAAU,UAAU,QAAQ;AACpC,MAAI,cAAc,UAAU,aAAa,UAAa,aAAa,OAAQ;AAC3E,MAAI,cAAc,gBAAgB;AAChC,OAAI,aAAa,QAAS;AAC1B,qBAAkB;AAClB,OAAI,OAAO,UAAU,YAAY,+BAA+B,IAAI,MAAM,CAAE;;AAE9E,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,KAAK,KAAK,IAAI,MAAM,CAAE;AACxE,OAAK,IAAI,MAAM;AACf,MAAI,KAAK,MAAM;;AAEjB,QAAO;EAAE;EAAK,aAAa,EAAE,iBAAiB;EAAE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/response/catalog/gemini-page.ts
|
|
3
|
+
/** Offset tokens are canonical base64-encoded nonnegative integer offsets. */
|
|
4
|
+
function geminiPage(ids, query) {
|
|
5
|
+
const rawSize = query.get("pageSize");
|
|
6
|
+
const size = rawSize === null ? 50 : Number(rawSize);
|
|
7
|
+
if (rawSize !== null && (!/^\d+$/.test(rawSize) || !Number.isInteger(size) || size < 0)) return { error: "pageSize must be a nonnegative integer" };
|
|
8
|
+
const limit = Math.min(size || 50, 1e3);
|
|
9
|
+
const token = query.get("pageToken");
|
|
10
|
+
let offset = 0;
|
|
11
|
+
if (token !== null) {
|
|
12
|
+
const decoded = Buffer.from(token, "base64").toString("utf8");
|
|
13
|
+
offset = Number(decoded);
|
|
14
|
+
if (!/^\d+$/.test(decoded) || !Number.isSafeInteger(offset) || offset < 0 || Buffer.from(decoded).toString("base64") !== token) return { error: "pageToken must be a valid catalog offset token" };
|
|
15
|
+
}
|
|
16
|
+
const selected = ids.slice(offset, offset + limit);
|
|
17
|
+
return { page: {
|
|
18
|
+
ids: selected,
|
|
19
|
+
...offset + selected.length < ids.length ? { nextPageToken: Buffer.from(String(offset + selected.length)).toString("base64") } : {}
|
|
20
|
+
} };
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
exports.geminiPage = geminiPage;
|
|
25
|
+
//# sourceMappingURL=gemini-page.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-page.cjs","names":[],"sources":["../../../src/response/catalog/gemini-page.ts"],"sourcesContent":["export interface GeminiCatalogPage {\n ids: string[];\n nextPageToken?: string;\n}\n\n/** Offset tokens are canonical base64-encoded nonnegative integer offsets. */\nexport function geminiPage(\n ids: readonly string[],\n query: URLSearchParams,\n): { page: GeminiCatalogPage; error?: never } | { error: string; page?: never } {\n const rawSize = query.get(\"pageSize\");\n const size = rawSize === null ? 50 : Number(rawSize);\n if (rawSize !== null && (!/^\\d+$/.test(rawSize) || !Number.isInteger(size) || size < 0))\n return { error: \"pageSize must be a nonnegative integer\" };\n const limit = Math.min(size || 50, 1000);\n const token = query.get(\"pageToken\");\n let offset = 0;\n if (token !== null) {\n const decoded = Buffer.from(token, \"base64\").toString(\"utf8\");\n offset = Number(decoded);\n if (\n !/^\\d+$/.test(decoded) ||\n !Number.isSafeInteger(offset) ||\n offset < 0 ||\n Buffer.from(decoded).toString(\"base64\") !== token\n )\n return { error: \"pageToken must be a valid catalog offset token\" };\n }\n const selected = ids.slice(offset, offset + limit);\n return {\n page: {\n ids: selected,\n ...(offset + selected.length < ids.length\n ? { nextPageToken: Buffer.from(String(offset + selected.length)).toString(\"base64\") }\n : {}),\n },\n };\n}\n"],"mappings":";;;AAMA,SAAgB,WACd,KACA,OAC8E;CAC9E,MAAM,UAAU,MAAM,IAAI,WAAW;CACrC,MAAM,OAAO,YAAY,OAAO,KAAK,OAAO,QAAQ;AACpD,KAAI,YAAY,SAAS,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,OAAO,UAAU,KAAK,IAAI,OAAO,GACnF,QAAO,EAAE,OAAO,0CAA0C;CAC5D,MAAM,QAAQ,KAAK,IAAI,QAAQ,IAAI,IAAK;CACxC,MAAM,QAAQ,MAAM,IAAI,YAAY;CACpC,IAAI,SAAS;AACb,KAAI,UAAU,MAAM;EAClB,MAAM,UAAU,OAAO,KAAK,OAAO,SAAS,CAAC,SAAS,OAAO;AAC7D,WAAS,OAAO,QAAQ;AACxB,MACE,CAAC,QAAQ,KAAK,QAAQ,IACtB,CAAC,OAAO,cAAc,OAAO,IAC7B,SAAS,KACT,OAAO,KAAK,QAAQ,CAAC,SAAS,SAAS,KAAK,MAE5C,QAAO,EAAE,OAAO,kDAAkD;;CAEtE,MAAM,WAAW,IAAI,MAAM,QAAQ,SAAS,MAAM;AAClD,QAAO,EACL,MAAM;EACJ,KAAK;EACL,GAAI,SAAS,SAAS,SAAS,IAAI,SAC/B,EAAE,eAAe,OAAO,KAAK,OAAO,SAAS,SAAS,OAAO,CAAC,CAAC,SAAS,SAAS,EAAE,GACnF,EAAE;EACP,EACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/response/catalog/gemini-page.ts
|
|
2
|
+
/** Offset tokens are canonical base64-encoded nonnegative integer offsets. */
|
|
3
|
+
function geminiPage(ids, query) {
|
|
4
|
+
const rawSize = query.get("pageSize");
|
|
5
|
+
const size = rawSize === null ? 50 : Number(rawSize);
|
|
6
|
+
if (rawSize !== null && (!/^\d+$/.test(rawSize) || !Number.isInteger(size) || size < 0)) return { error: "pageSize must be a nonnegative integer" };
|
|
7
|
+
const limit = Math.min(size || 50, 1e3);
|
|
8
|
+
const token = query.get("pageToken");
|
|
9
|
+
let offset = 0;
|
|
10
|
+
if (token !== null) {
|
|
11
|
+
const decoded = Buffer.from(token, "base64").toString("utf8");
|
|
12
|
+
offset = Number(decoded);
|
|
13
|
+
if (!/^\d+$/.test(decoded) || !Number.isSafeInteger(offset) || offset < 0 || Buffer.from(decoded).toString("base64") !== token) return { error: "pageToken must be a valid catalog offset token" };
|
|
14
|
+
}
|
|
15
|
+
const selected = ids.slice(offset, offset + limit);
|
|
16
|
+
return { page: {
|
|
17
|
+
ids: selected,
|
|
18
|
+
...offset + selected.length < ids.length ? { nextPageToken: Buffer.from(String(offset + selected.length)).toString("base64") } : {}
|
|
19
|
+
} };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
export { geminiPage };
|
|
24
|
+
//# sourceMappingURL=gemini-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-page.js","names":[],"sources":["../../../src/response/catalog/gemini-page.ts"],"sourcesContent":["export interface GeminiCatalogPage {\n ids: string[];\n nextPageToken?: string;\n}\n\n/** Offset tokens are canonical base64-encoded nonnegative integer offsets. */\nexport function geminiPage(\n ids: readonly string[],\n query: URLSearchParams,\n): { page: GeminiCatalogPage; error?: never } | { error: string; page?: never } {\n const rawSize = query.get(\"pageSize\");\n const size = rawSize === null ? 50 : Number(rawSize);\n if (rawSize !== null && (!/^\\d+$/.test(rawSize) || !Number.isInteger(size) || size < 0))\n return { error: \"pageSize must be a nonnegative integer\" };\n const limit = Math.min(size || 50, 1000);\n const token = query.get(\"pageToken\");\n let offset = 0;\n if (token !== null) {\n const decoded = Buffer.from(token, \"base64\").toString(\"utf8\");\n offset = Number(decoded);\n if (\n !/^\\d+$/.test(decoded) ||\n !Number.isSafeInteger(offset) ||\n offset < 0 ||\n Buffer.from(decoded).toString(\"base64\") !== token\n )\n return { error: \"pageToken must be a valid catalog offset token\" };\n }\n const selected = ids.slice(offset, offset + limit);\n return {\n page: {\n ids: selected,\n ...(offset + selected.length < ids.length\n ? { nextPageToken: Buffer.from(String(offset + selected.length)).toString(\"base64\") }\n : {}),\n },\n };\n}\n"],"mappings":";;AAMA,SAAgB,WACd,KACA,OAC8E;CAC9E,MAAM,UAAU,MAAM,IAAI,WAAW;CACrC,MAAM,OAAO,YAAY,OAAO,KAAK,OAAO,QAAQ;AACpD,KAAI,YAAY,SAAS,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,OAAO,UAAU,KAAK,IAAI,OAAO,GACnF,QAAO,EAAE,OAAO,0CAA0C;CAC5D,MAAM,QAAQ,KAAK,IAAI,QAAQ,IAAI,IAAK;CACxC,MAAM,QAAQ,MAAM,IAAI,YAAY;CACpC,IAAI,SAAS;AACb,KAAI,UAAU,MAAM;EAClB,MAAM,UAAU,OAAO,KAAK,OAAO,SAAS,CAAC,SAAS,OAAO;AAC7D,WAAS,OAAO,QAAQ;AACxB,MACE,CAAC,QAAQ,KAAK,QAAQ,IACtB,CAAC,OAAO,cAAc,OAAO,IAC7B,SAAS,KACT,OAAO,KAAK,QAAQ,CAAC,SAAS,SAAS,KAAK,MAE5C,QAAO,EAAE,OAAO,kDAAkD;;CAEtE,MAAM,WAAW,IAAI,MAAM,QAAQ,SAAS,MAAM;AAClD,QAAO,EACL,MAAM;EACJ,KAAK;EACL,GAAI,SAAS,SAAS,SAAS,IAAI,SAC/B,EAAE,eAAe,OAAO,KAAK,OAAO,SAAS,SAAS,OAAO,CAAC,CAAC,SAAS,SAAS,EAAE,GACnF,EAAE;EACP,EACF"}
|