@core-ai/google-genai 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +296 -93
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -2,15 +2,31 @@
|
|
|
2
2
|
import { GoogleGenAI } from "@google/genai";
|
|
3
3
|
|
|
4
4
|
// src/chat-model.ts
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
StructuredOutputNoObjectGeneratedError,
|
|
7
|
+
StructuredOutputParseError,
|
|
8
|
+
StructuredOutputValidationError,
|
|
9
|
+
createObjectStreamResult,
|
|
10
|
+
createStreamResult
|
|
11
|
+
} from "@core-ai/core-ai";
|
|
6
12
|
|
|
7
13
|
// src/chat-adapter.ts
|
|
8
14
|
import {
|
|
9
|
-
ApiError,
|
|
10
15
|
FunctionCallingConfigMode
|
|
11
16
|
} from "@google/genai";
|
|
12
17
|
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
13
|
-
|
|
18
|
+
|
|
19
|
+
// src/object-utils.ts
|
|
20
|
+
function asObject(value) {
|
|
21
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
return {};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// src/chat-adapter.ts
|
|
28
|
+
var DEFAULT_STRUCTURED_OUTPUT_TOOL_NAME = "core_ai_generate_object";
|
|
29
|
+
var DEFAULT_STRUCTURED_OUTPUT_TOOL_DESCRIPTION = "Return a JSON object that matches the requested schema.";
|
|
14
30
|
function convertMessages(messages) {
|
|
15
31
|
const systemParts = [];
|
|
16
32
|
const contents = [];
|
|
@@ -101,17 +117,17 @@ function convertUserContentPart(part) {
|
|
|
101
117
|
};
|
|
102
118
|
}
|
|
103
119
|
function convertTools(tools) {
|
|
104
|
-
const functionDeclarations = Object.values(
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
);
|
|
120
|
+
const functionDeclarations = Object.values(
|
|
121
|
+
tools
|
|
122
|
+
).map((tool) => {
|
|
123
|
+
const schema = zodToJsonSchema(tool.parameters);
|
|
124
|
+
const { $schema: _schema, ...parametersJsonSchema } = schema;
|
|
125
|
+
return {
|
|
126
|
+
name: tool.name,
|
|
127
|
+
description: tool.description,
|
|
128
|
+
parametersJsonSchema
|
|
129
|
+
};
|
|
130
|
+
});
|
|
115
131
|
if (functionDeclarations.length === 0) {
|
|
116
132
|
return [];
|
|
117
133
|
}
|
|
@@ -150,6 +166,33 @@ function convertToolChoice(choice) {
|
|
|
150
166
|
}
|
|
151
167
|
};
|
|
152
168
|
}
|
|
169
|
+
function getStructuredOutputToolName(options) {
|
|
170
|
+
const trimmedName = options.schemaName?.trim();
|
|
171
|
+
if (trimmedName && trimmedName.length > 0) {
|
|
172
|
+
return trimmedName;
|
|
173
|
+
}
|
|
174
|
+
return DEFAULT_STRUCTURED_OUTPUT_TOOL_NAME;
|
|
175
|
+
}
|
|
176
|
+
function createStructuredOutputOptions(options) {
|
|
177
|
+
const toolName = getStructuredOutputToolName(options);
|
|
178
|
+
return {
|
|
179
|
+
messages: options.messages,
|
|
180
|
+
tools: {
|
|
181
|
+
structured_output: {
|
|
182
|
+
name: toolName,
|
|
183
|
+
description: options.schemaDescription ?? DEFAULT_STRUCTURED_OUTPUT_TOOL_DESCRIPTION,
|
|
184
|
+
parameters: options.schema
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
toolChoice: {
|
|
188
|
+
type: "tool",
|
|
189
|
+
toolName
|
|
190
|
+
},
|
|
191
|
+
config: options.config,
|
|
192
|
+
providerOptions: options.providerOptions,
|
|
193
|
+
signal: options.signal
|
|
194
|
+
};
|
|
195
|
+
}
|
|
153
196
|
function isToolResultContent(content) {
|
|
154
197
|
if (content.role !== "user" || !content.parts || content.parts.length === 0) {
|
|
155
198
|
return false;
|
|
@@ -258,8 +301,13 @@ async function* transformStream(stream) {
|
|
|
258
301
|
let usage = {
|
|
259
302
|
inputTokens: 0,
|
|
260
303
|
outputTokens: 0,
|
|
261
|
-
|
|
262
|
-
|
|
304
|
+
inputTokenDetails: {
|
|
305
|
+
cacheReadTokens: 0,
|
|
306
|
+
cacheWriteTokens: 0
|
|
307
|
+
},
|
|
308
|
+
outputTokenDetails: {
|
|
309
|
+
reasoningTokens: 0
|
|
310
|
+
}
|
|
263
311
|
};
|
|
264
312
|
for await (const chunk of stream) {
|
|
265
313
|
usage = mapUsage(chunk, usage);
|
|
@@ -282,7 +330,9 @@ async function* transformStream(stream) {
|
|
|
282
330
|
toolCallId: mappedCall.id,
|
|
283
331
|
toolName: mappedCall.name
|
|
284
332
|
};
|
|
285
|
-
const serializedArguments = JSON.stringify(
|
|
333
|
+
const serializedArguments = JSON.stringify(
|
|
334
|
+
mappedCall.arguments
|
|
335
|
+
);
|
|
286
336
|
if (serializedArguments !== "{}") {
|
|
287
337
|
yield {
|
|
288
338
|
type: "tool-call-delta",
|
|
@@ -329,23 +379,26 @@ async function* transformStream(stream) {
|
|
|
329
379
|
function mapUsage(response, fallback) {
|
|
330
380
|
const inputTokens = response.usageMetadata?.promptTokenCount ?? fallback?.inputTokens ?? 0;
|
|
331
381
|
const textTokens = response.usageMetadata?.candidatesTokenCount ?? 0;
|
|
332
|
-
const reasoningTokens = response.usageMetadata?.thoughtsTokenCount ?? fallback?.reasoningTokens ?? 0;
|
|
382
|
+
const reasoningTokens = response.usageMetadata?.thoughtsTokenCount ?? fallback?.outputTokenDetails.reasoningTokens ?? 0;
|
|
333
383
|
const outputTokens = textTokens + reasoningTokens;
|
|
334
|
-
const
|
|
384
|
+
const cacheReadTokens = response.usageMetadata?.cachedContentTokenCount ?? fallback?.inputTokenDetails.cacheReadTokens ?? 0;
|
|
335
385
|
return {
|
|
336
386
|
inputTokens,
|
|
337
387
|
outputTokens,
|
|
338
|
-
|
|
339
|
-
|
|
388
|
+
inputTokenDetails: {
|
|
389
|
+
cacheReadTokens,
|
|
390
|
+
cacheWriteTokens: 0
|
|
391
|
+
},
|
|
392
|
+
outputTokenDetails: {
|
|
393
|
+
reasoningTokens
|
|
394
|
+
}
|
|
340
395
|
};
|
|
341
396
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
}
|
|
348
|
-
function wrapError(error) {
|
|
397
|
+
|
|
398
|
+
// src/google-error.ts
|
|
399
|
+
import { ApiError } from "@google/genai";
|
|
400
|
+
import { ProviderError } from "@core-ai/core-ai";
|
|
401
|
+
function wrapGoogleError(error) {
|
|
349
402
|
if (error instanceof ApiError) {
|
|
350
403
|
return new ProviderError(error.message, "google", error.status, error);
|
|
351
404
|
}
|
|
@@ -359,33 +412,215 @@ function wrapError(error) {
|
|
|
359
412
|
|
|
360
413
|
// src/chat-model.ts
|
|
361
414
|
function createGoogleGenAIChatModel(client, modelId) {
|
|
415
|
+
const provider = "google";
|
|
416
|
+
async function callGenerateContentApi(request) {
|
|
417
|
+
try {
|
|
418
|
+
return await client.models.generateContent(request);
|
|
419
|
+
} catch (error) {
|
|
420
|
+
throw wrapGoogleError(error);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
async function callGenerateContentStreamApi(request) {
|
|
424
|
+
try {
|
|
425
|
+
return await client.models.generateContentStream(request);
|
|
426
|
+
} catch (error) {
|
|
427
|
+
throw wrapGoogleError(error);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
async function generateChat(options) {
|
|
431
|
+
const request = createGenerateRequest(modelId, options);
|
|
432
|
+
const response = await callGenerateContentApi(request);
|
|
433
|
+
return mapGenerateResponse(response);
|
|
434
|
+
}
|
|
435
|
+
async function streamChat(options) {
|
|
436
|
+
const request = createGenerateRequest(modelId, options);
|
|
437
|
+
const stream = await callGenerateContentStreamApi(request);
|
|
438
|
+
return createStreamResult(transformStream(stream));
|
|
439
|
+
}
|
|
362
440
|
return {
|
|
363
|
-
provider
|
|
441
|
+
provider,
|
|
364
442
|
modelId,
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
443
|
+
generate: generateChat,
|
|
444
|
+
stream: streamChat,
|
|
445
|
+
async generateObject(options) {
|
|
446
|
+
const structuredOptions = createStructuredOutputOptions(options);
|
|
447
|
+
const result = await generateChat(structuredOptions);
|
|
448
|
+
const toolName = getStructuredOutputToolName(options);
|
|
449
|
+
const object = extractStructuredObject(
|
|
450
|
+
result,
|
|
451
|
+
options.schema,
|
|
452
|
+
provider,
|
|
453
|
+
toolName
|
|
454
|
+
);
|
|
455
|
+
return {
|
|
456
|
+
object,
|
|
457
|
+
finishReason: result.finishReason,
|
|
458
|
+
usage: result.usage
|
|
459
|
+
};
|
|
373
460
|
},
|
|
374
|
-
async
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
461
|
+
async streamObject(options) {
|
|
462
|
+
const structuredOptions = createStructuredOutputOptions(options);
|
|
463
|
+
const stream = await streamChat(structuredOptions);
|
|
464
|
+
const toolName = getStructuredOutputToolName(options);
|
|
465
|
+
return createObjectStreamResult(
|
|
466
|
+
transformStructuredOutputStream(
|
|
467
|
+
stream,
|
|
468
|
+
options.schema,
|
|
469
|
+
provider,
|
|
470
|
+
toolName
|
|
471
|
+
)
|
|
472
|
+
);
|
|
382
473
|
}
|
|
383
474
|
};
|
|
384
475
|
}
|
|
476
|
+
function extractStructuredObject(result, schema, provider, toolName) {
|
|
477
|
+
const structuredToolCall = result.toolCalls.find(
|
|
478
|
+
(toolCall) => toolCall.name === toolName
|
|
479
|
+
);
|
|
480
|
+
if (structuredToolCall) {
|
|
481
|
+
return validateStructuredToolArguments(
|
|
482
|
+
schema,
|
|
483
|
+
structuredToolCall.arguments,
|
|
484
|
+
provider
|
|
485
|
+
);
|
|
486
|
+
}
|
|
487
|
+
const rawOutput = result.content?.trim();
|
|
488
|
+
if (rawOutput && rawOutput.length > 0) {
|
|
489
|
+
return parseAndValidateStructuredPayload(schema, rawOutput, provider);
|
|
490
|
+
}
|
|
491
|
+
throw new StructuredOutputNoObjectGeneratedError(
|
|
492
|
+
"model did not emit a structured object payload",
|
|
493
|
+
provider
|
|
494
|
+
);
|
|
495
|
+
}
|
|
496
|
+
async function* transformStructuredOutputStream(stream, schema, provider, toolName) {
|
|
497
|
+
let validatedObject;
|
|
498
|
+
let contentBuffer = "";
|
|
499
|
+
const toolArgumentDeltas = /* @__PURE__ */ new Map();
|
|
500
|
+
for await (const event of stream) {
|
|
501
|
+
if (event.type === "content-delta") {
|
|
502
|
+
contentBuffer += event.text;
|
|
503
|
+
yield {
|
|
504
|
+
type: "object-delta",
|
|
505
|
+
text: event.text
|
|
506
|
+
};
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
if (event.type === "tool-call-delta") {
|
|
510
|
+
const previous = toolArgumentDeltas.get(event.toolCallId) ?? "";
|
|
511
|
+
toolArgumentDeltas.set(
|
|
512
|
+
event.toolCallId,
|
|
513
|
+
`${previous}${event.argumentsDelta}`
|
|
514
|
+
);
|
|
515
|
+
yield {
|
|
516
|
+
type: "object-delta",
|
|
517
|
+
text: event.argumentsDelta
|
|
518
|
+
};
|
|
519
|
+
continue;
|
|
520
|
+
}
|
|
521
|
+
if (event.type === "tool-call-end" && event.toolCall.name === toolName) {
|
|
522
|
+
validatedObject = validateStructuredToolArguments(
|
|
523
|
+
schema,
|
|
524
|
+
event.toolCall.arguments,
|
|
525
|
+
provider
|
|
526
|
+
);
|
|
527
|
+
yield {
|
|
528
|
+
type: "object",
|
|
529
|
+
object: validatedObject
|
|
530
|
+
};
|
|
531
|
+
continue;
|
|
532
|
+
}
|
|
533
|
+
if (event.type === "finish") {
|
|
534
|
+
if (validatedObject === void 0) {
|
|
535
|
+
const fallbackPayload = getFallbackStructuredPayload(
|
|
536
|
+
contentBuffer,
|
|
537
|
+
toolArgumentDeltas
|
|
538
|
+
);
|
|
539
|
+
if (!fallbackPayload) {
|
|
540
|
+
throw new StructuredOutputNoObjectGeneratedError(
|
|
541
|
+
"structured output stream ended without an object payload",
|
|
542
|
+
provider
|
|
543
|
+
);
|
|
544
|
+
}
|
|
545
|
+
validatedObject = parseAndValidateStructuredPayload(
|
|
546
|
+
schema,
|
|
547
|
+
fallbackPayload,
|
|
548
|
+
provider
|
|
549
|
+
);
|
|
550
|
+
yield {
|
|
551
|
+
type: "object",
|
|
552
|
+
object: validatedObject
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
yield {
|
|
556
|
+
type: "finish",
|
|
557
|
+
finishReason: event.finishReason,
|
|
558
|
+
usage: event.usage
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
function getFallbackStructuredPayload(contentBuffer, toolArgumentDeltas) {
|
|
564
|
+
for (const delta of toolArgumentDeltas.values()) {
|
|
565
|
+
const trimmed = delta.trim();
|
|
566
|
+
if (trimmed.length > 0) {
|
|
567
|
+
return trimmed;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
const trimmedContent = contentBuffer.trim();
|
|
571
|
+
if (trimmedContent.length > 0) {
|
|
572
|
+
return trimmedContent;
|
|
573
|
+
}
|
|
574
|
+
return void 0;
|
|
575
|
+
}
|
|
576
|
+
function validateStructuredToolArguments(schema, toolArguments, provider) {
|
|
577
|
+
return validateStructuredObject(
|
|
578
|
+
schema,
|
|
579
|
+
toolArguments,
|
|
580
|
+
provider,
|
|
581
|
+
JSON.stringify(toolArguments)
|
|
582
|
+
);
|
|
583
|
+
}
|
|
584
|
+
function parseAndValidateStructuredPayload(schema, rawPayload, provider) {
|
|
585
|
+
const parsedPayload = parseJson(rawPayload, provider);
|
|
586
|
+
return validateStructuredObject(schema, parsedPayload, provider, rawPayload);
|
|
587
|
+
}
|
|
588
|
+
function parseJson(rawOutput, provider) {
|
|
589
|
+
try {
|
|
590
|
+
return JSON.parse(rawOutput);
|
|
591
|
+
} catch (error) {
|
|
592
|
+
throw new StructuredOutputParseError(
|
|
593
|
+
"failed to parse structured output as JSON",
|
|
594
|
+
provider,
|
|
595
|
+
{
|
|
596
|
+
rawOutput,
|
|
597
|
+
cause: error
|
|
598
|
+
}
|
|
599
|
+
);
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
function validateStructuredObject(schema, value, provider, rawOutput) {
|
|
603
|
+
const parsed = schema.safeParse(value);
|
|
604
|
+
if (parsed.success) {
|
|
605
|
+
return parsed.data;
|
|
606
|
+
}
|
|
607
|
+
throw new StructuredOutputValidationError(
|
|
608
|
+
"structured output does not match schema",
|
|
609
|
+
provider,
|
|
610
|
+
formatZodIssues(parsed.error.issues),
|
|
611
|
+
{
|
|
612
|
+
rawOutput
|
|
613
|
+
}
|
|
614
|
+
);
|
|
615
|
+
}
|
|
616
|
+
function formatZodIssues(issues) {
|
|
617
|
+
return issues.map((issue) => {
|
|
618
|
+
const path = issue.path.length > 0 ? issue.path.map((segment) => String(segment)).join(".") : "<root>";
|
|
619
|
+
return `${path}: ${issue.message}`;
|
|
620
|
+
});
|
|
621
|
+
}
|
|
385
622
|
|
|
386
623
|
// src/embedding-model.ts
|
|
387
|
-
import { ApiError as ApiError2 } from "@google/genai";
|
|
388
|
-
import { ProviderError as ProviderError2 } from "@core-ai/core-ai";
|
|
389
624
|
function createGoogleGenAIEmbeddingModel(client, modelId) {
|
|
390
625
|
return {
|
|
391
626
|
provider: "google",
|
|
@@ -407,48 +642,33 @@ function createGoogleGenAIEmbeddingModel(client, modelId) {
|
|
|
407
642
|
...providerOptions,
|
|
408
643
|
config: {
|
|
409
644
|
...baseRequest.config,
|
|
410
|
-
...
|
|
645
|
+
...asObject(providerOptions["config"])
|
|
411
646
|
}
|
|
412
647
|
} : baseRequest;
|
|
413
648
|
const response = await client.models.embedContent(request);
|
|
649
|
+
const tokenCounts = (response.embeddings ?? []).map((item) => item.statistics?.tokenCount).filter(
|
|
650
|
+
(tokenCount) => typeof tokenCount === "number"
|
|
651
|
+
);
|
|
652
|
+
const usage = tokenCounts.length > 0 ? {
|
|
653
|
+
inputTokens: tokenCounts.reduce(
|
|
654
|
+
(total, tokenCount) => total + tokenCount,
|
|
655
|
+
0
|
|
656
|
+
)
|
|
657
|
+
} : void 0;
|
|
414
658
|
return {
|
|
415
659
|
embeddings: (response.embeddings ?? []).map(
|
|
416
660
|
(item) => item.values ?? []
|
|
417
661
|
),
|
|
418
|
-
usage
|
|
419
|
-
inputTokens: (response.embeddings ?? []).reduce(
|
|
420
|
-
(total, item) => total + (item.statistics?.tokenCount ?? 0),
|
|
421
|
-
0
|
|
422
|
-
)
|
|
423
|
-
}
|
|
662
|
+
usage
|
|
424
663
|
};
|
|
425
664
|
} catch (error) {
|
|
426
|
-
throw
|
|
665
|
+
throw wrapGoogleError(error);
|
|
427
666
|
}
|
|
428
667
|
}
|
|
429
668
|
};
|
|
430
669
|
}
|
|
431
|
-
function wrapError2(error) {
|
|
432
|
-
if (error instanceof ApiError2) {
|
|
433
|
-
return new ProviderError2(error.message, "google", error.status, error);
|
|
434
|
-
}
|
|
435
|
-
return new ProviderError2(
|
|
436
|
-
error instanceof Error ? error.message : String(error),
|
|
437
|
-
"google",
|
|
438
|
-
void 0,
|
|
439
|
-
error
|
|
440
|
-
);
|
|
441
|
-
}
|
|
442
|
-
function asObject2(value) {
|
|
443
|
-
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
444
|
-
return value;
|
|
445
|
-
}
|
|
446
|
-
return {};
|
|
447
|
-
}
|
|
448
670
|
|
|
449
671
|
// src/image-model.ts
|
|
450
|
-
import { ApiError as ApiError3 } from "@google/genai";
|
|
451
|
-
import { ProviderError as ProviderError3 } from "@core-ai/core-ai";
|
|
452
672
|
function createGoogleGenAIImageModel(client, modelId) {
|
|
453
673
|
return {
|
|
454
674
|
provider: "google",
|
|
@@ -469,7 +689,7 @@ function createGoogleGenAIImageModel(client, modelId) {
|
|
|
469
689
|
...providerOptions,
|
|
470
690
|
config: {
|
|
471
691
|
...baseRequest.config,
|
|
472
|
-
...
|
|
692
|
+
...asObject(providerOptions["config"])
|
|
473
693
|
}
|
|
474
694
|
} : baseRequest;
|
|
475
695
|
const response = await client.models.generateImages(request);
|
|
@@ -481,22 +701,11 @@ function createGoogleGenAIImageModel(client, modelId) {
|
|
|
481
701
|
}))
|
|
482
702
|
};
|
|
483
703
|
} catch (error) {
|
|
484
|
-
throw
|
|
704
|
+
throw wrapGoogleError(error);
|
|
485
705
|
}
|
|
486
706
|
}
|
|
487
707
|
};
|
|
488
708
|
}
|
|
489
|
-
function wrapError3(error) {
|
|
490
|
-
if (error instanceof ApiError3) {
|
|
491
|
-
return new ProviderError3(error.message, "google", error.status, error);
|
|
492
|
-
}
|
|
493
|
-
return new ProviderError3(
|
|
494
|
-
error instanceof Error ? error.message : String(error),
|
|
495
|
-
"google",
|
|
496
|
-
void 0,
|
|
497
|
-
error
|
|
498
|
-
);
|
|
499
|
-
}
|
|
500
709
|
function mapSizeToImageConfig(size) {
|
|
501
710
|
if (!size) {
|
|
502
711
|
return {};
|
|
@@ -531,12 +740,6 @@ function greatestCommonDivisor(a, b) {
|
|
|
531
740
|
}
|
|
532
741
|
return x === 0 ? 1 : x;
|
|
533
742
|
}
|
|
534
|
-
function asObject3(value) {
|
|
535
|
-
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
536
|
-
return value;
|
|
537
|
-
}
|
|
538
|
-
return {};
|
|
539
|
-
}
|
|
540
743
|
|
|
541
744
|
// src/provider.ts
|
|
542
745
|
function createGoogleGenAI(options = {}) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@core-ai/google-genai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Google GenAI provider package for @core-ai/core-ai",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Omnifact (https://omnifact.ai)",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"test:watch": "vitest"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@core-ai/core-ai": "^0.
|
|
47
|
+
"@core-ai/core-ai": "^0.4.0",
|
|
48
48
|
"@google/genai": "^1.42.0",
|
|
49
49
|
"zod-to-json-schema": "^3.25.1"
|
|
50
50
|
},
|