@llumiverse/drivers 1.2.0 → 1.3.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.
Files changed (49) hide show
  1. package/lib/cjs/anthropic/index.js +64 -0
  2. package/lib/cjs/anthropic/index.js.map +1 -0
  3. package/lib/cjs/index.js +1 -0
  4. package/lib/cjs/index.js.map +1 -1
  5. package/lib/cjs/openai/index.js +12 -6
  6. package/lib/cjs/openai/index.js.map +1 -1
  7. package/lib/cjs/shared/claude-messages.js +737 -0
  8. package/lib/cjs/shared/claude-messages.js.map +1 -0
  9. package/lib/cjs/vertexai/index.js.map +1 -1
  10. package/lib/cjs/vertexai/models/claude.js +27 -872
  11. package/lib/cjs/vertexai/models/claude.js.map +1 -1
  12. package/lib/cjs/vertexai/models/gemini.js +18 -12
  13. package/lib/cjs/vertexai/models/gemini.js.map +1 -1
  14. package/lib/esm/anthropic/index.js +57 -0
  15. package/lib/esm/anthropic/index.js.map +1 -0
  16. package/lib/esm/index.js +1 -0
  17. package/lib/esm/index.js.map +1 -1
  18. package/lib/esm/openai/index.js +12 -7
  19. package/lib/esm/openai/index.js.map +1 -1
  20. package/lib/esm/shared/claude-messages.js +716 -0
  21. package/lib/esm/shared/claude-messages.js.map +1 -0
  22. package/lib/esm/vertexai/index.js.map +1 -1
  23. package/lib/esm/vertexai/models/claude.js +27 -865
  24. package/lib/esm/vertexai/models/claude.js.map +1 -1
  25. package/lib/esm/vertexai/models/gemini.js +18 -12
  26. package/lib/esm/vertexai/models/gemini.js.map +1 -1
  27. package/lib/types/anthropic/index.d.ts +21 -0
  28. package/lib/types/anthropic/index.d.ts.map +1 -0
  29. package/lib/types/index.d.ts +1 -0
  30. package/lib/types/index.d.ts.map +1 -1
  31. package/lib/types/openai/index.d.ts +1 -0
  32. package/lib/types/openai/index.d.ts.map +1 -1
  33. package/lib/types/shared/claude-messages.d.ts +75 -0
  34. package/lib/types/shared/claude-messages.d.ts.map +1 -0
  35. package/lib/types/vertexai/index.d.ts +4 -4
  36. package/lib/types/vertexai/index.d.ts.map +1 -1
  37. package/lib/types/vertexai/models/claude.d.ts +3 -106
  38. package/lib/types/vertexai/models/claude.d.ts.map +1 -1
  39. package/lib/types/vertexai/models/gemini.d.ts +1 -1
  40. package/lib/types/vertexai/models/gemini.d.ts.map +1 -1
  41. package/package.json +7 -6
  42. package/src/anthropic/index.ts +104 -0
  43. package/src/index.ts +1 -0
  44. package/src/openai/index.ts +13 -8
  45. package/src/shared/claude-messages.ts +879 -0
  46. package/src/vertexai/index.ts +18 -19
  47. package/src/vertexai/models/claude-error-handling.test.ts +3 -3
  48. package/src/vertexai/models/claude.ts +44 -1016
  49. package/src/vertexai/models/gemini.ts +27 -14
@@ -482,7 +482,7 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
482
482
  return { contents, system };
483
483
  }
484
484
 
485
- usageMetadataToTokenUsage(usageMetadata: GenerateContentResponseUsageMetadata | undefined): ExecutionTokenUsage {
485
+ usageMetadataToTokenUsage(driver: VertexAIDriver, usageMetadata: GenerateContentResponseUsageMetadata | undefined): ExecutionTokenUsage {
486
486
  if (!usageMetadata || !usageMetadata.totalTokenCount) {
487
487
  return {};
488
488
  }
@@ -499,11 +499,14 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
499
499
  + (usageMetadata.toolUsePromptTokenCount ?? 0);
500
500
 
501
501
  if ((tokenUsage.total ?? 0) !== (tokenUsage.prompt ?? 0) + tokenUsage.result) {
502
- console.warn("[VertexAI] Gemini token usage mismatch: total does not equal prompt + result", {
503
- total: tokenUsage.total,
504
- prompt: tokenUsage.prompt,
505
- result: tokenUsage.result
506
- });
502
+ // Token-accounting mismatch: warn-level diagnostic (the call still
503
+ // returns the best-effort tokenUsage). Use the driver's structured
504
+ // logger so we don't promote stderr writes to ERROR in serverless
505
+ // log aggregators — see the recoverable-tool-call sites below.
506
+ driver.logger.warn(
507
+ { total: tokenUsage.total, prompt: tokenUsage.prompt, result: tokenUsage.result },
508
+ "[VertexAI] Gemini token usage mismatch: total does not equal prompt + result",
509
+ );
507
510
  }
508
511
 
509
512
  if (!tokenUsage.result) {
@@ -545,7 +548,7 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
545
548
  const payload = getGeminiPayload(options, prompt);
546
549
  const response = await client.models.generateContent(payload);
547
550
 
548
- const token_usage: ExecutionTokenUsage = this.usageMetadataToTokenUsage(response.usageMetadata);
551
+ const token_usage: ExecutionTokenUsage = this.usageMetadataToTokenUsage(driver, response.usageMetadata);
549
552
 
550
553
  let tool_use: ToolUse[] | undefined;
551
554
  let finish_reason: string | undefined, result: any;
@@ -570,10 +573,15 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
570
573
  tool_use = collectToolUseParts(content);
571
574
 
572
575
  // For recoverable tool call issues, log warning but continue processing
573
- // The workflow will handle the invalid tool call gracefully
576
+ // The workflow will handle the invalid tool call gracefully.
577
+ // Route through the driver's structured logger instead of `console.warn`
578
+ // so downstream runtimes (e.g. Cloud Run) don't promote stderr writes
579
+ // to ERROR severity for what is, by definition, a recoverable event.
574
580
  if (isRecoverableToolCall && tool_use && tool_use.length > 0) {
575
- console.warn(`[Gemini] Recoverable tool call issue (${candidate.finishReason}): ` +
576
- `Model tried to call undeclared tool(s): ${tool_use.map(t => t.tool_name).join(', ')}`);
581
+ driver.logger.warn(
582
+ `[Gemini] Recoverable tool call issue (${candidate.finishReason}): ` +
583
+ `Model tried to call undeclared tool(s): ${tool_use.map(t => t.tool_name).join(', ')}`,
584
+ );
577
585
  }
578
586
 
579
587
  result = extractCompletionResults(content);
@@ -654,7 +662,7 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
654
662
  const response = await client.models.generateContentStream(payload);
655
663
 
656
664
  const stream = asyncMap(response, async (item) => {
657
- const token_usage: ExecutionTokenUsage = this.usageMetadataToTokenUsage(item.usageMetadata);
665
+ const token_usage: ExecutionTokenUsage = this.usageMetadataToTokenUsage(driver, item.usageMetadata);
658
666
  if (item.candidates && item.candidates.length > 0) {
659
667
  for (const candidate of item.candidates) {
660
668
  let tool_use: ToolUse[] | undefined;
@@ -677,10 +685,15 @@ export class GeminiModelDefinition implements ModelDefinition<GenerateContentPro
677
685
  tool_use = collectToolUseParts(candidate.content);
678
686
  if (tool_use) {
679
687
  finish_reason = "tool_use";
680
- // Log warning for recoverable tool call issues
688
+ // Log warning for recoverable tool call issues — see the
689
+ // matching site in `requestTextCompletion` above for why
690
+ // we route through the driver's logger instead of
691
+ // `console.warn`.
681
692
  if (isRecoverableToolCall) {
682
- console.warn(`[Gemini] Recoverable tool call issue (${candidate.finishReason}): ` +
683
- `Model tried to call undeclared tool(s): ${tool_use.map(t => t.tool_name).join(', ')}`);
693
+ driver.logger.warn(
694
+ `[Gemini] Recoverable tool call issue (${candidate.finishReason}): ` +
695
+ `Model tried to call undeclared tool(s): ${tool_use.map(t => t.tool_name).join(', ')}`,
696
+ );
684
697
  }
685
698
  }
686
699
  return {