pi2dsh 0.7.0 → 0.9.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.
- package/README.md +5 -2
- package/README.zh.md +4 -2
- package/dist/analyzer-C86ba-27.mjs +626 -0
- package/dist/analyzer-C86ba-27.mjs.map +1 -0
- package/dist/cli.mjs +3 -1
- package/dist/cli.mjs.map +1 -1
- package/dist/compat/pi-ai.d.mts +1 -11
- package/dist/compat/pi-ai.d.mts.map +1 -1
- package/dist/compat/pi-ai.mjs +2 -2
- package/dist/credentials-oauth.mjs +1 -1
- package/dist/generator-C0jNM-yu.mjs +298 -0
- package/dist/generator-C0jNM-yu.mjs.map +1 -0
- package/dist/host.d.mts +2 -0
- package/dist/host.d.mts.map +1 -1
- package/dist/host.mjs +2 -1
- package/dist/host.mjs.map +1 -1
- package/dist/index.d.mts +29 -10
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +27 -4
- package/dist/index.mjs.map +1 -1
- package/dist/mcp-config-Dlou-ZA-.mjs +707 -0
- package/dist/mcp-config-Dlou-ZA-.mjs.map +1 -0
- package/dist/{pi-ai-B4hucafU.mjs → pi-ai-BA3h0Dwv.mjs} +2 -84
- package/dist/pi-ai-BA3h0Dwv.mjs.map +1 -0
- package/dist/{runtime-k3IlCgjQ.mjs → runtime-DMEJknhK.mjs} +115 -960
- package/dist/runtime-DMEJknhK.mjs.map +1 -0
- package/dist/runtime.d.mts +19 -6
- package/dist/runtime.d.mts.map +1 -1
- package/dist/runtime.mjs +2 -2
- package/package.json +6 -3
- package/dist/all-BChhwMVE.mjs +0 -28512
- package/dist/all-BChhwMVE.mjs.map +0 -1
- package/dist/anthropic-messages-Dlw4T0S4.mjs +0 -6438
- package/dist/anthropic-messages-Dlw4T0S4.mjs.map +0 -1
- package/dist/azure-openai-responses-vGUNukZ7.mjs +0 -209
- package/dist/azure-openai-responses-vGUNukZ7.mjs.map +0 -1
- package/dist/deferred-tools-BD4g5QUx.mjs +0 -32
- package/dist/deferred-tools-BD4g5QUx.mjs.map +0 -1
- package/dist/diagnostics-CJye1UFh.mjs +0 -99
- package/dist/diagnostics-CJye1UFh.mjs.map +0 -1
- package/dist/dist-DY2GeEQ6.mjs +0 -1089
- package/dist/dist-DY2GeEQ6.mjs.map +0 -1
- package/dist/dist-DYfTHu0C.mjs +0 -1246
- package/dist/dist-DYfTHu0C.mjs.map +0 -1
- package/dist/error-body-DKA3lknR.mjs +0 -104
- package/dist/error-body-DKA3lknR.mjs.map +0 -1
- package/dist/github-copilot-headers-CZo2QHrt.mjs +0 -25
- package/dist/github-copilot-headers-CZo2QHrt.mjs.map +0 -1
- package/dist/google-generative-ai-C30gRjRi.mjs +0 -358
- package/dist/google-generative-ai-C30gRjRi.mjs.map +0 -1
- package/dist/google-shared-W8g3Esep.mjs +0 -29042
- package/dist/google-shared-W8g3Esep.mjs.map +0 -1
- package/dist/google-vertex--O_gyVYA.mjs +0 -402
- package/dist/google-vertex--O_gyVYA.mjs.map +0 -1
- package/dist/hash-Dbggamac.mjs +0 -19
- package/dist/hash-Dbggamac.mjs.map +0 -1
- package/dist/headers-CPzZhJQn.mjs +0 -17
- package/dist/headers-CPzZhJQn.mjs.map +0 -1
- package/dist/images-models-DJtHo9Rp.mjs +0 -1068
- package/dist/images-models-DJtHo9Rp.mjs.map +0 -1
- package/dist/json-parse-C-vG4_qc.mjs +0 -384
- package/dist/json-parse-C-vG4_qc.mjs.map +0 -1
- package/dist/mcp-config-Cful6uUS.mjs +0 -1618
- package/dist/mcp-config-Cful6uUS.mjs.map +0 -1
- package/dist/mistral-conversations-LSDG9sjq.mjs +0 -42007
- package/dist/mistral-conversations-LSDG9sjq.mjs.map +0 -1
- package/dist/multipart-parser-CoM3rwav.mjs +0 -301
- package/dist/multipart-parser-CoM3rwav.mjs.map +0 -1
- package/dist/openai-codex-responses-JxII_OUX.mjs +0 -1169
- package/dist/openai-codex-responses-JxII_OUX.mjs.map +0 -1
- package/dist/openai-completions-Dp-VwLzJ.mjs +0 -947
- package/dist/openai-completions-Dp-VwLzJ.mjs.map +0 -1
- package/dist/openai-completions-lite-BrM7gJzs.mjs +0 -316
- package/dist/openai-completions-lite-BrM7gJzs.mjs.map +0 -1
- package/dist/openai-prompt-cache-BDWtZRKh.mjs +0 -11
- package/dist/openai-prompt-cache-BDWtZRKh.mjs.map +0 -1
- package/dist/openai-responses-CWmNks8K.mjs +0 -247
- package/dist/openai-responses-CWmNks8K.mjs.map +0 -1
- package/dist/openai-responses-shared-CYgIDTf3.mjs +0 -572
- package/dist/openai-responses-shared-CYgIDTf3.mjs.map +0 -1
- package/dist/openrouter-images-DfAULV7l.mjs +0 -127
- package/dist/openrouter-images-DfAULV7l.mjs.map +0 -1
- package/dist/otel-Boafyju5.mjs +0 -24935
- package/dist/otel-Boafyju5.mjs.map +0 -1
- package/dist/pi-ai-B4hucafU.mjs.map +0 -1
- package/dist/pi-messages-HzGtvc5_.mjs +0 -306
- package/dist/pi-messages-HzGtvc5_.mjs.map +0 -1
- package/dist/provider-env-C9gOBFJi.mjs +0 -40
- package/dist/provider-env-C9gOBFJi.mjs.map +0 -1
- package/dist/provider-retry-Cw6YJ4cr.mjs +0 -80
- package/dist/provider-retry-Cw6YJ4cr.mjs.map +0 -1
- package/dist/runtime-k3IlCgjQ.mjs.map +0 -1
- package/dist/sanitize-unicode-wLA11KvZ.mjs +0 -29
- package/dist/sanitize-unicode-wLA11KvZ.mjs.map +0 -1
- package/dist/src-D0GRWCE8.mjs +0 -5031
- package/dist/src-D0GRWCE8.mjs.map +0 -1
- package/dist/transform-messages-DGq9mvhA.mjs +0 -379
- package/dist/transform-messages-DGq9mvhA.mjs.map +0 -1
- package/dist/uuid-DtFT7tOE.mjs +0 -65
- package/dist/uuid-DtFT7tOE.mjs.map +0 -1
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { a as AssistantMessageEventStream } from "./diagnostics-CJye1UFh.mjs";
|
|
3
|
-
import { o as clampThinkingLevel } from "./images-models-DJtHo9Rp.mjs";
|
|
4
|
-
import { t as splitDeferredTools } from "./deferred-tools-BD4g5QUx.mjs";
|
|
5
|
-
import { t as headersToRecord } from "./headers-CPzZhJQn.mjs";
|
|
6
|
-
import { t as getProviderEnvValue } from "./provider-env-C9gOBFJi.mjs";
|
|
7
|
-
import { t as retryProviderRequest } from "./provider-retry-Cw6YJ4cr.mjs";
|
|
8
|
-
import { c as createGrammarToolInputProperties, i as buildBaseOptions } from "./transform-messages-DGq9mvhA.mjs";
|
|
9
|
-
import { n as hasCopilotVisionInput, t as buildCopilotDynamicHeaders } from "./github-copilot-headers-CZo2QHrt.mjs";
|
|
10
|
-
import { n as normalizeProviderError, t as formatProviderError } from "./error-body-DKA3lknR.mjs";
|
|
11
|
-
import { t as clampOpenAIPromptCacheKey } from "./openai-prompt-cache-BDWtZRKh.mjs";
|
|
12
|
-
import { n as convertResponsesTools, r as processResponsesStream, t as convertResponsesMessages } from "./openai-responses-shared-CYgIDTf3.mjs";
|
|
13
|
-
import OpenAI from "openai";
|
|
14
|
-
//#region node_modules/.pnpm/@earendil-works+pi-ai@0.84.1_ws@8.21.3_zod@4.4.3/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js
|
|
15
|
-
const OPENAI_TOOL_CALL_PROVIDERS = /* @__PURE__ */ new Set([
|
|
16
|
-
"openai",
|
|
17
|
-
"openai-codex",
|
|
18
|
-
"opencode"
|
|
19
|
-
]);
|
|
20
|
-
const OPENAI_RESPONSES_MIN_OUTPUT_TOKENS = 16;
|
|
21
|
-
function hasHeader(headers, name) {
|
|
22
|
-
if (!headers) return false;
|
|
23
|
-
const expected = name.toLowerCase();
|
|
24
|
-
for (const [key, value] of Object.entries(headers)) if (key.toLowerCase() === expected && value !== null && value.trim().length > 0) return true;
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
function getClientApiKey(provider, apiKey, headers) {
|
|
28
|
-
if (apiKey) return apiKey;
|
|
29
|
-
if (hasHeader(headers, "authorization") || hasHeader(headers, "cf-aig-authorization")) return "unused";
|
|
30
|
-
throw new Error(`No API key for provider: ${provider}`);
|
|
31
|
-
}
|
|
32
|
-
function detectSessionAffinityFormat(model) {
|
|
33
|
-
return model.provider === "openrouter" || model.baseUrl.includes("openrouter.ai") ? "openrouter" : "openai";
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Resolve cache retention preference.
|
|
37
|
-
* Defaults to "short" and uses PI_CACHE_RETENTION for backward compatibility.
|
|
38
|
-
*/
|
|
39
|
-
function resolveCacheRetention(cacheRetention, env) {
|
|
40
|
-
if (cacheRetention) return cacheRetention;
|
|
41
|
-
if (getProviderEnvValue("PI_CACHE_RETENTION", env) === "long") return "long";
|
|
42
|
-
return "short";
|
|
43
|
-
}
|
|
44
|
-
function getCompat(model) {
|
|
45
|
-
return {
|
|
46
|
-
supportsDeveloperRole: model.compat?.supportsDeveloperRole ?? true,
|
|
47
|
-
sessionAffinityFormat: model.compat?.sessionAffinityFormat ?? detectSessionAffinityFormat(model),
|
|
48
|
-
supportsLongCacheRetention: model.compat?.supportsLongCacheRetention ?? true,
|
|
49
|
-
supportsStrictMode: model.compat?.supportsStrictMode ?? false,
|
|
50
|
-
supportsOpenAIGrammarTools: model.compat?.supportsOpenAIGrammarTools ?? false,
|
|
51
|
-
supportsToolSearch: model.compat?.supportsToolSearch ?? false,
|
|
52
|
-
supportsExplicitPromptCacheMode: model.compat?.supportsExplicitPromptCacheMode ?? false
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
function getPromptCacheRetention(compat, cacheRetention) {
|
|
56
|
-
return cacheRetention === "long" && compat.supportsLongCacheRetention ? "24h" : void 0;
|
|
57
|
-
}
|
|
58
|
-
function formatOpenAIResponsesError(error) {
|
|
59
|
-
return formatProviderError(normalizeProviderError(error), "OpenAI API error");
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Generate function for OpenAI Responses API
|
|
63
|
-
*/
|
|
64
|
-
const stream = (model, context, options) => {
|
|
65
|
-
const stream = new AssistantMessageEventStream();
|
|
66
|
-
(async () => {
|
|
67
|
-
const output = {
|
|
68
|
-
role: "assistant",
|
|
69
|
-
content: [],
|
|
70
|
-
api: model.api,
|
|
71
|
-
provider: model.provider,
|
|
72
|
-
model: model.id,
|
|
73
|
-
usage: {
|
|
74
|
-
input: 0,
|
|
75
|
-
output: 0,
|
|
76
|
-
cacheRead: 0,
|
|
77
|
-
cacheWrite: 0,
|
|
78
|
-
totalTokens: 0,
|
|
79
|
-
cost: {
|
|
80
|
-
input: 0,
|
|
81
|
-
output: 0,
|
|
82
|
-
cacheRead: 0,
|
|
83
|
-
cacheWrite: 0,
|
|
84
|
-
total: 0
|
|
85
|
-
}
|
|
86
|
-
},
|
|
87
|
-
stopReason: "pending",
|
|
88
|
-
timestamp: Date.now()
|
|
89
|
-
};
|
|
90
|
-
try {
|
|
91
|
-
const apiKey = getClientApiKey(model.provider, options?.apiKey, options?.headers);
|
|
92
|
-
const cacheSessionId = resolveCacheRetention(options?.cacheRetention, options?.env) === "none" ? void 0 : options?.sessionId;
|
|
93
|
-
const compat = getCompat(model);
|
|
94
|
-
const grammarToolInputProperties = createGrammarToolInputProperties(context.tools, compat.supportsOpenAIGrammarTools);
|
|
95
|
-
const client = createClient(model, context, apiKey, options?.headers, options?.fetch, cacheSessionId);
|
|
96
|
-
let params = buildParams(model, context, options, compat, grammarToolInputProperties);
|
|
97
|
-
const nextParams = await options?.onPayload?.(params, model);
|
|
98
|
-
if (nextParams !== void 0) params = nextParams;
|
|
99
|
-
const requestOptions = {
|
|
100
|
-
...options?.signal ? { signal: options.signal } : {},
|
|
101
|
-
...options?.timeoutMs !== void 0 ? { timeout: options.timeoutMs } : {},
|
|
102
|
-
maxRetries: 0
|
|
103
|
-
};
|
|
104
|
-
const { data: openaiStream, response } = await retryProviderRequest(() => client.responses.create(params, requestOptions).withResponse(), {
|
|
105
|
-
maxRetries: options?.maxRetries,
|
|
106
|
-
maxRetryDelayMs: options?.maxRetryDelayMs,
|
|
107
|
-
signal: options?.signal
|
|
108
|
-
});
|
|
109
|
-
await options?.onResponse?.({
|
|
110
|
-
status: response.status,
|
|
111
|
-
headers: headersToRecord(response.headers)
|
|
112
|
-
}, model);
|
|
113
|
-
stream.push({
|
|
114
|
-
type: "start",
|
|
115
|
-
partial: output
|
|
116
|
-
});
|
|
117
|
-
await processResponsesStream(openaiStream, output, stream, model, {
|
|
118
|
-
serviceTier: options?.serviceTier,
|
|
119
|
-
grammarToolInputProperties,
|
|
120
|
-
applyServiceTierPricing: (usage, serviceTier) => applyServiceTierPricing(usage, serviceTier, model)
|
|
121
|
-
});
|
|
122
|
-
if (options?.signal?.aborted) throw new Error("Request was aborted");
|
|
123
|
-
if (output.stopReason === "pending") throw new Error("OpenAI Responses stream ended without a stop reason");
|
|
124
|
-
if (output.stopReason === "aborted" || output.stopReason === "error") throw new Error(output.errorMessage || "An unknown error occurred");
|
|
125
|
-
stream.push({
|
|
126
|
-
type: "done",
|
|
127
|
-
reason: output.stopReason,
|
|
128
|
-
message: output
|
|
129
|
-
});
|
|
130
|
-
stream.end();
|
|
131
|
-
} catch (error) {
|
|
132
|
-
for (const block of output.content) {
|
|
133
|
-
delete block.index;
|
|
134
|
-
delete block.partialJson;
|
|
135
|
-
delete block.customInput;
|
|
136
|
-
}
|
|
137
|
-
output.stopReason = options?.signal?.aborted ? "aborted" : "error";
|
|
138
|
-
output.errorMessage = formatOpenAIResponsesError(error);
|
|
139
|
-
stream.push({
|
|
140
|
-
type: "error",
|
|
141
|
-
reason: output.stopReason,
|
|
142
|
-
error: output
|
|
143
|
-
});
|
|
144
|
-
stream.end();
|
|
145
|
-
}
|
|
146
|
-
})();
|
|
147
|
-
return stream;
|
|
148
|
-
};
|
|
149
|
-
const streamSimple = (model, context, options) => {
|
|
150
|
-
getClientApiKey(model.provider, options?.apiKey, options?.headers);
|
|
151
|
-
const base = buildBaseOptions(model, context, options, options?.apiKey);
|
|
152
|
-
const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : void 0;
|
|
153
|
-
const reasoningEffort = clampedReasoning === "off" ? void 0 : clampedReasoning;
|
|
154
|
-
return stream(model, context, {
|
|
155
|
-
...base,
|
|
156
|
-
reasoningEffort
|
|
157
|
-
});
|
|
158
|
-
};
|
|
159
|
-
function createClient(model, context, apiKey, optionsHeaders, fetch, sessionId) {
|
|
160
|
-
const compat = getCompat(model);
|
|
161
|
-
const headers = { ...model.headers };
|
|
162
|
-
if (model.provider === "github-copilot") {
|
|
163
|
-
const hasImages = hasCopilotVisionInput(context.messages);
|
|
164
|
-
const copilotHeaders = buildCopilotDynamicHeaders({
|
|
165
|
-
messages: context.messages,
|
|
166
|
-
hasImages
|
|
167
|
-
});
|
|
168
|
-
Object.assign(headers, copilotHeaders);
|
|
169
|
-
}
|
|
170
|
-
if (sessionId) {
|
|
171
|
-
if (compat.sessionAffinityFormat === "openrouter") headers["x-session-id"] = sessionId;
|
|
172
|
-
else {
|
|
173
|
-
if (compat.sessionAffinityFormat === "openai") headers.session_id = sessionId;
|
|
174
|
-
headers["x-client-request-id"] = sessionId;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
if (optionsHeaders) Object.assign(headers, optionsHeaders);
|
|
178
|
-
return new OpenAI({
|
|
179
|
-
apiKey,
|
|
180
|
-
baseURL: model.baseUrl,
|
|
181
|
-
dangerouslyAllowBrowser: true,
|
|
182
|
-
fetch,
|
|
183
|
-
defaultHeaders: headers
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
function buildParams(model, context, options, compat = getCompat(model), grammarToolInputProperties = createGrammarToolInputProperties(context.tools, compat.supportsOpenAIGrammarTools)) {
|
|
187
|
-
const toolPlacement = splitDeferredTools(context, compat.supportsToolSearch);
|
|
188
|
-
const messages = convertResponsesMessages(model, context, OPENAI_TOOL_CALL_PROVIDERS, {
|
|
189
|
-
grammarToolInputProperties,
|
|
190
|
-
deferredTools: toolPlacement.deferred,
|
|
191
|
-
toolOptions: {
|
|
192
|
-
supportsStrictMode: compat.supportsStrictMode,
|
|
193
|
-
supportsOpenAIGrammarTools: compat.supportsOpenAIGrammarTools
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
const cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env);
|
|
197
|
-
const disableImplicitPromptCache = cacheRetention === "none" && compat.supportsExplicitPromptCacheMode;
|
|
198
|
-
const params = {
|
|
199
|
-
model: model.id,
|
|
200
|
-
input: messages,
|
|
201
|
-
stream: true,
|
|
202
|
-
prompt_cache_key: cacheRetention === "none" ? void 0 : clampOpenAIPromptCacheKey(options?.sessionId),
|
|
203
|
-
prompt_cache_retention: getPromptCacheRetention(compat, cacheRetention),
|
|
204
|
-
prompt_cache_options: disableImplicitPromptCache ? { mode: "explicit" } : void 0,
|
|
205
|
-
store: false
|
|
206
|
-
};
|
|
207
|
-
if (options?.maxTokens) params.max_output_tokens = Math.max(options.maxTokens, OPENAI_RESPONSES_MIN_OUTPUT_TOKENS);
|
|
208
|
-
if (options?.temperature !== void 0) params.temperature = options?.temperature;
|
|
209
|
-
if (options?.serviceTier !== void 0) params.service_tier = options.serviceTier;
|
|
210
|
-
if (toolPlacement.immediate.length > 0) params.tools = convertResponsesTools(toolPlacement.immediate, {
|
|
211
|
-
supportsStrictMode: compat.supportsStrictMode,
|
|
212
|
-
supportsOpenAIGrammarTools: compat.supportsOpenAIGrammarTools
|
|
213
|
-
});
|
|
214
|
-
if (options?.toolChoice !== void 0) params.tool_choice = options.toolChoice;
|
|
215
|
-
if (model.reasoning) {
|
|
216
|
-
if (options?.reasoningEffort || options?.reasoningSummary) {
|
|
217
|
-
params.reasoning = {
|
|
218
|
-
effort: options?.reasoningEffort ? model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort : "medium",
|
|
219
|
-
summary: options?.reasoningSummary || "auto"
|
|
220
|
-
};
|
|
221
|
-
params.include = ["reasoning.encrypted_content"];
|
|
222
|
-
} else if (model.provider !== "github-copilot" && model.thinkingLevelMap?.off !== null) params.reasoning = { effort: model.thinkingLevelMap?.off ?? "none" };
|
|
223
|
-
if (model.provider === "xai") params.include = ["reasoning.encrypted_content"];
|
|
224
|
-
}
|
|
225
|
-
if (options?.samplingParams) Object.assign(params, options.samplingParams);
|
|
226
|
-
return params;
|
|
227
|
-
}
|
|
228
|
-
function getServiceTierCostMultiplier(model, serviceTier) {
|
|
229
|
-
switch (serviceTier) {
|
|
230
|
-
case "flex": return .5;
|
|
231
|
-
case "priority": return model.id === "gpt-5.5" ? 2.5 : 2;
|
|
232
|
-
default: return 1;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
function applyServiceTierPricing(usage, serviceTier, model) {
|
|
236
|
-
const multiplier = getServiceTierCostMultiplier(model, serviceTier);
|
|
237
|
-
if (multiplier === 1) return;
|
|
238
|
-
usage.cost.input *= multiplier;
|
|
239
|
-
usage.cost.output *= multiplier;
|
|
240
|
-
usage.cost.cacheRead *= multiplier;
|
|
241
|
-
usage.cost.cacheWrite *= multiplier;
|
|
242
|
-
usage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;
|
|
243
|
-
}
|
|
244
|
-
//#endregion
|
|
245
|
-
export { stream, streamSimple };
|
|
246
|
-
|
|
247
|
-
//# sourceMappingURL=openai-responses-CWmNks8K.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-responses-CWmNks8K.mjs","names":[],"sources":["../node_modules/.pnpm/@earendil-works+pi-ai@0.84.1_ws@8.21.3_zod@4.4.3/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js"],"sourcesContent":["import OpenAI from \"openai\";\nimport { clampThinkingLevel } from \"../models.js\";\nimport { splitDeferredTools } from \"../utils/deferred-tools.js\";\nimport { formatProviderError, normalizeProviderError } from \"../utils/error-body.js\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.js\";\nimport { headersToRecord } from \"../utils/headers.js\";\nimport { getProviderEnvValue } from \"../utils/provider-env.js\";\nimport { retryProviderRequest } from \"../utils/provider-retry.js\";\nimport { createGrammarToolInputProperties } from \"./constrained-sampling.js\";\nimport { buildCopilotDynamicHeaders, hasCopilotVisionInput } from \"./github-copilot-headers.js\";\nimport { clampOpenAIPromptCacheKey } from \"./openai-prompt-cache.js\";\nimport { convertResponsesMessages, convertResponsesTools, processResponsesStream } from \"./openai-responses-shared.js\";\nimport { buildBaseOptions } from \"./simple-options.js\";\nconst OPENAI_TOOL_CALL_PROVIDERS = new Set([\"openai\", \"openai-codex\", \"opencode\"]);\n// OpenAI Responses rejects max_output_tokens below 16: https://github.com/earendil-works/pi/issues/6265\nconst OPENAI_RESPONSES_MIN_OUTPUT_TOKENS = 16;\nfunction hasHeader(headers, name) {\n if (!headers)\n return false;\n const expected = name.toLowerCase();\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === expected && value !== null && value.trim().length > 0)\n return true;\n }\n return false;\n}\nfunction getClientApiKey(provider, apiKey, headers) {\n if (apiKey)\n return apiKey;\n if (hasHeader(headers, \"authorization\") || hasHeader(headers, \"cf-aig-authorization\"))\n return \"unused\";\n throw new Error(`No API key for provider: ${provider}`);\n}\nfunction detectSessionAffinityFormat(model) {\n return model.provider === \"openrouter\" || model.baseUrl.includes(\"openrouter.ai\") ? \"openrouter\" : \"openai\";\n}\n/**\n * Resolve cache retention preference.\n * Defaults to \"short\" and uses PI_CACHE_RETENTION for backward compatibility.\n */\nfunction resolveCacheRetention(cacheRetention, env) {\n if (cacheRetention) {\n return cacheRetention;\n }\n if (getProviderEnvValue(\"PI_CACHE_RETENTION\", env) === \"long\") {\n return \"long\";\n }\n return \"short\";\n}\nfunction getCompat(model) {\n return {\n supportsDeveloperRole: model.compat?.supportsDeveloperRole ?? true,\n sessionAffinityFormat: model.compat?.sessionAffinityFormat ?? detectSessionAffinityFormat(model),\n supportsLongCacheRetention: model.compat?.supportsLongCacheRetention ?? true,\n supportsStrictMode: model.compat?.supportsStrictMode ?? false,\n supportsOpenAIGrammarTools: model.compat?.supportsOpenAIGrammarTools ?? false,\n supportsToolSearch: model.compat?.supportsToolSearch ?? false,\n supportsExplicitPromptCacheMode: model.compat?.supportsExplicitPromptCacheMode ?? false,\n };\n}\nfunction getPromptCacheRetention(compat, cacheRetention) {\n return cacheRetention === \"long\" && compat.supportsLongCacheRetention ? \"24h\" : undefined;\n}\nfunction formatOpenAIResponsesError(error) {\n return formatProviderError(normalizeProviderError(error), \"OpenAI API error\");\n}\n/**\n * Generate function for OpenAI Responses API\n */\nexport const stream = (model, context, options) => {\n const stream = new AssistantMessageEventStream();\n // Start async processing\n (async () => {\n const output = {\n role: \"assistant\",\n content: [],\n api: model.api,\n provider: model.provider,\n model: model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: \"pending\",\n timestamp: Date.now(),\n };\n try {\n // Create OpenAI client\n const apiKey = getClientApiKey(model.provider, options?.apiKey, options?.headers);\n const cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env);\n const cacheSessionId = cacheRetention === \"none\" ? undefined : options?.sessionId;\n const compat = getCompat(model);\n const grammarToolInputProperties = createGrammarToolInputProperties(context.tools, compat.supportsOpenAIGrammarTools);\n const client = createClient(model, context, apiKey, options?.headers, options?.fetch, cacheSessionId);\n let params = buildParams(model, context, options, compat, grammarToolInputProperties);\n const nextParams = await options?.onPayload?.(params, model);\n if (nextParams !== undefined) {\n params = nextParams;\n }\n const requestOptions = {\n ...(options?.signal ? { signal: options.signal } : {}),\n ...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),\n maxRetries: 0,\n };\n const { data: openaiStream, response } = await retryProviderRequest(() => client.responses.create(params, requestOptions).withResponse(), {\n maxRetries: options?.maxRetries,\n maxRetryDelayMs: options?.maxRetryDelayMs,\n signal: options?.signal,\n });\n await options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);\n stream.push({ type: \"start\", partial: output });\n await processResponsesStream(openaiStream, output, stream, model, {\n serviceTier: options?.serviceTier,\n grammarToolInputProperties,\n applyServiceTierPricing: (usage, serviceTier) => applyServiceTierPricing(usage, serviceTier, model),\n });\n if (options?.signal?.aborted) {\n throw new Error(\"Request was aborted\");\n }\n if (output.stopReason === \"pending\") {\n throw new Error(\"OpenAI Responses stream ended without a stop reason\");\n }\n if (output.stopReason === \"aborted\" || output.stopReason === \"error\") {\n throw new Error(output.errorMessage || \"An unknown error occurred\");\n }\n stream.push({ type: \"done\", reason: output.stopReason, message: output });\n stream.end();\n }\n catch (error) {\n for (const block of output.content) {\n delete block.index;\n // Streaming scratch buffers are only used during parsing; never persist them.\n delete block.partialJson;\n delete block.customInput;\n }\n output.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n output.errorMessage = formatOpenAIResponsesError(error);\n stream.push({ type: \"error\", reason: output.stopReason, error: output });\n stream.end();\n }\n })();\n return stream;\n};\nexport const streamSimple = (model, context, options) => {\n getClientApiKey(model.provider, options?.apiKey, options?.headers);\n const base = buildBaseOptions(model, context, options, options?.apiKey);\n const clampedReasoning = options?.reasoning ? clampThinkingLevel(model, options.reasoning) : undefined;\n const reasoningEffort = clampedReasoning === \"off\" ? undefined : clampedReasoning;\n return stream(model, context, {\n ...base,\n reasoningEffort,\n });\n};\nfunction createClient(model, context, apiKey, optionsHeaders, fetch, sessionId) {\n const compat = getCompat(model);\n const headers = { ...model.headers };\n if (model.provider === \"github-copilot\") {\n const hasImages = hasCopilotVisionInput(context.messages);\n const copilotHeaders = buildCopilotDynamicHeaders({\n messages: context.messages,\n hasImages,\n });\n Object.assign(headers, copilotHeaders);\n }\n if (sessionId) {\n if (compat.sessionAffinityFormat === \"openrouter\") {\n headers[\"x-session-id\"] = sessionId;\n }\n else {\n if (compat.sessionAffinityFormat === \"openai\") {\n headers.session_id = sessionId;\n }\n headers[\"x-client-request-id\"] = sessionId;\n }\n }\n // Merge options headers last so they can override defaults\n if (optionsHeaders) {\n Object.assign(headers, optionsHeaders);\n }\n return new OpenAI({\n apiKey,\n baseURL: model.baseUrl,\n dangerouslyAllowBrowser: true,\n fetch,\n defaultHeaders: headers,\n });\n}\nfunction buildParams(model, context, options, compat = getCompat(model), grammarToolInputProperties = createGrammarToolInputProperties(context.tools, compat.supportsOpenAIGrammarTools)) {\n const toolPlacement = splitDeferredTools(context, compat.supportsToolSearch);\n const messages = convertResponsesMessages(model, context, OPENAI_TOOL_CALL_PROVIDERS, {\n grammarToolInputProperties,\n deferredTools: toolPlacement.deferred,\n toolOptions: {\n supportsStrictMode: compat.supportsStrictMode,\n supportsOpenAIGrammarTools: compat.supportsOpenAIGrammarTools,\n },\n });\n const cacheRetention = resolveCacheRetention(options?.cacheRetention, options?.env);\n const disableImplicitPromptCache = cacheRetention === \"none\" && compat.supportsExplicitPromptCacheMode;\n const params = {\n model: model.id,\n input: messages,\n stream: true,\n prompt_cache_key: cacheRetention === \"none\" ? undefined : clampOpenAIPromptCacheKey(options?.sessionId),\n prompt_cache_retention: getPromptCacheRetention(compat, cacheRetention),\n prompt_cache_options: disableImplicitPromptCache ? { mode: \"explicit\" } : undefined,\n store: false,\n };\n if (options?.maxTokens) {\n params.max_output_tokens = Math.max(options.maxTokens, OPENAI_RESPONSES_MIN_OUTPUT_TOKENS);\n }\n if (options?.temperature !== undefined) {\n params.temperature = options?.temperature;\n }\n if (options?.serviceTier !== undefined) {\n params.service_tier = options.serviceTier;\n }\n if (toolPlacement.immediate.length > 0) {\n params.tools = convertResponsesTools(toolPlacement.immediate, {\n supportsStrictMode: compat.supportsStrictMode,\n supportsOpenAIGrammarTools: compat.supportsOpenAIGrammarTools,\n });\n }\n if (options?.toolChoice !== undefined) {\n params.tool_choice = options.toolChoice;\n }\n if (model.reasoning) {\n if (options?.reasoningEffort || options?.reasoningSummary) {\n const effort = options?.reasoningEffort\n ? (model.thinkingLevelMap?.[options.reasoningEffort] ?? options.reasoningEffort)\n : \"medium\";\n params.reasoning = {\n effort: effort,\n summary: options?.reasoningSummary || \"auto\",\n };\n params.include = [\"reasoning.encrypted_content\"];\n }\n else if (model.provider !== \"github-copilot\" && model.thinkingLevelMap?.off !== null) {\n params.reasoning = {\n effort: (model.thinkingLevelMap?.off ?? \"none\"),\n };\n }\n if (model.provider === \"xai\")\n params.include = [\"reasoning.encrypted_content\"];\n }\n // Last so custom keys override the named request fields.\n if (options?.samplingParams) {\n Object.assign(params, options.samplingParams);\n }\n return params;\n}\nfunction getServiceTierCostMultiplier(model, serviceTier) {\n switch (serviceTier) {\n case \"flex\":\n return 0.5;\n case \"priority\":\n return model.id === \"gpt-5.5\" ? 2.5 : 2;\n default:\n return 1;\n }\n}\nfunction applyServiceTierPricing(usage, serviceTier, model) {\n const multiplier = getServiceTierCostMultiplier(model, serviceTier);\n if (multiplier === 1)\n return;\n usage.cost.input *= multiplier;\n usage.cost.output *= multiplier;\n usage.cost.cacheRead *= multiplier;\n usage.cost.cacheWrite *= multiplier;\n usage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;\n}\n//# sourceMappingURL=openai-responses.js.map"],"x_google_ignoreList":[0],"mappings":"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"}
|