@earendil-works/pi-ai 1.5.0 → 1.5.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.
Files changed (122) hide show
  1. package/README.md +23 -4
  2. package/dist/api/anthropic-messages.d.ts.map +1 -1
  3. package/dist/api/anthropic-messages.js +224 -17
  4. package/dist/api/anthropic-messages.js.map +1 -1
  5. package/dist/api/azure-openai-responses.js +1 -1
  6. package/dist/api/azure-openai-responses.js.map +1 -1
  7. package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  8. package/dist/api/bedrock-converse-stream.js +4 -2
  9. package/dist/api/bedrock-converse-stream.js.map +1 -1
  10. package/dist/api/bedrock-converse-stream.lazy.d.ts +7 -0
  11. package/dist/api/bedrock-converse-stream.lazy.d.ts.map +1 -1
  12. package/dist/api/bedrock-converse-stream.lazy.js +18 -5
  13. package/dist/api/bedrock-converse-stream.lazy.js.map +1 -1
  14. package/dist/api/constrained-sampling.d.ts +0 -2
  15. package/dist/api/constrained-sampling.d.ts.map +1 -1
  16. package/dist/api/constrained-sampling.js +0 -13
  17. package/dist/api/constrained-sampling.js.map +1 -1
  18. package/dist/api/lazy.d.ts +1 -1
  19. package/dist/api/lazy.d.ts.map +1 -1
  20. package/dist/api/lazy.js +9 -8
  21. package/dist/api/lazy.js.map +1 -1
  22. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  23. package/dist/api/openai-codex-responses.js +7 -3
  24. package/dist/api/openai-codex-responses.js.map +1 -1
  25. package/dist/api/openai-completions.d.ts +2 -1
  26. package/dist/api/openai-completions.d.ts.map +1 -1
  27. package/dist/api/openai-completions.js +13 -5
  28. package/dist/api/openai-completions.js.map +1 -1
  29. package/dist/api/openai-responses.d.ts.map +1 -1
  30. package/dist/api/openai-responses.js +4 -2
  31. package/dist/api/openai-responses.js.map +1 -1
  32. package/dist/api/simple-options.d.ts +1 -0
  33. package/dist/api/simple-options.d.ts.map +1 -1
  34. package/dist/api/simple-options.js +16 -2
  35. package/dist/api/simple-options.js.map +1 -1
  36. package/dist/api/strict-tool-limits.d.ts +13 -0
  37. package/dist/api/strict-tool-limits.d.ts.map +1 -0
  38. package/dist/api/strict-tool-limits.js +50 -0
  39. package/dist/api/strict-tool-limits.js.map +1 -0
  40. package/dist/auth/oauth/load.d.ts.map +1 -1
  41. package/dist/auth/oauth/load.js +5 -2
  42. package/dist/auth/oauth/load.js.map +1 -1
  43. package/dist/cache-warming.d.ts +53 -0
  44. package/dist/cache-warming.d.ts.map +1 -0
  45. package/dist/cache-warming.js +82 -0
  46. package/dist/cache-warming.js.map +1 -0
  47. package/dist/env-api-keys.d.ts.map +1 -1
  48. package/dist/env-api-keys.js +1 -0
  49. package/dist/env-api-keys.js.map +1 -1
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +1 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/lazy-bedrock-provider.d.ts +10 -0
  55. package/dist/lazy-bedrock-provider.d.ts.map +1 -0
  56. package/dist/lazy-bedrock-provider.js +13 -0
  57. package/dist/lazy-bedrock-provider.js.map +1 -0
  58. package/dist/lazy-oauth.d.ts +10 -0
  59. package/dist/lazy-oauth.d.ts.map +1 -0
  60. package/dist/lazy-oauth.js +23 -0
  61. package/dist/lazy-oauth.js.map +1 -0
  62. package/dist/models.d.ts +7 -0
  63. package/dist/models.d.ts.map +1 -1
  64. package/dist/models.generated.d.ts +4 -0
  65. package/dist/models.generated.d.ts.map +1 -1
  66. package/dist/models.generated.js +4 -0
  67. package/dist/models.generated.js.map +1 -1
  68. package/dist/models.js +19 -11
  69. package/dist/models.js.map +1 -1
  70. package/dist/providers/all.d.ts.map +1 -1
  71. package/dist/providers/all.js +2 -0
  72. package/dist/providers/all.js.map +1 -1
  73. package/dist/providers/compat-schema.d.ts +16 -0
  74. package/dist/providers/compat-schema.d.ts.map +1 -1
  75. package/dist/providers/compat-schema.js +22 -1
  76. package/dist/providers/compat-schema.js.map +1 -1
  77. package/dist/providers/data/.manifest.json +1 -1
  78. package/dist/providers/data/amazon-bedrock.json +1 -1
  79. package/dist/providers/data/anthropic.json +1 -1
  80. package/dist/providers/data/azure.json +1 -1
  81. package/dist/providers/data/baseten.json +1 -1
  82. package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  83. package/dist/providers/data/fireworks.json +1 -1
  84. package/dist/providers/data/github-copilot.json +1 -1
  85. package/dist/providers/data/google.json +1 -1
  86. package/dist/providers/data/nvidia.json +1 -1
  87. package/dist/providers/data/opencode-go.json +1 -1
  88. package/dist/providers/data/opencode.json +1 -1
  89. package/dist/providers/data/openrouter.json +1 -1
  90. package/dist/providers/data/qwen-token-plan-individual-cn.json +1 -0
  91. package/dist/providers/data/qwen-token-plan-individual.json +1 -1
  92. package/dist/providers/data/radius.json +1 -1
  93. package/dist/providers/data/together.json +1 -1
  94. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  95. package/dist/providers/github-copilot.d.ts +3 -1
  96. package/dist/providers/github-copilot.d.ts.map +1 -1
  97. package/dist/providers/github-copilot.js +13 -2
  98. package/dist/providers/github-copilot.js.map +1 -1
  99. package/dist/providers/openai-codex.js +1 -1
  100. package/dist/providers/openai-codex.js.map +1 -1
  101. package/dist/providers/qwen-token-plan-individual-cn.d.ts +3 -0
  102. package/dist/providers/qwen-token-plan-individual-cn.d.ts.map +1 -0
  103. package/dist/providers/qwen-token-plan-individual-cn.js +15 -0
  104. package/dist/providers/qwen-token-plan-individual-cn.js.map +1 -0
  105. package/dist/providers/qwen-token-plan-individual-cn.models.d.ts +6 -0
  106. package/dist/providers/qwen-token-plan-individual-cn.models.d.ts.map +1 -0
  107. package/dist/providers/qwen-token-plan-individual-cn.models.js +8 -0
  108. package/dist/providers/qwen-token-plan-individual-cn.models.js.map +1 -0
  109. package/dist/types.d.ts +8 -1
  110. package/dist/types.d.ts.map +1 -1
  111. package/dist/types.js.map +1 -1
  112. package/dist/utils/error-body.d.ts +8 -0
  113. package/dist/utils/error-body.d.ts.map +1 -1
  114. package/dist/utils/error-body.js +28 -1
  115. package/dist/utils/error-body.js.map +1 -1
  116. package/dist/utils/retry.d.ts.map +1 -1
  117. package/dist/utils/retry.js +3 -0
  118. package/dist/utils/retry.js.map +1 -1
  119. package/dist/utils/version.d.ts +1 -1
  120. package/dist/utils/version.js +1 -1
  121. package/dist/utils/version.js.map +1 -1
  122. package/package.json +11 -3
@@ -555,12 +555,16 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
555
555
  grammarToolInputProperties,
556
556
  });
557
557
  const cacheControl = getCompatCacheControl(compat, cacheRetention);
558
+ const promptCacheKeyMode = compat.promptCacheKeyMode ?? "auto";
559
+ const supportsPromptCacheKey = promptCacheKeyMode === "enabled" ||
560
+ (promptCacheKeyMode === "auto" &&
561
+ (model.baseUrl.includes("api.openai.com") ||
562
+ (cacheRetention === "long" && compat.supportsLongCacheRetention)));
558
563
  const params = {
559
564
  model: model.id,
560
565
  messages,
561
566
  stream: true,
562
- prompt_cache_key: (model.baseUrl.includes("api.openai.com") && cacheRetention !== "none") ||
563
- (cacheRetention === "long" && compat.supportsLongCacheRetention)
567
+ prompt_cache_key: cacheRetention !== "none" && supportsPromptCacheKey
564
568
  ? clampOpenAIPromptCacheKey(options?.sessionId)
565
569
  : undefined,
566
570
  prompt_cache_retention: cacheRetention === "long" && compat.supportsLongCacheRetention ? "24h" : undefined,
@@ -589,8 +593,7 @@ function buildParams(model, context, options, compat = getCompat(model), cacheRe
589
593
  params.tool_stream = true;
590
594
  }
591
595
  }
592
- else if (hasToolHistory(context.messages)) {
593
- // Anthropic (via LiteLLM/proxy) requires tools param when conversation has tool_calls/tool_results
596
+ else if (compat.requiresToolsWithToolHistory && hasToolHistory(context.messages)) {
594
597
  params.tools = [];
595
598
  }
596
599
  if (cacheControl) {
@@ -950,7 +953,7 @@ export function convertMessages(model, context, compat, options) {
950
953
  // Some providers don't accept null content, use empty string instead
951
954
  const assistantMsg = {
952
955
  role: "assistant",
953
- content: compat.requiresAssistantAfterToolResult ? "" : null,
956
+ content: compat.requiresAssistantAfterToolResult || compat.requiresNonNullAssistantContent ? "" : null,
954
957
  };
955
958
  const assistantTextParts = msg.content
956
959
  .filter(isTextContentBlock)
@@ -1264,6 +1267,8 @@ function detectCompat(model) {
1264
1267
  maxTokensField: useMaxTokens ? "max_tokens" : "max_completion_tokens",
1265
1268
  requiresToolResultName: false,
1266
1269
  requiresAssistantAfterToolResult: false,
1270
+ requiresNonNullAssistantContent: false,
1271
+ requiresToolsWithToolHistory: false,
1267
1272
  requiresThinkingAsText: false,
1268
1273
  requiresReasoningContentOnAssistantMessages: isDeepSeek,
1269
1274
  thinkingFormat: isDeepSeek
@@ -1316,6 +1321,8 @@ function getCompat(model) {
1316
1321
  maxTokensField: model.compat.maxTokensField ?? detected.maxTokensField,
1317
1322
  requiresToolResultName: model.compat.requiresToolResultName ?? detected.requiresToolResultName,
1318
1323
  requiresAssistantAfterToolResult: model.compat.requiresAssistantAfterToolResult ?? detected.requiresAssistantAfterToolResult,
1324
+ requiresNonNullAssistantContent: model.compat.requiresNonNullAssistantContent ?? detected.requiresNonNullAssistantContent,
1325
+ requiresToolsWithToolHistory: model.compat.requiresToolsWithToolHistory ?? detected.requiresToolsWithToolHistory,
1319
1326
  requiresThinkingAsText: model.compat.requiresThinkingAsText ?? detected.requiresThinkingAsText,
1320
1327
  requiresReasoningContentOnAssistantMessages: model.compat.requiresReasoningContentOnAssistantMessages ??
1321
1328
  detected.requiresReasoningContentOnAssistantMessages,
@@ -1335,6 +1342,7 @@ function getCompat(model) {
1335
1342
  sendSessionAffinityHeaders: model.compat.sendSessionAffinityHeaders ?? detected.sendSessionAffinityHeaders,
1336
1343
  sessionAffinityFormat: model.compat.sessionAffinityFormat ?? detected.sessionAffinityFormat,
1337
1344
  supportsLongCacheRetention: model.compat.supportsLongCacheRetention ?? detected.supportsLongCacheRetention,
1345
+ promptCacheKeyMode: model.compat.promptCacheKeyMode,
1338
1346
  vllmPriority: model.compat.vllmPriority,
1339
1347
  };
1340
1348
  }