@earendil-works/pi-ai 1.3.0 → 1.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.
Files changed (141) hide show
  1. package/README.md +78 -3
  2. package/dist/api/anthropic-messages.d.ts.map +1 -1
  3. package/dist/api/anthropic-messages.js +7 -10
  4. package/dist/api/anthropic-messages.js.map +1 -1
  5. package/dist/api/azure-openai-responses.d.ts.map +1 -1
  6. package/dist/api/azure-openai-responses.js +8 -4
  7. package/dist/api/azure-openai-responses.js.map +1 -1
  8. package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  9. package/dist/api/bedrock-converse-stream.js +12 -0
  10. package/dist/api/bedrock-converse-stream.js.map +1 -1
  11. package/dist/api/classifier-shared.d.ts.map +1 -1
  12. package/dist/api/classifier-shared.js +4 -3
  13. package/dist/api/classifier-shared.js.map +1 -1
  14. package/dist/api/cloudflare-workers-ai-system-one.d.ts.map +1 -1
  15. package/dist/api/cloudflare-workers-ai-system-one.js +8 -0
  16. package/dist/api/cloudflare-workers-ai-system-one.js.map +1 -1
  17. package/dist/api/google-generative-ai.js +4 -4
  18. package/dist/api/google-generative-ai.js.map +1 -1
  19. package/dist/api/google-shared.js +1 -1
  20. package/dist/api/google-shared.js.map +1 -1
  21. package/dist/api/google-vertex.d.ts.map +1 -1
  22. package/dist/api/google-vertex.js +9 -9
  23. package/dist/api/google-vertex.js.map +1 -1
  24. package/dist/api/lazy.d.ts +7 -2
  25. package/dist/api/lazy.d.ts.map +1 -1
  26. package/dist/api/lazy.js +24 -5
  27. package/dist/api/lazy.js.map +1 -1
  28. package/dist/api/llama-cpp-classify.d.ts.map +1 -1
  29. package/dist/api/llama-cpp-classify.js +2 -1
  30. package/dist/api/llama-cpp-classify.js.map +1 -1
  31. package/dist/api/mistral-conversations.js +2 -2
  32. package/dist/api/mistral-conversations.js.map +1 -1
  33. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  34. package/dist/api/openai-codex-responses.js +17 -11
  35. package/dist/api/openai-codex-responses.js.map +1 -1
  36. package/dist/api/openai-completions.d.ts.map +1 -1
  37. package/dist/api/openai-completions.js +14 -8
  38. package/dist/api/openai-completions.js.map +1 -1
  39. package/dist/api/openai-responses-shared.d.ts +16 -0
  40. package/dist/api/openai-responses-shared.d.ts.map +1 -1
  41. package/dist/api/openai-responses-shared.js +61 -9
  42. package/dist/api/openai-responses-shared.js.map +1 -1
  43. package/dist/api/openai-responses.d.ts.map +1 -1
  44. package/dist/api/openai-responses.js +17 -9
  45. package/dist/api/openai-responses.js.map +1 -1
  46. package/dist/api/openrouter-images.d.ts.map +1 -1
  47. package/dist/api/openrouter-images.js +4 -3
  48. package/dist/api/openrouter-images.js.map +1 -1
  49. package/dist/api/pi-messages.d.ts.map +1 -1
  50. package/dist/api/pi-messages.js +3 -3
  51. package/dist/api/pi-messages.js.map +1 -1
  52. package/dist/api/simple-options.d.ts.map +1 -1
  53. package/dist/api/simple-options.js +2 -1
  54. package/dist/api/simple-options.js.map +1 -1
  55. package/dist/api/system-one-shared.d.ts +29 -2
  56. package/dist/api/system-one-shared.d.ts.map +1 -1
  57. package/dist/api/system-one-shared.js +55 -3
  58. package/dist/api/system-one-shared.js.map +1 -1
  59. package/dist/api/typesafe-system-one.d.ts.map +1 -1
  60. package/dist/api/typesafe-system-one.js +10 -0
  61. package/dist/api/typesafe-system-one.js.map +1 -1
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +2 -0
  65. package/dist/index.js.map +1 -1
  66. package/dist/models.d.ts +4 -0
  67. package/dist/models.d.ts.map +1 -1
  68. package/dist/models.js +19 -6
  69. package/dist/models.js.map +1 -1
  70. package/dist/providers/compat-schema.d.ts +168 -0
  71. package/dist/providers/compat-schema.d.ts.map +1 -1
  72. package/dist/providers/compat-schema.js +15 -2
  73. package/dist/providers/compat-schema.js.map +1 -1
  74. package/dist/providers/data/.manifest.json +1 -1
  75. package/dist/providers/data/amazon-bedrock.json +1 -1
  76. package/dist/providers/data/azure.json +1 -1
  77. package/dist/providers/data/baseten.json +1 -1
  78. package/dist/providers/data/cerebras.json +1 -1
  79. package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  80. package/dist/providers/data/cloudflare-workers-ai.json +1 -1
  81. package/dist/providers/data/fireworks.json +1 -1
  82. package/dist/providers/data/github-copilot.json +1 -1
  83. package/dist/providers/data/google.json +1 -1
  84. package/dist/providers/data/groq.json +1 -1
  85. package/dist/providers/data/huggingface.json +1 -1
  86. package/dist/providers/data/minimax-cn.json +1 -1
  87. package/dist/providers/data/minimax.json +1 -1
  88. package/dist/providers/data/mistral.json +1 -1
  89. package/dist/providers/data/moonshotai-cn.json +1 -1
  90. package/dist/providers/data/nvidia.json +1 -1
  91. package/dist/providers/data/openai-codex.json +1 -1
  92. package/dist/providers/data/openai.json +1 -1
  93. package/dist/providers/data/opencode-go.json +1 -1
  94. package/dist/providers/data/opencode.json +1 -1
  95. package/dist/providers/data/openrouter.json +1 -1
  96. package/dist/providers/data/qwen-token-plan-cn.json +1 -1
  97. package/dist/providers/data/qwen-token-plan.json +1 -1
  98. package/dist/providers/data/radius.json +1 -1
  99. package/dist/providers/data/together.json +1 -1
  100. package/dist/providers/data/typesafe.json +1 -1
  101. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  102. package/dist/providers/data/xai.json +1 -1
  103. package/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
  104. package/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
  105. package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
  106. package/dist/providers/data/xiaomi.json +1 -1
  107. package/dist/providers/data/zai-coding-cn.json +1 -1
  108. package/dist/providers/model-schema.d.ts.map +1 -1
  109. package/dist/providers/model-schema.js +4 -2
  110. package/dist/providers/model-schema.js.map +1 -1
  111. package/dist/telemetry.d.ts +288 -0
  112. package/dist/telemetry.d.ts.map +1 -0
  113. package/dist/telemetry.js +191 -0
  114. package/dist/telemetry.js.map +1 -0
  115. package/dist/types.d.ts +13 -5
  116. package/dist/types.d.ts.map +1 -1
  117. package/dist/types.js.map +1 -1
  118. package/dist/utils/identity.d.ts +65 -0
  119. package/dist/utils/identity.d.ts.map +1 -0
  120. package/dist/utils/identity.js +141 -0
  121. package/dist/utils/identity.js.map +1 -0
  122. package/dist/utils/overflow.d.ts +1 -0
  123. package/dist/utils/overflow.d.ts.map +1 -1
  124. package/dist/utils/overflow.js +6 -1
  125. package/dist/utils/overflow.js.map +1 -1
  126. package/dist/utils/retry.d.ts.map +1 -1
  127. package/dist/utils/retry.js +16 -7
  128. package/dist/utils/retry.js.map +1 -1
  129. package/dist/utils/transcript.d.ts +22 -8
  130. package/dist/utils/transcript.d.ts.map +1 -1
  131. package/dist/utils/transcript.js +29 -18
  132. package/dist/utils/transcript.js.map +1 -1
  133. package/dist/utils/version.d.ts +2 -0
  134. package/dist/utils/version.d.ts.map +1 -0
  135. package/dist/utils/version.js +3 -0
  136. package/dist/utils/version.js.map +1 -0
  137. package/package.json +2 -2
  138. package/dist/utils/pi-user-agent.d.ts +0 -2
  139. package/dist/utils/pi-user-agent.d.ts.map +0 -1
  140. package/dist/utils/pi-user-agent.js +0 -12
  141. package/dist/utils/pi-user-agent.js.map +0 -1
@@ -4,8 +4,8 @@ import { formatProviderError, normalizeProviderError } from "../utils/error-body
4
4
  import { AssistantMessageEventStream } from "../utils/event-stream.js";
5
5
  import { shortHash } from "../utils/hash.js";
6
6
  import { headersToRecord } from "../utils/headers.js";
7
+ import { getIdentityHeaders } from "../utils/identity.js";
7
8
  import { parseStreamingJson, parseToolCallArguments } from "../utils/json-parse.js";
8
- import { getPiUserAgent } from "../utils/pi-user-agent.js";
9
9
  import { getProviderEnvValue } from "../utils/provider-env.js";
10
10
  import { retryProviderRequest } from "../utils/provider-retry.js";
11
11
  import { sanitizeSurrogates } from "../utils/sanitize-unicode.js";
@@ -183,7 +183,7 @@ export const stream = (model, context, options) => {
183
183
  const grammarToolInputProperties = createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages), compat.supportsOpenAIGrammarTools);
184
184
  const cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env);
185
185
  const cacheSessionId = cacheRetention === "none" ? undefined : options?.sessionId;
186
- const client = createClient(model, normalizedContext, apiKey, options?.headers, options?.fetch, cacheSessionId, compat);
186
+ const client = createClient(model, normalizedContext, apiKey, options?.headers, options?.identity, options?.fetch, cacheSessionId, compat);
187
187
  let params = buildParams(model, normalizedContext, options, compat, cacheRetention, grammarToolInputProperties);
188
188
  const nextParams = await options?.onPayload?.(params, model);
189
189
  if (nextParams !== undefined) {
@@ -531,8 +531,8 @@ export const streamSimple = (model, context, options) => {
531
531
  thinkingBudgets: options?.thinkingBudgets,
532
532
  });
533
533
  };
534
- function createClient(model, context, apiKey, optionsHeaders, fetch, sessionId, compat = getCompat(model)) {
535
- const headers = { "User-Agent": getPiUserAgent(), ...model.headers };
534
+ function createClient(model, context, apiKey, optionsHeaders, identity, fetch, sessionId, compat = getCompat(model)) {
535
+ const headers = { ...getIdentityHeaders(model, identity), ...model.headers };
536
536
  if (model.provider === "github-copilot") {
537
537
  const hasImages = hasCopilotVisionInput(context.messages);
538
538
  const copilotHeaders = buildCopilotDynamicHeaders({
@@ -566,7 +566,9 @@ function createClient(model, context, apiKey, optionsHeaders, fetch, sessionId,
566
566
  });
567
567
  }
568
568
  function buildParams(model, context, options, compat = getCompat(model), cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env), grammarToolInputProperties = createGrammarToolInputProperties(getDeclaredTools(context.messages), compat.supportsOpenAIGrammarTools)) {
569
- const transcriptTools = resolveTranscriptTools(context.messages, compat.supportsMidConvoSystemMessages === true && compat.supportsMidConvoToolAdditions === true);
569
+ const transcriptTools = resolveTranscriptTools(context.messages, compat.supportsMidConvoSystemMessages === true && compat.supportsMidConvoToolAdditions === true
570
+ ? "additions"
571
+ : "none");
570
572
  const messages = convertMessages(model, context, compat, {
571
573
  grammarToolInputProperties,
572
574
  });
@@ -897,9 +899,12 @@ export function convertMessages(model, context, compat, options) {
897
899
  return id;
898
900
  };
899
901
  const transformedMessages = transformMessages(normalizedContext.messages, model, (id) => normalizeToolCallId(id));
900
- const transcriptTools = resolveTranscriptTools(normalizedContext.messages, compat.supportsMidConvoSystemMessages === true && compat.supportsMidConvoToolAdditions === true);
902
+ const transcriptTools = resolveTranscriptTools(normalizedContext.messages, compat.supportsMidConvoSystemMessages === true && compat.supportsMidConvoToolAdditions === true
903
+ ? "additions"
904
+ : "none");
901
905
  const instructionRole = model.reasoning && compat.supportsDeveloperRole ? "developer" : "system";
902
906
  let lastRole = null;
907
+ let systemIndex = 0;
903
908
  for (let i = 0; i < transformedMessages.length; i++) {
904
909
  const msg = transformedMessages[i];
905
910
  // Some providers don't allow user messages directly after tool results
@@ -911,7 +916,8 @@ export function convertMessages(model, context, compat, options) {
911
916
  });
912
917
  }
913
918
  if (msg.role === "system") {
914
- const addedTools = i > 0 && transcriptTools.anchorsAdditions ? (msg.toolsAdded ?? []) : [];
919
+ // transformMessages keeps system messages in order, so their position matches the transcript.
920
+ const addedTools = systemIndex++ >= transcriptTools.foldedSystemMessages ? (msg.toolsAdded ?? []) : [];
915
921
  if (addedTools.length > 0) {
916
922
  const kimiToolMessage = {
917
923
  role: "system",
@@ -1076,7 +1082,7 @@ export function convertMessages(model, context, compat, options) {
1076
1082
  .join("\n");
1077
1083
  const hasImages = toolMsg.content.some((c) => c.type === "image");
1078
1084
  // Always send tool result with text (or placeholder if only images)
1079
- const hasText = textResult.length > 0;
1085
+ const hasText = textResult.trim().length > 0;
1080
1086
  const toolResultText = hasText ? textResult : hasImages ? "(see attached image)" : "(no tool output)";
1081
1087
  // Some providers require the 'name' field in tool results
1082
1088
  const toolResultMsg = {