@marinoscar/platform-api 0.1.0-next.5 → 0.1.0-next.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 +12 -0
- package/dist/ai/core/ai-error.d.ts +15 -158
- package/dist/ai/core/ai-error.d.ts.map +1 -1
- package/dist/ai/core/ai-error.js +58 -221
- package/dist/ai/core/ai-error.js.map +1 -1
- package/dist/ai/core/capabilities.d.ts +3 -126
- package/dist/ai/core/capabilities.d.ts.map +1 -1
- package/dist/ai/core/capabilities.js +13 -109
- package/dist/ai/core/capabilities.js.map +1 -1
- package/dist/ai/core/conversation.d.ts +2 -15
- package/dist/ai/core/conversation.d.ts.map +1 -1
- package/dist/ai/core/conversation.js +9 -54
- package/dist/ai/core/conversation.js.map +1 -1
- package/dist/ai/core/hosted-tools.d.ts +3 -172
- package/dist/ai/core/hosted-tools.d.ts.map +1 -1
- package/dist/ai/core/hosted-tools.js +20 -286
- package/dist/ai/core/hosted-tools.js.map +1 -1
- package/dist/ai/core/provider-adapter.interface.d.ts +3 -260
- package/dist/ai/core/provider-adapter.interface.d.ts.map +1 -1
- package/dist/ai/core/provider-adapter.interface.js +7 -29
- package/dist/ai/core/provider-adapter.interface.js.map +1 -1
- package/dist/ai/core/structured-output.d.ts +3 -49
- package/dist/ai/core/structured-output.d.ts.map +1 -1
- package/dist/ai/core/structured-output.js +9 -80
- package/dist/ai/core/structured-output.js.map +1 -1
- package/dist/ai/core/tools.d.ts +3 -93
- package/dist/ai/core/tools.d.ts.map +1 -1
- package/dist/ai/core/tools.js +9 -73
- package/dist/ai/core/tools.js.map +1 -1
- package/dist/ai/core/types/file-inputs.types.d.ts +3 -102
- package/dist/ai/core/types/file-inputs.types.d.ts.map +1 -1
- package/dist/ai/core/types/file-inputs.types.js +14 -78
- package/dist/ai/core/types/file-inputs.types.js.map +1 -1
- package/dist/ai/core/types/media.types.d.ts +3 -616
- package/dist/ai/core/types/media.types.d.ts.map +1 -1
- package/dist/ai/core/types/media.types.js +33 -203
- package/dist/ai/core/types/media.types.js.map +1 -1
- package/dist/ai/core/types/responses.types.d.ts +3 -619
- package/dist/ai/core/types/responses.types.d.ts.map +1 -1
- package/dist/ai/core/types/responses.types.js +9 -57
- package/dist/ai/core/types/responses.types.js.map +1 -1
- package/dist/ai/http/dto/ai-images.dto.d.ts +4 -4
- package/dist/ai/index.d.ts +1 -1
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +3 -3
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/providers/anthropic/anthropic-client.factory.d.ts +13 -15
- package/dist/ai/providers/anthropic/anthropic-client.factory.d.ts.map +1 -1
- package/dist/ai/providers/anthropic/anthropic-client.factory.js +23 -52
- package/dist/ai/providers/anthropic/anthropic-client.factory.js.map +1 -1
- package/dist/ai/providers/anthropic/anthropic.adapter.d.ts +15 -51
- package/dist/ai/providers/anthropic/anthropic.adapter.d.ts.map +1 -1
- package/dist/ai/providers/anthropic/anthropic.adapter.js +29 -293
- package/dist/ai/providers/anthropic/anthropic.adapter.js.map +1 -1
- package/dist/ai/providers/azure-openai/azure-openai-client.factory.d.ts +10 -14
- package/dist/ai/providers/azure-openai/azure-openai-client.factory.d.ts.map +1 -1
- package/dist/ai/providers/azure-openai/azure-openai-client.factory.js +20 -53
- package/dist/ai/providers/azure-openai/azure-openai-client.factory.js.map +1 -1
- package/dist/ai/providers/azure-openai/azure-openai.adapter.d.ts +14 -31
- package/dist/ai/providers/azure-openai/azure-openai.adapter.d.ts.map +1 -1
- package/dist/ai/providers/azure-openai/azure-openai.adapter.js +25 -170
- package/dist/ai/providers/azure-openai/azure-openai.adapter.js.map +1 -1
- package/dist/ai/providers/gemini/gemini-client.factory.d.ts +13 -18
- package/dist/ai/providers/gemini/gemini-client.factory.d.ts.map +1 -1
- package/dist/ai/providers/gemini/gemini-client.factory.js +24 -68
- package/dist/ai/providers/gemini/gemini-client.factory.js.map +1 -1
- package/dist/ai/providers/gemini/gemini.adapter.d.ts +15 -58
- package/dist/ai/providers/gemini/gemini.adapter.d.ts.map +1 -1
- package/dist/ai/providers/gemini/gemini.adapter.js +29 -348
- package/dist/ai/providers/gemini/gemini.adapter.js.map +1 -1
- package/dist/ai/providers/openai/openai-client.factory.d.ts +13 -35
- package/dist/ai/providers/openai/openai-client.factory.d.ts.map +1 -1
- package/dist/ai/providers/openai/openai-client.factory.js +25 -64
- package/dist/ai/providers/openai/openai-client.factory.js.map +1 -1
- package/dist/ai/providers/openai/openai.adapter.d.ts +15 -48
- package/dist/ai/providers/openai/openai.adapter.d.ts.map +1 -1
- package/dist/ai/providers/openai/openai.adapter.js +27 -206
- package/dist/ai/providers/openai/openai.adapter.js.map +1 -1
- package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.d.ts +11 -11
- package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.d.ts.map +1 -1
- package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.js +18 -41
- package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.js.map +1 -1
- package/dist/ai/providers/openai-compatible/openai-compatible.adapter.d.ts +14 -32
- package/dist/ai/providers/openai-compatible/openai-compatible.adapter.d.ts.map +1 -1
- package/dist/ai/providers/openai-compatible/openai-compatible.adapter.js +25 -149
- package/dist/ai/providers/openai-compatible/openai-compatible.adapter.js.map +1 -1
- package/dist/ai/providers/platform-ai-tracer.d.ts +4 -0
- package/dist/ai/providers/platform-ai-tracer.d.ts.map +1 -0
- package/dist/ai/providers/platform-ai-tracer.js +20 -0
- package/dist/ai/providers/platform-ai-tracer.js.map +1 -0
- package/dist/ai/runtime/ai-image-run-request.d.ts +1 -1
- package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.d.ts +28 -5
- package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.d.ts.map +1 -1
- package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.js +54 -9
- package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.js.map +1 -1
- package/dist/ai/testing/index.d.ts +1 -1
- package/dist/ai/testing/index.d.ts.map +1 -1
- package/dist/ai/testing/index.js +2 -1
- package/dist/ai/testing/index.js.map +1 -1
- package/dist/jobs/rate-limit.error.d.ts +2 -26
- package/dist/jobs/rate-limit.error.d.ts.map +1 -1
- package/dist/jobs/rate-limit.error.js +4 -52
- package/dist/jobs/rate-limit.error.js.map +1 -1
- package/dist/storage/config/storage-config.controller.d.ts +1 -1
- package/package.json +3 -2
- package/dist/ai/providers/anthropic/anthropic-errors.d.ts +0 -16
- package/dist/ai/providers/anthropic/anthropic-errors.d.ts.map +0 -1
- package/dist/ai/providers/anthropic/anthropic-errors.js +0 -156
- package/dist/ai/providers/anthropic/anthropic-errors.js.map +0 -1
- package/dist/ai/providers/anthropic/anthropic-messages.mapper.d.ts +0 -80
- package/dist/ai/providers/anthropic/anthropic-messages.mapper.d.ts.map +0 -1
- package/dist/ai/providers/anthropic/anthropic-messages.mapper.js +0 -536
- package/dist/ai/providers/anthropic/anthropic-messages.mapper.js.map +0 -1
- package/dist/ai/providers/anthropic/anthropic-model-catalog.d.ts +0 -49
- package/dist/ai/providers/anthropic/anthropic-model-catalog.d.ts.map +0 -1
- package/dist/ai/providers/anthropic/anthropic-model-catalog.js +0 -198
- package/dist/ai/providers/anthropic/anthropic-model-catalog.js.map +0 -1
- package/dist/ai/providers/anthropic/anthropic-stream.mapper.d.ts +0 -35
- package/dist/ai/providers/anthropic/anthropic-stream.mapper.d.ts.map +0 -1
- package/dist/ai/providers/anthropic/anthropic-stream.mapper.js +0 -203
- package/dist/ai/providers/anthropic/anthropic-stream.mapper.js.map +0 -1
- package/dist/ai/providers/anthropic/testing/anthropic-fixtures.d.ts +0 -18
- package/dist/ai/providers/anthropic/testing/anthropic-fixtures.d.ts.map +0 -1
- package/dist/ai/providers/anthropic/testing/anthropic-fixtures.js +0 -120
- package/dist/ai/providers/anthropic/testing/anthropic-fixtures.js.map +0 -1
- package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.d.ts +0 -59
- package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.d.ts.map +0 -1
- package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.js +0 -206
- package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.js.map +0 -1
- package/dist/ai/providers/azure-openai/azure-openai-settings.d.ts +0 -23
- package/dist/ai/providers/azure-openai/azure-openai-settings.d.ts.map +0 -1
- package/dist/ai/providers/azure-openai/azure-openai-settings.js +0 -54
- package/dist/ai/providers/azure-openai/azure-openai-settings.js.map +0 -1
- package/dist/ai/providers/gemini/gemini-content.mapper.d.ts +0 -98
- package/dist/ai/providers/gemini/gemini-content.mapper.d.ts.map +0 -1
- package/dist/ai/providers/gemini/gemini-content.mapper.js +0 -665
- package/dist/ai/providers/gemini/gemini-content.mapper.js.map +0 -1
- package/dist/ai/providers/gemini/gemini-embeddings.mapper.d.ts +0 -13
- package/dist/ai/providers/gemini/gemini-embeddings.mapper.d.ts.map +0 -1
- package/dist/ai/providers/gemini/gemini-embeddings.mapper.js +0 -78
- package/dist/ai/providers/gemini/gemini-embeddings.mapper.js.map +0 -1
- package/dist/ai/providers/gemini/gemini-errors.d.ts +0 -32
- package/dist/ai/providers/gemini/gemini-errors.d.ts.map +0 -1
- package/dist/ai/providers/gemini/gemini-errors.js +0 -191
- package/dist/ai/providers/gemini/gemini-errors.js.map +0 -1
- package/dist/ai/providers/gemini/gemini-model-catalog.d.ts +0 -45
- package/dist/ai/providers/gemini/gemini-model-catalog.d.ts.map +0 -1
- package/dist/ai/providers/gemini/gemini-model-catalog.js +0 -264
- package/dist/ai/providers/gemini/gemini-model-catalog.js.map +0 -1
- package/dist/ai/providers/gemini/gemini-stream.mapper.d.ts +0 -31
- package/dist/ai/providers/gemini/gemini-stream.mapper.d.ts.map +0 -1
- package/dist/ai/providers/gemini/gemini-stream.mapper.js +0 -118
- package/dist/ai/providers/gemini/gemini-stream.mapper.js.map +0 -1
- package/dist/ai/providers/gemini/testing/gemini-fixtures.d.ts +0 -80
- package/dist/ai/providers/gemini/testing/gemini-fixtures.d.ts.map +0 -1
- package/dist/ai/providers/gemini/testing/gemini-fixtures.js +0 -118
- package/dist/ai/providers/gemini/testing/gemini-fixtures.js.map +0 -1
- package/dist/ai/providers/gemini/testing/gemini-mock-transport.d.ts +0 -82
- package/dist/ai/providers/gemini/testing/gemini-mock-transport.d.ts.map +0 -1
- package/dist/ai/providers/gemini/testing/gemini-mock-transport.js +0 -342
- package/dist/ai/providers/gemini/testing/gemini-mock-transport.js.map +0 -1
- package/dist/ai/providers/openai/openai-audio.mapper.d.ts +0 -42
- package/dist/ai/providers/openai/openai-audio.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-audio.mapper.js +0 -266
- package/dist/ai/providers/openai/openai-audio.mapper.js.map +0 -1
- package/dist/ai/providers/openai/openai-call-telemetry.d.ts +0 -25
- package/dist/ai/providers/openai/openai-call-telemetry.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-call-telemetry.js +0 -93
- package/dist/ai/providers/openai/openai-call-telemetry.js.map +0 -1
- package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.d.ts +0 -41
- package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.js +0 -173
- package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.js.map +0 -1
- package/dist/ai/providers/openai/openai-chat-completions.engine.d.ts +0 -33
- package/dist/ai/providers/openai/openai-chat-completions.engine.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-chat-completions.engine.js +0 -165
- package/dist/ai/providers/openai/openai-chat-completions.engine.js.map +0 -1
- package/dist/ai/providers/openai/openai-chat-completions.mapper.d.ts +0 -42
- package/dist/ai/providers/openai/openai-chat-completions.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-chat-completions.mapper.js +0 -304
- package/dist/ai/providers/openai/openai-chat-completions.mapper.js.map +0 -1
- package/dist/ai/providers/openai/openai-embeddings.mapper.d.ts +0 -25
- package/dist/ai/providers/openai/openai-embeddings.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-embeddings.mapper.js +0 -81
- package/dist/ai/providers/openai/openai-embeddings.mapper.js.map +0 -1
- package/dist/ai/providers/openai/openai-errors.d.ts +0 -45
- package/dist/ai/providers/openai/openai-errors.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-errors.js +0 -247
- package/dist/ai/providers/openai/openai-errors.js.map +0 -1
- package/dist/ai/providers/openai/openai-family-guards.d.ts +0 -4
- package/dist/ai/providers/openai/openai-family-guards.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-family-guards.js +0 -19
- package/dist/ai/providers/openai/openai-family-guards.js.map +0 -1
- package/dist/ai/providers/openai/openai-images.mapper.d.ts +0 -23
- package/dist/ai/providers/openai/openai-images.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-images.mapper.js +0 -164
- package/dist/ai/providers/openai/openai-images.mapper.js.map +0 -1
- package/dist/ai/providers/openai/openai-model-catalog.d.ts +0 -36
- package/dist/ai/providers/openai/openai-model-catalog.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-model-catalog.js +0 -209
- package/dist/ai/providers/openai/openai-model-catalog.js.map +0 -1
- package/dist/ai/providers/openai/openai-realtime.mapper.d.ts +0 -18
- package/dist/ai/providers/openai/openai-realtime.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-realtime.mapper.js +0 -159
- package/dist/ai/providers/openai/openai-realtime.mapper.js.map +0 -1
- package/dist/ai/providers/openai/openai-redirect-guard.d.ts +0 -9
- package/dist/ai/providers/openai/openai-redirect-guard.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-redirect-guard.js +0 -61
- package/dist/ai/providers/openai/openai-redirect-guard.js.map +0 -1
- package/dist/ai/providers/openai/openai-responses.engine.d.ts +0 -50
- package/dist/ai/providers/openai/openai-responses.engine.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-responses.engine.js +0 -206
- package/dist/ai/providers/openai/openai-responses.engine.js.map +0 -1
- package/dist/ai/providers/openai/openai-responses.mapper.d.ts +0 -64
- package/dist/ai/providers/openai/openai-responses.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-responses.mapper.js +0 -580
- package/dist/ai/providers/openai/openai-responses.mapper.js.map +0 -1
- package/dist/ai/providers/openai/openai-stream.mapper.d.ts +0 -28
- package/dist/ai/providers/openai/openai-stream.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-stream.mapper.js +0 -139
- package/dist/ai/providers/openai/openai-stream.mapper.js.map +0 -1
- package/dist/ai/providers/openai/testing/chat-completions-fixtures.d.ts +0 -24
- package/dist/ai/providers/openai/testing/chat-completions-fixtures.d.ts.map +0 -1
- package/dist/ai/providers/openai/testing/chat-completions-fixtures.js +0 -72
- package/dist/ai/providers/openai/testing/chat-completions-fixtures.js.map +0 -1
- package/dist/ai/providers/openai/testing/conformance-responders.d.ts +0 -7
- package/dist/ai/providers/openai/testing/conformance-responders.d.ts.map +0 -1
- package/dist/ai/providers/openai/testing/conformance-responders.js +0 -64
- package/dist/ai/providers/openai/testing/conformance-responders.js.map +0 -1
- package/dist/ai/providers/openai/testing/openai-fixtures.d.ts +0 -52
- package/dist/ai/providers/openai/testing/openai-fixtures.d.ts.map +0 -1
- package/dist/ai/providers/openai/testing/openai-fixtures.js +0 -208
- package/dist/ai/providers/openai/testing/openai-fixtures.js.map +0 -1
- package/dist/ai/providers/openai/testing/openai-mock-transport.d.ts +0 -242
- package/dist/ai/providers/openai/testing/openai-mock-transport.d.ts.map +0 -1
- package/dist/ai/providers/openai/testing/openai-mock-transport.js +0 -523
- package/dist/ai/providers/openai/testing/openai-mock-transport.js.map +0 -1
- package/dist/ai/providers/openai-compatible/openai-compatible-settings.d.ts +0 -13
- package/dist/ai/providers/openai-compatible/openai-compatible-settings.d.ts.map +0 -1
- package/dist/ai/providers/openai-compatible/openai-compatible-settings.js +0 -29
- package/dist/ai/providers/openai-compatible/openai-compatible-settings.js.map +0 -1
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// =============================================================================
|
|
3
|
-
// Gemini model classifier (issue #447, epic #421)
|
|
4
|
-
// =============================================================================
|
|
5
|
-
//
|
|
6
|
-
// This table is a best-effort default; admins override per model. Update it
|
|
7
|
-
// when Google ships a new family.
|
|
8
|
-
//
|
|
9
|
-
// TWO SOURCES, ONE ANSWER. Unlike OpenAI's and Anthropic's, Gemini's model
|
|
10
|
-
// list says things about each model: `inputTokenLimit`, `outputTokenLimit`,
|
|
11
|
-
// `supportedGenerationMethods` (the SDK's `supportedActions`) and a
|
|
12
|
-
// `thinking` flag. The catalog sync hands those back as
|
|
13
|
-
// `AiDiscoveredModelMetadata` (`AiProviderAdapter.classifyModel`'s optional
|
|
14
|
-
// second argument), and `classifyGeminiModel` uses them to ENRICH what the
|
|
15
|
-
// curated rule table below says:
|
|
16
|
-
//
|
|
17
|
-
// - the token limits replace the table's (the provider is the authority on
|
|
18
|
-
// its own limits, and they move between previews);
|
|
19
|
-
// - `supportedActions`, when present, must include the method the profile
|
|
20
|
-
// needs (`generateContent` for a generative model, `embedContent` /
|
|
21
|
-
// `batchEmbedContents` for an embedding model) or the id is left
|
|
22
|
-
// unclassified — a listing that says a model cannot generate outranks a
|
|
23
|
-
// name that looks like it can;
|
|
24
|
-
// - an id NO rule matches is still classified when its metadata is clear:
|
|
25
|
-
// a `gemini-*` model that supports `generateContent` gets the generic
|
|
26
|
-
// Gemini profile (reasoning only if `thinking` says so), a model that
|
|
27
|
-
// supports `embedContent` the embedding profile. Aliases such as
|
|
28
|
-
// `gemini-flash-latest` land here.
|
|
29
|
-
//
|
|
30
|
-
// Without metadata (a request-time lookup, a test) the rule table answers
|
|
31
|
-
// alone. The rule list is ORDERED — FIRST MATCH WINS — and every pattern is
|
|
32
|
-
// tested against the lower-cased id with any `models/` prefix removed, so a
|
|
33
|
-
// dated or `-preview-MM-YYYY` snapshot classifies like its family.
|
|
34
|
-
//
|
|
35
|
-
// Each rule carries a `GeminiModelProfile`: the neutral capabilities the
|
|
36
|
-
// catalog stores, plus the facts the REQUEST MAPPER needs that the neutral
|
|
37
|
-
// vocabulary deliberately does not model:
|
|
38
|
-
//
|
|
39
|
-
// thinking how `reasoning.effort` is expressed —
|
|
40
|
-
// 'level': `thinkingConfig.thinkingLevel` (Gemini 3.x,
|
|
41
|
-
// where the level is the recommended control),
|
|
42
|
-
// 'budget': `thinkingConfig.thinkingBudget` (Gemini 2.5),
|
|
43
|
-
// 'none': no thinking (Gemini 2.0 / 1.5);
|
|
44
|
-
// thinkingLevels 'level' families: effort -> level (Gemini 3 Pro has
|
|
45
|
-
// only LOW and HIGH; Flash has all four);
|
|
46
|
-
// structuredOutput whether `responseJsonSchema` is sent at all (2.5+);
|
|
47
|
-
// structuredWithTools whether a schema may be combined with function tools
|
|
48
|
-
// (Gemini 3.x; 2.5 answers that combination with a 400);
|
|
49
|
-
// embeddingDimensions embedding models: whether `outputDimensionality`
|
|
50
|
-
// (Matryoshka truncation) is accepted.
|
|
51
|
-
//
|
|
52
|
-
// Every generative Gemini model reads images and documents (PDF, text,
|
|
53
|
-
// audio, video) inline, so `vision_input` and `file_input` are declared for
|
|
54
|
-
// all of them. `hosted_tools` is never declared: this adapter maps none of
|
|
55
|
-
// Google's built-in tools yet (see `gemini.adapter.ts`).
|
|
56
|
-
// =============================================================================
|
|
57
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
58
|
-
exports.GEMINI_CLASSIFIER_RULES = exports.GEMINI_THINKING_BUDGETS = void 0;
|
|
59
|
-
exports.normalizeGeminiModelId = normalizeGeminiModelId;
|
|
60
|
-
exports.geminiModelProfile = geminiModelProfile;
|
|
61
|
-
exports.classifyGeminiModel = classifyGeminiModel;
|
|
62
|
-
const ALL_EFFORTS = ['minimal', 'low', 'medium', 'high'];
|
|
63
|
-
/**
|
|
64
|
-
* `reasoning.effort` → `thinkingConfig.thinkingBudget`, for the 'budget'
|
|
65
|
-
* families (Gemini 2.5), and for an unclassified model.
|
|
66
|
-
*
|
|
67
|
-
* The ranges Google documents are 128-32768 (2.5 Pro), 0-24576 (2.5 Flash)
|
|
68
|
-
* and 512-24576 (2.5 Flash-Lite), so every rung sits inside all three: the
|
|
69
|
-
* floor is Flash-Lite's minimum, the top is Flash's maximum, and the rungs
|
|
70
|
-
* roughly quadruple so the four efforts are genuinely different amounts of
|
|
71
|
-
* thinking. Gemini 3.x still accepts a budget (it is how an unclassified
|
|
72
|
-
* model is asked), though a level is the recommended control there.
|
|
73
|
-
*/
|
|
74
|
-
exports.GEMINI_THINKING_BUDGETS = {
|
|
75
|
-
minimal: 512,
|
|
76
|
-
low: 2048,
|
|
77
|
-
medium: 8192,
|
|
78
|
-
high: 24576,
|
|
79
|
-
};
|
|
80
|
-
/** Gemini 3.x Flash / Flash-Lite: all four levels. */
|
|
81
|
-
const FLASH_LEVELS = {
|
|
82
|
-
minimal: 'MINIMAL',
|
|
83
|
-
low: 'LOW',
|
|
84
|
-
medium: 'MEDIUM',
|
|
85
|
-
high: 'HIGH',
|
|
86
|
-
};
|
|
87
|
-
/** Gemini 3.x Pro: LOW and HIGH only — the lower two efforts ask for LOW, the upper two HIGH. */
|
|
88
|
-
const PRO_LEVELS = {
|
|
89
|
-
minimal: 'LOW',
|
|
90
|
-
low: 'LOW',
|
|
91
|
-
medium: 'HIGH',
|
|
92
|
-
high: 'HIGH',
|
|
93
|
-
};
|
|
94
|
-
const M1 = 1_048_576;
|
|
95
|
-
function generate(spec) {
|
|
96
|
-
const reasoning = spec.thinking !== 'none';
|
|
97
|
-
return {
|
|
98
|
-
kind: 'generate',
|
|
99
|
-
capabilities: {
|
|
100
|
-
capabilities: [
|
|
101
|
-
'responses',
|
|
102
|
-
...(reasoning ? ['reasoning'] : []),
|
|
103
|
-
'tools',
|
|
104
|
-
...(spec.structuredOutput ? ['structured_output'] : []),
|
|
105
|
-
'streaming',
|
|
106
|
-
'vision_input',
|
|
107
|
-
'file_input',
|
|
108
|
-
],
|
|
109
|
-
inputModalities: ['text', 'image', 'file'],
|
|
110
|
-
outputModalities: ['text'],
|
|
111
|
-
...(reasoning ? { reasoningEfforts: [...ALL_EFFORTS] } : {}),
|
|
112
|
-
contextWindow: spec.contextWindow,
|
|
113
|
-
maxOutputTokens: spec.maxOutputTokens,
|
|
114
|
-
},
|
|
115
|
-
thinking: spec.thinking,
|
|
116
|
-
...(spec.thinkingLevels ? { thinkingLevels: spec.thinkingLevels } : {}),
|
|
117
|
-
structuredOutput: spec.structuredOutput,
|
|
118
|
-
structuredWithTools: spec.structuredWithTools,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
function embedding(contextWindow) {
|
|
122
|
-
return {
|
|
123
|
-
kind: 'embedding',
|
|
124
|
-
capabilities: {
|
|
125
|
-
capabilities: ['embeddings'],
|
|
126
|
-
inputModalities: ['text'],
|
|
127
|
-
outputModalities: ['embedding'],
|
|
128
|
-
contextWindow,
|
|
129
|
-
},
|
|
130
|
-
thinking: 'none',
|
|
131
|
-
structuredOutput: false,
|
|
132
|
-
structuredWithTools: false,
|
|
133
|
-
embeddingDimensions: true,
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
const GEMINI_3_PRO = generate({
|
|
137
|
-
thinking: 'level',
|
|
138
|
-
thinkingLevels: PRO_LEVELS,
|
|
139
|
-
structuredOutput: true,
|
|
140
|
-
structuredWithTools: true,
|
|
141
|
-
contextWindow: M1,
|
|
142
|
-
maxOutputTokens: 65_536,
|
|
143
|
-
});
|
|
144
|
-
const GEMINI_3_FLASH = { ...GEMINI_3_PRO, thinkingLevels: FLASH_LEVELS };
|
|
145
|
-
const GEMINI_2_5 = generate({
|
|
146
|
-
thinking: 'budget',
|
|
147
|
-
structuredOutput: true,
|
|
148
|
-
structuredWithTools: false,
|
|
149
|
-
contextWindow: M1,
|
|
150
|
-
maxOutputTokens: 65_536,
|
|
151
|
-
});
|
|
152
|
-
function legacy(contextWindow) {
|
|
153
|
-
return generate({
|
|
154
|
-
thinking: 'none',
|
|
155
|
-
structuredOutput: false,
|
|
156
|
-
structuredWithTools: false,
|
|
157
|
-
contextWindow,
|
|
158
|
-
maxOutputTokens: 8192,
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* The profile an unmatched `gemini-*` id gets when its listing says it can
|
|
163
|
-
* `generateContent` — current-generation defaults, with reasoning decided by
|
|
164
|
-
* the listing's `thinking` flag (see `classifyGeminiModel`).
|
|
165
|
-
*/
|
|
166
|
-
const GENERIC_GEMINI = generate({
|
|
167
|
-
thinking: 'budget',
|
|
168
|
-
structuredOutput: true,
|
|
169
|
-
structuredWithTools: true,
|
|
170
|
-
contextWindow: M1,
|
|
171
|
-
maxOutputTokens: 65_536,
|
|
172
|
-
});
|
|
173
|
-
/** Ordered; first match wins. See the file header before reordering. */
|
|
174
|
-
exports.GEMINI_CLASSIFIER_RULES = [
|
|
175
|
-
// ---- Deliberately unclassified: models no port here drives — image
|
|
176
|
-
// output, speech output, the Live API, computer use, robotics, and the
|
|
177
|
-
// non-Gemini families the listing also carries.
|
|
178
|
-
{ match: /-(?:image|tts)(?:-|$)|native-audio|-live(?:-|$)|computer-use|robotics/, profile: null },
|
|
179
|
-
{ match: /^(?:imagen|veo|aqa|gemma|learnlm|lyria)-?/, profile: null },
|
|
180
|
-
{ match: /^(?:embedding-001|embedding-gecko)/, profile: null },
|
|
181
|
-
// ---- Embeddings.
|
|
182
|
-
{ match: /^gemini-embedding-2(?:-|$)/, profile: embedding(8192) },
|
|
183
|
-
{ match: /^gemini-embedding-/, profile: embedding(2048) },
|
|
184
|
-
{ match: /^text-embedding-004$/, profile: embedding(2048) },
|
|
185
|
-
// ---- Gemini 3.x: thinking levels, schemas with tools.
|
|
186
|
-
{ match: /^gemini-3(?:\.\d+)?-pro(?:-|$)/, profile: GEMINI_3_PRO },
|
|
187
|
-
{ match: /^gemini-3(?:\.\d+)?-flash(?:-lite)?(?:-|$)/, profile: GEMINI_3_FLASH },
|
|
188
|
-
// ---- Gemini 2.5: thinking budgets.
|
|
189
|
-
{ match: /^gemini-2\.5-(?:pro|flash|flash-lite)(?:-|$)/, profile: GEMINI_2_5 },
|
|
190
|
-
// ---- Gemini 2.0 / 1.5: no thinking; `responseJsonSchema` not sent.
|
|
191
|
-
{ match: /^gemini-2\.0-flash(?:-lite)?(?:-|$)/, profile: legacy(M1) },
|
|
192
|
-
{ match: /^gemini-1\.5-pro(?:-|$)/, profile: legacy(2_097_152) },
|
|
193
|
-
{ match: /^gemini-1\.5-flash(?:-8b)?(?:-|$)/, profile: legacy(M1) },
|
|
194
|
-
];
|
|
195
|
-
/** The id the rules are tested against: trimmed, lower-cased, without `models/`. */
|
|
196
|
-
function normalizeGeminiModelId(modelId) {
|
|
197
|
-
return modelId.trim().toLowerCase().replace(/^models\//, '');
|
|
198
|
-
}
|
|
199
|
-
function positiveInt(value) {
|
|
200
|
-
return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : undefined;
|
|
201
|
-
}
|
|
202
|
-
function supports(metadata, ...actions) {
|
|
203
|
-
const listed = metadata?.supportedActions;
|
|
204
|
-
if (!Array.isArray(listed))
|
|
205
|
-
return undefined;
|
|
206
|
-
return actions.some((action) => listed.includes(action));
|
|
207
|
-
}
|
|
208
|
-
/** `profile` with the listing's own token limits and thinking flag folded in. */
|
|
209
|
-
function enrich(profile, metadata) {
|
|
210
|
-
if (!metadata)
|
|
211
|
-
return profile;
|
|
212
|
-
const out = structuredClone(profile);
|
|
213
|
-
const context = positiveInt(metadata.inputTokenLimit);
|
|
214
|
-
const output = positiveInt(metadata.outputTokenLimit);
|
|
215
|
-
if (context !== undefined)
|
|
216
|
-
out.capabilities.contextWindow = context;
|
|
217
|
-
if (output !== undefined && out.kind === 'generate')
|
|
218
|
-
out.capabilities.maxOutputTokens = output;
|
|
219
|
-
return out;
|
|
220
|
-
}
|
|
221
|
-
/** The generic profile for an unmatched `gemini-*` id, reasoning per the listing's flag. */
|
|
222
|
-
function genericFromMetadata(metadata) {
|
|
223
|
-
if (metadata.thinking === true)
|
|
224
|
-
return GENERIC_GEMINI;
|
|
225
|
-
const noThinking = structuredClone(GENERIC_GEMINI);
|
|
226
|
-
noThinking.thinking = 'none';
|
|
227
|
-
noThinking.capabilities.capabilities = noThinking.capabilities.capabilities.filter((c) => c !== 'reasoning');
|
|
228
|
-
delete noThinking.capabilities.reasoningEfforts;
|
|
229
|
-
return noThinking;
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* The full profile for `modelId`, or `null` when neither the table nor the
|
|
233
|
-
* listing metadata classifies it. A fresh copy each call, so a caller cannot
|
|
234
|
-
* corrupt the table.
|
|
235
|
-
*/
|
|
236
|
-
function geminiModelProfile(modelId, metadata, rules = exports.GEMINI_CLASSIFIER_RULES) {
|
|
237
|
-
const id = normalizeGeminiModelId(modelId);
|
|
238
|
-
const rule = rules.find((candidate) => candidate.match.test(id));
|
|
239
|
-
if (rule) {
|
|
240
|
-
if (!rule.profile)
|
|
241
|
-
return null;
|
|
242
|
-
const needed = rule.profile.kind === 'embedding'
|
|
243
|
-
? supports(metadata, 'embedContent', 'batchEmbedContents')
|
|
244
|
-
: supports(metadata, 'generateContent');
|
|
245
|
-
// A listing that says the model cannot do what its name suggests wins.
|
|
246
|
-
if (needed === false)
|
|
247
|
-
return null;
|
|
248
|
-
return enrich(structuredClone(rule.profile), metadata);
|
|
249
|
-
}
|
|
250
|
-
if (!metadata)
|
|
251
|
-
return null;
|
|
252
|
-
if (id.startsWith('gemini-') && supports(metadata, 'generateContent')) {
|
|
253
|
-
return enrich(genericFromMetadata(metadata), metadata);
|
|
254
|
-
}
|
|
255
|
-
if (id.includes('embedding') && supports(metadata, 'embedContent', 'batchEmbedContents')) {
|
|
256
|
-
return enrich(embedding(2048), metadata);
|
|
257
|
-
}
|
|
258
|
-
return null;
|
|
259
|
-
}
|
|
260
|
-
/** `classifyModel()`: the neutral capabilities only. */
|
|
261
|
-
function classifyGeminiModel(modelId, metadata) {
|
|
262
|
-
return geminiModelProfile(modelId, metadata)?.capabilities ?? null;
|
|
263
|
-
}
|
|
264
|
-
//# sourceMappingURL=gemini-model-catalog.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-model-catalog.js","sourceRoot":"","sources":["../../../../src/ai/providers/gemini/gemini-model-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { GenerateContentResponse } from '@google/genai';
|
|
2
|
-
import { AiError } from '../../core/ai-error';
|
|
3
|
-
import type { AiResponseRequest, AiStreamEvent } from '../../core/types/responses.types';
|
|
4
|
-
export interface GeminiStreamMapperOptions {
|
|
5
|
-
request: AiResponseRequest;
|
|
6
|
-
}
|
|
7
|
-
export declare class GeminiStreamMapper {
|
|
8
|
-
private readonly opts;
|
|
9
|
-
private readonly assembler;
|
|
10
|
-
private id;
|
|
11
|
-
private model;
|
|
12
|
-
private finishReason;
|
|
13
|
-
private promptBlocked;
|
|
14
|
-
private usage;
|
|
15
|
-
private startedFlag;
|
|
16
|
-
private terminalFlag;
|
|
17
|
-
constructor(opts: GeminiStreamMapperOptions);
|
|
18
|
-
/** Whether `response.created` has been emitted. */
|
|
19
|
-
get started(): boolean;
|
|
20
|
-
/** Whether a terminal event (`response.completed` or `error`) has been emitted. */
|
|
21
|
-
get terminated(): boolean;
|
|
22
|
-
/** Whether the stream has said it is finished (a finish reason, or a blocked prompt). */
|
|
23
|
-
get finished(): boolean;
|
|
24
|
-
/** Maps one chunk to zero or more of our events. Nothing is emitted after a terminal event. */
|
|
25
|
-
map(chunk: GenerateContentResponse): AiStreamEvent[];
|
|
26
|
-
/** The stream ended: closes the open item and emits `response.completed`. Call only when `finished`. */
|
|
27
|
-
complete(): AiStreamEvent[];
|
|
28
|
-
/** Ends the stream with an `error` event for `err` (idempotent). */
|
|
29
|
-
fail(err: AiError): AiStreamEvent[];
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=gemini-stream.mapper.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-stream.mapper.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/gemini/gemini-stream.mapper.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAgB,uBAAuB,EAAwC,MAAM,eAAe,CAAC;AAEjH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAQzF,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED,qBAAa,kBAAkB;IAUjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IATjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,KAAK,CAAmD;IAChE,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;gBAEA,IAAI,EAAE,yBAAyB;IAE5D,mDAAmD;IACnD,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,mFAAmF;IACnF,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,yFAAyF;IACzF,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,+FAA+F;IAC/F,GAAG,CAAC,KAAK,EAAE,uBAAuB,GAAG,aAAa,EAAE;IAyBpD,wGAAwG;IACxG,QAAQ,IAAI,aAAa,EAAE;IA2B3B,oEAAoE;IACpE,IAAI,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,EAAE;CAMpC"}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// =============================================================================
|
|
3
|
-
// Gemini `streamGenerateContent` chunks -> AiStreamEvent (issue #447, epic #421)
|
|
4
|
-
// =============================================================================
|
|
5
|
-
//
|
|
6
|
-
// One `GeminiStreamMapper` per stream. A Gemini stream is a sequence of
|
|
7
|
-
// partial `GenerateContentResponse`s (SSE `data:` frames): each carries the
|
|
8
|
-
// NEXT parts of the one candidate — a slice of text, a slice of a thought
|
|
9
|
-
// summary, or a whole function call — and the last carries the
|
|
10
|
-
// `finishReason` and the final `usageMetadata`. There is no terminal event:
|
|
11
|
-
// the stream simply ends. The output contract is exactly the other adapters':
|
|
12
|
-
// `response.created` first, exactly one terminal event (`response.completed`
|
|
13
|
-
// or `error`), and the concatenated `output_text.delta`s equal the completed
|
|
14
|
-
// response's `outputText`.
|
|
15
|
-
//
|
|
16
|
-
// first chunk -> response.created (its `responseId`)
|
|
17
|
-
// text part -> output_text.delta
|
|
18
|
-
// thought part -> reasoning_summary.delta
|
|
19
|
-
// functionCall part -> function_call.arguments.delta (the whole
|
|
20
|
-
// arguments JSON — Gemini sends a call whole)
|
|
21
|
-
// + output_item.done
|
|
22
|
-
// a change of part kind -> output_item.done for the item it closes
|
|
23
|
-
// thoughtSignature -> (kept for replay, never emitted)
|
|
24
|
-
// end of stream -> response.completed, IF a finish reason (or a
|
|
25
|
-
// blocked prompt) was seen; a stream that ends
|
|
26
|
-
// without one is truncated — the adapter's to
|
|
27
|
-
// fail
|
|
28
|
-
//
|
|
29
|
-
// Parts are assembled by `GeminiOutputAssembler`, and the completed response
|
|
30
|
-
// is built by `finishGeminiResponse` — both shared with `create`, so a
|
|
31
|
-
// streamed and a non-streamed call produce the same items and the same
|
|
32
|
-
// structured-output validation; if that validation fails, the stream ends
|
|
33
|
-
// with an `error` event carrying its code instead.
|
|
34
|
-
// =============================================================================
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.GeminiStreamMapper = void 0;
|
|
37
|
-
const ai_error_1 = require("../../core/ai-error");
|
|
38
|
-
const gemini_content_mapper_1 = require("./gemini-content.mapper");
|
|
39
|
-
class GeminiStreamMapper {
|
|
40
|
-
opts;
|
|
41
|
-
assembler = new gemini_content_mapper_1.GeminiOutputAssembler();
|
|
42
|
-
id = '';
|
|
43
|
-
model = '';
|
|
44
|
-
finishReason;
|
|
45
|
-
promptBlocked = false;
|
|
46
|
-
usage;
|
|
47
|
-
startedFlag = false;
|
|
48
|
-
terminalFlag = false;
|
|
49
|
-
constructor(opts) {
|
|
50
|
-
this.opts = opts;
|
|
51
|
-
}
|
|
52
|
-
/** Whether `response.created` has been emitted. */
|
|
53
|
-
get started() {
|
|
54
|
-
return this.startedFlag;
|
|
55
|
-
}
|
|
56
|
-
/** Whether a terminal event (`response.completed` or `error`) has been emitted. */
|
|
57
|
-
get terminated() {
|
|
58
|
-
return this.terminalFlag;
|
|
59
|
-
}
|
|
60
|
-
/** Whether the stream has said it is finished (a finish reason, or a blocked prompt). */
|
|
61
|
-
get finished() {
|
|
62
|
-
return this.finishReason !== undefined || this.promptBlocked;
|
|
63
|
-
}
|
|
64
|
-
/** Maps one chunk to zero or more of our events. Nothing is emitted after a terminal event. */
|
|
65
|
-
map(chunk) {
|
|
66
|
-
if (this.terminalFlag)
|
|
67
|
-
return [];
|
|
68
|
-
const events = [];
|
|
69
|
-
if (!this.startedFlag) {
|
|
70
|
-
this.startedFlag = true;
|
|
71
|
-
this.id = chunk.responseId || (0, gemini_content_mapper_1.geminiFallbackResponseId)();
|
|
72
|
-
events.push({ type: 'response.created', id: this.id });
|
|
73
|
-
}
|
|
74
|
-
if (chunk.modelVersion)
|
|
75
|
-
this.model = chunk.modelVersion;
|
|
76
|
-
if (chunk.usageMetadata)
|
|
77
|
-
this.usage = chunk.usageMetadata;
|
|
78
|
-
const candidate = chunk.candidates?.[0];
|
|
79
|
-
if (!candidate && chunk.promptFeedback?.blockReason)
|
|
80
|
-
this.promptBlocked = true;
|
|
81
|
-
for (const part of candidate?.content?.parts ?? [])
|
|
82
|
-
events.push(...this.assembler.push(part));
|
|
83
|
-
if (candidate?.finishReason)
|
|
84
|
-
this.finishReason = candidate.finishReason;
|
|
85
|
-
return events;
|
|
86
|
-
}
|
|
87
|
-
/** The stream ended: closes the open item and emits `response.completed`. Call only when `finished`. */
|
|
88
|
-
complete() {
|
|
89
|
-
if (this.terminalFlag)
|
|
90
|
-
return [];
|
|
91
|
-
const events = this.assembler.finish();
|
|
92
|
-
let response;
|
|
93
|
-
try {
|
|
94
|
-
response = (0, gemini_content_mapper_1.finishGeminiResponse)({
|
|
95
|
-
id: this.id,
|
|
96
|
-
model: this.model || this.opts.request.model,
|
|
97
|
-
output: this.assembler.items,
|
|
98
|
-
finishReason: this.finishReason,
|
|
99
|
-
promptBlocked: this.promptBlocked,
|
|
100
|
-
usage: (0, gemini_content_mapper_1.geminiUsage)(this.usage),
|
|
101
|
-
}, this.opts.request);
|
|
102
|
-
}
|
|
103
|
-
catch (err) {
|
|
104
|
-
return [...events, ...this.fail(ai_error_1.AiError.wrap(err))];
|
|
105
|
-
}
|
|
106
|
-
this.terminalFlag = true;
|
|
107
|
-
return [...events, { type: 'response.completed', response }];
|
|
108
|
-
}
|
|
109
|
-
/** Ends the stream with an `error` event for `err` (idempotent). */
|
|
110
|
-
fail(err) {
|
|
111
|
-
if (this.terminalFlag)
|
|
112
|
-
return [];
|
|
113
|
-
this.terminalFlag = true;
|
|
114
|
-
return [{ type: 'error', code: err.code, message: err.message }];
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
exports.GeminiStreamMapper = GeminiStreamMapper;
|
|
118
|
-
//# sourceMappingURL=gemini-stream.mapper.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-stream.mapper.js","sourceRoot":"","sources":["../../../../src/ai/providers/gemini/gemini-stream.mapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
export interface GeminiWirePart {
|
|
2
|
-
text?: string;
|
|
3
|
-
thought?: boolean;
|
|
4
|
-
thoughtSignature?: string;
|
|
5
|
-
functionCall?: {
|
|
6
|
-
name: string;
|
|
7
|
-
args?: Record<string, unknown>;
|
|
8
|
-
id?: string;
|
|
9
|
-
};
|
|
10
|
-
functionResponse?: {
|
|
11
|
-
name: string;
|
|
12
|
-
response: Record<string, unknown>;
|
|
13
|
-
id?: string;
|
|
14
|
-
};
|
|
15
|
-
inlineData?: {
|
|
16
|
-
mimeType: string;
|
|
17
|
-
data: string;
|
|
18
|
-
};
|
|
19
|
-
fileData?: {
|
|
20
|
-
fileUri: string;
|
|
21
|
-
mimeType?: string;
|
|
22
|
-
};
|
|
23
|
-
executableCode?: {
|
|
24
|
-
language: string;
|
|
25
|
-
code: string;
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
export interface GeminiWireUsage {
|
|
29
|
-
promptTokenCount?: number;
|
|
30
|
-
candidatesTokenCount?: number;
|
|
31
|
-
thoughtsTokenCount?: number;
|
|
32
|
-
cachedContentTokenCount?: number;
|
|
33
|
-
toolUsePromptTokenCount?: number;
|
|
34
|
-
totalTokenCount?: number;
|
|
35
|
-
}
|
|
36
|
-
export interface GeminiWireResponse {
|
|
37
|
-
candidates?: Array<{
|
|
38
|
-
content?: {
|
|
39
|
-
role: 'model';
|
|
40
|
-
parts: GeminiWirePart[];
|
|
41
|
-
};
|
|
42
|
-
finishReason?: string;
|
|
43
|
-
index?: number;
|
|
44
|
-
}>;
|
|
45
|
-
promptFeedback?: {
|
|
46
|
-
blockReason?: string;
|
|
47
|
-
};
|
|
48
|
-
usageMetadata?: GeminiWireUsage;
|
|
49
|
-
modelVersion?: string;
|
|
50
|
-
responseId?: string;
|
|
51
|
-
}
|
|
52
|
-
export declare function textPart(text: string, thoughtSignature?: string): GeminiWirePart;
|
|
53
|
-
export declare function thoughtPart(text: string, thoughtSignature?: string): GeminiWirePart;
|
|
54
|
-
export declare function functionCallPart(name: string, args: Record<string, unknown>, opts?: {
|
|
55
|
-
id?: string;
|
|
56
|
-
thoughtSignature?: string;
|
|
57
|
-
}): GeminiWirePart;
|
|
58
|
-
/** A fresh opaque signature, base64 like the real ones. */
|
|
59
|
-
export declare function signature(): string;
|
|
60
|
-
export declare function usageFixture(patch?: GeminiWireUsage): GeminiWireUsage;
|
|
61
|
-
export interface ResponseFixtureOptions {
|
|
62
|
-
model?: string;
|
|
63
|
-
parts: GeminiWirePart[];
|
|
64
|
-
finishReason?: string;
|
|
65
|
-
usage?: GeminiWireUsage;
|
|
66
|
-
responseId?: string;
|
|
67
|
-
}
|
|
68
|
-
/** A complete `GenerateContentResponse` body. `finishReason` defaults to `STOP`. */
|
|
69
|
-
export declare function responseFixture(opts: ResponseFixtureOptions): GeminiWireResponse;
|
|
70
|
-
/**
|
|
71
|
-
* The `streamGenerateContent` chunks for `response`: each text/thought part
|
|
72
|
-
* split into `chunkSize`-character slices (the signature on the last slice),
|
|
73
|
-
* each other part whole, then a final chunk with an empty text part, the
|
|
74
|
-
* finish reason and the full usage. Every chunk repeats the response id and
|
|
75
|
-
* model version, as the real API's do.
|
|
76
|
-
*/
|
|
77
|
-
export declare function streamChunksFor(response: GeminiWireResponse, chunkSize?: number): GeminiWireResponse[];
|
|
78
|
-
/** A deterministic unit-ish vector for `text`, `length` long — the same text always embeds the same. */
|
|
79
|
-
export declare function embeddingFor(text: string, length: number): number[];
|
|
80
|
-
//# sourceMappingURL=gemini-fixtures.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-fixtures.d.ts","sourceRoot":"","sources":["../../../../../src/ai/providers/gemini/testing/gemini-fixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// Builders for Gemini API wire objects in tests (issue #447). Not imported by
|
|
3
|
-
// production code.
|
|
4
|
-
//
|
|
5
|
-
// These are the REST shapes (`generativelanguage.googleapis.com/v1beta`), not
|
|
6
|
-
// the SDK's classes: the mock transport sends them over HTTP and the real SDK
|
|
7
|
-
// parses them, exactly as it would the real API's. `streamChunksFor` turns
|
|
8
|
-
// one response into the chunk sequence `streamGenerateContent?alt=sse` sends
|
|
9
|
-
// for it — text split into slices, a function call whole, and a final chunk
|
|
10
|
-
// carrying the finish reason and the full usage — so a streamed and a
|
|
11
|
-
// non-streamed call can be driven from the same fixture.
|
|
12
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.textPart = textPart;
|
|
14
|
-
exports.thoughtPart = thoughtPart;
|
|
15
|
-
exports.functionCallPart = functionCallPart;
|
|
16
|
-
exports.signature = signature;
|
|
17
|
-
exports.usageFixture = usageFixture;
|
|
18
|
-
exports.responseFixture = responseFixture;
|
|
19
|
-
exports.streamChunksFor = streamChunksFor;
|
|
20
|
-
exports.embeddingFor = embeddingFor;
|
|
21
|
-
let counter = 0;
|
|
22
|
-
function textPart(text, thoughtSignature) {
|
|
23
|
-
return { text, ...(thoughtSignature ? { thoughtSignature } : {}) };
|
|
24
|
-
}
|
|
25
|
-
function thoughtPart(text, thoughtSignature) {
|
|
26
|
-
return { text, thought: true, ...(thoughtSignature ? { thoughtSignature } : {}) };
|
|
27
|
-
}
|
|
28
|
-
function functionCallPart(name, args, opts = {}) {
|
|
29
|
-
return {
|
|
30
|
-
functionCall: { name, args, ...(opts.id ? { id: opts.id } : {}) },
|
|
31
|
-
...(opts.thoughtSignature ? { thoughtSignature: opts.thoughtSignature } : {}),
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
/** A fresh opaque signature, base64 like the real ones. */
|
|
35
|
-
function signature() {
|
|
36
|
-
return Buffer.from(`sig-${++counter}-${Math.random()}`).toString('base64');
|
|
37
|
-
}
|
|
38
|
-
function usageFixture(patch = {}) {
|
|
39
|
-
return { promptTokenCount: 12, candidatesTokenCount: 7, totalTokenCount: 19, ...patch };
|
|
40
|
-
}
|
|
41
|
-
/** A complete `GenerateContentResponse` body. `finishReason` defaults to `STOP`. */
|
|
42
|
-
function responseFixture(opts) {
|
|
43
|
-
return {
|
|
44
|
-
candidates: [
|
|
45
|
-
{
|
|
46
|
-
content: { role: 'model', parts: opts.parts },
|
|
47
|
-
finishReason: opts.finishReason ?? 'STOP',
|
|
48
|
-
index: 0,
|
|
49
|
-
},
|
|
50
|
-
],
|
|
51
|
-
usageMetadata: usageFixture(opts.usage),
|
|
52
|
-
modelVersion: opts.model ?? 'gemini-2.5-flash',
|
|
53
|
-
responseId: opts.responseId ?? `resp_${++counter}`,
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
function slices(text, size) {
|
|
57
|
-
const out = [];
|
|
58
|
-
for (let i = 0; i < text.length; i += size)
|
|
59
|
-
out.push(text.slice(i, i + size));
|
|
60
|
-
return out.length > 0 ? out : [''];
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* The `streamGenerateContent` chunks for `response`: each text/thought part
|
|
64
|
-
* split into `chunkSize`-character slices (the signature on the last slice),
|
|
65
|
-
* each other part whole, then a final chunk with an empty text part, the
|
|
66
|
-
* finish reason and the full usage. Every chunk repeats the response id and
|
|
67
|
-
* model version, as the real API's do.
|
|
68
|
-
*/
|
|
69
|
-
function streamChunksFor(response, chunkSize = 5) {
|
|
70
|
-
const candidate = response.candidates?.[0];
|
|
71
|
-
const head = { modelVersion: response.modelVersion, responseId: response.responseId };
|
|
72
|
-
const chunks = [];
|
|
73
|
-
if (!candidate) {
|
|
74
|
-
return [{ ...head, promptFeedback: response.promptFeedback, usageMetadata: response.usageMetadata }];
|
|
75
|
-
}
|
|
76
|
-
for (const part of candidate.content?.parts ?? []) {
|
|
77
|
-
if (typeof part.text === 'string') {
|
|
78
|
-
const pieces = slices(part.text, chunkSize);
|
|
79
|
-
pieces.forEach((piece, i) => {
|
|
80
|
-
const last = i === pieces.length - 1;
|
|
81
|
-
const slice = {
|
|
82
|
-
text: piece,
|
|
83
|
-
...(part.thought ? { thought: true } : {}),
|
|
84
|
-
...(last && part.thoughtSignature ? { thoughtSignature: part.thoughtSignature } : {}),
|
|
85
|
-
};
|
|
86
|
-
chunks.push({
|
|
87
|
-
...head,
|
|
88
|
-
candidates: [{ content: { role: 'model', parts: [slice] }, index: 0 }],
|
|
89
|
-
usageMetadata: { promptTokenCount: response.usageMetadata?.promptTokenCount },
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
chunks.push({
|
|
95
|
-
...head,
|
|
96
|
-
candidates: [{ content: { role: 'model', parts: [part] }, index: 0 }],
|
|
97
|
-
usageMetadata: { promptTokenCount: response.usageMetadata?.promptTokenCount },
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
chunks.push({
|
|
102
|
-
...head,
|
|
103
|
-
candidates: [{ content: { role: 'model', parts: [{ text: '' }] }, finishReason: candidate.finishReason, index: 0 }],
|
|
104
|
-
usageMetadata: response.usageMetadata,
|
|
105
|
-
});
|
|
106
|
-
return chunks;
|
|
107
|
-
}
|
|
108
|
-
/** A deterministic unit-ish vector for `text`, `length` long — the same text always embeds the same. */
|
|
109
|
-
function embeddingFor(text, length) {
|
|
110
|
-
let seed = 0;
|
|
111
|
-
for (const char of text)
|
|
112
|
-
seed = (seed * 31 + char.charCodeAt(0)) >>> 0;
|
|
113
|
-
return Array.from({ length }, () => {
|
|
114
|
-
seed = (seed * 1103515245 + 12345) >>> 0;
|
|
115
|
-
return Number(((seed / 0xffffffff) * 2 - 1).toFixed(6));
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
//# sourceMappingURL=gemini-fixtures.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-fixtures.js","sourceRoot":"","sources":["../../../../../src/ai/providers/gemini/testing/gemini-fixtures.ts"],"names":[],"mappings":"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"}
|