@boxiaolanya2008/pi-ai 0.60.4

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 (164) hide show
  1. package/README.md +1198 -0
  2. package/bedrock-provider.d.ts +1 -0
  3. package/bedrock-provider.js +1 -0
  4. package/dist/api-registry.d.ts +20 -0
  5. package/dist/api-registry.d.ts.map +1 -0
  6. package/dist/api-registry.js +44 -0
  7. package/dist/api-registry.js.map +1 -0
  8. package/dist/bedrock-provider.d.ts +5 -0
  9. package/dist/bedrock-provider.d.ts.map +1 -0
  10. package/dist/bedrock-provider.js +6 -0
  11. package/dist/bedrock-provider.js.map +1 -0
  12. package/dist/cli.d.ts +3 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +113 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/env-api-keys.d.ts +4 -0
  17. package/dist/env-api-keys.d.ts.map +1 -0
  18. package/dist/env-api-keys.js +85 -0
  19. package/dist/env-api-keys.js.map +1 -0
  20. package/dist/index.d.ts +23 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +21 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/models.d.ts +22 -0
  25. package/dist/models.d.ts.map +1 -0
  26. package/dist/models.generated.d.ts +4 -0
  27. package/dist/models.generated.d.ts.map +1 -0
  28. package/dist/models.generated.js +11 -0
  29. package/dist/models.generated.js.map +1 -0
  30. package/dist/models.js +50 -0
  31. package/dist/models.js.map +1 -0
  32. package/dist/oauth.d.ts +2 -0
  33. package/dist/oauth.d.ts.map +1 -0
  34. package/dist/oauth.js +2 -0
  35. package/dist/oauth.js.map +1 -0
  36. package/dist/providers/amazon-bedrock.d.ts +15 -0
  37. package/dist/providers/amazon-bedrock.d.ts.map +1 -0
  38. package/dist/providers/amazon-bedrock.js +552 -0
  39. package/dist/providers/amazon-bedrock.js.map +1 -0
  40. package/dist/providers/anthropic.d.ts +15 -0
  41. package/dist/providers/anthropic.d.ts.map +1 -0
  42. package/dist/providers/anthropic.js +677 -0
  43. package/dist/providers/anthropic.js.map +1 -0
  44. package/dist/providers/azure-openai-responses.d.ts +12 -0
  45. package/dist/providers/azure-openai-responses.d.ts.map +1 -0
  46. package/dist/providers/azure-openai-responses.js +181 -0
  47. package/dist/providers/azure-openai-responses.js.map +1 -0
  48. package/dist/providers/github-copilot-headers.d.ts +8 -0
  49. package/dist/providers/github-copilot-headers.d.ts.map +1 -0
  50. package/dist/providers/github-copilot-headers.js +26 -0
  51. package/dist/providers/github-copilot-headers.js.map +1 -0
  52. package/dist/providers/google-gemini-cli.d.ts +15 -0
  53. package/dist/providers/google-gemini-cli.d.ts.map +1 -0
  54. package/dist/providers/google-gemini-cli.js +43 -0
  55. package/dist/providers/google-gemini-cli.js.map +1 -0
  56. package/dist/providers/google-shared.d.ts +15 -0
  57. package/dist/providers/google-shared.d.ts.map +1 -0
  58. package/dist/providers/google-shared.js +226 -0
  59. package/dist/providers/google-shared.js.map +1 -0
  60. package/dist/providers/google-vertex.d.ts +15 -0
  61. package/dist/providers/google-vertex.d.ts.map +1 -0
  62. package/dist/providers/google-vertex.js +372 -0
  63. package/dist/providers/google-vertex.js.map +1 -0
  64. package/dist/providers/google.d.ts +13 -0
  65. package/dist/providers/google.d.ts.map +1 -0
  66. package/dist/providers/google.js +351 -0
  67. package/dist/providers/google.js.map +1 -0
  68. package/dist/providers/mistral.d.ts +13 -0
  69. package/dist/providers/mistral.d.ts.map +1 -0
  70. package/dist/providers/mistral.js +489 -0
  71. package/dist/providers/mistral.js.map +1 -0
  72. package/dist/providers/openai-codex-responses.d.ts +9 -0
  73. package/dist/providers/openai-codex-responses.d.ts.map +1 -0
  74. package/dist/providers/openai-codex-responses.js +672 -0
  75. package/dist/providers/openai-codex-responses.js.map +1 -0
  76. package/dist/providers/openai-completions.d.ts +15 -0
  77. package/dist/providers/openai-completions.d.ts.map +1 -0
  78. package/dist/providers/openai-completions.js +651 -0
  79. package/dist/providers/openai-completions.js.map +1 -0
  80. package/dist/providers/openai-responses-shared.d.ts +17 -0
  81. package/dist/providers/openai-responses-shared.d.ts.map +1 -0
  82. package/dist/providers/openai-responses-shared.js +420 -0
  83. package/dist/providers/openai-responses-shared.js.map +1 -0
  84. package/dist/providers/openai-responses.d.ts +10 -0
  85. package/dist/providers/openai-responses.d.ts.map +1 -0
  86. package/dist/providers/openai-responses.js +186 -0
  87. package/dist/providers/openai-responses.js.map +1 -0
  88. package/dist/providers/register-builtins.d.ts +11 -0
  89. package/dist/providers/register-builtins.d.ts.map +1 -0
  90. package/dist/providers/register-builtins.js +138 -0
  91. package/dist/providers/register-builtins.js.map +1 -0
  92. package/dist/providers/simple-options.d.ts +8 -0
  93. package/dist/providers/simple-options.d.ts.map +1 -0
  94. package/dist/providers/simple-options.js +35 -0
  95. package/dist/providers/simple-options.js.map +1 -0
  96. package/dist/providers/transform-messages.d.ts +3 -0
  97. package/dist/providers/transform-messages.d.ts.map +1 -0
  98. package/dist/providers/transform-messages.js +130 -0
  99. package/dist/providers/transform-messages.js.map +1 -0
  100. package/dist/stream.d.ts +8 -0
  101. package/dist/stream.d.ts.map +1 -0
  102. package/dist/stream.js +27 -0
  103. package/dist/stream.js.map +1 -0
  104. package/dist/types.d.ts +213 -0
  105. package/dist/types.d.ts.map +1 -0
  106. package/dist/types.js +2 -0
  107. package/dist/types.js.map +1 -0
  108. package/dist/utils/event-stream.d.ts +20 -0
  109. package/dist/utils/event-stream.d.ts.map +1 -0
  110. package/dist/utils/event-stream.js +77 -0
  111. package/dist/utils/event-stream.js.map +1 -0
  112. package/dist/utils/hash.d.ts +2 -0
  113. package/dist/utils/hash.d.ts.map +1 -0
  114. package/dist/utils/hash.js +13 -0
  115. package/dist/utils/hash.js.map +1 -0
  116. package/dist/utils/json-parse.d.ts +2 -0
  117. package/dist/utils/json-parse.d.ts.map +1 -0
  118. package/dist/utils/json-parse.js +19 -0
  119. package/dist/utils/json-parse.js.map +1 -0
  120. package/dist/utils/oauth/anthropic.d.ts +4 -0
  121. package/dist/utils/oauth/anthropic.d.ts.map +1 -0
  122. package/dist/utils/oauth/anthropic.js +61 -0
  123. package/dist/utils/oauth/anthropic.js.map +1 -0
  124. package/dist/utils/oauth/github-copilot.d.ts +16 -0
  125. package/dist/utils/oauth/github-copilot.d.ts.map +1 -0
  126. package/dist/utils/oauth/github-copilot.js +247 -0
  127. package/dist/utils/oauth/github-copilot.js.map +1 -0
  128. package/dist/utils/oauth/google-antigravity.d.ts +7 -0
  129. package/dist/utils/oauth/google-antigravity.d.ts.map +1 -0
  130. package/dist/utils/oauth/google-antigravity.js +55 -0
  131. package/dist/utils/oauth/google-antigravity.js.map +1 -0
  132. package/dist/utils/oauth/index.d.ts +18 -0
  133. package/dist/utils/oauth/index.d.ts.map +1 -0
  134. package/dist/utils/oauth/index.js +72 -0
  135. package/dist/utils/oauth/index.js.map +1 -0
  136. package/dist/utils/oauth/openai-codex.d.ts +14 -0
  137. package/dist/utils/oauth/openai-codex.d.ts.map +1 -0
  138. package/dist/utils/oauth/openai-codex.js +348 -0
  139. package/dist/utils/oauth/openai-codex.js.map +1 -0
  140. package/dist/utils/oauth/pkce.d.ts +5 -0
  141. package/dist/utils/oauth/pkce.d.ts.map +1 -0
  142. package/dist/utils/oauth/pkce.js +18 -0
  143. package/dist/utils/oauth/pkce.js.map +1 -0
  144. package/dist/utils/oauth/types.d.ts +40 -0
  145. package/dist/utils/oauth/types.d.ts.map +1 -0
  146. package/dist/utils/oauth/types.js +2 -0
  147. package/dist/utils/oauth/types.js.map +1 -0
  148. package/dist/utils/overflow.d.ts +4 -0
  149. package/dist/utils/overflow.d.ts.map +1 -0
  150. package/dist/utils/overflow.js +40 -0
  151. package/dist/utils/overflow.js.map +1 -0
  152. package/dist/utils/sanitize-unicode.d.ts +2 -0
  153. package/dist/utils/sanitize-unicode.d.ts.map +1 -0
  154. package/dist/utils/sanitize-unicode.js +4 -0
  155. package/dist/utils/sanitize-unicode.js.map +1 -0
  156. package/dist/utils/typebox-helpers.d.ts +6 -0
  157. package/dist/utils/typebox-helpers.d.ts.map +1 -0
  158. package/dist/utils/typebox-helpers.js +10 -0
  159. package/dist/utils/typebox-helpers.js.map +1 -0
  160. package/dist/utils/validation.d.ts +4 -0
  161. package/dist/utils/validation.d.ts.map +1 -0
  162. package/dist/utils/validation.js +45 -0
  163. package/dist/utils/validation.js.map +1 -0
  164. package/package.json +80 -0
@@ -0,0 +1,40 @@
1
+ const OVERFLOW_PATTERNS = [
2
+ /prompt is too long/i,
3
+ /input is too long for requested model/i,
4
+ /exceeds the context window/i,
5
+ /input token count.*exceeds the maximum/i,
6
+ /maximum prompt length is \d+/i,
7
+ /reduce the length of the messages/i,
8
+ /maximum context length is \d+ tokens/i,
9
+ /exceeds the limit of \d+/i,
10
+ /exceeds the available context size/i,
11
+ /greater than the context length/i,
12
+ /context window exceeds limit/i,
13
+ /exceeded model token limit/i,
14
+ /too large for model with \d+ maximum context length/i,
15
+ /model_context_window_exceeded/i,
16
+ /context[_ ]length[_ ]exceeded/i,
17
+ /too many tokens/i,
18
+ /token limit exceeded/i,
19
+ ];
20
+ export function isContextOverflow(message, contextWindow) {
21
+ if (message.stopReason === "error" && message.errorMessage) {
22
+ if (OVERFLOW_PATTERNS.some((p) => p.test(message.errorMessage))) {
23
+ return true;
24
+ }
25
+ if (/^4(00|13)\s*(status code)?\s*\(no body\)/i.test(message.errorMessage)) {
26
+ return true;
27
+ }
28
+ }
29
+ if (contextWindow && message.stopReason === "stop") {
30
+ const inputTokens = message.usage.input + message.usage.cacheRead;
31
+ if (inputTokens > contextWindow) {
32
+ return true;
33
+ }
34
+ }
35
+ return false;
36
+ }
37
+ export function getOverflowPatterns() {
38
+ return [...OVERFLOW_PATTERNS];
39
+ }
40
+ //# sourceMappingURL=overflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overflow.js","sourceRoot":"","sources":["../../src/utils/overflow.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG;IACzB,qBAAqB;IACrB,wCAAwC;IACxC,6BAA6B;IAC7B,yCAAyC;IACzC,+BAA+B;IAC/B,oCAAoC;IACpC,uCAAuC;IACvC,2BAA2B;IAC3B,qCAAqC;IACrC,kCAAkC;IAClC,+BAA+B;IAC/B,6BAA6B;IAC7B,sDAAsD;IACtD,gCAAgC;IAChC,gCAAgC;IAChC,kBAAkB;IAClB,uBAAuB;CACvB,CAAC;AACF,MAAM,UAAU,iBAAiB,CAAC,OAAyB,EAAE,aAAsB,EAAW;IAC7F,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QAC5D,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAa,CAAC,CAAC,EAAE,CAAC;YAClE,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,2CAA2C,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5E,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IACD,IAAI,aAAa,IAAI,OAAO,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;QACpD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QAClE,IAAI,WAAW,GAAG,aAAa,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AACD,MAAM,UAAU,mBAAmB,GAAa;IAC/C,OAAO,CAAC,GAAG,iBAAiB,CAAC,CAAC;AAAA,CAC9B","sourcesContent":["import type { AssistantMessage } from \"../types.js\";\n\nconst OVERFLOW_PATTERNS = [\n\t/prompt is too long/i,\n\t/input is too long for requested model/i,\n\t/exceeds the context window/i,\n\t/input token count.*exceeds the maximum/i,\n\t/maximum prompt length is \\d+/i,\n\t/reduce the length of the messages/i,\n\t/maximum context length is \\d+ tokens/i,\n\t/exceeds the limit of \\d+/i,\n\t/exceeds the available context size/i,\n\t/greater than the context length/i,\n\t/context window exceeds limit/i,\n\t/exceeded model token limit/i,\n\t/too large for model with \\d+ maximum context length/i,\n\t/model_context_window_exceeded/i,\n\t/context[_ ]length[_ ]exceeded/i,\n\t/too many tokens/i,\n\t/token limit exceeded/i,\n];\nexport function isContextOverflow(message: AssistantMessage, contextWindow?: number): boolean {\n\tif (message.stopReason === \"error\" && message.errorMessage) {\n\t\tif (OVERFLOW_PATTERNS.some((p) => p.test(message.errorMessage!))) {\n\t\t\treturn true;\n\t\t}\n\t\tif (/^4(00|13)\\s*(status code)?\\s*\\(no body\\)/i.test(message.errorMessage)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\tif (contextWindow && message.stopReason === \"stop\") {\n\t\tconst inputTokens = message.usage.input + message.usage.cacheRead;\n\t\tif (inputTokens > contextWindow) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\nexport function getOverflowPatterns(): RegExp[] {\n\treturn [...OVERFLOW_PATTERNS];\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function sanitizeSurrogates(text: string): string;
2
+ //# sourceMappingURL=sanitize-unicode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-unicode.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize-unicode.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD","sourcesContent":["export function sanitizeSurrogates(text: string): string {\n\treturn text.replace(/[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/g, \"\");\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export function sanitizeSurrogates(text) {
2
+ return text.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g, "");
3
+ }
4
+ //# sourceMappingURL=sanitize-unicode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-unicode.js","sourceRoot":"","sources":["../../src/utils/sanitize-unicode.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAU;IACxD,OAAO,IAAI,CAAC,OAAO,CAAC,yEAAyE,EAAE,EAAE,CAAC,CAAC;AAAA,CACnG","sourcesContent":["export function sanitizeSurrogates(text: string): string {\n\treturn text.replace(/[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/g, \"\");\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import { type TUnsafe } from "@sinclair/typebox";
2
+ export declare function StringEnum<T extends readonly string[]>(values: T, options?: {
3
+ description?: string;
4
+ default?: T[number];
5
+ }): TUnsafe<T[number]>;
6
+ //# sourceMappingURL=typebox-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typebox-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/typebox-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAQ,MAAM,mBAAmB,CAAC;AACvD,wBAAgB,UAAU,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EACrD,MAAM,EAAE,CAAC,EACT,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;CAAE,GACrD,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAOpB","sourcesContent":["import { type TUnsafe, Type } from \"@sinclair/typebox\";\nexport function StringEnum<T extends readonly string[]>(\n\tvalues: T,\n\toptions?: { description?: string; default?: T[number] },\n): TUnsafe<T[number]> {\n\treturn Type.Unsafe<T[number]>({\n\t\ttype: \"string\",\n\t\tenum: values as any,\n\t\t...(options?.description && { description: options.description }),\n\t\t...(options?.default && { default: options.default }),\n\t});\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ export function StringEnum(values, options) {
3
+ return Type.Unsafe({
4
+ type: "string",
5
+ enum: values,
6
+ ...(options?.description && { description: options.description }),
7
+ ...(options?.default && { default: options.default }),
8
+ });
9
+ }
10
+ //# sourceMappingURL=typebox-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typebox-helpers.js","sourceRoot":"","sources":["../../src/utils/typebox-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACvD,MAAM,UAAU,UAAU,CACzB,MAAS,EACT,OAAuD,EAClC;IACrB,OAAO,IAAI,CAAC,MAAM,CAAY;QAC7B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAa;QACnB,GAAG,CAAC,OAAO,EAAE,WAAW,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;KACrD,CAAC,CAAC;AAAA,CACH","sourcesContent":["import { type TUnsafe, Type } from \"@sinclair/typebox\";\nexport function StringEnum<T extends readonly string[]>(\n\tvalues: T,\n\toptions?: { description?: string; default?: T[number] },\n): TUnsafe<T[number]> {\n\treturn Type.Unsafe<T[number]>({\n\t\ttype: \"string\",\n\t\tenum: values as any,\n\t\t...(options?.description && { description: options.description }),\n\t\t...(options?.default && { default: options.default }),\n\t});\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { Tool, ToolCall } from "../types.js";
2
+ export declare function validateToolCall(tools: Tool[], toolCall: ToolCall): any;
3
+ export declare function validateToolArguments(tool: Tool, toolCall: ToolCall): any;
4
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAgBlD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAMvE;AACD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAkBzE","sourcesContent":["import AjvModule from \"ajv\";\nimport addFormatsModule from \"ajv-formats\";\n\nconst Ajv = (AjvModule as any).default || AjvModule;\nconst addFormats = (addFormatsModule as any).default || addFormatsModule;\n\nimport type { Tool, ToolCall } from \"../types.js\";\n\nconst isBrowserExtension = typeof globalThis !== \"undefined\" && (globalThis as any).chrome?.runtime?.id !== undefined;\nlet ajv: any = null;\nif (!isBrowserExtension) {\n\ttry {\n\t\tajv = new Ajv({\n\t\t\tallErrors: true,\n\t\t\tstrict: false,\n\t\t\tcoerceTypes: true,\n\t\t});\n\t\taddFormats(ajv);\n\t} catch (_e) {\n\t\tconsole.warn(\"AJV validation disabled due to CSP restrictions\");\n\t}\n}\nexport function validateToolCall(tools: Tool[], toolCall: ToolCall): any {\n\tconst tool = tools.find((t) => t.name === toolCall.name);\n\tif (!tool) {\n\t\tthrow new Error(`Tool \"${toolCall.name}\" not found`);\n\t}\n\treturn validateToolArguments(tool, toolCall);\n}\nexport function validateToolArguments(tool: Tool, toolCall: ToolCall): any {\n\tif (!ajv || isBrowserExtension) {\n\t\treturn toolCall.arguments;\n\t}\n\tconst validate = ajv.compile(tool.parameters);\n\tconst args = structuredClone(toolCall.arguments);\n\tif (validate(args)) {\n\t\treturn args;\n\t}\n\tconst errors =\n\t\tvalidate.errors\n\t\t\t?.map((err: any) => {\n\t\t\t\tconst path = err.instancePath ? err.instancePath.substring(1) : err.params.missingProperty || \"root\";\n\t\t\t\treturn ` - ${path}: ${err.message}`;\n\t\t\t})\n\t\t\t.join(\"\\n\") || \"Unknown validation error\";\n\tconst errorMessage = `Validation failed for tool \"${toolCall.name}\":\\n${errors}\\n\\nReceived arguments:\\n${JSON.stringify(toolCall.arguments, null, 2)}`;\n\tthrow new Error(errorMessage);\n}\n"]}
@@ -0,0 +1,45 @@
1
+ import AjvModule from "ajv";
2
+ import addFormatsModule from "ajv-formats";
3
+ const Ajv = AjvModule.default || AjvModule;
4
+ const addFormats = addFormatsModule.default || addFormatsModule;
5
+ const isBrowserExtension = typeof globalThis !== "undefined" && globalThis.chrome?.runtime?.id !== undefined;
6
+ let ajv = null;
7
+ if (!isBrowserExtension) {
8
+ try {
9
+ ajv = new Ajv({
10
+ allErrors: true,
11
+ strict: false,
12
+ coerceTypes: true,
13
+ });
14
+ addFormats(ajv);
15
+ }
16
+ catch (_e) {
17
+ console.warn("AJV validation disabled due to CSP restrictions");
18
+ }
19
+ }
20
+ export function validateToolCall(tools, toolCall) {
21
+ const tool = tools.find((t) => t.name === toolCall.name);
22
+ if (!tool) {
23
+ throw new Error(`Tool "${toolCall.name}" not found`);
24
+ }
25
+ return validateToolArguments(tool, toolCall);
26
+ }
27
+ export function validateToolArguments(tool, toolCall) {
28
+ if (!ajv || isBrowserExtension) {
29
+ return toolCall.arguments;
30
+ }
31
+ const validate = ajv.compile(tool.parameters);
32
+ const args = structuredClone(toolCall.arguments);
33
+ if (validate(args)) {
34
+ return args;
35
+ }
36
+ const errors = validate.errors
37
+ ?.map((err) => {
38
+ const path = err.instancePath ? err.instancePath.substring(1) : err.params.missingProperty || "root";
39
+ return ` - ${path}: ${err.message}`;
40
+ })
41
+ .join("\n") || "Unknown validation error";
42
+ const errorMessage = `Validation failed for tool "${toolCall.name}":\n${errors}\n\nReceived arguments:\n${JSON.stringify(toolCall.arguments, null, 2)}`;
43
+ throw new Error(errorMessage);
44
+ }
45
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,KAAK,CAAC;AAC5B,OAAO,gBAAgB,MAAM,aAAa,CAAC;AAE3C,MAAM,GAAG,GAAI,SAAiB,CAAC,OAAO,IAAI,SAAS,CAAC;AACpD,MAAM,UAAU,GAAI,gBAAwB,CAAC,OAAO,IAAI,gBAAgB,CAAC;AAIzE,MAAM,kBAAkB,GAAG,OAAO,UAAU,KAAK,WAAW,IAAK,UAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,SAAS,CAAC;AACtH,IAAI,GAAG,GAAQ,IAAI,CAAC;AACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACzB,IAAI,CAAC;QACJ,GAAG,GAAG,IAAI,GAAG,CAAC;YACb,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,UAAU,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACjE,CAAC;AACF,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,QAAkB,EAAO;IACxE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,CAAC,IAAI,aAAa,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,CAC7C;AACD,MAAM,UAAU,qBAAqB,CAAC,IAAU,EAAE,QAAkB,EAAO;IAC1E,IAAI,CAAC,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAChC,OAAO,QAAQ,CAAC,SAAS,CAAC;IAC3B,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,MAAM,GACX,QAAQ,CAAC,MAAM;QACd,EAAE,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC;QACrG,OAAO,OAAO,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;IAAA,CACrC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,IAAI,0BAA0B,CAAC;IAC5C,MAAM,YAAY,GAAG,+BAA+B,QAAQ,CAAC,IAAI,OAAO,MAAM,4BAA4B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;IACxJ,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;AAAA,CAC9B","sourcesContent":["import AjvModule from \"ajv\";\nimport addFormatsModule from \"ajv-formats\";\n\nconst Ajv = (AjvModule as any).default || AjvModule;\nconst addFormats = (addFormatsModule as any).default || addFormatsModule;\n\nimport type { Tool, ToolCall } from \"../types.js\";\n\nconst isBrowserExtension = typeof globalThis !== \"undefined\" && (globalThis as any).chrome?.runtime?.id !== undefined;\nlet ajv: any = null;\nif (!isBrowserExtension) {\n\ttry {\n\t\tajv = new Ajv({\n\t\t\tallErrors: true,\n\t\t\tstrict: false,\n\t\t\tcoerceTypes: true,\n\t\t});\n\t\taddFormats(ajv);\n\t} catch (_e) {\n\t\tconsole.warn(\"AJV validation disabled due to CSP restrictions\");\n\t}\n}\nexport function validateToolCall(tools: Tool[], toolCall: ToolCall): any {\n\tconst tool = tools.find((t) => t.name === toolCall.name);\n\tif (!tool) {\n\t\tthrow new Error(`Tool \"${toolCall.name}\" not found`);\n\t}\n\treturn validateToolArguments(tool, toolCall);\n}\nexport function validateToolArguments(tool: Tool, toolCall: ToolCall): any {\n\tif (!ajv || isBrowserExtension) {\n\t\treturn toolCall.arguments;\n\t}\n\tconst validate = ajv.compile(tool.parameters);\n\tconst args = structuredClone(toolCall.arguments);\n\tif (validate(args)) {\n\t\treturn args;\n\t}\n\tconst errors =\n\t\tvalidate.errors\n\t\t\t?.map((err: any) => {\n\t\t\t\tconst path = err.instancePath ? err.instancePath.substring(1) : err.params.missingProperty || \"root\";\n\t\t\t\treturn ` - ${path}: ${err.message}`;\n\t\t\t})\n\t\t\t.join(\"\\n\") || \"Unknown validation error\";\n\tconst errorMessage = `Validation failed for tool \"${toolCall.name}\":\\n${errors}\\n\\nReceived arguments:\\n${JSON.stringify(toolCall.arguments, null, 2)}`;\n\tthrow new Error(errorMessage);\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "@boxiaolanya2008/pi-ai",
3
+ "version": "0.60.4",
4
+ "description": "Unified LLM API with automatic model discovery and provider configuration",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./oauth": {
14
+ "types": "./dist/oauth.d.ts",
15
+ "import": "./dist/oauth.js"
16
+ },
17
+ "./bedrock-provider": {
18
+ "types": "./bedrock-provider.d.ts",
19
+ "import": "./bedrock-provider.js"
20
+ }
21
+ },
22
+ "bin": {
23
+ "pi-ai": "./dist/cli.js"
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "bedrock-provider.js",
28
+ "bedrock-provider.d.ts",
29
+ "README.md"
30
+ ],
31
+ "scripts": {
32
+ "clean": "shx rm -rf dist",
33
+ "generate-models": "npx tsx scripts/generate-models.ts",
34
+ "build": "npm run generate-models && tsgo -p tsconfig.build.json",
35
+ "dev": "tsgo -p tsconfig.build.json --watch --preserveWatchOutput",
36
+ "dev:tsc": "tsgo -p tsconfig.build.json --watch --preserveWatchOutput",
37
+ "test": "vitest --run",
38
+ "prepublishOnly": "npm run clean && npm run build"
39
+ },
40
+ "dependencies": {
41
+ "@anthropic-ai/sdk": "^0.73.0",
42
+ "@aws-sdk/client-bedrock-runtime": "^3.983.0",
43
+ "@google/genai": "^1.40.0",
44
+ "@mistralai/mistralai": "1.14.1",
45
+ "@sinclair/typebox": "^0.34.41",
46
+ "ajv": "^8.17.1",
47
+ "ajv-formats": "^3.0.1",
48
+ "chalk": "^5.6.2",
49
+ "openai": "6.26.0",
50
+ "partial-json": "^0.1.7",
51
+ "proxy-agent": "^6.5.0",
52
+ "undici": "^7.19.1",
53
+ "zod-to-json-schema": "^3.24.6"
54
+ },
55
+ "keywords": [
56
+ "ai",
57
+ "llm",
58
+ "openai",
59
+ "anthropic",
60
+ "gemini",
61
+ "bedrock",
62
+ "unified",
63
+ "api"
64
+ ],
65
+ "author": "Mario Zechner",
66
+ "license": "MIT",
67
+ "repository": {
68
+ "type": "git",
69
+ "url": "git+https://github.com/badlogic/pi-mono.git",
70
+ "directory": "packages/ai"
71
+ },
72
+ "engines": {
73
+ "node": ">=20.0.0"
74
+ },
75
+ "devDependencies": {
76
+ "@types/node": "^24.3.0",
77
+ "canvas": "^3.2.0",
78
+ "vitest": "^3.2.4"
79
+ }
80
+ }