@effect-uai/google 0.12.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Gemini.d.mts +0 -2
- package/dist/Gemini.d.mts.map +1 -1
- package/dist/Gemini.mjs +1 -1
- package/dist/Gemini.mjs.map +1 -1
- package/dist/GeminiEmbedding.d.mts +2 -3
- package/dist/GeminiEmbedding.d.mts.map +1 -1
- package/dist/GeminiEmbedding.mjs +1 -1
- package/dist/GeminiEmbedding.mjs.map +1 -1
- package/dist/GeminiSynthesizer.d.mts +1 -3
- package/dist/GeminiSynthesizer.d.mts.map +1 -1
- package/dist/GeminiSynthesizer.mjs +13 -12
- package/dist/GeminiSynthesizer.mjs.map +1 -1
- package/dist/GeminiSynthesizer.test.d.mts +1 -1
- package/dist/GeminiSynthesizer.test.mjs +1 -1
- package/dist/GeminiSynthesizer.test.mjs.map +1 -1
- package/dist/GeminiTools.d.mts +0 -2
- package/dist/GeminiTools.d.mts.map +1 -1
- package/dist/GeminiTools.mjs +1 -1
- package/dist/GeminiTools.mjs.map +1 -1
- package/dist/GoogleDeepResearch.d.mts +2 -3
- package/dist/GoogleDeepResearch.d.mts.map +1 -1
- package/dist/GoogleDeepResearch.mjs +8 -5
- package/dist/GoogleDeepResearch.mjs.map +1 -1
- package/dist/GoogleDeepResearch.test.d.mts +1 -1
- package/dist/GoogleDeepResearch.test.mjs +1 -1
- package/dist/GoogleDeepResearch.test.mjs.map +1 -1
- package/dist/LyriaGenerator.d.mts +0 -2
- package/dist/LyriaGenerator.d.mts.map +1 -1
- package/dist/LyriaGenerator.mjs +9 -6
- package/dist/LyriaGenerator.mjs.map +1 -1
- package/dist/LyriaGenerator.test.d.mts +1 -1
- package/dist/LyriaGenerator.test.mjs +153 -8
- package/dist/LyriaGenerator.test.mjs.map +1 -1
- package/dist/codec.d.mts +14 -9
- package/dist/codec.d.mts.map +1 -1
- package/dist/codec.mjs +2 -2
- package/dist/codec.mjs.map +1 -1
- package/dist/geminiSpeechCodec.d.mts +0 -1
- package/dist/geminiSpeechCodec.d.mts.map +1 -1
- package/dist/geminiSpeechCodec.mjs.map +1 -1
- package/dist/geminiSpeechCodec.test.d.mts +1 -1
- package/dist/geminiSpeechCodec.test.mjs +1 -1
- package/dist/geminiSpeechCodec.test.mjs.map +1 -1
- package/dist/geminiTools.test.d.mts +1 -1
- package/dist/geminiTools.test.mjs +17 -11
- package/dist/geminiTools.test.mjs.map +1 -1
- package/dist/{magic-string.es-CaWgF-3p.mjs → magic-string.es-CUAnjKYC.mjs} +14 -13
- package/dist/{magic-string.es-CaWgF-3p.mjs.map → magic-string.es-CUAnjKYC.mjs.map} +1 -1
- package/dist/models.d.mts.map +1 -1
- package/dist/{dist-CWoAuwS9.mjs → test.DNmyFkvJ-N3QqMRwZ.mjs} +257 -381
- package/dist/test.DNmyFkvJ-N3QqMRwZ.mjs.map +1 -0
- package/package.json +5 -5
- package/src/Gemini.ts +4 -7
- package/src/GeminiEmbedding.ts +36 -48
- package/src/GeminiSynthesizer.ts +20 -27
- package/src/GeminiTools.ts +4 -6
- package/src/GoogleDeepResearch.ts +12 -21
- package/src/LyriaGenerator.ts +19 -23
- package/src/codec.ts +9 -11
- package/dist/dist-CWoAuwS9.mjs.map +0 -1
- /package/dist/{chunk-uyGKjUfl.mjs → rolldown-runtime-EAsCxrDo.mjs} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-uai/google",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.1",
|
|
4
4
|
"description": "Google Gemini provider for @effect-uai/core.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -59,13 +59,13 @@
|
|
|
59
59
|
"access": "public"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
|
-
"effect": "4.0.0-
|
|
63
|
-
"typescript": "^
|
|
64
|
-
"@effect-uai/core": "0.12.
|
|
62
|
+
"effect": "4.0.0-rc.111",
|
|
63
|
+
"typescript": "^7.0.2",
|
|
64
|
+
"@effect-uai/core": "0.12.1"
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
|
67
67
|
"@effect-uai/core": ">=0.2.0 <1",
|
|
68
|
-
"effect": ">=4.0.0-
|
|
68
|
+
"effect": ">=4.0.0-rc.111 <5.0.0"
|
|
69
69
|
},
|
|
70
70
|
"scripts": {
|
|
71
71
|
"build": "tsdown",
|
package/src/Gemini.ts
CHANGED
|
@@ -330,13 +330,10 @@ export const layer = (
|
|
|
330
330
|
const typed = Layer.effect(Gemini, make(cfg))
|
|
331
331
|
const generic = Layer.effect(
|
|
332
332
|
LanguageModel,
|
|
333
|
-
Effect.map(
|
|
334
|
-
|
|
335
|
-
(
|
|
336
|
-
|
|
337
|
-
turn: (request) => s.turn(request as GeminiRequest),
|
|
338
|
-
}),
|
|
339
|
-
),
|
|
333
|
+
Effect.map(make(cfg), (s): LanguageModelService => ({
|
|
334
|
+
streamTurn: (request) => s.streamTurn(request as GeminiRequest),
|
|
335
|
+
turn: (request) => s.turn(request as GeminiRequest),
|
|
336
|
+
})),
|
|
340
337
|
)
|
|
341
338
|
return Layer.merge(typed, generic)
|
|
342
339
|
}
|
package/src/GeminiEmbedding.ts
CHANGED
|
@@ -121,21 +121,16 @@ const urlRejected = (param: string): AiError.AiError =>
|
|
|
121
121
|
*/
|
|
122
122
|
const imageSourceToPart = (param: string) =>
|
|
123
123
|
Match.type<ImageSource>().pipe(
|
|
124
|
-
Match.tag(
|
|
125
|
-
|
|
126
|
-
(s): Effect.Effect<WirePart, AiError.AiError> =>
|
|
127
|
-
Effect.succeed({ inlineData: { mimeType: s.mimeType, data: s.base64 } }),
|
|
124
|
+
Match.tag("base64", (s): Effect.Effect<WirePart, AiError.AiError> =>
|
|
125
|
+
Effect.succeed({ inlineData: { mimeType: s.mimeType, data: s.base64 } }),
|
|
128
126
|
),
|
|
129
|
-
Match.tag(
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
inlineData: { mimeType: s.mimeType, data: Encoding.encodeBase64(s.bytes) },
|
|
134
|
-
}),
|
|
127
|
+
Match.tag("bytes", (s): Effect.Effect<WirePart, AiError.AiError> =>
|
|
128
|
+
Effect.succeed({
|
|
129
|
+
inlineData: { mimeType: s.mimeType, data: Encoding.encodeBase64(s.bytes) },
|
|
130
|
+
}),
|
|
135
131
|
),
|
|
136
|
-
Match.tag(
|
|
137
|
-
|
|
138
|
-
(): Effect.Effect<WirePart, AiError.AiError> => Effect.fail(urlRejected(param)),
|
|
132
|
+
Match.tag("url", (): Effect.Effect<WirePart, AiError.AiError> =>
|
|
133
|
+
Effect.fail(urlRejected(param)),
|
|
139
134
|
),
|
|
140
135
|
Match.exhaustive,
|
|
141
136
|
)
|
|
@@ -291,12 +286,10 @@ const embedImpl =
|
|
|
291
286
|
postJson(cfg, `${baseUrl(cfg)}/models/${request.model}:embedContent`, body),
|
|
292
287
|
),
|
|
293
288
|
Effect.flatMap(decodeSingle),
|
|
294
|
-
Effect.map(
|
|
295
|
-
(decoded)
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
}),
|
|
299
|
-
),
|
|
289
|
+
Effect.map((decoded): EmbedResponse => ({
|
|
290
|
+
embedding: valuesToEmbedding(decoded.embedding.values),
|
|
291
|
+
usage: emptyUsage,
|
|
292
|
+
})),
|
|
300
293
|
)
|
|
301
294
|
|
|
302
295
|
const embedManyImpl =
|
|
@@ -309,12 +302,10 @@ const embedManyImpl =
|
|
|
309
302
|
postJson(cfg, `${baseUrl(cfg)}/models/${request.model}:batchEmbedContents`, body),
|
|
310
303
|
),
|
|
311
304
|
Effect.flatMap(decodeBatch),
|
|
312
|
-
Effect.map(
|
|
313
|
-
(
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
}),
|
|
317
|
-
),
|
|
305
|
+
Effect.map((decoded): EmbedManyResponse => ({
|
|
306
|
+
embeddings: decoded.embeddings.map((e) => valuesToEmbedding(e.values)),
|
|
307
|
+
usage: emptyUsage,
|
|
308
|
+
})),
|
|
318
309
|
)
|
|
319
310
|
|
|
320
311
|
// ---------------------------------------------------------------------------
|
|
@@ -346,29 +337,26 @@ export const layer = (
|
|
|
346
337
|
const typed = Layer.effect(GeminiEmbedding, make(cfg))
|
|
347
338
|
const generic = Layer.effect(
|
|
348
339
|
EmbeddingModel,
|
|
349
|
-
Effect.map(
|
|
350
|
-
|
|
351
|
-
(
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
) as Effect.Effect<EmbedManyResponse<E>, AiError.AiError>,
|
|
370
|
-
}),
|
|
371
|
-
),
|
|
340
|
+
Effect.map(make(cfg), (s): EmbeddingModelService => ({
|
|
341
|
+
// Gemini's embed endpoints emit float32 only. Reject a non-float32
|
|
342
|
+
// `encoding` (bucket 1) so a float32 vector isn't handed back
|
|
343
|
+
// mislabeled as the requested type. `task` is left silent: it's a
|
|
344
|
+
// per-model gap (honored by gemini-embedding-001, ignored by
|
|
345
|
+
// gemini-embedding-2 server-side), and per capabilities.md §2.3 we
|
|
346
|
+
// don't maintain per-model tables; there's no wire error to translate.
|
|
347
|
+
embed: <E extends EmbedEncoding | undefined = undefined>(
|
|
348
|
+
req: Omit<CommonEmbedRequest, "encoding"> & { readonly encoding?: E },
|
|
349
|
+
) =>
|
|
350
|
+
assertEncoding(req.encoding, ["float32"], "gemini").pipe(
|
|
351
|
+
Effect.andThen(s.embed(req as GeminiEmbedRequest)),
|
|
352
|
+
) as Effect.Effect<EmbedResponse<E>, AiError.AiError>,
|
|
353
|
+
embedMany: <E extends EmbedEncoding | undefined = undefined>(
|
|
354
|
+
req: Omit<CommonEmbedManyRequest, "encoding"> & { readonly encoding?: E },
|
|
355
|
+
) =>
|
|
356
|
+
assertEncoding(req.encoding, ["float32"], "gemini").pipe(
|
|
357
|
+
Effect.andThen(s.embedMany(req as GeminiEmbedManyRequest)),
|
|
358
|
+
) as Effect.Effect<EmbedManyResponse<E>, AiError.AiError>,
|
|
359
|
+
})),
|
|
372
360
|
)
|
|
373
361
|
return Layer.merge(typed, generic)
|
|
374
362
|
}
|
package/src/GeminiSynthesizer.ts
CHANGED
|
@@ -222,21 +222,18 @@ const unsupportedStreamDialogue: SpeechSynthesizerService["streamSynthesizeDialo
|
|
|
222
222
|
// ---------------------------------------------------------------------------
|
|
223
223
|
|
|
224
224
|
export const make = (cfg: Config) =>
|
|
225
|
-
Effect.map(
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
Stream.
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
streamSynthesizeDialogue: unsupportedStreamDialogue,
|
|
238
|
-
}),
|
|
239
|
-
)
|
|
225
|
+
Effect.map(HttpClient.HttpClient, (client): GeminiSynthesizerService => ({
|
|
226
|
+
synthesize: (r) =>
|
|
227
|
+
synthesizeImpl(cfg)(r).pipe(Effect.provideService(HttpClient.HttpClient, client)),
|
|
228
|
+
streamSynthesis: (r) =>
|
|
229
|
+
Stream.fromEffect(synthesizeImpl(cfg)(r)).pipe(
|
|
230
|
+
Stream.map((b): AudioChunk => ({ bytes: b.bytes })),
|
|
231
|
+
Stream.provideService(HttpClient.HttpClient, client),
|
|
232
|
+
),
|
|
233
|
+
streamSynthesisFrom: unsupportedStreamFrom,
|
|
234
|
+
synthesizeDialogue: unsupportedDialogue,
|
|
235
|
+
streamSynthesizeDialogue: unsupportedStreamDialogue,
|
|
236
|
+
}))
|
|
240
237
|
|
|
241
238
|
/**
|
|
242
239
|
* Layer registers both `GeminiSynthesizer` and the generic
|
|
@@ -249,17 +246,13 @@ export const layer = (cfg: Config) =>
|
|
|
249
246
|
Layer.effect(GeminiSynthesizer, make(cfg)),
|
|
250
247
|
Layer.effect(
|
|
251
248
|
SpeechSynthesizer,
|
|
252
|
-
Effect.map(
|
|
253
|
-
|
|
254
|
-
(
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
synthesizeDialogue: s.synthesizeDialogue,
|
|
261
|
-
streamSynthesizeDialogue: s.streamSynthesizeDialogue,
|
|
262
|
-
}),
|
|
263
|
-
),
|
|
249
|
+
Effect.map(make(cfg), (s): SpeechSynthesizerService => ({
|
|
250
|
+
synthesize: (req: CommonSynthesizeRequest) => s.synthesize(req as GeminiSynthesizeRequest),
|
|
251
|
+
streamSynthesis: (req: CommonSynthesizeRequest) =>
|
|
252
|
+
s.streamSynthesis(req as GeminiSynthesizeRequest),
|
|
253
|
+
streamSynthesisFrom: s.streamSynthesisFrom,
|
|
254
|
+
synthesizeDialogue: s.synthesizeDialogue,
|
|
255
|
+
streamSynthesizeDialogue: s.streamSynthesizeDialogue,
|
|
256
|
+
})),
|
|
264
257
|
),
|
|
265
258
|
)
|
package/src/GeminiTools.ts
CHANGED
|
@@ -77,12 +77,10 @@ const renderOne = (
|
|
|
77
77
|
})
|
|
78
78
|
: decodeConfig(tool.config).pipe(
|
|
79
79
|
Result.map(configToWire),
|
|
80
|
-
Result.mapError(
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}),
|
|
85
|
-
),
|
|
80
|
+
Result.mapError((): ToolRenderError => ({
|
|
81
|
+
capability: "providerTool",
|
|
82
|
+
reason: `unrecognized Gemini provider tool config on "${tool.name}"`,
|
|
83
|
+
})),
|
|
86
84
|
)
|
|
87
85
|
|
|
88
86
|
/**
|
|
@@ -217,27 +217,18 @@ const turnFromInteraction = (wire: WireInteraction): Turn => {
|
|
|
217
217
|
export const jobStateOf = (wire: WireInteraction): ResearchState =>
|
|
218
218
|
Match.value(wire.status ?? "").pipe(
|
|
219
219
|
Match.whenOr("queued", "pending", (): ResearchState => ({ _tag: "Pending" })),
|
|
220
|
-
Match.whenOr(
|
|
221
|
-
"
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
"
|
|
229
|
-
(
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
"failed",
|
|
233
|
-
"error",
|
|
234
|
-
"cancelled",
|
|
235
|
-
(): ResearchState => ({
|
|
236
|
-
_tag: "Failed",
|
|
237
|
-
...(wire.error?.message != null && { reason: wire.error.message }),
|
|
238
|
-
raw: wire,
|
|
239
|
-
}),
|
|
240
|
-
),
|
|
220
|
+
Match.whenOr("in_progress", "running", "processing", (): ResearchState => ({
|
|
221
|
+
_tag: "Running",
|
|
222
|
+
})),
|
|
223
|
+
Match.whenOr("completed", "succeeded", (): ResearchState => ({
|
|
224
|
+
_tag: "Succeeded",
|
|
225
|
+
result: turnFromInteraction(wire),
|
|
226
|
+
})),
|
|
227
|
+
Match.whenOr("failed", "error", "cancelled", (): ResearchState => ({
|
|
228
|
+
_tag: "Failed",
|
|
229
|
+
...(wire.error?.message != null && { reason: wire.error.message }),
|
|
230
|
+
raw: wire,
|
|
231
|
+
})),
|
|
241
232
|
Match.orElse((): ResearchState => ({ _tag: "Running" })),
|
|
242
233
|
)
|
|
243
234
|
|
package/src/LyriaGenerator.ts
CHANGED
|
@@ -105,19 +105,18 @@ const isClipModel = (model: string): boolean => model.includes("clip")
|
|
|
105
105
|
|
|
106
106
|
export const realizedFormat: (mime: LyriaResponseMimeType) => AudioFormat =
|
|
107
107
|
Match.type<LyriaResponseMimeType>().pipe(
|
|
108
|
-
Match.when(
|
|
109
|
-
"
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
),
|
|
108
|
+
Match.when("audio/mp3", (): AudioFormat => ({
|
|
109
|
+
container: "mp3",
|
|
110
|
+
encoding: "mp3",
|
|
111
|
+
sampleRate: 44100,
|
|
112
|
+
channels: 2,
|
|
113
|
+
})),
|
|
114
|
+
Match.when("audio/wav", (): AudioFormat => ({
|
|
115
|
+
container: "wav",
|
|
116
|
+
encoding: "pcm_s16le",
|
|
117
|
+
sampleRate: 44100,
|
|
118
|
+
channels: 2,
|
|
119
|
+
})),
|
|
121
120
|
Match.exhaustive,
|
|
122
121
|
)
|
|
123
122
|
|
|
@@ -395,15 +394,12 @@ export const layer = (
|
|
|
395
394
|
Layer.effect(LyriaGenerator, make(cfg)),
|
|
396
395
|
Layer.effect(
|
|
397
396
|
MusicGenerator,
|
|
398
|
-
Effect.map(
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
streamGenerationFrom: s.streamGenerationFrom,
|
|
406
|
-
}),
|
|
407
|
-
),
|
|
397
|
+
Effect.map(make(cfg), (s): MusicGeneratorService => ({
|
|
398
|
+
generate: (req: CommonGenerateMusicRequest) =>
|
|
399
|
+
s.generate({ ...req, model: req.model as LyriaModel }),
|
|
400
|
+
streamGeneration: (req: CommonStreamGenerateMusicRequest) =>
|
|
401
|
+
s.streamGeneration({ ...req, model: req.model as LyriaModel }),
|
|
402
|
+
streamGenerationFrom: s.streamGenerationFrom,
|
|
403
|
+
})),
|
|
408
404
|
),
|
|
409
405
|
)
|
package/src/codec.ts
CHANGED
|
@@ -218,16 +218,12 @@ const messageText = (message: Message): string => message.content.map(blockText)
|
|
|
218
218
|
*/
|
|
219
219
|
const imageSourceToParts = Match.type<InputImage["source"]>().pipe(
|
|
220
220
|
Match.tag("url", (): ReadonlyArray<RequestPart> => []),
|
|
221
|
-
Match.tag(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
)
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
(s): ReadonlyArray<RequestPart> => [
|
|
228
|
-
{ inlineData: { mimeType: s.mimeType, data: Encoding.encodeBase64(s.bytes) } },
|
|
229
|
-
],
|
|
230
|
-
),
|
|
221
|
+
Match.tag("base64", (s): ReadonlyArray<RequestPart> => [
|
|
222
|
+
{ inlineData: { mimeType: s.mimeType, data: s.base64 } },
|
|
223
|
+
]),
|
|
224
|
+
Match.tag("bytes", (s): ReadonlyArray<RequestPart> => [
|
|
225
|
+
{ inlineData: { mimeType: s.mimeType, data: Encoding.encodeBase64(s.bytes) } },
|
|
226
|
+
]),
|
|
231
227
|
Match.exhaustive,
|
|
232
228
|
)
|
|
233
229
|
|
|
@@ -434,7 +430,9 @@ const sanitizeSchema = (schema: unknown): unknown => {
|
|
|
434
430
|
)
|
|
435
431
|
}
|
|
436
432
|
|
|
437
|
-
const toolDescriptorsToTools = (
|
|
433
|
+
const toolDescriptorsToTools = (
|
|
434
|
+
tools: ReadonlyArray<ToolDescriptor>,
|
|
435
|
+
): ReadonlyArray<RequestTool> =>
|
|
438
436
|
tools.length === 0
|
|
439
437
|
? []
|
|
440
438
|
: [
|