@langchain/google 0.2.11 → 0.2.13
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 +29 -0
- package/dist/chat_models/{api-types.d.ts → api_types/generate_content.d.cts} +198 -200
- package/dist/chat_models/{api-types.d.cts → api_types/generate_content.d.ts} +198 -200
- package/dist/chat_models/api_types/interactions.d.cts +1423 -0
- package/dist/chat_models/api_types/interactions.d.ts +1423 -0
- package/dist/chat_models/base.cjs +60 -403
- package/dist/chat_models/base.cjs.map +1 -1
- package/dist/chat_models/base.d.cts +13 -200
- package/dist/chat_models/base.d.ts +15 -202
- package/dist/chat_models/base.js +61 -402
- package/dist/chat_models/base.js.map +1 -1
- package/dist/chat_models/handlers/base.cjs +62 -0
- package/dist/chat_models/handlers/base.cjs.map +1 -0
- package/dist/chat_models/handlers/base.d.cts +46 -0
- package/dist/chat_models/handlers/base.d.ts +46 -0
- package/dist/chat_models/handlers/base.js +62 -0
- package/dist/chat_models/handlers/base.js.map +1 -0
- package/dist/chat_models/handlers/generate_content.cjs +344 -0
- package/dist/chat_models/handlers/generate_content.cjs.map +1 -0
- package/dist/chat_models/handlers/generate_content.d.cts +32 -0
- package/dist/chat_models/handlers/generate_content.d.ts +32 -0
- package/dist/chat_models/handlers/generate_content.js +344 -0
- package/dist/chat_models/handlers/generate_content.js.map +1 -0
- package/dist/chat_models/handlers/index.cjs +6 -0
- package/dist/chat_models/handlers/index.d.cts +4 -0
- package/dist/chat_models/handlers/index.d.ts +4 -0
- package/dist/chat_models/handlers/index.js +4 -0
- package/dist/chat_models/handlers/interactions.cjs +303 -0
- package/dist/chat_models/handlers/interactions.cjs.map +1 -0
- package/dist/chat_models/handlers/interactions.d.cts +33 -0
- package/dist/chat_models/handlers/interactions.d.ts +33 -0
- package/dist/chat_models/handlers/interactions.js +303 -0
- package/dist/chat_models/handlers/interactions.js.map +1 -0
- package/dist/chat_models/index.cjs +14 -6
- package/dist/chat_models/index.cjs.map +1 -1
- package/dist/chat_models/index.d.cts +7 -3
- package/dist/chat_models/index.d.ts +7 -3
- package/dist/chat_models/index.js +8 -4
- package/dist/chat_models/index.js.map +1 -1
- package/dist/chat_models/node.cjs +4 -5
- package/dist/chat_models/node.cjs.map +1 -1
- package/dist/chat_models/node.d.cts +1 -3
- package/dist/chat_models/node.d.ts +1 -3
- package/dist/chat_models/node.js +3 -4
- package/dist/chat_models/node.js.map +1 -1
- package/dist/chat_models/profiles.cjs +1 -2
- package/dist/chat_models/profiles.js +1 -2
- package/dist/chat_models/types.cjs +1 -2
- package/dist/chat_models/types.cjs.map +1 -1
- package/dist/chat_models/types.d.cts +776 -88
- package/dist/chat_models/types.d.ts +776 -88
- package/dist/chat_models/types.js +1 -2
- package/dist/chat_models/types.js.map +1 -1
- package/dist/clients/index.cjs +3 -4
- package/dist/clients/index.d.cts +0 -2
- package/dist/clients/index.d.ts +0 -2
- package/dist/clients/index.js +3 -4
- package/dist/clients/node.cjs +4 -5
- package/dist/clients/node.d.cts +0 -2
- package/dist/clients/node.d.ts +0 -2
- package/dist/clients/node.js +4 -5
- package/dist/const.cjs +1 -2
- package/dist/const.js +1 -2
- package/dist/converters/{messages.cjs → generate_content/messages.cjs} +4 -5
- package/dist/converters/generate_content/messages.cjs.map +1 -0
- package/dist/converters/{messages.js → generate_content/messages.js} +4 -5
- package/dist/converters/generate_content/messages.js.map +1 -0
- package/dist/converters/generate_content/params.cjs +135 -0
- package/dist/converters/generate_content/params.cjs.map +1 -0
- package/dist/converters/generate_content/params.js +131 -0
- package/dist/converters/generate_content/params.js.map +1 -0
- package/dist/{utils → converters/generate_content}/stream_events.cjs +2 -3
- package/dist/converters/generate_content/stream_events.cjs.map +1 -0
- package/dist/{utils → converters/generate_content}/stream_events.js +2 -3
- package/dist/converters/generate_content/stream_events.js.map +1 -0
- package/dist/converters/{tools.cjs → generate_content/tools.cjs} +4 -5
- package/dist/converters/generate_content/tools.cjs.map +1 -0
- package/dist/converters/{tools.js → generate_content/tools.js} +4 -5
- package/dist/converters/generate_content/tools.js.map +1 -0
- package/dist/converters/interactions/messages.cjs +766 -0
- package/dist/converters/interactions/messages.cjs.map +1 -0
- package/dist/converters/interactions/messages.js +759 -0
- package/dist/converters/interactions/messages.js.map +1 -0
- package/dist/converters/interactions/params.cjs +244 -0
- package/dist/converters/interactions/params.cjs.map +1 -0
- package/dist/converters/interactions/params.js +237 -0
- package/dist/converters/interactions/params.js.map +1 -0
- package/dist/converters/interactions/stream_events.cjs +769 -0
- package/dist/converters/interactions/stream_events.cjs.map +1 -0
- package/dist/converters/interactions/stream_events.js +768 -0
- package/dist/converters/interactions/stream_events.js.map +1 -0
- package/dist/converters/interactions/tools.cjs +229 -0
- package/dist/converters/interactions/tools.cjs.map +1 -0
- package/dist/converters/interactions/tools.js +228 -0
- package/dist/converters/interactions/tools.js.map +1 -0
- package/dist/converters/{params.cjs → shared/params.cjs} +8 -94
- package/dist/converters/shared/params.cjs.map +1 -0
- package/dist/converters/{params.js → shared/params.js} +8 -92
- package/dist/converters/shared/params.js.map +1 -0
- package/dist/index.cjs +8 -0
- package/dist/index.d.cts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +5 -1
- package/dist/node.cjs +1 -1
- package/dist/node.d.cts +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/node.js +1 -1
- package/dist/utils/errors.cjs +1 -2
- package/dist/utils/errors.js +1 -2
- package/dist/utils/gcp-auth.cjs +3 -4
- package/dist/utils/gcp-auth.d.cts +0 -2
- package/dist/utils/gcp-auth.d.ts +0 -2
- package/dist/utils/gcp-auth.js +3 -4
- package/dist/utils/handler.cjs +1 -2
- package/dist/utils/handler.d.cts +0 -2
- package/dist/utils/handler.d.ts +0 -2
- package/dist/utils/handler.js +1 -2
- package/dist/utils/metadata.cjs +9 -2
- package/dist/utils/metadata.cjs.map +1 -1
- package/dist/utils/metadata.js +9 -3
- package/dist/utils/metadata.js.map +1 -1
- package/dist/utils/misc.cjs +1 -2
- package/dist/utils/misc.cjs.map +1 -1
- package/dist/utils/misc.d.cts +2 -3
- package/dist/utils/misc.d.ts +2 -3
- package/dist/utils/misc.js +1 -2
- package/dist/utils/misc.js.map +1 -1
- package/dist/utils/stream.cjs +1 -2
- package/dist/utils/stream.js +1 -2
- package/package.json +12 -10
- package/dist/converters/messages.cjs.map +0 -1
- package/dist/converters/messages.js.map +0 -1
- package/dist/converters/params.cjs.map +0 -1
- package/dist/converters/params.js.map +0 -1
- package/dist/converters/tools.cjs.map +0 -1
- package/dist/converters/tools.js.map +0 -1
- package/dist/utils/stream_events.cjs.map +0 -1
- package/dist/utils/stream_events.js.map +0 -1
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { settableServiceTier } from "../../chat_models/types.js";
|
|
2
|
+
import { convertFieldsToSpeechConfig, convertFieldsToThinkingConfig, mapDetailToMediaResolution } from "../generate_content/params.js";
|
|
3
|
+
import { convertReasoningTokensToReasoningEffort } from "../shared/params.js";
|
|
4
|
+
import { isInteropZodSchema } from "@langchain/core/utils/types";
|
|
5
|
+
import { isSerializableSchema } from "@langchain/core/utils/standard_schema";
|
|
6
|
+
import { toJsonSchema } from "@langchain/core/utils/json_schema";
|
|
7
|
+
// src/converters/interactions/params.ts
|
|
8
|
+
/**
|
|
9
|
+
* Merges constructor parameters and per-call options for the Interactions API,
|
|
10
|
+
* giving precedence to `b` over `a` for each field.
|
|
11
|
+
*/
|
|
12
|
+
function combineInteractionsFields(a, b, ...rest) {
|
|
13
|
+
const combined = {
|
|
14
|
+
temperature: b.temperature ?? a.temperature,
|
|
15
|
+
topP: b.topP ?? a.topP,
|
|
16
|
+
topK: b.topK ?? a.topK,
|
|
17
|
+
maxOutputTokens: b.maxOutputTokens ?? a.maxOutputTokens,
|
|
18
|
+
presencePenalty: b.presencePenalty ?? a.presencePenalty,
|
|
19
|
+
frequencyPenalty: b.frequencyPenalty ?? a.frequencyPenalty,
|
|
20
|
+
stopSequences: b.stopSequences ?? a.stopSequences,
|
|
21
|
+
seed: b.seed ?? a.seed,
|
|
22
|
+
safetySettings: b.safetySettings ?? a.safetySettings,
|
|
23
|
+
responseSchema: b.responseSchema ?? a.responseSchema,
|
|
24
|
+
responseMimeType: b.responseMimeType ?? a.responseMimeType,
|
|
25
|
+
tools: b.tools ?? a.tools,
|
|
26
|
+
responseModalities: b.responseModalities ?? a.responseModalities,
|
|
27
|
+
thinkingConfig: b.thinkingConfig ?? a.thinkingConfig,
|
|
28
|
+
speechConfig: b.speechConfig ?? a.speechConfig,
|
|
29
|
+
imageConfig: b.imageConfig ?? a.imageConfig,
|
|
30
|
+
mediaResolution: b.mediaResolution ?? a.mediaResolution,
|
|
31
|
+
detail: b.detail ?? a.detail,
|
|
32
|
+
maxReasoningTokens: b.maxReasoningTokens ?? a.maxReasoningTokens,
|
|
33
|
+
thinkingBudget: b.thinkingBudget ?? a.thinkingBudget,
|
|
34
|
+
reasoningEffort: b.reasoningEffort ?? a.reasoningEffort,
|
|
35
|
+
thinkingLevel: b.thinkingLevel ?? a.thinkingLevel,
|
|
36
|
+
serviceTier: b.serviceTier ?? a.serviceTier,
|
|
37
|
+
responseFormat: b.responseFormat ?? a.responseFormat,
|
|
38
|
+
previousInteractionId: b.previousInteractionId ?? a.previousInteractionId,
|
|
39
|
+
store: b.store ?? a.store,
|
|
40
|
+
background: b.background ?? a.background,
|
|
41
|
+
agent: b.agent ?? a.agent,
|
|
42
|
+
agentConfig: b.agentConfig ?? a.agentConfig,
|
|
43
|
+
webhookConfig: b.webhookConfig ?? a.webhookConfig
|
|
44
|
+
};
|
|
45
|
+
if (rest.length > 0) return combineInteractionsFields(combined, rest[0], ...rest.slice(1));
|
|
46
|
+
return combined;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Converts reasoning/thinking fields (`reasoningEffort`, `thinkingLevel`,
|
|
50
|
+
* `maxReasoningTokens`, `thinkingBudget`, or `thinkingConfig`) into the
|
|
51
|
+
* Interactions API `thinking_level` and `thinking_summaries` fields on
|
|
52
|
+
* `generation_config`.
|
|
53
|
+
*/
|
|
54
|
+
function convertFieldsToInteractionsThinking(model, fields) {
|
|
55
|
+
const explicitThinkingConfig = fields.thinkingConfig;
|
|
56
|
+
const computedThinkingConfig = convertFieldsToThinkingConfig(model, fields);
|
|
57
|
+
const thinkingConfig = explicitThinkingConfig ?? computedThinkingConfig;
|
|
58
|
+
if (!thinkingConfig) return {};
|
|
59
|
+
let thinkingSummaries;
|
|
60
|
+
if (typeof thinkingConfig.includeThoughts === "boolean") thinkingSummaries = thinkingConfig.includeThoughts ? "auto" : "none";
|
|
61
|
+
let levelRaw = thinkingConfig.thinkingLevel ?? computedThinkingConfig?.thinkingLevel ?? fields.reasoningEffort ?? fields.thinkingLevel;
|
|
62
|
+
if (!levelRaw && typeof thinkingConfig.thinkingBudget === "number") levelRaw = convertReasoningTokensToReasoningEffort(model, thinkingConfig.thinkingBudget);
|
|
63
|
+
const normalizedLevel = levelRaw?.toLowerCase();
|
|
64
|
+
return {
|
|
65
|
+
...normalizedLevel ? { thinking_level: normalizedLevel } : {},
|
|
66
|
+
...thinkingSummaries ? { thinking_summaries: thinkingSummaries } : {}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Converts `speechConfig` (either simplified or GenerateContent `SpeechConfig`)
|
|
71
|
+
* into the Interactions API `Array<Gemini.Interactions.SpeechConfig>` format.
|
|
72
|
+
*/
|
|
73
|
+
function convertFieldsToInteractionsSpeechConfig(fields) {
|
|
74
|
+
if (typeof fields.speechConfig === "undefined") return;
|
|
75
|
+
if (Array.isArray(fields.speechConfig) && fields.speechConfig.every((item) => typeof item === "object" && item !== null && ("voice" in item || "language" in item || "speaker" in item))) return fields.speechConfig;
|
|
76
|
+
const genSpeechConfig = convertFieldsToSpeechConfig(fields);
|
|
77
|
+
if (!genSpeechConfig) return;
|
|
78
|
+
const language = genSpeechConfig.languageCode;
|
|
79
|
+
if (genSpeechConfig.multiSpeakerVoiceConfig?.speakerVoiceConfigs) return genSpeechConfig.multiSpeakerVoiceConfig.speakerVoiceConfigs.map((speakerConfig) => ({
|
|
80
|
+
...speakerConfig.speaker ? { speaker: speakerConfig.speaker } : {},
|
|
81
|
+
...speakerConfig.voiceConfig?.prebuiltVoiceConfig?.voiceName ? { voice: speakerConfig.voiceConfig.prebuiltVoiceConfig.voiceName } : {},
|
|
82
|
+
...language ? { language } : {}
|
|
83
|
+
}));
|
|
84
|
+
const voice = genSpeechConfig.voiceConfig?.prebuiltVoiceConfig?.voiceName;
|
|
85
|
+
if (voice || language) return [{
|
|
86
|
+
...voice ? { voice } : {},
|
|
87
|
+
...language ? { language } : {}
|
|
88
|
+
}];
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Converts a GenerateContent `ImageConfig` (camelCase) or Interactions `ImageResponseFormat`
|
|
92
|
+
* (snake_case) into an Interactions `ImageResponseFormat` (omitting `type`).
|
|
93
|
+
*/
|
|
94
|
+
function convertFieldsToInteractionsImageConfig(imageConfig) {
|
|
95
|
+
if (!imageConfig) return;
|
|
96
|
+
const raw = imageConfig;
|
|
97
|
+
const aspectRatio = raw.aspect_ratio ?? raw.aspectRatio;
|
|
98
|
+
const imageSize = raw.image_size ?? raw.imageSize;
|
|
99
|
+
const mimeType = raw.mime_type;
|
|
100
|
+
const delivery = raw.delivery;
|
|
101
|
+
if (!aspectRatio && !imageSize && !mimeType && !delivery) return;
|
|
102
|
+
return {
|
|
103
|
+
...aspectRatio ? { aspect_ratio: aspectRatio } : {},
|
|
104
|
+
...imageSize ? { image_size: imageSize } : {},
|
|
105
|
+
...mimeType ? { mime_type: mimeType } : {},
|
|
106
|
+
...delivery ? { delivery } : {}
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Maps `mediaResolution` (GenerateContent enum or lowercase) or `detail` ("low" | "high" | "auto")
|
|
111
|
+
* to the Interactions API `MediaResolution` ("low" | "medium" | "high" | "ultra_high").
|
|
112
|
+
*/
|
|
113
|
+
function convertMediaResolutionToInteractions(mediaResolution, detail) {
|
|
114
|
+
const resolved = mediaResolution ?? mapDetailToMediaResolution(detail);
|
|
115
|
+
if (!resolved) return;
|
|
116
|
+
const normalized = resolved.toLowerCase();
|
|
117
|
+
if (normalized === "media_resolution_low" || normalized === "low") return "low";
|
|
118
|
+
if (normalized === "media_resolution_medium" || normalized === "medium") return "medium";
|
|
119
|
+
if (normalized === "media_resolution_high" || normalized === "high") return "high";
|
|
120
|
+
if (normalized === "media_resolution_ultra_high" || normalized === "ultra_high") return "ultra_high";
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Maps GenerateContent `SafetySetting[]` (`HARM_CATEGORY_*`, `BLOCK_*`) into
|
|
124
|
+
* Interactions API `SafetySetting[]` (`{ type, threshold }` in lowercase snake_case).
|
|
125
|
+
*/
|
|
126
|
+
function convertSafetySettingsToInteractions(safetySettings) {
|
|
127
|
+
if (!safetySettings || safetySettings.length === 0) return;
|
|
128
|
+
const result = [];
|
|
129
|
+
for (const setting of safetySettings) {
|
|
130
|
+
const rawSetting = setting;
|
|
131
|
+
const rawCategory = (rawSetting.category ?? rawSetting.type ?? "").toLowerCase();
|
|
132
|
+
const type = rawCategory.startsWith("harm_category_") ? rawCategory.slice(14) : rawCategory;
|
|
133
|
+
const rawThreshold = (rawSetting.threshold ?? "").toLowerCase();
|
|
134
|
+
const threshold = rawThreshold === "harm_block_threshold_unspecified" || !rawThreshold ? void 0 : rawThreshold;
|
|
135
|
+
if (type && threshold && type !== "unspecified") result.push({
|
|
136
|
+
type,
|
|
137
|
+
threshold,
|
|
138
|
+
...rawSetting.method ? { method: rawSetting.method } : {}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return result.length > 0 ? result : void 0;
|
|
142
|
+
}
|
|
143
|
+
function convertImageFieldsToFormat(fields) {
|
|
144
|
+
return {
|
|
145
|
+
type: "image",
|
|
146
|
+
...convertFieldsToInteractionsImageConfig(fields.imageConfig) ?? {},
|
|
147
|
+
...fields.responseMimeType?.startsWith("image/") ? { mime_type: fields.responseMimeType } : {}
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
function convertAudioFieldsToFormat(fields) {
|
|
151
|
+
return {
|
|
152
|
+
type: "audio",
|
|
153
|
+
...fields.responseMimeType?.startsWith("audio/") ? { mime_type: fields.responseMimeType } : {}
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function convertVideoFieldsToFormat(fields) {
|
|
157
|
+
return {
|
|
158
|
+
type: "video",
|
|
159
|
+
...fields.responseMimeType?.startsWith("video/") ? { mime_type: fields.responseMimeType } : {}
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function fieldsToJsonSchema(fields) {
|
|
163
|
+
if (fields.responseSchema) {
|
|
164
|
+
if (isInteropZodSchema(fields.responseSchema) || isSerializableSchema(fields.responseSchema)) return toJsonSchema(fields.responseSchema);
|
|
165
|
+
else return fields.responseSchema;
|
|
166
|
+
} else return;
|
|
167
|
+
}
|
|
168
|
+
function convertTextFieldsToFormat(fields) {
|
|
169
|
+
const jsonSchema = fieldsToJsonSchema(fields);
|
|
170
|
+
const textMimeType = fields.responseMimeType === "application/json" || fields.responseMimeType === "text/plain" || fields.responseMimeType?.startsWith("text/") ? fields.responseMimeType : jsonSchema ? "application/json" : void 0;
|
|
171
|
+
return {
|
|
172
|
+
type: "text",
|
|
173
|
+
...textMimeType ? { mime_type: textMimeType } : {},
|
|
174
|
+
...jsonSchema ? { schema: jsonSchema } : {}
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function convertModalityFieldsToFormat(modality, fields) {
|
|
178
|
+
switch (modality.toUpperCase()) {
|
|
179
|
+
case "IMAGE": return convertImageFieldsToFormat(fields);
|
|
180
|
+
case "AUDIO": return convertAudioFieldsToFormat(fields);
|
|
181
|
+
case "VIDEO": return convertVideoFieldsToFormat(fields);
|
|
182
|
+
case "TEXT": return convertTextFieldsToFormat(fields);
|
|
183
|
+
default: return;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Translates `responseFormat`, `responseSchema`, `responseModalities`, `responseMimeType`,
|
|
188
|
+
* and `imageConfig` into the Interactions API `response_format` field.
|
|
189
|
+
*
|
|
190
|
+
* In the Interactions API OpenAPI specification, top-level `response_mime_type`,
|
|
191
|
+
* top-level `response_modalities`, and `generation_config.image_config` are all
|
|
192
|
+
* marked `deprecated: true` (and Vertex AI / `gcp` rejects `response_mime_type`
|
|
193
|
+
* and `response_modalities` as unknown parameters). All of them are superseded by
|
|
194
|
+
* `response_format` (`ResponseFormat | Array<ResponseFormat>`):
|
|
195
|
+
* - Single or multiple `responseModalities` map to a single `ResponseFormat` object
|
|
196
|
+
* or an array of `ResponseFormat` objects (`{ type: "text" | "image" | "audio" | "video", ... }`),
|
|
197
|
+
* folding in `imageConfig`, `responseMimeType`, and `responseSchema` where applicable.
|
|
198
|
+
* - `responseSchema` without `responseModalities` is passed directly as a raw JSON
|
|
199
|
+
* Schema object in `response_format` (one of the variants in `ResponseFormat`'s `anyOf`
|
|
200
|
+
* in the OpenAPI spec; verified with `gai` and assumed to behave the same on `gcp`,
|
|
201
|
+
* though the spec also defines `{ type: "text", mime_type: "application/json", schema }`).
|
|
202
|
+
* - Standalone `responseMimeType` or `imageConfig` maps to the corresponding typed
|
|
203
|
+
* `ResponseFormat` object (`TextResponseFormat`, `ImageResponseFormat`, etc.).
|
|
204
|
+
*/
|
|
205
|
+
function convertFieldsToInteractionsResponseFormat(fields) {
|
|
206
|
+
if (fields.responseFormat) return fields.responseFormat;
|
|
207
|
+
if (fields.responseModalities && fields.responseModalities.length > 0) {
|
|
208
|
+
const formats = [];
|
|
209
|
+
for (const modality of fields.responseModalities) {
|
|
210
|
+
const format = convertModalityFieldsToFormat(modality, fields);
|
|
211
|
+
if (format) formats.push(format);
|
|
212
|
+
}
|
|
213
|
+
if (formats.length === 1) return formats[0];
|
|
214
|
+
if (formats.length > 1) return formats;
|
|
215
|
+
}
|
|
216
|
+
const jsonSchema = fieldsToJsonSchema(fields);
|
|
217
|
+
if (jsonSchema) return jsonSchema;
|
|
218
|
+
if (fields.responseMimeType) {
|
|
219
|
+
if (fields.responseMimeType.startsWith("image/")) return convertImageFieldsToFormat(fields);
|
|
220
|
+
if (fields.responseMimeType.startsWith("audio/")) return convertAudioFieldsToFormat(fields);
|
|
221
|
+
if (fields.responseMimeType.startsWith("video/")) return convertVideoFieldsToFormat(fields);
|
|
222
|
+
if (fields.responseMimeType === "application/json" || fields.responseMimeType === "text/plain" || fields.responseMimeType.startsWith("text/")) return convertTextFieldsToFormat(fields);
|
|
223
|
+
}
|
|
224
|
+
if (convertFieldsToInteractionsImageConfig(fields.imageConfig)) return convertImageFieldsToFormat(fields);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Builds an object containing `service_tier` when supported by the target platform.
|
|
228
|
+
*/
|
|
229
|
+
function convertFieldsToInteractionsServiceTier(platform, fields) {
|
|
230
|
+
if (platform === "gcp") return {};
|
|
231
|
+
const serviceTier = fields.serviceTier;
|
|
232
|
+
if (!serviceTier || !settableServiceTier.includes(serviceTier)) return {};
|
|
233
|
+
return { service_tier: serviceTier };
|
|
234
|
+
}
|
|
235
|
+
export { combineInteractionsFields, convertFieldsToInteractionsImageConfig, convertFieldsToInteractionsResponseFormat, convertFieldsToInteractionsServiceTier, convertFieldsToInteractionsSpeechConfig, convertFieldsToInteractionsThinking, convertMediaResolutionToInteractions, convertSafetySettingsToInteractions };
|
|
236
|
+
|
|
237
|
+
//# sourceMappingURL=params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"params.js","names":[],"sources":["../../../src/converters/interactions/params.ts"],"sourcesContent":["import { isInteropZodSchema } from \"@langchain/core/utils/types\";\nimport { isSerializableSchema } from \"@langchain/core/utils/standard_schema\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport {\n type ChatGoogleFields,\n type GooglePlatformType,\n type InteractionsFields,\n settableServiceTier,\n type Gemini,\n} from \"../../chat_models/types.js\";\nimport {\n convertFieldsToSpeechConfig,\n convertFieldsToThinkingConfig,\n mapDetailToMediaResolution,\n} from \"../generate_content/params.js\";\nimport { convertReasoningTokensToReasoningEffort } from \"../shared/params.js\";\n\n/**\n * Merges constructor parameters and per-call options for the Interactions API,\n * giving precedence to `b` over `a` for each field.\n */\nexport function combineInteractionsFields(\n a: InteractionsFields,\n b: InteractionsFields,\n ...rest: InteractionsFields[]\n): InteractionsFields {\n const combined: InteractionsFields = {\n temperature: b.temperature ?? a.temperature,\n topP: b.topP ?? a.topP,\n topK: b.topK ?? a.topK,\n maxOutputTokens: b.maxOutputTokens ?? a.maxOutputTokens,\n presencePenalty: b.presencePenalty ?? a.presencePenalty,\n frequencyPenalty: b.frequencyPenalty ?? a.frequencyPenalty,\n stopSequences: b.stopSequences ?? a.stopSequences,\n seed: b.seed ?? a.seed,\n safetySettings: b.safetySettings ?? a.safetySettings,\n responseSchema: b.responseSchema ?? a.responseSchema,\n responseMimeType: b.responseMimeType ?? a.responseMimeType,\n tools: b.tools ?? a.tools,\n responseModalities: b.responseModalities ?? a.responseModalities,\n thinkingConfig: b.thinkingConfig ?? a.thinkingConfig,\n speechConfig: b.speechConfig ?? a.speechConfig,\n imageConfig: b.imageConfig ?? a.imageConfig,\n mediaResolution: b.mediaResolution ?? a.mediaResolution,\n detail: b.detail ?? a.detail,\n maxReasoningTokens: b.maxReasoningTokens ?? a.maxReasoningTokens,\n thinkingBudget: b.thinkingBudget ?? a.thinkingBudget,\n reasoningEffort: b.reasoningEffort ?? a.reasoningEffort,\n thinkingLevel: b.thinkingLevel ?? a.thinkingLevel,\n serviceTier: b.serviceTier ?? a.serviceTier,\n responseFormat: b.responseFormat ?? a.responseFormat,\n previousInteractionId: b.previousInteractionId ?? a.previousInteractionId,\n store: b.store ?? a.store,\n background: b.background ?? a.background,\n agent: b.agent ?? a.agent,\n agentConfig: b.agentConfig ?? a.agentConfig,\n webhookConfig: b.webhookConfig ?? a.webhookConfig,\n };\n if (rest.length > 0) {\n return combineInteractionsFields(combined, rest[0], ...rest.slice(1));\n }\n return combined;\n}\n\n/**\n * Converts reasoning/thinking fields (`reasoningEffort`, `thinkingLevel`,\n * `maxReasoningTokens`, `thinkingBudget`, or `thinkingConfig`) into the\n * Interactions API `thinking_level` and `thinking_summaries` fields on\n * `generation_config`.\n */\nexport function convertFieldsToInteractionsThinking(\n model: string,\n fields: ChatGoogleFields\n): {\n thinking_level?: Gemini.Interactions.ThinkingLevel;\n thinking_summaries?: \"auto\" | \"none\";\n} {\n const explicitThinkingConfig = fields.thinkingConfig;\n const computedThinkingConfig = convertFieldsToThinkingConfig(model, fields);\n const thinkingConfig = explicitThinkingConfig ?? computedThinkingConfig;\n\n if (!thinkingConfig) {\n return {};\n }\n\n let thinkingSummaries: \"auto\" | \"none\" | undefined;\n if (typeof thinkingConfig.includeThoughts === \"boolean\") {\n thinkingSummaries = thinkingConfig.includeThoughts ? \"auto\" : \"none\";\n }\n\n let levelRaw: string | undefined =\n thinkingConfig.thinkingLevel ??\n computedThinkingConfig?.thinkingLevel ??\n fields.reasoningEffort ??\n fields.thinkingLevel;\n\n if (!levelRaw && typeof thinkingConfig.thinkingBudget === \"number\") {\n levelRaw = convertReasoningTokensToReasoningEffort(\n model,\n thinkingConfig.thinkingBudget\n );\n }\n\n const normalizedLevel = levelRaw?.toLowerCase() as\n | Gemini.Interactions.ThinkingLevel\n | undefined;\n\n return {\n ...(normalizedLevel ? { thinking_level: normalizedLevel } : {}),\n ...(thinkingSummaries ? { thinking_summaries: thinkingSummaries } : {}),\n };\n}\n\n/**\n * Converts `speechConfig` (either simplified or GenerateContent `SpeechConfig`)\n * into the Interactions API `Array<Gemini.Interactions.SpeechConfig>` format.\n */\nexport function convertFieldsToInteractionsSpeechConfig(\n fields: ChatGoogleFields\n): Array<Gemini.Interactions.SpeechConfig> | undefined {\n if (typeof fields.speechConfig === \"undefined\") {\n return undefined;\n }\n\n // If already passed as an array of Interactions SpeechConfig objects, return as-is\n if (\n Array.isArray(fields.speechConfig) &&\n fields.speechConfig.every(\n (item) =>\n typeof item === \"object\" &&\n item !== null &&\n (\"voice\" in item || \"language\" in item || \"speaker\" in item)\n )\n ) {\n return fields.speechConfig as unknown as Array<Gemini.Interactions.SpeechConfig>;\n }\n\n const genSpeechConfig = convertFieldsToSpeechConfig(fields);\n if (!genSpeechConfig) {\n return undefined;\n }\n\n const language = genSpeechConfig.languageCode;\n\n if (genSpeechConfig.multiSpeakerVoiceConfig?.speakerVoiceConfigs) {\n return genSpeechConfig.multiSpeakerVoiceConfig.speakerVoiceConfigs.map(\n (speakerConfig): Gemini.Interactions.SpeechConfig => ({\n ...(speakerConfig.speaker ? { speaker: speakerConfig.speaker } : {}),\n ...(speakerConfig.voiceConfig?.prebuiltVoiceConfig?.voiceName\n ? { voice: speakerConfig.voiceConfig.prebuiltVoiceConfig.voiceName }\n : {}),\n ...(language ? { language } : {}),\n })\n );\n }\n\n const voice = genSpeechConfig.voiceConfig?.prebuiltVoiceConfig?.voiceName;\n if (voice || language) {\n return [\n {\n ...(voice ? { voice } : {}),\n ...(language ? { language } : {}),\n },\n ];\n }\n\n return undefined;\n}\n\n/**\n * Converts a GenerateContent `ImageConfig` (camelCase) or Interactions `ImageResponseFormat`\n * (snake_case) into an Interactions `ImageResponseFormat` (omitting `type`).\n */\nexport function convertFieldsToInteractionsImageConfig(\n imageConfig?:\n | Gemini.GenContent.ImageConfig\n | Partial<Gemini.Interactions.ImageResponseFormat>\n): Omit<Gemini.Interactions.ImageResponseFormat, \"type\"> | undefined {\n if (!imageConfig) {\n return undefined;\n }\n\n const raw = imageConfig as Gemini.GenContent.ImageConfig &\n Partial<Gemini.Interactions.ImageResponseFormat>;\n const aspectRatio = raw.aspect_ratio ?? raw.aspectRatio;\n const imageSize = raw.image_size ?? raw.imageSize;\n const mimeType = raw.mime_type;\n const delivery = raw.delivery;\n\n if (!aspectRatio && !imageSize && !mimeType && !delivery) {\n return undefined;\n }\n\n return {\n ...(aspectRatio\n ? {\n aspect_ratio:\n aspectRatio as Gemini.Interactions.ImageResponseFormat[\"aspect_ratio\"],\n }\n : {}),\n ...(imageSize\n ? {\n image_size:\n imageSize as Gemini.Interactions.ImageResponseFormat[\"image_size\"],\n }\n : {}),\n ...(mimeType ? { mime_type: mimeType } : {}),\n ...(delivery ? { delivery } : {}),\n };\n}\n\n/**\n * Maps `mediaResolution` (GenerateContent enum or lowercase) or `detail` (\"low\" | \"high\" | \"auto\")\n * to the Interactions API `MediaResolution` (\"low\" | \"medium\" | \"high\" | \"ultra_high\").\n */\nexport function convertMediaResolutionToInteractions(\n mediaResolution?:\n | Gemini.Shared.MediaResolution\n | Gemini.Interactions.MediaResolution,\n detail?: ChatGoogleFields[\"detail\"]\n): Gemini.Interactions.MediaResolution | undefined {\n const resolved = mediaResolution ?? mapDetailToMediaResolution(detail);\n if (!resolved) {\n return undefined;\n }\n\n const normalized = resolved.toLowerCase();\n if (normalized === \"media_resolution_low\" || normalized === \"low\") {\n return \"low\";\n }\n if (normalized === \"media_resolution_medium\" || normalized === \"medium\") {\n return \"medium\";\n }\n if (normalized === \"media_resolution_high\" || normalized === \"high\") {\n return \"high\";\n }\n if (\n normalized === \"media_resolution_ultra_high\" ||\n normalized === \"ultra_high\"\n ) {\n return \"ultra_high\";\n }\n return undefined;\n}\n\n/**\n * Maps GenerateContent `SafetySetting[]` (`HARM_CATEGORY_*`, `BLOCK_*`) into\n * Interactions API `SafetySetting[]` (`{ type, threshold }` in lowercase snake_case).\n */\nexport function convertSafetySettingsToInteractions(\n safetySettings?: Gemini.Shared.SafetySetting[]\n): Gemini.Interactions.SafetySetting[] | undefined {\n if (!safetySettings || safetySettings.length === 0) {\n return undefined;\n }\n\n const result: Gemini.Interactions.SafetySetting[] = [];\n for (const setting of safetySettings) {\n const rawSetting = setting as Gemini.Shared.SafetySetting &\n Partial<Gemini.Interactions.SafetySetting>;\n const rawCategory = (\n rawSetting.category ??\n rawSetting.type ??\n \"\"\n ).toLowerCase();\n const type = (\n rawCategory.startsWith(\"harm_category_\")\n ? rawCategory.slice(\"harm_category_\".length)\n : rawCategory\n ) as Gemini.Interactions.SafetySetting[\"type\"];\n\n const rawThreshold = (rawSetting.threshold ?? \"\").toLowerCase();\n const threshold = (\n rawThreshold === \"harm_block_threshold_unspecified\" || !rawThreshold\n ? undefined\n : rawThreshold\n ) as Gemini.Interactions.SafetySetting[\"threshold\"] | undefined;\n\n if (type && threshold && type !== (\"unspecified\" as string)) {\n result.push({\n type,\n threshold,\n ...(rawSetting.method ? { method: rawSetting.method } : {}),\n });\n }\n }\n\n return result.length > 0 ? result : undefined;\n}\n\nfunction convertImageFieldsToFormat(\n fields: ChatGoogleFields\n): Gemini.Interactions.ImageResponseFormat {\n const imageConfig = convertFieldsToInteractionsImageConfig(\n fields.imageConfig\n );\n return {\n type: \"image\",\n ...(imageConfig ?? {}),\n ...(fields.responseMimeType?.startsWith(\"image/\")\n ? {\n mime_type:\n fields.responseMimeType as Gemini.Interactions.ImageResponseFormat[\"mime_type\"],\n }\n : {}),\n };\n}\n\nfunction convertAudioFieldsToFormat(\n fields: ChatGoogleFields\n): Gemini.Interactions.AudioResponseFormat {\n return {\n type: \"audio\",\n ...(fields.responseMimeType?.startsWith(\"audio/\")\n ? {\n mime_type:\n fields.responseMimeType as Gemini.Interactions.AudioResponseFormat[\"mime_type\"],\n }\n : {}),\n };\n}\n\nfunction convertVideoFieldsToFormat(\n fields: ChatGoogleFields\n): Gemini.Interactions.VideoResponseFormat {\n return {\n type: \"video\",\n ...(fields.responseMimeType?.startsWith(\"video/\")\n ? {\n mime_type:\n fields.responseMimeType as Gemini.Interactions.VideoResponseFormat[\"mime_type\"],\n }\n : {}),\n };\n}\n\nfunction fieldsToJsonSchema(\n fields: ChatGoogleFields\n): Record<string, unknown> | undefined {\n if (fields.responseSchema) {\n if (\n isInteropZodSchema(fields.responseSchema) ||\n isSerializableSchema(fields.responseSchema)\n ) {\n return toJsonSchema(fields.responseSchema) as Record<string, unknown>;\n } else {\n return fields.responseSchema as Record<string, unknown>;\n }\n } else {\n return undefined;\n }\n}\n\nfunction convertTextFieldsToFormat(\n fields: ChatGoogleFields\n): Gemini.Interactions.TextResponseFormat {\n const jsonSchema = fieldsToJsonSchema(fields);\n const textMimeType =\n fields.responseMimeType === \"application/json\" ||\n fields.responseMimeType === \"text/plain\" ||\n fields.responseMimeType?.startsWith(\"text/\")\n ? (fields.responseMimeType as Gemini.Interactions.TextResponseFormat[\"mime_type\"])\n : jsonSchema\n ? \"application/json\"\n : undefined;\n return {\n type: \"text\",\n ...(textMimeType ? { mime_type: textMimeType } : {}),\n ...(jsonSchema ? { schema: jsonSchema } : {}),\n };\n}\n\nfunction convertModalityFieldsToFormat(\n modality: string,\n fields: ChatGoogleFields\n): Gemini.Interactions.ResponseFormat | undefined {\n const m = modality.toUpperCase();\n switch (m) {\n case \"IMAGE\":\n return convertImageFieldsToFormat(fields);\n case \"AUDIO\":\n return convertAudioFieldsToFormat(fields);\n case \"VIDEO\":\n return convertVideoFieldsToFormat(fields);\n case \"TEXT\":\n return convertTextFieldsToFormat(fields);\n default:\n return undefined;\n }\n}\n\n/**\n * Translates `responseFormat`, `responseSchema`, `responseModalities`, `responseMimeType`,\n * and `imageConfig` into the Interactions API `response_format` field.\n *\n * In the Interactions API OpenAPI specification, top-level `response_mime_type`,\n * top-level `response_modalities`, and `generation_config.image_config` are all\n * marked `deprecated: true` (and Vertex AI / `gcp` rejects `response_mime_type`\n * and `response_modalities` as unknown parameters). All of them are superseded by\n * `response_format` (`ResponseFormat | Array<ResponseFormat>`):\n * - Single or multiple `responseModalities` map to a single `ResponseFormat` object\n * or an array of `ResponseFormat` objects (`{ type: \"text\" | \"image\" | \"audio\" | \"video\", ... }`),\n * folding in `imageConfig`, `responseMimeType`, and `responseSchema` where applicable.\n * - `responseSchema` without `responseModalities` is passed directly as a raw JSON\n * Schema object in `response_format` (one of the variants in `ResponseFormat`'s `anyOf`\n * in the OpenAPI spec; verified with `gai` and assumed to behave the same on `gcp`,\n * though the spec also defines `{ type: \"text\", mime_type: \"application/json\", schema }`).\n * - Standalone `responseMimeType` or `imageConfig` maps to the corresponding typed\n * `ResponseFormat` object (`TextResponseFormat`, `ImageResponseFormat`, etc.).\n */\nexport function convertFieldsToInteractionsResponseFormat(\n fields: ChatGoogleFields\n): Gemini.Interactions.CreateInteractionParameters[\"response_format\"] {\n if (fields.responseFormat) {\n return fields.responseFormat;\n }\n\n if (fields.responseModalities && fields.responseModalities.length > 0) {\n const formats: Gemini.Interactions.ResponseFormat[] = [];\n for (const modality of fields.responseModalities) {\n const format = convertModalityFieldsToFormat(modality, fields);\n if (format) {\n formats.push(format);\n }\n }\n\n if (formats.length === 1) {\n return formats[0];\n }\n if (formats.length > 1) {\n return formats;\n }\n }\n\n const jsonSchema: Record<string, unknown> | undefined =\n fieldsToJsonSchema(fields);\n if (jsonSchema) {\n return jsonSchema;\n }\n\n if (fields.responseMimeType) {\n if (fields.responseMimeType.startsWith(\"image/\")) {\n return convertImageFieldsToFormat(fields);\n }\n if (fields.responseMimeType.startsWith(\"audio/\")) {\n return convertAudioFieldsToFormat(fields);\n }\n if (fields.responseMimeType.startsWith(\"video/\")) {\n return convertVideoFieldsToFormat(fields);\n }\n if (\n fields.responseMimeType === \"application/json\" ||\n fields.responseMimeType === \"text/plain\" ||\n fields.responseMimeType.startsWith(\"text/\")\n ) {\n return convertTextFieldsToFormat(fields);\n }\n }\n\n if (convertFieldsToInteractionsImageConfig(fields.imageConfig)) {\n return convertImageFieldsToFormat(fields);\n }\n\n return undefined;\n}\n\n/**\n * Builds an object containing `service_tier` when supported by the target platform.\n */\nexport function convertFieldsToInteractionsServiceTier(\n platform: GooglePlatformType,\n fields: ChatGoogleFields\n): {\n service_tier?: Gemini.Interactions.CreateInteractionParameters[\"service_tier\"];\n} {\n if (platform === \"gcp\") {\n return {};\n }\n\n const serviceTier = fields.serviceTier;\n if (!serviceTier || !settableServiceTier.includes(serviceTier)) {\n return {};\n }\n\n return {\n service_tier: serviceTier,\n };\n}\n"],"mappings":"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"}
|