@bastani/pi-ai 0.9.41 → 0.9.42

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 (50) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +2 -0
  3. package/dist/api/anthropic-messages.d.ts.map +1 -1
  4. package/dist/api/anthropic-messages.js +37 -3
  5. package/dist/api/anthropic-messages.js.map +1 -1
  6. package/dist/api/azure-openai-responses.d.ts.map +1 -1
  7. package/dist/api/azure-openai-responses.js +12 -4
  8. package/dist/api/azure-openai-responses.js.map +1 -1
  9. package/dist/api/mistral-conversations.d.ts.map +1 -1
  10. package/dist/api/mistral-conversations.js +3 -1
  11. package/dist/api/mistral-conversations.js.map +1 -1
  12. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  13. package/dist/api/openai-codex-responses.js +3 -1
  14. package/dist/api/openai-codex-responses.js.map +1 -1
  15. package/dist/api/openai-completions.d.ts.map +1 -1
  16. package/dist/api/openai-completions.js +12 -4
  17. package/dist/api/openai-completions.js.map +1 -1
  18. package/dist/api/openai-responses.d.ts.map +1 -1
  19. package/dist/api/openai-responses.js +4 -3
  20. package/dist/api/openai-responses.js.map +1 -1
  21. package/dist/auth/types.d.ts +4 -0
  22. package/dist/auth/types.d.ts.map +1 -1
  23. package/dist/auth/types.js.map +1 -1
  24. package/dist/compat/extension-oauth-types.d.ts +4 -0
  25. package/dist/compat/extension-oauth-types.d.ts.map +1 -1
  26. package/dist/compat/extension-oauth-types.js.map +1 -1
  27. package/dist/providers/data/.manifest.json +1 -1
  28. package/dist/providers/data/fireworks.json +1 -1
  29. package/dist/providers/data/huggingface.json +1 -1
  30. package/dist/providers/data/mistral.json +1 -1
  31. package/dist/providers/data/nvidia.json +1 -1
  32. package/dist/providers/data/opencode-go.json +1 -1
  33. package/dist/providers/data/opencode.json +1 -1
  34. package/dist/providers/data/openrouter.json +1 -1
  35. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  36. package/dist/types.d.ts +5 -0
  37. package/dist/types.d.ts.map +1 -1
  38. package/dist/types.js.map +1 -1
  39. package/dist/utils/openrouter-cost.d.ts +24 -0
  40. package/dist/utils/openrouter-cost.d.ts.map +1 -0
  41. package/dist/utils/openrouter-cost.js +34 -0
  42. package/dist/utils/openrouter-cost.js.map +1 -0
  43. package/dist/utils/request-admission.d.ts +12 -0
  44. package/dist/utils/request-admission.d.ts.map +1 -0
  45. package/dist/utils/request-admission.js +37 -0
  46. package/dist/utils/request-admission.js.map +1 -0
  47. package/dist/utils/version.d.ts +1 -1
  48. package/dist/utils/version.js +1 -1
  49. package/dist/utils/version.js.map +1 -1
  50. package/package.json +2 -2
@@ -5,8 +5,10 @@ import { shortHash } from "../utils/hash.js";
5
5
  import { headersToRecord } from "../utils/headers.js";
6
6
  import { getIdentityHeaders } from "../utils/identity.js";
7
7
  import { parseStreamingJson, parseToolCallArguments } from "../utils/json-parse.js";
8
+ import { applyOpenRouterReportedCost, isOpenRouterModel, } from "../utils/openrouter-cost.js";
8
9
  import { getProviderEnvValue } from "../utils/provider-env.js";
9
10
  import { retryProviderRequest } from "../utils/provider-retry.js";
11
+ import { admitOpenAIRequests, getFetchAdmission } from "../utils/request-admission.js";
10
12
  import { getProviderRetryAfterMs } from "../utils/retry-hints.js";
11
13
  import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
12
14
  import { createStreamDeadline, withStreamDeadline } from "../utils/stream-deadline.js";
@@ -575,14 +577,14 @@ function createClient(model, context, apiKey, optionsHeaders, identity, fetch, s
575
577
  if (optionsHeaders) {
576
578
  Object.assign(headers, optionsHeaders);
577
579
  }
578
- return new RetryHintOpenAI({
580
+ return admitOpenAIRequests(new RetryHintOpenAI({
579
581
  apiKey,
580
582
  baseURL: model.baseUrl,
581
583
  dangerouslyAllowBrowser: true,
582
- fetch,
584
+ fetch: getFetchAdmission(fetch)?.fetch ?? fetch,
583
585
  // Affinity defaults yield to explicit model and request headers, including null suppression.
584
586
  defaultHeaders: { ...sessionAffinityHeaders, ...headers },
585
- });
587
+ }), fetch);
586
588
  }
587
589
  function buildParams(model, context, options, compat = getCompat(model), cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env), grammarToolInputProperties = createGrammarToolInputProperties(getDeclaredTools(context.messages), compat.supportsOpenAIGrammarTools)) {
588
590
  const transcriptTools = resolveTranscriptTools(context.messages, compat.supportsMidConvoSystemMessages === true && compat.supportsMidConvoToolAdditions === true
@@ -1241,7 +1243,10 @@ function convertTools(tools, compat) {
1241
1243
  };
1242
1244
  });
1243
1245
  }
1244
- function parseChunkUsage(rawUsage, model) {
1246
+ function parseChunkUsage(
1247
+ // OpenRouter adds billing fields to streamed usage at runtime,
1248
+ // although the OpenAI SDK does not type those fields.
1249
+ rawUsage, model) {
1245
1250
  const promptTokens = rawUsage.prompt_tokens || 0;
1246
1251
  const cacheReadTokens = rawUsage.prompt_tokens_details?.cached_tokens ?? rawUsage.prompt_cache_hit_tokens ?? rawUsage.cached_tokens ?? 0;
1247
1252
  const cacheWriteTokens = rawUsage.prompt_tokens_details?.cache_write_tokens || 0;
@@ -1269,6 +1274,9 @@ function parseChunkUsage(rawUsage, model) {
1269
1274
  cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
1270
1275
  };
1271
1276
  calculateCost(model, usage);
1277
+ if (isOpenRouterModel(model)) {
1278
+ applyOpenRouterReportedCost(usage, rawUsage);
1279
+ }
1272
1280
  return usage;
1273
1281
  }
1274
1282
  function mapStopReason(reason) {