@earendil-works/pi-ai 1.0.4 → 1.2.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 (121) hide show
  1. package/README.md +14 -3
  2. package/dist/api/anthropic-messages.d.ts.map +1 -1
  3. package/dist/api/anthropic-messages.js +63 -22
  4. package/dist/api/anthropic-messages.js.map +1 -1
  5. package/dist/api/bedrock-converse-stream.js +33 -2
  6. package/dist/api/bedrock-converse-stream.js.map +1 -1
  7. package/dist/api/classifier-shared.d.ts +21 -0
  8. package/dist/api/classifier-shared.d.ts.map +1 -0
  9. package/dist/api/classifier-shared.js +98 -0
  10. package/dist/api/classifier-shared.js.map +1 -0
  11. package/dist/api/cloudflare-workers-ai-system-one.d.ts.map +1 -1
  12. package/dist/api/cloudflare-workers-ai-system-one.js +2 -1
  13. package/dist/api/cloudflare-workers-ai-system-one.js.map +1 -1
  14. package/dist/api/lazy.d.ts.map +1 -1
  15. package/dist/api/lazy.js +4 -3
  16. package/dist/api/lazy.js.map +1 -1
  17. package/dist/api/llama-cpp-classify.d.ts.map +1 -1
  18. package/dist/api/llama-cpp-classify.js +2 -0
  19. package/dist/api/llama-cpp-classify.js.map +1 -1
  20. package/dist/api/mistral-conversations.d.ts.map +1 -1
  21. package/dist/api/mistral-conversations.js +31 -14
  22. package/dist/api/mistral-conversations.js.map +1 -1
  23. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  24. package/dist/api/openai-codex-responses.js +7 -4
  25. package/dist/api/openai-codex-responses.js.map +1 -1
  26. package/dist/api/openai-decisions.d.ts +4 -0
  27. package/dist/api/openai-decisions.d.ts.map +1 -0
  28. package/dist/api/openai-decisions.js +162 -0
  29. package/dist/api/openai-decisions.js.map +1 -0
  30. package/dist/api/openai-decisions.lazy.d.ts +3 -0
  31. package/dist/api/openai-decisions.lazy.d.ts.map +1 -0
  32. package/dist/api/openai-decisions.lazy.js +4 -0
  33. package/dist/api/openai-decisions.lazy.js.map +1 -0
  34. package/dist/api/system-one-shared.d.ts +0 -1
  35. package/dist/api/system-one-shared.d.ts.map +1 -1
  36. package/dist/api/system-one-shared.js +5 -89
  37. package/dist/api/system-one-shared.js.map +1 -1
  38. package/dist/api/typesafe-system-one.d.ts.map +1 -1
  39. package/dist/api/typesafe-system-one.js +2 -1
  40. package/dist/api/typesafe-system-one.js.map +1 -1
  41. package/dist/auth/oauth/anthropic.d.ts.map +1 -1
  42. package/dist/auth/oauth/anthropic.js +14 -6
  43. package/dist/auth/oauth/anthropic.js.map +1 -1
  44. package/dist/auth/oauth/openai-chatgpt.js +1 -1
  45. package/dist/auth/oauth/openai-chatgpt.js.map +1 -1
  46. package/dist/auth/oauth/openai-codex.d.ts.map +1 -1
  47. package/dist/auth/oauth/openai-codex.js +4 -4
  48. package/dist/auth/oauth/openai-codex.js.map +1 -1
  49. package/dist/auth/types.d.ts +5 -0
  50. package/dist/auth/types.d.ts.map +1 -1
  51. package/dist/auth/types.js.map +1 -1
  52. package/dist/models.d.ts +5 -0
  53. package/dist/models.d.ts.map +1 -1
  54. package/dist/models.js +3 -1
  55. package/dist/models.js.map +1 -1
  56. package/dist/providers/compat-schema.d.ts +338 -0
  57. package/dist/providers/compat-schema.d.ts.map +1 -0
  58. package/dist/providers/compat-schema.js +375 -0
  59. package/dist/providers/compat-schema.js.map +1 -0
  60. package/dist/providers/data/.manifest.json +1 -1
  61. package/dist/providers/data/amazon-bedrock.json +1 -1
  62. package/dist/providers/data/anthropic.json +1 -1
  63. package/dist/providers/data/baseten.json +1 -1
  64. package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  65. package/dist/providers/data/cloudflare-workers-ai.json +1 -1
  66. package/dist/providers/data/github-copilot.json +1 -1
  67. package/dist/providers/data/google-vertex.json +1 -1
  68. package/dist/providers/data/google.json +1 -1
  69. package/dist/providers/data/huggingface.json +1 -1
  70. package/dist/providers/data/meta.json +1 -1
  71. package/dist/providers/data/minimax-cn.json +1 -1
  72. package/dist/providers/data/minimax.json +1 -1
  73. package/dist/providers/data/mistral.json +1 -1
  74. package/dist/providers/data/openai.json +1 -1
  75. package/dist/providers/data/opencode-go.json +1 -1
  76. package/dist/providers/data/opencode.json +1 -1
  77. package/dist/providers/data/openrouter.json +1 -1
  78. package/dist/providers/data/radius.json +1 -1
  79. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  80. package/dist/providers/faux.d.ts.map +1 -1
  81. package/dist/providers/faux.js +25 -8
  82. package/dist/providers/faux.js.map +1 -1
  83. package/dist/providers/model-schema.d.ts +91 -0
  84. package/dist/providers/model-schema.d.ts.map +1 -0
  85. package/dist/providers/model-schema.js +55 -0
  86. package/dist/providers/model-schema.js.map +1 -0
  87. package/dist/providers/openai.d.ts.map +1 -1
  88. package/dist/providers/openai.js +12 -3
  89. package/dist/providers/openai.js.map +1 -1
  90. package/dist/providers/openrouter-api.d.ts +40 -0
  91. package/dist/providers/openrouter-api.d.ts.map +1 -0
  92. package/dist/providers/openrouter-api.js +41 -0
  93. package/dist/providers/openrouter-api.js.map +1 -0
  94. package/dist/providers/openrouter.d.ts +11 -1
  95. package/dist/providers/openrouter.d.ts.map +1 -1
  96. package/dist/providers/openrouter.js +52 -1
  97. package/dist/providers/openrouter.js.map +1 -1
  98. package/dist/providers/radius.d.ts.map +1 -1
  99. package/dist/providers/radius.js +4 -12
  100. package/dist/providers/radius.js.map +1 -1
  101. package/dist/types.d.ts +21 -304
  102. package/dist/types.d.ts.map +1 -1
  103. package/dist/types.js.map +1 -1
  104. package/dist/utils/estimate.js +1 -1
  105. package/dist/utils/estimate.js.map +1 -1
  106. package/dist/utils/event-stream.d.ts +10 -1
  107. package/dist/utils/event-stream.d.ts.map +1 -1
  108. package/dist/utils/event-stream.js +25 -0
  109. package/dist/utils/event-stream.js.map +1 -1
  110. package/dist/utils/model-operations.d.ts +3 -1
  111. package/dist/utils/model-operations.d.ts.map +1 -1
  112. package/dist/utils/model-operations.js +6 -0
  113. package/dist/utils/model-operations.js.map +1 -1
  114. package/dist/utils/provider-retry.d.ts +2 -0
  115. package/dist/utils/provider-retry.d.ts.map +1 -1
  116. package/dist/utils/provider-retry.js +2 -0
  117. package/dist/utils/provider-retry.js.map +1 -1
  118. package/dist/utils/retry.d.ts.map +1 -1
  119. package/dist/utils/retry.js +5 -2
  120. package/dist/utils/retry.js.map +1 -1
  121. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"faux.d.ts","sourceRoot":"","sources":["../../src/providers/faux.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"faux.d.ts","sourceRoot":"","sources":["../../src/providers/faux.ts"],"names":[],"mappings":"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"}
@@ -104,8 +104,23 @@ function messageToText(message) {
104
104
  }
105
105
  return toolResultToText(message);
106
106
  }
107
- function serializeContext(context) {
108
- return context.messages.map((message) => `${message.role}:${messageToText(message)}`).join("\n\n");
107
+ /** Length of the prompt text that joins `messages` with blank lines. */
108
+ function joinedLength(messages, count = messages.length) {
109
+ let length = count > 0 ? (count - 1) * 2 : 0;
110
+ for (let index = 0; index < count; index++)
111
+ length += messages[index].length;
112
+ return length;
113
+ }
114
+ /**
115
+ * Length of the common prefix of the two joined prompts. Equal messages are compared whole; characters are compared
116
+ * only from the first message that differs.
117
+ */
118
+ function commonPromptPrefixLength(previous, current) {
119
+ let index = 0;
120
+ while (index < previous.length && index < current.length && previous[index] === current[index])
121
+ index++;
122
+ const rest = (messages) => index === messages.length ? "" : (index > 0 ? "\n\n" : "") + messages.slice(index).join("\n\n");
123
+ return joinedLength(previous, index) + commonPrefixLength(rest(previous), rest(current));
109
124
  }
110
125
  function commonPrefixLength(a, b) {
111
126
  const length = Math.min(a.length, b.length);
@@ -116,8 +131,10 @@ function commonPrefixLength(a, b) {
116
131
  return index;
117
132
  }
118
133
  function withUsageEstimate(message, context, options, promptCache) {
119
- const promptText = serializeContext(context);
120
- const promptTokens = estimateTokens(promptText);
134
+ // One text per message; the whole prompt joins them with blank lines.
135
+ const prompt = context.messages.map((message) => `${message.role}:${messageToText(message)}`);
136
+ const promptLength = joinedLength(prompt);
137
+ const promptTokens = Math.ceil(promptLength / 4);
121
138
  const outputTokens = estimateTokens(assistantContentToText(message.content));
122
139
  let input = promptTokens;
123
140
  let cacheRead = 0;
@@ -126,15 +143,15 @@ function withUsageEstimate(message, context, options, promptCache) {
126
143
  if (sessionId && options?.cacheRetention !== "none") {
127
144
  const previousPrompt = promptCache.get(sessionId);
128
145
  if (previousPrompt) {
129
- const cachedChars = commonPrefixLength(previousPrompt, promptText);
130
- cacheRead = estimateTokens(previousPrompt.slice(0, cachedChars));
131
- cacheWrite = estimateTokens(promptText.slice(cachedChars));
146
+ const cachedChars = commonPromptPrefixLength(previousPrompt, prompt);
147
+ cacheRead = Math.ceil(cachedChars / 4);
148
+ cacheWrite = Math.ceil((promptLength - cachedChars) / 4);
132
149
  input = Math.max(0, promptTokens - cacheRead);
133
150
  }
134
151
  else {
135
152
  cacheWrite = promptTokens;
136
153
  }
137
- promptCache.set(sessionId, promptText);
154
+ promptCache.set(sessionId, prompt);
138
155
  }
139
156
  return {
140
157
  ...message,
@@ -1 +1 @@
1
- {"version":3,"file":"faux.js","sourceRoot":"","sources":["../../src/providers/faux.ts"],"names":[],"mappings":"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","sourcesContent":["import { createProvider, type Provider } from \"../models.ts\";\nimport type {\n\tAssistantMessage,\n\tAssistantMessageEventStream,\n\tDeferredCancelOptions,\n\tDeferredFetchOptions,\n\tDeferredHandle,\n\tImageContent,\n\tMessage,\n\tModel,\n\tSimpleStreamOptions,\n\tStreamFunction,\n\tStreamOptions,\n\tTextContent,\n\tThinkingContent,\n\tToolCall,\n\tToolResultMessage,\n\tTranscriptContext,\n\tUsage,\n} from \"../types.ts\";\nimport { createAssistantMessageEventStream } from \"../utils/event-stream.ts\";\nimport { getSystemMessageText } from \"../utils/text.ts\";\n\nconst DEFAULT_API = \"faux\";\nconst DEFAULT_PROVIDER = \"faux\";\nconst DEFAULT_MODEL_ID = \"faux-1\";\nconst DEFAULT_MODEL_NAME = \"Faux Model\";\nconst DEFAULT_BASE_URL = \"http://localhost:0\";\nconst DEFAULT_MIN_TOKEN_SIZE = 3;\nconst DEFAULT_MAX_TOKEN_SIZE = 5;\n\nconst DEFAULT_USAGE: Usage = {\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n};\n\nexport interface FauxModelDefinition {\n\tid: string;\n\tname?: string;\n\treasoning?: boolean;\n\tinput?: (\"text\" | \"image\")[];\n\tinputLimits?: Model<string>[\"inputLimits\"];\n\tcost?: { input: number; output: number; cacheRead: number; cacheWrite: number };\n\tcontextWindow?: number;\n\tmaxTokens?: number;\n}\n\nexport type FauxContentBlock = TextContent | ThinkingContent | ToolCall;\n\nexport function fauxText(text: string): TextContent {\n\treturn { type: \"text\", text };\n}\n\nexport function fauxThinking(thinking: string): ThinkingContent {\n\treturn { type: \"thinking\", thinking };\n}\n\nexport function fauxToolCall(name: string, arguments_: ToolCall[\"arguments\"], options: { id?: string } = {}): ToolCall {\n\treturn {\n\t\ttype: \"toolCall\",\n\t\tid: options.id ?? randomId(\"tool\"),\n\t\tname,\n\t\targuments: arguments_,\n\t};\n}\n\nfunction normalizeFauxAssistantContent(content: string | FauxContentBlock | FauxContentBlock[]): FauxContentBlock[] {\n\tif (typeof content === \"string\") {\n\t\treturn [fauxText(content)];\n\t}\n\treturn Array.isArray(content) ? content : [content];\n}\n\nexport function fauxAssistantMessage(\n\tcontent: string | FauxContentBlock | FauxContentBlock[],\n\toptions: {\n\t\tstopReason?: AssistantMessage[\"stopReason\"];\n\t\tdeferred?: DeferredHandle;\n\t\terrorMessage?: string;\n\t\tresponseId?: string;\n\t\ttimestamp?: number;\n\t} = {},\n): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: normalizeFauxAssistantContent(content),\n\t\tapi: DEFAULT_API,\n\t\tprovider: DEFAULT_PROVIDER,\n\t\tmodel: DEFAULT_MODEL_ID,\n\t\tusage: DEFAULT_USAGE,\n\t\tstopReason: options.stopReason ?? \"stop\",\n\t\t...(options.deferred === undefined ? {} : { deferred: options.deferred }),\n\t\t...(options.errorMessage === undefined ? {} : { errorMessage: options.errorMessage }),\n\t\t...(options.responseId === undefined ? {} : { responseId: options.responseId }),\n\t\ttimestamp: options.timestamp ?? Date.now(),\n\t};\n}\n\nexport interface FauxProviderState {\n\tcallCount: number;\n\tdeferredFetchCount: number;\n\tcancelledDeferred: DeferredHandle[];\n}\n\nexport type FauxResponseFactory = (\n\tcontext: TranscriptContext,\n\toptions: SimpleStreamOptions | undefined,\n\tstate: FauxProviderState,\n\tmodel: Model<string>,\n) => AssistantMessage | Promise<AssistantMessage>;\n\nexport type FauxResponseStep = AssistantMessage | FauxResponseFactory;\n\nexport interface RegisterFauxProviderOptions {\n\tapi?: string;\n\tprovider?: string;\n\tmodels?: FauxModelDefinition[];\n\tdeferred?: {\n\t\t/** Number of fetches that return the original handle before the scripted response becomes ready. */\n\t\tpendingFetches?: number;\n\t\tpollAfterMs?: number;\n\t};\n\ttokensPerSecond?: number;\n\ttokenSize?: {\n\t\tmin?: number;\n\t\tmax?: number;\n\t};\n}\n\nexport interface FauxProviderRegistration {\n\tapi: string;\n\tmodels: [Model<string>, ...Model<string>[]];\n\tgetModel(): Model<string>;\n\tgetModel(modelId: string): Model<string> | undefined;\n\tstate: FauxProviderState;\n\tsetResponses: (responses: FauxResponseStep[]) => void;\n\tappendResponses: (responses: FauxResponseStep[]) => void;\n\tgetPendingResponseCount: () => number;\n\tunregister: () => void;\n}\n\nexport interface FauxProviderHandle {\n\tprovider: Provider;\n\tapi: string;\n\tmodels: [Model<string>, ...Model<string>[]];\n\tgetModel(): Model<string>;\n\tgetModel(modelId: string): Model<string> | undefined;\n\tstate: FauxProviderState;\n\tsetResponses: (responses: FauxResponseStep[]) => void;\n\tappendResponses: (responses: FauxResponseStep[]) => void;\n\tgetPendingResponseCount: () => number;\n}\n\nfunction estimateTokens(text: string): number {\n\treturn Math.ceil(text.length / 4);\n}\n\nfunction randomId(prefix: string): string {\n\treturn `${prefix}:${Date.now()}:${Math.random().toString(36).slice(2)}`;\n}\n\nfunction contentToText(content: string | Array<TextContent | ImageContent>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\treturn content\n\t\t.map((block) => {\n\t\t\tif (block.type === \"text\") {\n\t\t\t\treturn block.text;\n\t\t\t}\n\t\t\treturn `[image:${block.mimeType}:${block.data.length}]`;\n\t\t})\n\t\t.join(\"\\n\");\n}\n\nfunction assistantContentToText(content: Array<TextContent | ThinkingContent | ToolCall>): string {\n\treturn content\n\t\t.map((block) => {\n\t\t\tif (block.type === \"text\") {\n\t\t\t\treturn block.text;\n\t\t\t}\n\t\t\tif (block.type === \"thinking\") {\n\t\t\t\treturn block.thinking;\n\t\t\t}\n\t\t\treturn `${block.name}:${JSON.stringify(block.arguments)}`;\n\t\t})\n\t\t.join(\"\\n\");\n}\n\nfunction toolResultToText(message: ToolResultMessage): string {\n\treturn [message.toolName, ...message.content.map((block) => contentToText([block]))].join(\"\\n\");\n}\n\nfunction messageToText(message: Message): string {\n\tif (message.role === \"system\") {\n\t\treturn [\n\t\t\tgetSystemMessageText(message),\n\t\t\t...(message.toolsRemoved?.map((tool) => `tool-:${JSON.stringify(tool)}`) ?? []),\n\t\t\t...(message.toolsAdded?.map((tool) => `tool+:${JSON.stringify(tool)}`) ?? []),\n\t\t]\n\t\t\t.filter((part) => part.length > 0)\n\t\t\t.join(\"\\n\");\n\t}\n\tif (message.role === \"user\") {\n\t\treturn contentToText(message.content);\n\t}\n\tif (message.role === \"assistant\") {\n\t\treturn assistantContentToText(message.content);\n\t}\n\treturn toolResultToText(message);\n}\n\nfunction serializeContext(context: TranscriptContext): string {\n\treturn context.messages.map((message) => `${message.role}:${messageToText(message)}`).join(\"\\n\\n\");\n}\n\nfunction commonPrefixLength(a: string, b: string): number {\n\tconst length = Math.min(a.length, b.length);\n\tlet index = 0;\n\twhile (index < length && a[index] === b[index]) {\n\t\tindex++;\n\t}\n\treturn index;\n}\n\nfunction withUsageEstimate(\n\tmessage: AssistantMessage,\n\tcontext: TranscriptContext,\n\toptions: StreamOptions | undefined,\n\tpromptCache: Map<string, string>,\n): AssistantMessage {\n\tconst promptText = serializeContext(context);\n\tconst promptTokens = estimateTokens(promptText);\n\tconst outputTokens = estimateTokens(assistantContentToText(message.content));\n\tlet input = promptTokens;\n\tlet cacheRead = 0;\n\tlet cacheWrite = 0;\n\tconst sessionId = options?.sessionId;\n\n\tif (sessionId && options?.cacheRetention !== \"none\") {\n\t\tconst previousPrompt = promptCache.get(sessionId);\n\t\tif (previousPrompt) {\n\t\t\tconst cachedChars = commonPrefixLength(previousPrompt, promptText);\n\t\t\tcacheRead = estimateTokens(previousPrompt.slice(0, cachedChars));\n\t\t\tcacheWrite = estimateTokens(promptText.slice(cachedChars));\n\t\t\tinput = Math.max(0, promptTokens - cacheRead);\n\t\t} else {\n\t\t\tcacheWrite = promptTokens;\n\t\t}\n\t\tpromptCache.set(sessionId, promptText);\n\t}\n\n\treturn {\n\t\t...message,\n\t\tusage: {\n\t\t\tinput,\n\t\t\toutput: outputTokens,\n\t\t\tcacheRead,\n\t\t\tcacheWrite,\n\t\t\ttotalTokens: input + outputTokens + cacheRead + cacheWrite,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t},\n\t};\n}\n\nfunction splitStringByTokenSize(text: string, minTokenSize: number, maxTokenSize: number): string[] {\n\tconst chunks: string[] = [];\n\tlet index = 0;\n\twhile (index < text.length) {\n\t\tconst tokenSize = minTokenSize + Math.floor(Math.random() * (maxTokenSize - minTokenSize + 1));\n\t\tconst charSize = Math.max(1, tokenSize * 4);\n\t\tchunks.push(text.slice(index, index + charSize));\n\t\tindex += charSize;\n\t}\n\treturn chunks.length > 0 ? chunks : [\"\"];\n}\n\nfunction cloneMessage(message: AssistantMessage, api: string, provider: string, modelId: string): AssistantMessage {\n\tconst cloned = structuredClone(message);\n\treturn {\n\t\t...cloned,\n\t\tapi,\n\t\tprovider,\n\t\tmodel: modelId,\n\t\ttimestamp: cloned.timestamp ?? Date.now(),\n\t\tusage: cloned.usage ?? DEFAULT_USAGE,\n\t};\n}\n\nfunction createDeferredMessage(model: Model<string>, handle: DeferredHandle): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: DEFAULT_USAGE,\n\t\tstopReason: \"deferred\",\n\t\tdeferred: handle,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction createErrorMessage(error: unknown, api: string, provider: string, modelId: string): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tapi,\n\t\tprovider,\n\t\tmodel: modelId,\n\t\tusage: DEFAULT_USAGE,\n\t\tstopReason: \"error\",\n\t\terrorMessage: error instanceof Error ? error.message : String(error),\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction createAbortedMessage(partial: AssistantMessage): AssistantMessage {\n\treturn {\n\t\t...partial,\n\t\tstopReason: \"aborted\",\n\t\terrorMessage: \"Request was aborted\",\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction scheduleChunk(chunk: string, tokensPerSecond: number | undefined): Promise<void> {\n\tif (!tokensPerSecond || tokensPerSecond <= 0) {\n\t\treturn new Promise((resolve) => queueMicrotask(resolve));\n\t}\n\tconst delayMs = (estimateTokens(chunk) / tokensPerSecond) * 1000;\n\treturn new Promise((resolve) => setTimeout(resolve, delayMs));\n}\n\nasync function streamWithDeltas(\n\tstream: AssistantMessageEventStream,\n\tmessage: AssistantMessage,\n\tminTokenSize: number,\n\tmaxTokenSize: number,\n\ttokensPerSecond: number | undefined,\n\tsignal: AbortSignal | undefined,\n): Promise<void> {\n\tconst partial: AssistantMessage = { ...message, content: [], stopReason: \"pending\" };\n\tif (signal?.aborted) {\n\t\tconst aborted = createAbortedMessage(partial);\n\t\tstream.push({ type: \"error\", reason: \"aborted\", error: aborted });\n\t\tstream.end(aborted);\n\t\treturn;\n\t}\n\n\tstream.push({ type: \"start\", partial: { ...partial } });\n\n\tfor (let index = 0; index < message.content.length; index++) {\n\t\tif (signal?.aborted) {\n\t\t\tconst aborted = createAbortedMessage(partial);\n\t\t\tstream.push({ type: \"error\", reason: \"aborted\", error: aborted });\n\t\t\tstream.end(aborted);\n\t\t\treturn;\n\t\t}\n\n\t\tconst block = message.content[index];\n\n\t\tif (block.type === \"thinking\") {\n\t\t\tpartial.content = [...partial.content, { type: \"thinking\", thinking: \"\" }];\n\t\t\tstream.push({ type: \"thinking_start\", contentIndex: index, partial: { ...partial } });\n\t\t\tfor (const chunk of splitStringByTokenSize(block.thinking, minTokenSize, maxTokenSize)) {\n\t\t\t\tawait scheduleChunk(chunk, tokensPerSecond);\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tconst aborted = createAbortedMessage(partial);\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"aborted\", error: aborted });\n\t\t\t\t\tstream.end(aborted);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t(partial.content[index] as ThinkingContent).thinking += chunk;\n\t\t\t\tstream.push({ type: \"thinking_delta\", contentIndex: index, delta: chunk, partial: { ...partial } });\n\t\t\t}\n\t\t\tstream.push({\n\t\t\t\ttype: \"thinking_end\",\n\t\t\t\tcontentIndex: index,\n\t\t\t\tcontent: block.thinking,\n\t\t\t\tpartial: { ...partial },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (block.type === \"text\") {\n\t\t\tpartial.content = [...partial.content, { type: \"text\", text: \"\" }];\n\t\t\tstream.push({ type: \"text_start\", contentIndex: index, partial: { ...partial } });\n\t\t\tfor (const chunk of splitStringByTokenSize(block.text, minTokenSize, maxTokenSize)) {\n\t\t\t\tawait scheduleChunk(chunk, tokensPerSecond);\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tconst aborted = createAbortedMessage(partial);\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"aborted\", error: aborted });\n\t\t\t\t\tstream.end(aborted);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t(partial.content[index] as TextContent).text += chunk;\n\t\t\t\tstream.push({ type: \"text_delta\", contentIndex: index, delta: chunk, partial: { ...partial } });\n\t\t\t}\n\t\t\tstream.push({ type: \"text_end\", contentIndex: index, content: block.text, partial: { ...partial } });\n\t\t\tcontinue;\n\t\t}\n\n\t\tpartial.content = [...partial.content, { type: \"toolCall\", id: block.id, name: block.name, arguments: {} }];\n\t\tstream.push({ type: \"toolcall_start\", contentIndex: index, partial: { ...partial } });\n\t\tfor (const chunk of splitStringByTokenSize(JSON.stringify(block.arguments), minTokenSize, maxTokenSize)) {\n\t\t\tawait scheduleChunk(chunk, tokensPerSecond);\n\t\t\tif (signal?.aborted) {\n\t\t\t\tconst aborted = createAbortedMessage(partial);\n\t\t\t\tstream.push({ type: \"error\", reason: \"aborted\", error: aborted });\n\t\t\t\tstream.end(aborted);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstream.push({ type: \"toolcall_delta\", contentIndex: index, delta: chunk, partial: { ...partial } });\n\t\t}\n\t\t(partial.content[index] as ToolCall).arguments = block.arguments;\n\t\tstream.push({ type: \"toolcall_end\", contentIndex: index, toolCall: block, partial: { ...partial } });\n\t}\n\n\tif (message.stopReason === \"pending\") {\n\t\tthrow new Error(\"Faux response ended without a stop reason\");\n\t}\n\tif (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n\t\tstream.push({ type: \"error\", reason: message.stopReason, error: message });\n\t\tstream.end(message);\n\t\treturn;\n\t}\n\n\tstream.push({ type: \"done\", reason: message.stopReason, message });\n\tstream.end(message);\n}\n\nexport function createFauxCore(options: RegisterFauxProviderOptions) {\n\tconst api = options.api ?? randomId(DEFAULT_API);\n\tconst provider = options.provider ?? DEFAULT_PROVIDER;\n\tconst minTokenSize = Math.max(\n\t\t1,\n\t\tMath.min(options.tokenSize?.min ?? DEFAULT_MIN_TOKEN_SIZE, options.tokenSize?.max ?? DEFAULT_MAX_TOKEN_SIZE),\n\t);\n\tconst maxTokenSize = Math.max(minTokenSize, options.tokenSize?.max ?? DEFAULT_MAX_TOKEN_SIZE);\n\tlet pendingResponses: FauxResponseStep[] = [];\n\tconst tokensPerSecond = options.tokensPerSecond;\n\tconst state: FauxProviderState = { callCount: 0, deferredFetchCount: 0, cancelledDeferred: [] };\n\tconst promptCache = new Map<string, string>();\n\tconst deferredResponses = new Map<\n\t\tstring,\n\t\t{\n\t\t\thandle: DeferredHandle;\n\t\t\tstep: FauxResponseStep;\n\t\t\tcontext: TranscriptContext;\n\t\t\toptions: SimpleStreamOptions | undefined;\n\t\t\tmodel: Model<string>;\n\t\t\tpendingFetches: number;\n\t\t\tcancelled: boolean;\n\t\t\tfinal?: AssistantMessage;\n\t\t}\n\t>();\n\n\tconst modelDefinitions = options.models?.length\n\t\t? options.models\n\t\t: [\n\t\t\t\t{\n\t\t\t\t\tid: DEFAULT_MODEL_ID,\n\t\t\t\t\tname: DEFAULT_MODEL_NAME,\n\t\t\t\t\treasoning: false,\n\t\t\t\t\tinput: [\"text\", \"image\"] as (\"text\" | \"image\")[],\n\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\t\t\t\tcontextWindow: 128000,\n\t\t\t\t\tmaxTokens: 16384,\n\t\t\t\t},\n\t\t\t];\n\tconst models = modelDefinitions.map((definition) => ({\n\t\tid: definition.id,\n\t\tname: definition.name ?? definition.id,\n\t\tapi,\n\t\tprovider,\n\t\tbaseUrl: DEFAULT_BASE_URL,\n\t\treasoning: definition.reasoning ?? false,\n\t\tinput: definition.input ?? [\"text\", \"image\"],\n\t\tinputLimits: definition.inputLimits,\n\t\tcost: definition.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: definition.contextWindow ?? 128000,\n\t\tmaxTokens: definition.maxTokens ?? 16384,\n\t})) as [Model<string>, ...Model<string>[]];\n\n\tconst resolveResponse = async (\n\t\tstep: FauxResponseStep,\n\t\tcontext: TranscriptContext,\n\t\tstreamOptions: SimpleStreamOptions | undefined,\n\t\trequestModel: Model<string>,\n\t): Promise<AssistantMessage> => {\n\t\tconst resolved = typeof step === \"function\" ? await step(context, streamOptions, state, requestModel) : step;\n\t\treturn withUsageEstimate(\n\t\t\tcloneMessage(resolved, api, provider, requestModel.id),\n\t\t\tcontext,\n\t\t\tstreamOptions,\n\t\t\tpromptCache,\n\t\t);\n\t};\n\n\tconst stream: StreamFunction<string, SimpleStreamOptions> = (requestModel, context, streamOptions) => {\n\t\tconst outer = createAssistantMessageEventStream();\n\t\tconst step = pendingResponses.shift();\n\t\tstate.callCount++;\n\n\t\tqueueMicrotask(async () => {\n\t\t\ttry {\n\t\t\t\tawait streamOptions?.onResponse?.({ status: 200, headers: {} }, requestModel);\n\t\t\t\tif (!step) {\n\t\t\t\t\tlet message = createErrorMessage(\n\t\t\t\t\t\tnew Error(\"No more faux responses queued\"),\n\t\t\t\t\t\tapi,\n\t\t\t\t\t\tprovider,\n\t\t\t\t\t\trequestModel.id,\n\t\t\t\t\t);\n\t\t\t\t\tmessage = withUsageEstimate(message, context, streamOptions, promptCache);\n\t\t\t\t\touter.push({ type: \"error\", reason: \"error\", error: message });\n\t\t\t\t\touter.end(message);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (streamOptions?.deferred) {\n\t\t\t\t\tconst handle: DeferredHandle = {\n\t\t\t\t\t\tprovider: requestModel.provider,\n\t\t\t\t\t\tmodelId: requestModel.id,\n\t\t\t\t\t\tapi: requestModel.api,\n\t\t\t\t\t\tid: randomId(\"deferred\"),\n\t\t\t\t\t\t...(options.deferred?.pollAfterMs !== undefined ? { pollAfterMs: options.deferred.pollAfterMs } : {}),\n\t\t\t\t\t};\n\t\t\t\t\tdeferredResponses.set(handle.id, {\n\t\t\t\t\t\thandle,\n\t\t\t\t\t\tstep,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\toptions: streamOptions,\n\t\t\t\t\t\tmodel: requestModel,\n\t\t\t\t\t\tpendingFetches: Math.max(0, Math.floor(options.deferred?.pendingFetches ?? 0)),\n\t\t\t\t\t\tcancelled: false,\n\t\t\t\t\t});\n\t\t\t\t\tawait streamWithDeltas(\n\t\t\t\t\t\touter,\n\t\t\t\t\t\tcreateDeferredMessage(requestModel, handle),\n\t\t\t\t\t\tminTokenSize,\n\t\t\t\t\t\tmaxTokenSize,\n\t\t\t\t\t\ttokensPerSecond,\n\t\t\t\t\t\tstreamOptions.signal,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst message = await resolveResponse(step, context, streamOptions, requestModel);\n\t\t\t\tawait streamWithDeltas(outer, message, minTokenSize, maxTokenSize, tokensPerSecond, streamOptions?.signal);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = createErrorMessage(error, api, provider, requestModel.id);\n\t\t\t\touter.push({ type: \"error\", reason: \"error\", error: message });\n\t\t\t\touter.end(message);\n\t\t\t}\n\t\t});\n\n\t\treturn outer;\n\t};\n\n\tconst streamSimple: StreamFunction<string, SimpleStreamOptions> = (streamModel, context, streamOptions) =>\n\t\tstream(streamModel, context, streamOptions);\n\n\tconst fetchDeferred = (\n\t\trequestModel: Model<string>,\n\t\thandle: DeferredHandle,\n\t\tfetchOptions?: DeferredFetchOptions,\n\t): AssistantMessageEventStream => {\n\t\tconst outer = createAssistantMessageEventStream();\n\t\tstate.deferredFetchCount++;\n\n\t\tqueueMicrotask(async () => {\n\t\t\ttry {\n\t\t\t\tawait fetchOptions?.onResponse?.({ status: 200, headers: {} }, requestModel);\n\t\t\t\tconst entry = deferredResponses.get(handle.id);\n\t\t\t\tif (\n\t\t\t\t\t!entry ||\n\t\t\t\t\tentry.handle.provider !== handle.provider ||\n\t\t\t\t\tentry.handle.modelId !== handle.modelId ||\n\t\t\t\t\tentry.handle.api !== handle.api\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(`Unknown faux deferred response: ${handle.id}`);\n\t\t\t\t}\n\t\t\t\tif (entry.cancelled) throw new Error(`Faux deferred response was cancelled: ${handle.id}`);\n\n\t\t\t\tif (entry.pendingFetches > 0) {\n\t\t\t\t\tentry.pendingFetches--;\n\t\t\t\t\tawait streamWithDeltas(\n\t\t\t\t\t\touter,\n\t\t\t\t\t\tcreateDeferredMessage(requestModel, entry.handle),\n\t\t\t\t\t\tminTokenSize,\n\t\t\t\t\t\tmaxTokenSize,\n\t\t\t\t\t\ttokensPerSecond,\n\t\t\t\t\t\tfetchOptions?.signal,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!entry.final) {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tdeferred: _deferred,\n\t\t\t\t\t\tsignal: _submissionSignal,\n\t\t\t\t\t\tonResponse: _submissionOnResponse,\n\t\t\t\t\t\t...submissionOptions\n\t\t\t\t\t} = entry.options ?? {};\n\t\t\t\t\ttry {\n\t\t\t\t\t\tentry.final = await resolveResponse(entry.step, entry.context, submissionOptions, entry.model);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tentry.final = createErrorMessage(error, api, provider, entry.model.id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait streamWithDeltas(\n\t\t\t\t\touter,\n\t\t\t\t\tentry.final,\n\t\t\t\t\tminTokenSize,\n\t\t\t\t\tmaxTokenSize,\n\t\t\t\t\ttokensPerSecond,\n\t\t\t\t\tfetchOptions?.signal,\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = createErrorMessage(error, api, provider, requestModel.id);\n\t\t\t\touter.push({ type: \"error\", reason: \"error\", error: message });\n\t\t\t\touter.end(message);\n\t\t\t}\n\t\t});\n\n\t\treturn outer;\n\t};\n\n\tconst cancelDeferred = async (\n\t\trequestModel: Model<string>,\n\t\thandle: DeferredHandle,\n\t\tcancelOptions?: DeferredCancelOptions,\n\t): Promise<void> => {\n\t\tstate.cancelledDeferred.push(structuredClone(handle));\n\t\tconst entry = deferredResponses.get(handle.id);\n\t\tif (entry) entry.cancelled = true;\n\t\tawait cancelOptions?.onResponse?.({ status: 200, headers: {} }, requestModel);\n\t};\n\n\tfunction getModel(): Model<string>;\n\tfunction getModel(requestedModelId: string): Model<string> | undefined;\n\tfunction getModel(requestedModelId?: string): Model<string> | undefined {\n\t\tif (!requestedModelId) {\n\t\t\treturn models[0];\n\t\t}\n\t\treturn models.find((candidate) => candidate.id === requestedModelId);\n\t}\n\n\treturn {\n\t\tapi,\n\t\tprovider,\n\t\tmodels,\n\t\tstream,\n\t\tstreamSimple,\n\t\tfetchDeferred,\n\t\tcancelDeferred,\n\t\tgetModel,\n\t\tstate,\n\t\tsetResponses(responses: FauxResponseStep[]) {\n\t\t\tpendingResponses = [...responses];\n\t\t},\n\t\tappendResponses(responses: FauxResponseStep[]) {\n\t\t\tpendingResponses.push(...responses);\n\t\t},\n\t\tgetPendingResponseCount() {\n\t\t\treturn pendingResponses.length;\n\t\t},\n\t};\n}\n\n/**\n * Faux provider for tests built on explicit `Models` collections:\n *\n * ```ts\n * const faux = fauxProvider();\n * const models = createModels();\n * models.setProvider(faux.provider);\n * faux.setResponses([fauxAssistantMessage(\"hi\")]);\n * ```\n */\nexport function fauxProvider(options: RegisterFauxProviderOptions = {}): FauxProviderHandle {\n\tconst core = createFauxCore(options);\n\tconst provider = createProvider({\n\t\tid: core.provider,\n\t\tauth: { apiKey: { name: \"Faux\", resolve: async () => ({ auth: {} }) } },\n\t\tmodels: core.models,\n\t\tapi: {\n\t\t\tstream: core.stream,\n\t\t\tstreamSimple: core.streamSimple,\n\t\t\tfetchDeferred: core.fetchDeferred,\n\t\t\tcancelDeferred: core.cancelDeferred,\n\t\t},\n\t});\n\treturn {\n\t\tprovider,\n\t\tapi: core.api,\n\t\tmodels: core.models,\n\t\tgetModel: core.getModel,\n\t\tstate: core.state,\n\t\tsetResponses: core.setResponses,\n\t\tappendResponses: core.appendResponses,\n\t\tgetPendingResponseCount: core.getPendingResponseCount,\n\t};\n}\n"]}
1
+ {"version":3,"file":"faux.js","sourceRoot":"","sources":["../../src/providers/faux.ts"],"names":[],"mappings":"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","sourcesContent":["import { createProvider, type Provider } from \"../models.ts\";\nimport type {\n\tAssistantMessage,\n\tAssistantMessageEventStream,\n\tDeferredCancelOptions,\n\tDeferredFetchOptions,\n\tDeferredHandle,\n\tImageContent,\n\tMessage,\n\tModel,\n\tSimpleStreamOptions,\n\tStreamFunction,\n\tStreamOptions,\n\tTextContent,\n\tThinkingContent,\n\tToolCall,\n\tToolResultMessage,\n\tTranscriptContext,\n\tUsage,\n} from \"../types.ts\";\nimport { createAssistantMessageEventStream } from \"../utils/event-stream.ts\";\nimport { getSystemMessageText } from \"../utils/text.ts\";\n\nconst DEFAULT_API = \"faux\";\nconst DEFAULT_PROVIDER = \"faux\";\nconst DEFAULT_MODEL_ID = \"faux-1\";\nconst DEFAULT_MODEL_NAME = \"Faux Model\";\nconst DEFAULT_BASE_URL = \"http://localhost:0\";\nconst DEFAULT_MIN_TOKEN_SIZE = 3;\nconst DEFAULT_MAX_TOKEN_SIZE = 5;\n\nconst DEFAULT_USAGE: Usage = {\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n};\n\nexport interface FauxModelDefinition {\n\tid: string;\n\tname?: string;\n\treasoning?: boolean;\n\tinput?: (\"text\" | \"image\")[];\n\tinputLimits?: Model<string>[\"inputLimits\"];\n\tcost?: { input: number; output: number; cacheRead: number; cacheWrite: number };\n\tcontextWindow?: number;\n\tmaxTokens?: number;\n}\n\nexport type FauxContentBlock = TextContent | ThinkingContent | ToolCall;\n\nexport function fauxText(text: string): TextContent {\n\treturn { type: \"text\", text };\n}\n\nexport function fauxThinking(thinking: string): ThinkingContent {\n\treturn { type: \"thinking\", thinking };\n}\n\nexport function fauxToolCall(name: string, arguments_: ToolCall[\"arguments\"], options: { id?: string } = {}): ToolCall {\n\treturn {\n\t\ttype: \"toolCall\",\n\t\tid: options.id ?? randomId(\"tool\"),\n\t\tname,\n\t\targuments: arguments_,\n\t};\n}\n\nfunction normalizeFauxAssistantContent(content: string | FauxContentBlock | FauxContentBlock[]): FauxContentBlock[] {\n\tif (typeof content === \"string\") {\n\t\treturn [fauxText(content)];\n\t}\n\treturn Array.isArray(content) ? content : [content];\n}\n\nexport function fauxAssistantMessage(\n\tcontent: string | FauxContentBlock | FauxContentBlock[],\n\toptions: {\n\t\tstopReason?: AssistantMessage[\"stopReason\"];\n\t\tdeferred?: DeferredHandle;\n\t\terrorMessage?: string;\n\t\tresponseId?: string;\n\t\ttimestamp?: number;\n\t} = {},\n): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: normalizeFauxAssistantContent(content),\n\t\tapi: DEFAULT_API,\n\t\tprovider: DEFAULT_PROVIDER,\n\t\tmodel: DEFAULT_MODEL_ID,\n\t\tusage: DEFAULT_USAGE,\n\t\tstopReason: options.stopReason ?? \"stop\",\n\t\t...(options.deferred === undefined ? {} : { deferred: options.deferred }),\n\t\t...(options.errorMessage === undefined ? {} : { errorMessage: options.errorMessage }),\n\t\t...(options.responseId === undefined ? {} : { responseId: options.responseId }),\n\t\ttimestamp: options.timestamp ?? Date.now(),\n\t};\n}\n\nexport interface FauxProviderState {\n\tcallCount: number;\n\tdeferredFetchCount: number;\n\tcancelledDeferred: DeferredHandle[];\n}\n\nexport type FauxResponseFactory = (\n\tcontext: TranscriptContext,\n\toptions: SimpleStreamOptions | undefined,\n\tstate: FauxProviderState,\n\tmodel: Model<string>,\n) => AssistantMessage | Promise<AssistantMessage>;\n\nexport type FauxResponseStep = AssistantMessage | FauxResponseFactory;\n\nexport interface RegisterFauxProviderOptions {\n\tapi?: string;\n\tprovider?: string;\n\tmodels?: FauxModelDefinition[];\n\tdeferred?: {\n\t\t/** Number of fetches that return the original handle before the scripted response becomes ready. */\n\t\tpendingFetches?: number;\n\t\tpollAfterMs?: number;\n\t};\n\ttokensPerSecond?: number;\n\ttokenSize?: {\n\t\tmin?: number;\n\t\tmax?: number;\n\t};\n}\n\nexport interface FauxProviderRegistration {\n\tapi: string;\n\tmodels: [Model<string>, ...Model<string>[]];\n\tgetModel(): Model<string>;\n\tgetModel(modelId: string): Model<string> | undefined;\n\tstate: FauxProviderState;\n\tsetResponses: (responses: FauxResponseStep[]) => void;\n\tappendResponses: (responses: FauxResponseStep[]) => void;\n\tgetPendingResponseCount: () => number;\n\tunregister: () => void;\n}\n\nexport interface FauxProviderHandle {\n\tprovider: Provider;\n\tapi: string;\n\tmodels: [Model<string>, ...Model<string>[]];\n\tgetModel(): Model<string>;\n\tgetModel(modelId: string): Model<string> | undefined;\n\tstate: FauxProviderState;\n\tsetResponses: (responses: FauxResponseStep[]) => void;\n\tappendResponses: (responses: FauxResponseStep[]) => void;\n\tgetPendingResponseCount: () => number;\n}\n\nfunction estimateTokens(text: string): number {\n\treturn Math.ceil(text.length / 4);\n}\n\nfunction randomId(prefix: string): string {\n\treturn `${prefix}:${Date.now()}:${Math.random().toString(36).slice(2)}`;\n}\n\nfunction contentToText(content: string | Array<TextContent | ImageContent>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\treturn content\n\t\t.map((block) => {\n\t\t\tif (block.type === \"text\") {\n\t\t\t\treturn block.text;\n\t\t\t}\n\t\t\treturn `[image:${block.mimeType}:${block.data.length}]`;\n\t\t})\n\t\t.join(\"\\n\");\n}\n\nfunction assistantContentToText(content: Array<TextContent | ThinkingContent | ToolCall>): string {\n\treturn content\n\t\t.map((block) => {\n\t\t\tif (block.type === \"text\") {\n\t\t\t\treturn block.text;\n\t\t\t}\n\t\t\tif (block.type === \"thinking\") {\n\t\t\t\treturn block.thinking;\n\t\t\t}\n\t\t\treturn `${block.name}:${JSON.stringify(block.arguments)}`;\n\t\t})\n\t\t.join(\"\\n\");\n}\n\nfunction toolResultToText(message: ToolResultMessage): string {\n\treturn [message.toolName, ...message.content.map((block) => contentToText([block]))].join(\"\\n\");\n}\n\nfunction messageToText(message: Message): string {\n\tif (message.role === \"system\") {\n\t\treturn [\n\t\t\tgetSystemMessageText(message),\n\t\t\t...(message.toolsRemoved?.map((tool) => `tool-:${JSON.stringify(tool)}`) ?? []),\n\t\t\t...(message.toolsAdded?.map((tool) => `tool+:${JSON.stringify(tool)}`) ?? []),\n\t\t]\n\t\t\t.filter((part) => part.length > 0)\n\t\t\t.join(\"\\n\");\n\t}\n\tif (message.role === \"user\") {\n\t\treturn contentToText(message.content);\n\t}\n\tif (message.role === \"assistant\") {\n\t\treturn assistantContentToText(message.content);\n\t}\n\treturn toolResultToText(message);\n}\n\n/** Length of the prompt text that joins `messages` with blank lines. */\nfunction joinedLength(messages: readonly string[], count = messages.length): number {\n\tlet length = count > 0 ? (count - 1) * 2 : 0;\n\tfor (let index = 0; index < count; index++) length += messages[index]!.length;\n\treturn length;\n}\n\n/**\n * Length of the common prefix of the two joined prompts. Equal messages are compared whole; characters are compared\n * only from the first message that differs.\n */\nfunction commonPromptPrefixLength(previous: readonly string[], current: readonly string[]): number {\n\tlet index = 0;\n\twhile (index < previous.length && index < current.length && previous[index] === current[index]) index++;\n\tconst rest = (messages: readonly string[]) =>\n\t\tindex === messages.length ? \"\" : (index > 0 ? \"\\n\\n\" : \"\") + messages.slice(index).join(\"\\n\\n\");\n\treturn joinedLength(previous, index) + commonPrefixLength(rest(previous), rest(current));\n}\n\nfunction commonPrefixLength(a: string, b: string): number {\n\tconst length = Math.min(a.length, b.length);\n\tlet index = 0;\n\twhile (index < length && a[index] === b[index]) {\n\t\tindex++;\n\t}\n\treturn index;\n}\n\nfunction withUsageEstimate(\n\tmessage: AssistantMessage,\n\tcontext: TranscriptContext,\n\toptions: StreamOptions | undefined,\n\tpromptCache: Map<string, readonly string[]>,\n): AssistantMessage {\n\t// One text per message; the whole prompt joins them with blank lines.\n\tconst prompt = context.messages.map((message) => `${message.role}:${messageToText(message)}`);\n\tconst promptLength = joinedLength(prompt);\n\tconst promptTokens = Math.ceil(promptLength / 4);\n\tconst outputTokens = estimateTokens(assistantContentToText(message.content));\n\tlet input = promptTokens;\n\tlet cacheRead = 0;\n\tlet cacheWrite = 0;\n\tconst sessionId = options?.sessionId;\n\n\tif (sessionId && options?.cacheRetention !== \"none\") {\n\t\tconst previousPrompt = promptCache.get(sessionId);\n\t\tif (previousPrompt) {\n\t\t\tconst cachedChars = commonPromptPrefixLength(previousPrompt, prompt);\n\t\t\tcacheRead = Math.ceil(cachedChars / 4);\n\t\t\tcacheWrite = Math.ceil((promptLength - cachedChars) / 4);\n\t\t\tinput = Math.max(0, promptTokens - cacheRead);\n\t\t} else {\n\t\t\tcacheWrite = promptTokens;\n\t\t}\n\t\tpromptCache.set(sessionId, prompt);\n\t}\n\n\treturn {\n\t\t...message,\n\t\tusage: {\n\t\t\tinput,\n\t\t\toutput: outputTokens,\n\t\t\tcacheRead,\n\t\t\tcacheWrite,\n\t\t\ttotalTokens: input + outputTokens + cacheRead + cacheWrite,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t},\n\t};\n}\n\nfunction splitStringByTokenSize(text: string, minTokenSize: number, maxTokenSize: number): string[] {\n\tconst chunks: string[] = [];\n\tlet index = 0;\n\twhile (index < text.length) {\n\t\tconst tokenSize = minTokenSize + Math.floor(Math.random() * (maxTokenSize - minTokenSize + 1));\n\t\tconst charSize = Math.max(1, tokenSize * 4);\n\t\tchunks.push(text.slice(index, index + charSize));\n\t\tindex += charSize;\n\t}\n\treturn chunks.length > 0 ? chunks : [\"\"];\n}\n\nfunction cloneMessage(message: AssistantMessage, api: string, provider: string, modelId: string): AssistantMessage {\n\tconst cloned = structuredClone(message);\n\treturn {\n\t\t...cloned,\n\t\tapi,\n\t\tprovider,\n\t\tmodel: modelId,\n\t\ttimestamp: cloned.timestamp ?? Date.now(),\n\t\tusage: cloned.usage ?? DEFAULT_USAGE,\n\t};\n}\n\nfunction createDeferredMessage(model: Model<string>, handle: DeferredHandle): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: DEFAULT_USAGE,\n\t\tstopReason: \"deferred\",\n\t\tdeferred: handle,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction createErrorMessage(error: unknown, api: string, provider: string, modelId: string): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tapi,\n\t\tprovider,\n\t\tmodel: modelId,\n\t\tusage: DEFAULT_USAGE,\n\t\tstopReason: \"error\",\n\t\terrorMessage: error instanceof Error ? error.message : String(error),\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction createAbortedMessage(partial: AssistantMessage): AssistantMessage {\n\treturn {\n\t\t...partial,\n\t\tstopReason: \"aborted\",\n\t\terrorMessage: \"Request was aborted\",\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction scheduleChunk(chunk: string, tokensPerSecond: number | undefined): Promise<void> {\n\tif (!tokensPerSecond || tokensPerSecond <= 0) {\n\t\treturn new Promise((resolve) => queueMicrotask(resolve));\n\t}\n\tconst delayMs = (estimateTokens(chunk) / tokensPerSecond) * 1000;\n\treturn new Promise((resolve) => setTimeout(resolve, delayMs));\n}\n\nasync function streamWithDeltas(\n\tstream: AssistantMessageEventStream,\n\tmessage: AssistantMessage,\n\tminTokenSize: number,\n\tmaxTokenSize: number,\n\ttokensPerSecond: number | undefined,\n\tsignal: AbortSignal | undefined,\n): Promise<void> {\n\tconst partial: AssistantMessage = { ...message, content: [], stopReason: \"pending\" };\n\tif (signal?.aborted) {\n\t\tconst aborted = createAbortedMessage(partial);\n\t\tstream.push({ type: \"error\", reason: \"aborted\", error: aborted });\n\t\tstream.end(aborted);\n\t\treturn;\n\t}\n\n\tstream.push({ type: \"start\", partial: { ...partial } });\n\n\tfor (let index = 0; index < message.content.length; index++) {\n\t\tif (signal?.aborted) {\n\t\t\tconst aborted = createAbortedMessage(partial);\n\t\t\tstream.push({ type: \"error\", reason: \"aborted\", error: aborted });\n\t\t\tstream.end(aborted);\n\t\t\treturn;\n\t\t}\n\n\t\tconst block = message.content[index];\n\n\t\tif (block.type === \"thinking\") {\n\t\t\tpartial.content = [...partial.content, { type: \"thinking\", thinking: \"\" }];\n\t\t\tstream.push({ type: \"thinking_start\", contentIndex: index, partial: { ...partial } });\n\t\t\tfor (const chunk of splitStringByTokenSize(block.thinking, minTokenSize, maxTokenSize)) {\n\t\t\t\tawait scheduleChunk(chunk, tokensPerSecond);\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tconst aborted = createAbortedMessage(partial);\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"aborted\", error: aborted });\n\t\t\t\t\tstream.end(aborted);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t(partial.content[index] as ThinkingContent).thinking += chunk;\n\t\t\t\tstream.push({ type: \"thinking_delta\", contentIndex: index, delta: chunk, partial: { ...partial } });\n\t\t\t}\n\t\t\tstream.push({\n\t\t\t\ttype: \"thinking_end\",\n\t\t\t\tcontentIndex: index,\n\t\t\t\tcontent: block.thinking,\n\t\t\t\tpartial: { ...partial },\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (block.type === \"text\") {\n\t\t\tpartial.content = [...partial.content, { type: \"text\", text: \"\" }];\n\t\t\tstream.push({ type: \"text_start\", contentIndex: index, partial: { ...partial } });\n\t\t\tfor (const chunk of splitStringByTokenSize(block.text, minTokenSize, maxTokenSize)) {\n\t\t\t\tawait scheduleChunk(chunk, tokensPerSecond);\n\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\tconst aborted = createAbortedMessage(partial);\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"aborted\", error: aborted });\n\t\t\t\t\tstream.end(aborted);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t(partial.content[index] as TextContent).text += chunk;\n\t\t\t\tstream.push({ type: \"text_delta\", contentIndex: index, delta: chunk, partial: { ...partial } });\n\t\t\t}\n\t\t\tstream.push({ type: \"text_end\", contentIndex: index, content: block.text, partial: { ...partial } });\n\t\t\tcontinue;\n\t\t}\n\n\t\tpartial.content = [...partial.content, { type: \"toolCall\", id: block.id, name: block.name, arguments: {} }];\n\t\tstream.push({ type: \"toolcall_start\", contentIndex: index, partial: { ...partial } });\n\t\tfor (const chunk of splitStringByTokenSize(JSON.stringify(block.arguments), minTokenSize, maxTokenSize)) {\n\t\t\tawait scheduleChunk(chunk, tokensPerSecond);\n\t\t\tif (signal?.aborted) {\n\t\t\t\tconst aborted = createAbortedMessage(partial);\n\t\t\t\tstream.push({ type: \"error\", reason: \"aborted\", error: aborted });\n\t\t\t\tstream.end(aborted);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstream.push({ type: \"toolcall_delta\", contentIndex: index, delta: chunk, partial: { ...partial } });\n\t\t}\n\t\t(partial.content[index] as ToolCall).arguments = block.arguments;\n\t\tstream.push({ type: \"toolcall_end\", contentIndex: index, toolCall: block, partial: { ...partial } });\n\t}\n\n\tif (message.stopReason === \"pending\") {\n\t\tthrow new Error(\"Faux response ended without a stop reason\");\n\t}\n\tif (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n\t\tstream.push({ type: \"error\", reason: message.stopReason, error: message });\n\t\tstream.end(message);\n\t\treturn;\n\t}\n\n\tstream.push({ type: \"done\", reason: message.stopReason, message });\n\tstream.end(message);\n}\n\nexport function createFauxCore(options: RegisterFauxProviderOptions) {\n\tconst api = options.api ?? randomId(DEFAULT_API);\n\tconst provider = options.provider ?? DEFAULT_PROVIDER;\n\tconst minTokenSize = Math.max(\n\t\t1,\n\t\tMath.min(options.tokenSize?.min ?? DEFAULT_MIN_TOKEN_SIZE, options.tokenSize?.max ?? DEFAULT_MAX_TOKEN_SIZE),\n\t);\n\tconst maxTokenSize = Math.max(minTokenSize, options.tokenSize?.max ?? DEFAULT_MAX_TOKEN_SIZE);\n\tlet pendingResponses: FauxResponseStep[] = [];\n\tconst tokensPerSecond = options.tokensPerSecond;\n\tconst state: FauxProviderState = { callCount: 0, deferredFetchCount: 0, cancelledDeferred: [] };\n\tconst promptCache = new Map<string, readonly string[]>();\n\tconst deferredResponses = new Map<\n\t\tstring,\n\t\t{\n\t\t\thandle: DeferredHandle;\n\t\t\tstep: FauxResponseStep;\n\t\t\tcontext: TranscriptContext;\n\t\t\toptions: SimpleStreamOptions | undefined;\n\t\t\tmodel: Model<string>;\n\t\t\tpendingFetches: number;\n\t\t\tcancelled: boolean;\n\t\t\tfinal?: AssistantMessage;\n\t\t}\n\t>();\n\n\tconst modelDefinitions = options.models?.length\n\t\t? options.models\n\t\t: [\n\t\t\t\t{\n\t\t\t\t\tid: DEFAULT_MODEL_ID,\n\t\t\t\t\tname: DEFAULT_MODEL_NAME,\n\t\t\t\t\treasoning: false,\n\t\t\t\t\tinput: [\"text\", \"image\"] as (\"text\" | \"image\")[],\n\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\t\t\t\tcontextWindow: 128000,\n\t\t\t\t\tmaxTokens: 16384,\n\t\t\t\t},\n\t\t\t];\n\tconst models = modelDefinitions.map((definition) => ({\n\t\tid: definition.id,\n\t\tname: definition.name ?? definition.id,\n\t\tapi,\n\t\tprovider,\n\t\tbaseUrl: DEFAULT_BASE_URL,\n\t\treasoning: definition.reasoning ?? false,\n\t\tinput: definition.input ?? [\"text\", \"image\"],\n\t\tinputLimits: definition.inputLimits,\n\t\tcost: definition.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: definition.contextWindow ?? 128000,\n\t\tmaxTokens: definition.maxTokens ?? 16384,\n\t})) as [Model<string>, ...Model<string>[]];\n\n\tconst resolveResponse = async (\n\t\tstep: FauxResponseStep,\n\t\tcontext: TranscriptContext,\n\t\tstreamOptions: SimpleStreamOptions | undefined,\n\t\trequestModel: Model<string>,\n\t): Promise<AssistantMessage> => {\n\t\tconst resolved = typeof step === \"function\" ? await step(context, streamOptions, state, requestModel) : step;\n\t\treturn withUsageEstimate(\n\t\t\tcloneMessage(resolved, api, provider, requestModel.id),\n\t\t\tcontext,\n\t\t\tstreamOptions,\n\t\t\tpromptCache,\n\t\t);\n\t};\n\n\tconst stream: StreamFunction<string, SimpleStreamOptions> = (requestModel, context, streamOptions) => {\n\t\tconst outer = createAssistantMessageEventStream();\n\t\tconst step = pendingResponses.shift();\n\t\tstate.callCount++;\n\n\t\tqueueMicrotask(async () => {\n\t\t\ttry {\n\t\t\t\tawait streamOptions?.onResponse?.({ status: 200, headers: {} }, requestModel);\n\t\t\t\tif (!step) {\n\t\t\t\t\tlet message = createErrorMessage(\n\t\t\t\t\t\tnew Error(\"No more faux responses queued\"),\n\t\t\t\t\t\tapi,\n\t\t\t\t\t\tprovider,\n\t\t\t\t\t\trequestModel.id,\n\t\t\t\t\t);\n\t\t\t\t\tmessage = withUsageEstimate(message, context, streamOptions, promptCache);\n\t\t\t\t\touter.push({ type: \"error\", reason: \"error\", error: message });\n\t\t\t\t\touter.end(message);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (streamOptions?.deferred) {\n\t\t\t\t\tconst handle: DeferredHandle = {\n\t\t\t\t\t\tprovider: requestModel.provider,\n\t\t\t\t\t\tmodelId: requestModel.id,\n\t\t\t\t\t\tapi: requestModel.api,\n\t\t\t\t\t\tid: randomId(\"deferred\"),\n\t\t\t\t\t\t...(options.deferred?.pollAfterMs !== undefined ? { pollAfterMs: options.deferred.pollAfterMs } : {}),\n\t\t\t\t\t};\n\t\t\t\t\tdeferredResponses.set(handle.id, {\n\t\t\t\t\t\thandle,\n\t\t\t\t\t\tstep,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\toptions: streamOptions,\n\t\t\t\t\t\tmodel: requestModel,\n\t\t\t\t\t\tpendingFetches: Math.max(0, Math.floor(options.deferred?.pendingFetches ?? 0)),\n\t\t\t\t\t\tcancelled: false,\n\t\t\t\t\t});\n\t\t\t\t\tawait streamWithDeltas(\n\t\t\t\t\t\touter,\n\t\t\t\t\t\tcreateDeferredMessage(requestModel, handle),\n\t\t\t\t\t\tminTokenSize,\n\t\t\t\t\t\tmaxTokenSize,\n\t\t\t\t\t\ttokensPerSecond,\n\t\t\t\t\t\tstreamOptions.signal,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst message = await resolveResponse(step, context, streamOptions, requestModel);\n\t\t\t\tawait streamWithDeltas(outer, message, minTokenSize, maxTokenSize, tokensPerSecond, streamOptions?.signal);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = createErrorMessage(error, api, provider, requestModel.id);\n\t\t\t\touter.push({ type: \"error\", reason: \"error\", error: message });\n\t\t\t\touter.end(message);\n\t\t\t}\n\t\t});\n\n\t\treturn outer;\n\t};\n\n\tconst streamSimple: StreamFunction<string, SimpleStreamOptions> = (streamModel, context, streamOptions) =>\n\t\tstream(streamModel, context, streamOptions);\n\n\tconst fetchDeferred = (\n\t\trequestModel: Model<string>,\n\t\thandle: DeferredHandle,\n\t\tfetchOptions?: DeferredFetchOptions,\n\t): AssistantMessageEventStream => {\n\t\tconst outer = createAssistantMessageEventStream();\n\t\tstate.deferredFetchCount++;\n\n\t\tqueueMicrotask(async () => {\n\t\t\ttry {\n\t\t\t\tawait fetchOptions?.onResponse?.({ status: 200, headers: {} }, requestModel);\n\t\t\t\tconst entry = deferredResponses.get(handle.id);\n\t\t\t\tif (\n\t\t\t\t\t!entry ||\n\t\t\t\t\tentry.handle.provider !== handle.provider ||\n\t\t\t\t\tentry.handle.modelId !== handle.modelId ||\n\t\t\t\t\tentry.handle.api !== handle.api\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(`Unknown faux deferred response: ${handle.id}`);\n\t\t\t\t}\n\t\t\t\tif (entry.cancelled) throw new Error(`Faux deferred response was cancelled: ${handle.id}`);\n\n\t\t\t\tif (entry.pendingFetches > 0) {\n\t\t\t\t\tentry.pendingFetches--;\n\t\t\t\t\tawait streamWithDeltas(\n\t\t\t\t\t\touter,\n\t\t\t\t\t\tcreateDeferredMessage(requestModel, entry.handle),\n\t\t\t\t\t\tminTokenSize,\n\t\t\t\t\t\tmaxTokenSize,\n\t\t\t\t\t\ttokensPerSecond,\n\t\t\t\t\t\tfetchOptions?.signal,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!entry.final) {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tdeferred: _deferred,\n\t\t\t\t\t\tsignal: _submissionSignal,\n\t\t\t\t\t\tonResponse: _submissionOnResponse,\n\t\t\t\t\t\t...submissionOptions\n\t\t\t\t\t} = entry.options ?? {};\n\t\t\t\t\ttry {\n\t\t\t\t\t\tentry.final = await resolveResponse(entry.step, entry.context, submissionOptions, entry.model);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tentry.final = createErrorMessage(error, api, provider, entry.model.id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait streamWithDeltas(\n\t\t\t\t\touter,\n\t\t\t\t\tentry.final,\n\t\t\t\t\tminTokenSize,\n\t\t\t\t\tmaxTokenSize,\n\t\t\t\t\ttokensPerSecond,\n\t\t\t\t\tfetchOptions?.signal,\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = createErrorMessage(error, api, provider, requestModel.id);\n\t\t\t\touter.push({ type: \"error\", reason: \"error\", error: message });\n\t\t\t\touter.end(message);\n\t\t\t}\n\t\t});\n\n\t\treturn outer;\n\t};\n\n\tconst cancelDeferred = async (\n\t\trequestModel: Model<string>,\n\t\thandle: DeferredHandle,\n\t\tcancelOptions?: DeferredCancelOptions,\n\t): Promise<void> => {\n\t\tstate.cancelledDeferred.push(structuredClone(handle));\n\t\tconst entry = deferredResponses.get(handle.id);\n\t\tif (entry) entry.cancelled = true;\n\t\tawait cancelOptions?.onResponse?.({ status: 200, headers: {} }, requestModel);\n\t};\n\n\tfunction getModel(): Model<string>;\n\tfunction getModel(requestedModelId: string): Model<string> | undefined;\n\tfunction getModel(requestedModelId?: string): Model<string> | undefined {\n\t\tif (!requestedModelId) {\n\t\t\treturn models[0];\n\t\t}\n\t\treturn models.find((candidate) => candidate.id === requestedModelId);\n\t}\n\n\treturn {\n\t\tapi,\n\t\tprovider,\n\t\tmodels,\n\t\tstream,\n\t\tstreamSimple,\n\t\tfetchDeferred,\n\t\tcancelDeferred,\n\t\tgetModel,\n\t\tstate,\n\t\tsetResponses(responses: FauxResponseStep[]) {\n\t\t\tpendingResponses = [...responses];\n\t\t},\n\t\tappendResponses(responses: FauxResponseStep[]) {\n\t\t\tpendingResponses.push(...responses);\n\t\t},\n\t\tgetPendingResponseCount() {\n\t\t\treturn pendingResponses.length;\n\t\t},\n\t};\n}\n\n/**\n * Faux provider for tests built on explicit `Models` collections:\n *\n * ```ts\n * const faux = fauxProvider();\n * const models = createModels();\n * models.setProvider(faux.provider);\n * faux.setResponses([fauxAssistantMessage(\"hi\")]);\n * ```\n */\nexport function fauxProvider(options: RegisterFauxProviderOptions = {}): FauxProviderHandle {\n\tconst core = createFauxCore(options);\n\tconst provider = createProvider({\n\t\tid: core.provider,\n\t\tauth: { apiKey: { name: \"Faux\", resolve: async () => ({ auth: {} }) } },\n\t\tmodels: core.models,\n\t\tapi: {\n\t\t\tstream: core.stream,\n\t\t\tstreamSimple: core.streamSimple,\n\t\t\tfetchDeferred: core.fetchDeferred,\n\t\t\tcancelDeferred: core.cancelDeferred,\n\t\t},\n\t});\n\treturn {\n\t\tprovider,\n\t\tapi: core.api,\n\t\tmodels: core.models,\n\t\tgetModel: core.getModel,\n\t\tstate: core.state,\n\t\tsetResponses: core.setResponses,\n\t\tappendResponses: core.appendResponses,\n\t\tgetPendingResponseCount: core.getPendingResponseCount,\n\t};\n}\n"]}
@@ -0,0 +1,91 @@
1
+ import { type Static, Type } from "typebox";
2
+ export declare const THINKING_LEVELS: readonly ["minimal", "low", "medium", "high", "xhigh", "max"];
3
+ export declare const MODEL_THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
4
+ export declare const MODEL_INPUT_MODALITIES: readonly ["text", "image"];
5
+ export declare const CACHE_RETENTIONS: readonly ["none", "short", "long"];
6
+ export declare const MODEL_PROMPT_CACHE_RETENTIONS: readonly ["short", "long"];
7
+ export declare const ThinkingLevelSchema: Type.TEnum<["minimal", "low", "medium", "high", "xhigh", "max"]>;
8
+ export declare const ModelThinkingLevelSchema: Type.TEnum<["off", "minimal", "low", "medium", "high", "xhigh", "max"]>;
9
+ export declare const ModelInputModalitySchema: Type.TEnum<["text", "image"]>;
10
+ export declare const CacheRetentionSchema: Type.TEnum<["none", "short", "long"]>;
11
+ export declare const ThinkingLevelMapSchema: Type.TObject<{
12
+ high: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
13
+ low: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
14
+ max: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
15
+ medium: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
16
+ minimal: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
17
+ off: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
18
+ xhigh: Type.TOptional<Type.TUnion<[Type.TString, Type.TNull]>>;
19
+ }>;
20
+ export declare const ModelPromptCacheSchema: Type.TObject<{
21
+ long: Type.TOptional<Type.TNumber>;
22
+ short: Type.TOptional<Type.TNumber>;
23
+ }>;
24
+ export declare const ModelCostRatesSchema: Type.TObject<{
25
+ input: Type.TNumber;
26
+ output: Type.TNumber;
27
+ cacheRead: Type.TNumber;
28
+ cacheWrite: Type.TNumber;
29
+ }>;
30
+ export declare const ModelCostTierSchema: Type.TObject<{
31
+ input: Type.TNumber;
32
+ output: Type.TNumber;
33
+ cacheRead: Type.TNumber;
34
+ cacheWrite: Type.TNumber;
35
+ inputTokensAbove: Type.TNumber;
36
+ }>;
37
+ export declare const ModelCostSchema: Type.TObject<{
38
+ input: Type.TNumber;
39
+ output: Type.TNumber;
40
+ cacheRead: Type.TNumber;
41
+ cacheWrite: Type.TNumber;
42
+ tiers: Type.TOptional<Type.TArray<Type.TObject<{
43
+ input: Type.TNumber;
44
+ output: Type.TNumber;
45
+ cacheRead: Type.TNumber;
46
+ cacheWrite: Type.TNumber;
47
+ inputTokensAbove: Type.TNumber;
48
+ }>>>;
49
+ }>;
50
+ export declare const ModelImageResizeOptionsSchema: Type.TObject<{
51
+ maxWidth: Type.TOptional<Type.TInteger>;
52
+ maxHeight: Type.TOptional<Type.TInteger>;
53
+ maxBytes: Type.TOptional<Type.TInteger>;
54
+ jpegQuality: Type.TOptional<Type.TInteger>;
55
+ }>;
56
+ export declare const ModelImageInputLimitsSchema: Type.TObject<{
57
+ resize: Type.TOptional<Type.TObject<{
58
+ maxWidth: Type.TOptional<Type.TInteger>;
59
+ maxHeight: Type.TOptional<Type.TInteger>;
60
+ maxBytes: Type.TOptional<Type.TInteger>;
61
+ jpegQuality: Type.TOptional<Type.TInteger>;
62
+ }>>;
63
+ maxPerMessage: Type.TOptional<Type.TInteger>;
64
+ maxPerRequest: Type.TOptional<Type.TInteger>;
65
+ }>;
66
+ export declare const ModelInputLimitsSchema: Type.TObject<{
67
+ maxRequestBytes: Type.TOptional<Type.TInteger>;
68
+ images: Type.TOptional<Type.TObject<{
69
+ resize: Type.TOptional<Type.TObject<{
70
+ maxWidth: Type.TOptional<Type.TInteger>;
71
+ maxHeight: Type.TOptional<Type.TInteger>;
72
+ maxBytes: Type.TOptional<Type.TInteger>;
73
+ jpegQuality: Type.TOptional<Type.TInteger>;
74
+ }>>;
75
+ maxPerMessage: Type.TOptional<Type.TInteger>;
76
+ maxPerRequest: Type.TOptional<Type.TInteger>;
77
+ }>>;
78
+ }>;
79
+ export type ThinkingLevel = Static<typeof ThinkingLevelSchema>;
80
+ export type ModelThinkingLevel = Static<typeof ModelThinkingLevelSchema>;
81
+ export type ThinkingLevelMap = Static<typeof ThinkingLevelMapSchema>;
82
+ export type ModelInputModality = Static<typeof ModelInputModalitySchema>;
83
+ export type CacheRetention = Static<typeof CacheRetentionSchema>;
84
+ export type ModelPromptCache = Static<typeof ModelPromptCacheSchema>;
85
+ export type ModelCostRates = Static<typeof ModelCostRatesSchema>;
86
+ export type ModelCostTier = Static<typeof ModelCostTierSchema>;
87
+ export type ModelCost = Static<typeof ModelCostSchema>;
88
+ export type ModelImageResizeOptions = Static<typeof ModelImageResizeOptionsSchema>;
89
+ export type ModelImageInputLimits = Static<typeof ModelImageInputLimitsSchema>;
90
+ export type ModelInputLimits = Static<typeof ModelInputLimitsSchema>;
91
+ //# sourceMappingURL=model-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-schema.d.ts","sourceRoot":"","sources":["../../src/providers/model-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAuB,IAAI,EAAE,MAAM,SAAS,CAAC;AAEjE,eAAO,MAAM,eAAe,YAAI,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC;AAC7F,eAAO,MAAM,qBAAqB,sEAAuC,CAAC;AAC1E,eAAO,MAAM,sBAAsB,YAAI,MAAM,EAAE,OAAO,CAAU,CAAC;AACjE,eAAO,MAAM,gBAAgB,YAAI,MAAM,EAAE,OAAO,EAAE,MAAM,CAAU,CAAC;AACnE,eAAO,MAAM,6BAA6B,YAAI,OAAO,EAAE,MAAM,CAAU,CAAC;AAExE,eAAO,MAAM,mBAAmB,kEAA6B,CAAC;AAC9D,eAAO,MAAM,wBAAwB,yEAAmC,CAAC;AACzE,eAAO,MAAM,wBAAwB,+BAAoC,CAAC;AAC1E,eAAO,MAAM,oBAAoB,uCAA8B,CAAC;AAGhE,eAAO,MAAM,sBAAsB;;;;;;;;EAAmF,CAAC;AAEvH,eAAO,MAAM,sBAAsB;;;EAMlC,CAAC;AASF,eAAO,MAAM,oBAAoB;;;;;EAAwC,CAAC;AAC1E,eAAO,MAAM,mBAAmB;;;;;;EAK9B,CAAC;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;EAO1B,CAAC;AAgBH,eAAO,MAAM,6BAA6B;;;;;EAA4B,CAAC;AAEvE,eAAO,MAAM,2BAA2B;;;;;;;;;EAYtC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAKjC,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAC/D,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,wBAAwB,CAAC,CAAC;AACzE,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACrE,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,wBAAwB,CAAC,CAAC;AACzE,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACjE,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACrE,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACjE,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAC/D,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AACvD,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACnF,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAC/E,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { Type } from "typebox";
2
+ export const THINKING_LEVELS = ["minimal", "low", "medium", "high", "xhigh", "max"];
3
+ export const MODEL_THINKING_LEVELS = ["off", ...THINKING_LEVELS];
4
+ export const MODEL_INPUT_MODALITIES = ["text", "image"];
5
+ export const CACHE_RETENTIONS = ["none", "short", "long"];
6
+ export const MODEL_PROMPT_CACHE_RETENTIONS = ["short", "long"];
7
+ export const ThinkingLevelSchema = Type.Enum(THINKING_LEVELS);
8
+ export const ModelThinkingLevelSchema = Type.Enum(MODEL_THINKING_LEVELS);
9
+ export const ModelInputModalitySchema = Type.Enum(MODEL_INPUT_MODALITIES);
10
+ export const CacheRetentionSchema = Type.Enum(CACHE_RETENTIONS);
11
+ const ThinkingLevelMapValueSchema = Type.Union([Type.String(), Type.Null()]);
12
+ export const ThinkingLevelMapSchema = Type.Partial(Type.Record(ModelThinkingLevelSchema, ThinkingLevelMapValueSchema));
13
+ export const ModelPromptCacheSchema = Type.Partial(Type.Record(Type.Enum(MODEL_PROMPT_CACHE_RETENTIONS), Type.Number({ exclusiveMinimum: 0 })), {
14
+ description: "Best-effort prompt cache lifetime in seconds for each retention tier. A missing tier means the lifetime is unknown, so Pi does not warm it.",
15
+ });
16
+ const ModelCostRatesProperties = {
17
+ input: Type.Number({ description: "Input cost in USD per million tokens." }),
18
+ output: Type.Number({ description: "Output cost in USD per million tokens." }),
19
+ cacheRead: Type.Number({ description: "Cache-read cost in USD per million tokens." }),
20
+ cacheWrite: Type.Number({ description: "Cache-write cost in USD per million tokens." }),
21
+ };
22
+ export const ModelCostRatesSchema = Type.Object(ModelCostRatesProperties);
23
+ export const ModelCostTierSchema = Type.Object({
24
+ inputTokensAbove: Type.Number({
25
+ description: "Use this tier when total request input exceeds this token count.",
26
+ }),
27
+ ...ModelCostRatesProperties,
28
+ });
29
+ export const ModelCostSchema = Type.Object({
30
+ ...ModelCostRatesProperties,
31
+ tiers: Type.Optional(Type.Array(ModelCostTierSchema, {
32
+ description: "Request-wide pricing tiers. The highest matching input threshold applies to the full request.",
33
+ })),
34
+ });
35
+ function modelImageResizeOptions(options) {
36
+ return Type.Object({
37
+ maxWidth: Type.Optional(Type.Integer({ minimum: 1 })),
38
+ maxHeight: Type.Optional(Type.Integer({ minimum: 1 })),
39
+ maxBytes: Type.Optional(Type.Integer({ minimum: 1, description: "Maximum base64-encoded payload size in bytes." })),
40
+ jpegQuality: Type.Optional(Type.Integer({ minimum: 1, maximum: 100 })),
41
+ }, options);
42
+ }
43
+ export const ModelImageResizeOptionsSchema = modelImageResizeOptions();
44
+ export const ModelImageInputLimitsSchema = Type.Object({
45
+ resize: Type.Optional(modelImageResizeOptions({
46
+ description: "Cache-safe resize profile applied before a new image enters conversation history.",
47
+ })),
48
+ maxPerMessage: Type.Optional(Type.Integer({ minimum: 1, description: "Maximum images accepted in one provider message." })),
49
+ maxPerRequest: Type.Optional(Type.Integer({ minimum: 1, description: "Maximum images accepted across one provider request." })),
50
+ });
51
+ export const ModelInputLimitsSchema = Type.Object({
52
+ maxRequestBytes: Type.Optional(Type.Integer({ minimum: 1, description: "Maximum serialized provider request size in bytes." })),
53
+ images: Type.Optional(ModelImageInputLimitsSchema),
54
+ });
55
+ //# sourceMappingURL=model-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-schema.js","sourceRoot":"","sources":["../../src/providers/model-schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, type TSchemaOptions, Type } from \"typebox\";\n\nexport const THINKING_LEVELS = [\"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\nexport const MODEL_THINKING_LEVELS = [\"off\", ...THINKING_LEVELS] as const;\nexport const MODEL_INPUT_MODALITIES = [\"text\", \"image\"] as const;\nexport const CACHE_RETENTIONS = [\"none\", \"short\", \"long\"] as const;\nexport const MODEL_PROMPT_CACHE_RETENTIONS = [\"short\", \"long\"] as const;\n\nexport const ThinkingLevelSchema = Type.Enum(THINKING_LEVELS);\nexport const ModelThinkingLevelSchema = Type.Enum(MODEL_THINKING_LEVELS);\nexport const ModelInputModalitySchema = Type.Enum(MODEL_INPUT_MODALITIES);\nexport const CacheRetentionSchema = Type.Enum(CACHE_RETENTIONS);\n\nconst ThinkingLevelMapValueSchema = Type.Union([Type.String(), Type.Null()]);\nexport const ThinkingLevelMapSchema = Type.Partial(Type.Record(ModelThinkingLevelSchema, ThinkingLevelMapValueSchema));\n\nexport const ModelPromptCacheSchema = Type.Partial(\n\tType.Record(Type.Enum(MODEL_PROMPT_CACHE_RETENTIONS), Type.Number({ exclusiveMinimum: 0 })),\n\t{\n\t\tdescription:\n\t\t\t\"Best-effort prompt cache lifetime in seconds for each retention tier. A missing tier means the lifetime is unknown, so Pi does not warm it.\",\n\t},\n);\n\nconst ModelCostRatesProperties = {\n\tinput: Type.Number({ description: \"Input cost in USD per million tokens.\" }),\n\toutput: Type.Number({ description: \"Output cost in USD per million tokens.\" }),\n\tcacheRead: Type.Number({ description: \"Cache-read cost in USD per million tokens.\" }),\n\tcacheWrite: Type.Number({ description: \"Cache-write cost in USD per million tokens.\" }),\n};\n\nexport const ModelCostRatesSchema = Type.Object(ModelCostRatesProperties);\nexport const ModelCostTierSchema = Type.Object({\n\tinputTokensAbove: Type.Number({\n\t\tdescription: \"Use this tier when total request input exceeds this token count.\",\n\t}),\n\t...ModelCostRatesProperties,\n});\nexport const ModelCostSchema = Type.Object({\n\t...ModelCostRatesProperties,\n\ttiers: Type.Optional(\n\t\tType.Array(ModelCostTierSchema, {\n\t\t\tdescription: \"Request-wide pricing tiers. The highest matching input threshold applies to the full request.\",\n\t\t}),\n\t),\n});\n\nfunction modelImageResizeOptions(options?: TSchemaOptions) {\n\treturn Type.Object(\n\t\t{\n\t\t\tmaxWidth: Type.Optional(Type.Integer({ minimum: 1 })),\n\t\t\tmaxHeight: Type.Optional(Type.Integer({ minimum: 1 })),\n\t\t\tmaxBytes: Type.Optional(\n\t\t\t\tType.Integer({ minimum: 1, description: \"Maximum base64-encoded payload size in bytes.\" }),\n\t\t\t),\n\t\t\tjpegQuality: Type.Optional(Type.Integer({ minimum: 1, maximum: 100 })),\n\t\t},\n\t\toptions,\n\t);\n}\n\nexport const ModelImageResizeOptionsSchema = modelImageResizeOptions();\n\nexport const ModelImageInputLimitsSchema = Type.Object({\n\tresize: Type.Optional(\n\t\tmodelImageResizeOptions({\n\t\t\tdescription: \"Cache-safe resize profile applied before a new image enters conversation history.\",\n\t\t}),\n\t),\n\tmaxPerMessage: Type.Optional(\n\t\tType.Integer({ minimum: 1, description: \"Maximum images accepted in one provider message.\" }),\n\t),\n\tmaxPerRequest: Type.Optional(\n\t\tType.Integer({ minimum: 1, description: \"Maximum images accepted across one provider request.\" }),\n\t),\n});\n\nexport const ModelInputLimitsSchema = Type.Object({\n\tmaxRequestBytes: Type.Optional(\n\t\tType.Integer({ minimum: 1, description: \"Maximum serialized provider request size in bytes.\" }),\n\t),\n\timages: Type.Optional(ModelImageInputLimitsSchema),\n});\n\nexport type ThinkingLevel = Static<typeof ThinkingLevelSchema>;\nexport type ModelThinkingLevel = Static<typeof ModelThinkingLevelSchema>;\nexport type ThinkingLevelMap = Static<typeof ThinkingLevelMapSchema>;\nexport type ModelInputModality = Static<typeof ModelInputModalitySchema>;\nexport type CacheRetention = Static<typeof CacheRetentionSchema>;\nexport type ModelPromptCache = Static<typeof ModelPromptCacheSchema>;\nexport type ModelCostRates = Static<typeof ModelCostRatesSchema>;\nexport type ModelCostTier = Static<typeof ModelCostTierSchema>;\nexport type ModelCost = Static<typeof ModelCostSchema>;\nexport type ModelImageResizeOptions = Static<typeof ModelImageResizeOptionsSchema>;\nexport type ModelImageInputLimits = Static<typeof ModelImageInputLimitsSchema>;\nexport type ModelInputLimits = Static<typeof ModelInputLimitsSchema>;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG7D,wBAAgB,cAAc,IAAI,QAAQ,CAAC,kBAAkB,CAAC,CAiB7D"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAIA,OAAO,EAA+B,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAI1E,wBAAgB,cAAc,IAAI,QAAQ,CAAC,kBAAkB,CAAC,CA0B7D"}
@@ -1,8 +1,9 @@
1
+ import { openAIDecisionsApi } from "../api/openai-decisions.lazy.js";
1
2
  import { openAIResponsesApi } from "../api/openai-responses.lazy.js";
2
3
  import { envApiKeyAuth, lazyOAuth } from "../auth/helpers.js";
3
4
  import { loadOpenAIChatGPTOAuth } from "../auth/oauth/load.js";
4
- import { createProvider } from "../models.js";
5
- import { OPENAI_MODELS } from "./openai.models.js";
5
+ import { createProvider, isModelType } from "../models.js";
6
+ import { OPENAI_CLASSIFIER_MODELS, OPENAI_MODELS } from "./openai.models.js";
6
7
  export function openaiProvider() {
7
8
  return createProvider({
8
9
  id: "openai",
@@ -17,8 +18,16 @@ export function openaiProvider() {
17
18
  load: loadOpenAIChatGPTOAuth,
18
19
  }),
19
20
  },
20
- models: Object.values(OPENAI_MODELS),
21
+ models: [
22
+ ...Object.values(OPENAI_MODELS),
23
+ ...Object.values(OPENAI_CLASSIFIER_MODELS),
24
+ ],
25
+ // Sign in with ChatGPT tokens only reach the Responses API; the Decisions API rejects them.
26
+ filterAllModels: (models, credential) => credential?.type === "oauth" ? models.filter((model) => !isModelType(model, "classifier")) : models,
21
27
  api: openAIResponsesApi(),
28
+ classifiers: {
29
+ "openai-decisions": openAIDecisionsApi(),
30
+ },
22
31
  });
23
32
  }
24
33
  //# sourceMappingURL=openai.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAiB,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,UAAU,cAAc;IAC7B,OAAO,cAAc,CAAC;QACrB,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,2BAA2B;QACpC,IAAI,EAAE;YACL,MAAM,EAAE,aAAa,CAAC,gBAAgB,EAAE,CAAC,gBAAgB,CAAC,CAAC;YAC3D,KAAK,EAAE,SAAS,CAAC;gBAChB,IAAI,EAAE,+BAA+B;gBACrC,cAAc,EAAE,IAAI;gBACpB,UAAU,EAAE,sBAAsB;gBAClC,IAAI,EAAE,sBAAsB;aAC5B,CAAC;SACF;QACD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;QACpC,GAAG,EAAE,kBAAkB,EAAE;KACzB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { openAIResponsesApi } from \"../api/openai-responses.lazy.ts\";\nimport { envApiKeyAuth, lazyOAuth } from \"../auth/helpers.ts\";\nimport { loadOpenAIChatGPTOAuth } from \"../auth/oauth/load.ts\";\nimport { createProvider, type Provider } from \"../models.ts\";\nimport { OPENAI_MODELS } from \"./openai.models.ts\";\n\nexport function openaiProvider(): Provider<\"openai-responses\"> {\n\treturn createProvider({\n\t\tid: \"openai\",\n\t\tname: \"OpenAI\",\n\t\tbaseUrl: \"https://api.openai.com/v1\",\n\t\tauth: {\n\t\t\tapiKey: envApiKeyAuth(\"OpenAI API key\", [\"OPENAI_API_KEY\"]),\n\t\t\toauth: lazyOAuth({\n\t\t\t\tname: \"OpenAI (ChatGPT subscription)\",\n\t\t\t\tisSubscription: true,\n\t\t\t\tloginLabel: \"Sign in with ChatGPT\",\n\t\t\t\tload: loadOpenAIChatGPTOAuth,\n\t\t\t}),\n\t\t},\n\t\tmodels: Object.values(OPENAI_MODELS),\n\t\tapi: openAIResponsesApi(),\n\t});\n}\n"]}
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAiB,MAAM,cAAc,CAAC;AAE1E,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,UAAU,cAAc;IAC7B,OAAO,cAAc,CAAqB;QACzC,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,2BAA2B;QACpC,IAAI,EAAE;YACL,MAAM,EAAE,aAAa,CAAC,gBAAgB,EAAE,CAAC,gBAAgB,CAAC,CAAC;YAC3D,KAAK,EAAE,SAAS,CAAC;gBAChB,IAAI,EAAE,+BAA+B;gBACrC,cAAc,EAAE,IAAI;gBACpB,UAAU,EAAE,sBAAsB;gBAClC,IAAI,EAAE,sBAAsB;aAC5B,CAAC;SACF;QACD,MAAM,EAAE;YACP,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;YAC/B,GAAG,MAAM,CAAC,MAAM,CAAsC,wBAAwB,CAAC;SAC/E;QACD,4FAA4F;QAC5F,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CACvC,UAAU,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;QACpG,GAAG,EAAE,kBAAkB,EAAE;QACzB,WAAW,EAAE;YACZ,kBAAkB,EAAE,kBAAkB,EAAE;SACxC;KACD,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { openAIDecisionsApi } from \"../api/openai-decisions.lazy.ts\";\nimport { openAIResponsesApi } from \"../api/openai-responses.lazy.ts\";\nimport { envApiKeyAuth, lazyOAuth } from \"../auth/helpers.ts\";\nimport { loadOpenAIChatGPTOAuth } from \"../auth/oauth/load.ts\";\nimport { createProvider, isModelType, type Provider } from \"../models.ts\";\nimport type { ClassifierModel } from \"../types.ts\";\nimport { OPENAI_CLASSIFIER_MODELS, OPENAI_MODELS } from \"./openai.models.ts\";\n\nexport function openaiProvider(): Provider<\"openai-responses\"> {\n\treturn createProvider<\"openai-responses\">({\n\t\tid: \"openai\",\n\t\tname: \"OpenAI\",\n\t\tbaseUrl: \"https://api.openai.com/v1\",\n\t\tauth: {\n\t\t\tapiKey: envApiKeyAuth(\"OpenAI API key\", [\"OPENAI_API_KEY\"]),\n\t\t\toauth: lazyOAuth({\n\t\t\t\tname: \"OpenAI (ChatGPT subscription)\",\n\t\t\t\tisSubscription: true,\n\t\t\t\tloginLabel: \"Sign in with ChatGPT\",\n\t\t\t\tload: loadOpenAIChatGPTOAuth,\n\t\t\t}),\n\t\t},\n\t\tmodels: [\n\t\t\t...Object.values(OPENAI_MODELS),\n\t\t\t...Object.values<ClassifierModel<\"openai-decisions\">>(OPENAI_CLASSIFIER_MODELS),\n\t\t],\n\t\t// Sign in with ChatGPT tokens only reach the Responses API; the Decisions API rejects them.\n\t\tfilterAllModels: (models, credential) =>\n\t\t\tcredential?.type === \"oauth\" ? models.filter((model) => !isModelType(model, \"classifier\")) : models,\n\t\tapi: openAIResponsesApi(),\n\t\tclassifiers: {\n\t\t\t\"openai-decisions\": openAIDecisionsApi(),\n\t\t},\n\t});\n}\n"]}
@@ -0,0 +1,40 @@
1
+ import type { ModelCost } from "../types.ts";
2
+ /** OpenRouter's per-token prices, as decimal strings. */
3
+ export interface OpenRouterPricing {
4
+ prompt?: string;
5
+ completion?: string;
6
+ input_cache_read?: string;
7
+ input_cache_write?: string;
8
+ overrides?: OpenRouterPricingOverride[];
9
+ }
10
+ /**
11
+ * A conditional price. `min_prompt_tokens` selects prompt-length pricing; `utc_*` fields select
12
+ * time-of-day or weekday pricing. Missing rates keep the base price.
13
+ */
14
+ export interface OpenRouterPricingOverride {
15
+ min_prompt_tokens?: number;
16
+ utc_start?: number;
17
+ utc_end?: number;
18
+ utc_days?: string[];
19
+ prompt?: string;
20
+ completion?: string;
21
+ input_cache_read?: string;
22
+ input_cache_write?: string;
23
+ }
24
+ /** The fields pi reads from a model in OpenRouter's `GET /models` and `GET /models/user`. */
25
+ export interface OpenRouterModel {
26
+ id: string;
27
+ context_length?: number | null;
28
+ top_provider?: {
29
+ context_length?: number | null;
30
+ max_completion_tokens?: number | null;
31
+ };
32
+ pricing?: OpenRouterPricing;
33
+ }
34
+ /**
35
+ * Convert OpenRouter's $/token prices to pi's $/1M tokens. Missing, invalid and negative base
36
+ * prices are 0. Prompt-length overrides become request-wide tiers; a rate a tier does not list
37
+ * keeps the base price. Time-of-day overrides are skipped because ModelCost cannot express them.
38
+ */
39
+ export declare function openRouterCost(pricing: OpenRouterPricing | undefined): ModelCost;
40
+ //# sourceMappingURL=openrouter-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter-api.d.ts","sourceRoot":"","sources":["../../src/providers/openrouter-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,aAAa,CAAC;AAE5D,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,yBAAyB,EAAE,CAAC;CACxC;AAED;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,6FAA6F;AAC7F,MAAM,WAAW,eAAe;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,YAAY,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzF,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAYD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,SAAS,CA2BhF"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Convert one $/token price to $/1M tokens. 0 means free. Missing, invalid and negative prices use
3
+ * the fallback: OpenRouter reports -1 for router models such as `openrouter/auto`, whose price
4
+ * depends on the model they pick.
5
+ */
6
+ function perMillion(value, fallback) {
7
+ const perToken = Number.parseFloat(value ?? "");
8
+ return perToken >= 0 ? Number((perToken * 1_000_000).toFixed(6)) : fallback;
9
+ }
10
+ /**
11
+ * Convert OpenRouter's $/token prices to pi's $/1M tokens. Missing, invalid and negative base
12
+ * prices are 0. Prompt-length overrides become request-wide tiers; a rate a tier does not list
13
+ * keeps the base price. Time-of-day overrides are skipped because ModelCost cannot express them.
14
+ */
15
+ export function openRouterCost(pricing) {
16
+ const base = {
17
+ input: perMillion(pricing?.prompt, 0),
18
+ output: perMillion(pricing?.completion, 0),
19
+ cacheRead: perMillion(pricing?.input_cache_read, 0),
20
+ cacheWrite: perMillion(pricing?.input_cache_write, 0),
21
+ };
22
+ const tiers = (pricing?.overrides ?? []).flatMap((override) => {
23
+ if (override.min_prompt_tokens === undefined ||
24
+ override.utc_start !== undefined ||
25
+ override.utc_end !== undefined ||
26
+ override.utc_days !== undefined) {
27
+ return [];
28
+ }
29
+ return [
30
+ {
31
+ inputTokensAbove: override.min_prompt_tokens,
32
+ input: perMillion(override.prompt, base.input),
33
+ output: perMillion(override.completion, base.output),
34
+ cacheRead: perMillion(override.input_cache_read, base.cacheRead),
35
+ cacheWrite: perMillion(override.input_cache_write, base.cacheWrite),
36
+ },
37
+ ];
38
+ });
39
+ return tiers.length > 0 ? { ...base, tiers } : base;
40
+ }
41
+ //# sourceMappingURL=openrouter-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter-api.js","sourceRoot":"","sources":["../../src/providers/openrouter-api.ts"],"names":[],"mappings":"AAkCA;;;;GAIG;AACH,SAAS,UAAU,CAAC,KAAyB,EAAE,QAAgB;IAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAChD,OAAO,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAsC;IACpE,MAAM,IAAI,GAAG;QACZ,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAC1C,SAAS,EAAE,UAAU,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACnD,UAAU,EAAE,UAAU,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;KACrD,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAmB,EAAE;QAC9E,IACC,QAAQ,CAAC,iBAAiB,KAAK,SAAS;YACxC,QAAQ,CAAC,SAAS,KAAK,SAAS;YAChC,QAAQ,CAAC,OAAO,KAAK,SAAS;YAC9B,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAC9B,CAAC;YACF,OAAO,EAAE,CAAC;QACX,CAAC;QACD,OAAO;YACN;gBACC,gBAAgB,EAAE,QAAQ,CAAC,iBAAiB;gBAC5C,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;gBAC9C,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;gBACpD,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC;gBAChE,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC;aACnE;SACD,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC","sourcesContent":["import type { ModelCost, ModelCostTier } from \"../types.ts\";\n\n/** OpenRouter's per-token prices, as decimal strings. */\nexport interface OpenRouterPricing {\n\tprompt?: string;\n\tcompletion?: string;\n\tinput_cache_read?: string;\n\tinput_cache_write?: string;\n\toverrides?: OpenRouterPricingOverride[];\n}\n\n/**\n * A conditional price. `min_prompt_tokens` selects prompt-length pricing; `utc_*` fields select\n * time-of-day or weekday pricing. Missing rates keep the base price.\n */\nexport interface OpenRouterPricingOverride {\n\tmin_prompt_tokens?: number;\n\tutc_start?: number;\n\tutc_end?: number;\n\tutc_days?: string[];\n\tprompt?: string;\n\tcompletion?: string;\n\tinput_cache_read?: string;\n\tinput_cache_write?: string;\n}\n\n/** The fields pi reads from a model in OpenRouter's `GET /models` and `GET /models/user`. */\nexport interface OpenRouterModel {\n\tid: string;\n\tcontext_length?: number | null;\n\ttop_provider?: { context_length?: number | null; max_completion_tokens?: number | null };\n\tpricing?: OpenRouterPricing;\n}\n\n/**\n * Convert one $/token price to $/1M tokens. 0 means free. Missing, invalid and negative prices use\n * the fallback: OpenRouter reports -1 for router models such as `openrouter/auto`, whose price\n * depends on the model they pick.\n */\nfunction perMillion(value: string | undefined, fallback: number): number {\n\tconst perToken = Number.parseFloat(value ?? \"\");\n\treturn perToken >= 0 ? Number((perToken * 1_000_000).toFixed(6)) : fallback;\n}\n\n/**\n * Convert OpenRouter's $/token prices to pi's $/1M tokens. Missing, invalid and negative base\n * prices are 0. Prompt-length overrides become request-wide tiers; a rate a tier does not list\n * keeps the base price. Time-of-day overrides are skipped because ModelCost cannot express them.\n */\nexport function openRouterCost(pricing: OpenRouterPricing | undefined): ModelCost {\n\tconst base = {\n\t\tinput: perMillion(pricing?.prompt, 0),\n\t\toutput: perMillion(pricing?.completion, 0),\n\t\tcacheRead: perMillion(pricing?.input_cache_read, 0),\n\t\tcacheWrite: perMillion(pricing?.input_cache_write, 0),\n\t};\n\tconst tiers = (pricing?.overrides ?? []).flatMap((override): ModelCostTier[] => {\n\t\tif (\n\t\t\toverride.min_prompt_tokens === undefined ||\n\t\t\toverride.utc_start !== undefined ||\n\t\t\toverride.utc_end !== undefined ||\n\t\t\toverride.utc_days !== undefined\n\t\t) {\n\t\t\treturn [];\n\t\t}\n\t\treturn [\n\t\t\t{\n\t\t\t\tinputTokensAbove: override.min_prompt_tokens,\n\t\t\t\tinput: perMillion(override.prompt, base.input),\n\t\t\t\toutput: perMillion(override.completion, base.output),\n\t\t\t\tcacheRead: perMillion(override.input_cache_read, base.cacheRead),\n\t\t\t\tcacheWrite: perMillion(override.input_cache_write, base.cacheWrite),\n\t\t\t},\n\t\t];\n\t});\n\treturn tiers.length > 0 ? { ...base, tiers } : base;\n}\n"]}