@midscene/core 1.12.8 → 1.12.9-beta-20260917120835.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/dist/es/agent/utils.mjs +1 -1
- package/dist/es/ai-model/service-caller/call-ai.mjs +151 -40
- package/dist/es/ai-model/service-caller/call-ai.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/codex/call-codex.mjs +26 -14
- package/dist/es/ai-model/service-caller/codex/call-codex.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/codex/codex-app-server.mjs +12 -16
- package/dist/es/ai-model/service-caller/codex/codex-app-server.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/index.mjs +3 -3
- package/dist/es/ai-model/service-caller/model-call.mjs +49 -0
- package/dist/es/ai-model/service-caller/model-call.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/openai/call-openai.mjs +69 -0
- package/dist/es/ai-model/service-caller/openai/call-openai.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/openai/chat-completion/chat-completion.mjs +50 -0
- package/dist/es/ai-model/service-caller/openai/chat-completion/chat-completion.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/openai/chat-completion/non-stream.mjs +37 -0
- package/dist/es/ai-model/service-caller/openai/chat-completion/non-stream.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/openai/chat-completion/stream.mjs +78 -0
- package/dist/es/ai-model/service-caller/openai/chat-completion/stream.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/openai/chat-completion/utils.mjs +15 -0
- package/dist/es/ai-model/service-caller/openai/chat-completion/utils.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/{openai-client.mjs → openai/openai-client.mjs} +9 -21
- package/dist/es/ai-model/service-caller/openai/openai-client.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/{openai-error.mjs → openai/openai-request-context.mjs} +14 -46
- package/dist/es/ai-model/service-caller/openai/openai-request-context.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/proxy/index.mjs +2 -0
- package/dist/es/ai-model/service-caller/proxy/proxy-deps.node.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/proxy/proxy-deps.stub.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/{proxy.mjs → proxy/proxy.mjs} +2 -2
- package/dist/es/ai-model/service-caller/proxy/proxy.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/request-timeout.mjs +59 -18
- package/dist/es/ai-model/service-caller/request-timeout.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/semantic-retry.mjs +9 -4
- package/dist/es/ai-model/service-caller/semantic-retry.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/utils.mjs +25 -8
- package/dist/es/ai-model/service-caller/utils.mjs.map +1 -1
- package/dist/es/device/index.mjs +44 -21
- package/dist/es/device/index.mjs.map +1 -1
- package/dist/es/report-html-template.mjs +1 -1
- package/dist/es/types.mjs.map +1 -1
- package/dist/es/utils.mjs +1 -1
- package/dist/lib/agent/utils.js +1 -1
- package/dist/lib/ai-model/service-caller/call-ai.js +151 -46
- package/dist/lib/ai-model/service-caller/call-ai.js.map +1 -1
- package/dist/lib/ai-model/service-caller/codex/call-codex.js +30 -15
- package/dist/lib/ai-model/service-caller/codex/call-codex.js.map +1 -1
- package/dist/lib/ai-model/service-caller/codex/codex-app-server.js +12 -16
- package/dist/lib/ai-model/service-caller/codex/codex-app-server.js.map +1 -1
- package/dist/lib/ai-model/service-caller/index.js +7 -7
- package/dist/lib/ai-model/service-caller/model-call.js +89 -0
- package/dist/lib/ai-model/service-caller/model-call.js.map +1 -0
- package/dist/lib/ai-model/service-caller/openai/call-openai.js +103 -0
- package/dist/lib/ai-model/service-caller/openai/call-openai.js.map +1 -0
- package/dist/lib/ai-model/service-caller/openai/chat-completion/chat-completion.js +87 -0
- package/dist/lib/ai-model/service-caller/openai/chat-completion/chat-completion.js.map +1 -0
- package/dist/lib/ai-model/service-caller/openai/chat-completion/non-stream.js +71 -0
- package/dist/lib/ai-model/service-caller/openai/chat-completion/non-stream.js.map +1 -0
- package/dist/lib/ai-model/service-caller/openai/chat-completion/stream.js +112 -0
- package/dist/lib/ai-model/service-caller/openai/chat-completion/stream.js.map +1 -0
- package/dist/lib/ai-model/service-caller/openai/chat-completion/types.js.map +1 -0
- package/dist/lib/ai-model/service-caller/{chat-completion → openai/chat-completion}/utils.js +3 -29
- package/dist/lib/ai-model/service-caller/openai/chat-completion/utils.js.map +1 -0
- package/dist/lib/ai-model/service-caller/{openai-client.js → openai/openai-client.js} +9 -21
- package/dist/lib/ai-model/service-caller/openai/openai-client.js.map +1 -0
- package/dist/lib/ai-model/service-caller/{openai-error.js → openai/openai-request-context.js} +14 -46
- package/dist/lib/ai-model/service-caller/openai/openai-request-context.js.map +1 -0
- package/dist/lib/ai-model/service-caller/proxy/index.js +38 -0
- package/dist/lib/ai-model/service-caller/proxy/index.js.map +1 -0
- package/dist/lib/ai-model/service-caller/proxy/proxy-deps.node.js.map +1 -0
- package/dist/lib/ai-model/service-caller/proxy/proxy-deps.stub.js.map +1 -0
- package/dist/lib/ai-model/service-caller/{proxy.js → proxy/proxy.js} +4 -4
- package/dist/lib/ai-model/service-caller/proxy/proxy.js.map +1 -0
- package/dist/lib/ai-model/service-caller/request-timeout.js +67 -20
- package/dist/lib/ai-model/service-caller/request-timeout.js.map +1 -1
- package/dist/lib/ai-model/service-caller/semantic-retry.js +9 -4
- package/dist/lib/ai-model/service-caller/semantic-retry.js.map +1 -1
- package/dist/lib/ai-model/service-caller/utils.js +30 -13
- package/dist/lib/ai-model/service-caller/utils.js.map +1 -1
- package/dist/lib/device/index.js +56 -21
- package/dist/lib/device/index.js.map +1 -1
- package/dist/lib/report-html-template.js +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/types/ai-model/service-caller/call-ai.d.ts +2 -24
- package/dist/types/ai-model/service-caller/codex/call-codex.d.ts +7 -1
- package/dist/types/ai-model/service-caller/codex/codex-app-server.d.ts +1 -2
- package/dist/types/ai-model/service-caller/index.d.ts +3 -3
- package/dist/types/ai-model/service-caller/model-call.d.ts +26 -0
- package/dist/types/ai-model/service-caller/openai/call-openai.d.ts +3 -0
- package/dist/types/ai-model/service-caller/openai/chat-completion/chat-completion.d.ts +10 -0
- package/dist/types/ai-model/service-caller/openai/chat-completion/non-stream.d.ts +3 -0
- package/dist/types/ai-model/service-caller/openai/chat-completion/stream.d.ts +3 -0
- package/dist/types/ai-model/service-caller/openai/chat-completion/types.d.ts +10 -0
- package/dist/types/ai-model/service-caller/openai/chat-completion/utils.d.ts +5 -0
- package/dist/types/ai-model/service-caller/openai/openai-client.d.ts +14 -0
- package/dist/types/ai-model/service-caller/openai/openai-request-context.d.ts +18 -0
- package/dist/types/ai-model/service-caller/proxy/index.d.ts +1 -0
- package/dist/types/ai-model/service-caller/{proxy.d.ts → proxy/proxy.d.ts} +1 -1
- package/dist/types/ai-model/service-caller/request-timeout.d.ts +14 -11
- package/dist/types/ai-model/service-caller/types.d.ts +19 -0
- package/dist/types/ai-model/service-caller/utils.d.ts +10 -4
- package/dist/types/device/index.d.ts +28 -6
- package/dist/types/types.d.ts +5 -0
- package/package.json +6 -6
- package/dist/es/ai-model/service-caller/call.mjs +0 -56
- package/dist/es/ai-model/service-caller/call.mjs.map +0 -1
- package/dist/es/ai-model/service-caller/chat-completion/call.mjs +0 -101
- package/dist/es/ai-model/service-caller/chat-completion/call.mjs.map +0 -1
- package/dist/es/ai-model/service-caller/chat-completion/non-stream.mjs +0 -80
- package/dist/es/ai-model/service-caller/chat-completion/non-stream.mjs.map +0 -1
- package/dist/es/ai-model/service-caller/chat-completion/stream.mjs +0 -87
- package/dist/es/ai-model/service-caller/chat-completion/stream.mjs.map +0 -1
- package/dist/es/ai-model/service-caller/chat-completion/utils.mjs +0 -35
- package/dist/es/ai-model/service-caller/chat-completion/utils.mjs.map +0 -1
- package/dist/es/ai-model/service-caller/openai-client.mjs.map +0 -1
- package/dist/es/ai-model/service-caller/openai-error.mjs.map +0 -1
- package/dist/es/ai-model/service-caller/proxy-deps.node.mjs.map +0 -1
- package/dist/es/ai-model/service-caller/proxy-deps.stub.mjs.map +0 -1
- package/dist/es/ai-model/service-caller/proxy.mjs.map +0 -1
- package/dist/lib/ai-model/service-caller/call.js +0 -90
- package/dist/lib/ai-model/service-caller/call.js.map +0 -1
- package/dist/lib/ai-model/service-caller/chat-completion/call.js +0 -135
- package/dist/lib/ai-model/service-caller/chat-completion/call.js.map +0 -1
- package/dist/lib/ai-model/service-caller/chat-completion/non-stream.js +0 -114
- package/dist/lib/ai-model/service-caller/chat-completion/non-stream.js.map +0 -1
- package/dist/lib/ai-model/service-caller/chat-completion/stream.js +0 -121
- package/dist/lib/ai-model/service-caller/chat-completion/stream.js.map +0 -1
- package/dist/lib/ai-model/service-caller/chat-completion/types.js.map +0 -1
- package/dist/lib/ai-model/service-caller/chat-completion/utils.js.map +0 -1
- package/dist/lib/ai-model/service-caller/openai-client.js.map +0 -1
- package/dist/lib/ai-model/service-caller/openai-error.js.map +0 -1
- package/dist/lib/ai-model/service-caller/proxy-deps.node.js.map +0 -1
- package/dist/lib/ai-model/service-caller/proxy-deps.stub.js.map +0 -1
- package/dist/lib/ai-model/service-caller/proxy.js.map +0 -1
- package/dist/types/ai-model/service-caller/call.d.ts +0 -4
- package/dist/types/ai-model/service-caller/chat-completion/call.d.ts +0 -2
- package/dist/types/ai-model/service-caller/chat-completion/non-stream.d.ts +0 -2
- package/dist/types/ai-model/service-caller/chat-completion/stream.d.ts +0 -2
- package/dist/types/ai-model/service-caller/chat-completion/types.d.ts +0 -25
- package/dist/types/ai-model/service-caller/chat-completion/utils.d.ts +0 -12
- package/dist/types/ai-model/service-caller/openai-client.d.ts +0 -14
- package/dist/types/ai-model/service-caller/openai-error.d.ts +0 -26
- /package/dist/es/ai-model/service-caller/{chat-completion → openai/chat-completion}/types.mjs +0 -0
- /package/dist/es/ai-model/service-caller/{proxy-deps.node.mjs → proxy/proxy-deps.node.mjs} +0 -0
- /package/dist/es/ai-model/service-caller/{proxy-deps.stub.mjs → proxy/proxy-deps.stub.mjs} +0 -0
- /package/dist/lib/ai-model/service-caller/{chat-completion → openai/chat-completion}/types.js +0 -0
- /package/dist/lib/ai-model/service-caller/{proxy-deps.node.js → proxy/proxy-deps.node.js} +0 -0
- /package/dist/lib/ai-model/service-caller/{proxy-deps.stub.js → proxy/proxy-deps.stub.js} +0 -0
- /package/dist/types/ai-model/service-caller/{proxy-deps.node.d.ts → proxy/proxy-deps.node.d.ts} +0 -0
- /package/dist/types/ai-model/service-caller/{proxy-deps.stub.d.ts → proxy/proxy-deps.stub.d.ts} +0 -0
|
@@ -43,7 +43,7 @@ function _define_property(obj, key, value) {
|
|
|
43
43
|
return obj;
|
|
44
44
|
}
|
|
45
45
|
const CODEX_PROVIDER_SCHEME = 'codex://';
|
|
46
|
-
const
|
|
46
|
+
const CODEX_INTERRUPT_TIMEOUT_MS = 5000;
|
|
47
47
|
const CODEX_DEFAULT_PROCESS_START_TIMEOUT_MS = 15000;
|
|
48
48
|
const CODEX_DEFAULT_CLEANUP_TIMEOUT_MS = 8000;
|
|
49
49
|
const CODEX_TEXT_INPUT_MAX_LENGTH = 262144;
|
|
@@ -113,7 +113,7 @@ const extractTextFromMessage = (message)=>{
|
|
|
113
113
|
}).filter(Boolean).join('\n');
|
|
114
114
|
return '';
|
|
115
115
|
};
|
|
116
|
-
const extractImageInputs = (message
|
|
116
|
+
const extractImageInputs = (message)=>{
|
|
117
117
|
const content = message.content;
|
|
118
118
|
if (!Array.isArray(content)) return [];
|
|
119
119
|
const inputs = [];
|
|
@@ -121,7 +121,7 @@ const extractImageInputs = (message, imageDetailOverride)=>{
|
|
|
121
121
|
if (!part || 'object' != typeof part) continue;
|
|
122
122
|
const partType = String(part.type || '');
|
|
123
123
|
const imageUrl = 'image_url' === partType ? toNonEmptyString(part.image_url?.url) : 'input_image' === partType ? toNonEmptyString(part.image_url || part.url) : void 0;
|
|
124
|
-
const imageDetail =
|
|
124
|
+
const imageDetail = toCodexImageDetail('image_url' === partType ? part.image_url?.detail : part.detail);
|
|
125
125
|
if (imageUrl) {
|
|
126
126
|
if (imageUrl.startsWith('/') || imageUrl.startsWith('./') || imageUrl.startsWith('../') || imageUrl.startsWith('file://')) {
|
|
127
127
|
const path = imageUrl.startsWith('file://') ? normalizeCodexLocalImagePath(imageUrl) : imageUrl;
|
|
@@ -145,7 +145,7 @@ const extractImageInputs = (message, imageDetailOverride)=>{
|
|
|
145
145
|
}
|
|
146
146
|
return inputs;
|
|
147
147
|
};
|
|
148
|
-
const buildCodexTurnPayloadFromMessages = (messages
|
|
148
|
+
const buildCodexTurnPayloadFromMessages = (messages)=>{
|
|
149
149
|
const developerInstructionParts = [];
|
|
150
150
|
const transcriptParts = [];
|
|
151
151
|
const imageInputs = [];
|
|
@@ -159,7 +159,7 @@ const buildCodexTurnPayloadFromMessages = (messages, imageDetailOverride)=>{
|
|
|
159
159
|
const roleTag = role.toUpperCase();
|
|
160
160
|
if (text.trim()) transcriptParts.push(`[${roleTag}]\n${text.trim()}`);
|
|
161
161
|
else transcriptParts.push(`[${roleTag}]\n(no text content)`);
|
|
162
|
-
if ('user' === role) imageInputs.push(...extractImageInputs(message
|
|
162
|
+
if ('user' === role) imageInputs.push(...extractImageInputs(message));
|
|
163
163
|
}
|
|
164
164
|
const fullTranscript = transcriptParts.join('\n\n');
|
|
165
165
|
const transcriptText = (fullTranscript.length > CODEX_TEXT_INPUT_MAX_LENGTH ? fullTranscript.slice(-CODEX_TEXT_INPUT_MAX_LENGTH) : fullTranscript) || 'Please answer the latest user request.';
|
|
@@ -207,11 +207,9 @@ class CodexAppServerConnection {
|
|
|
207
207
|
isClosed() {
|
|
208
208
|
return this.closed;
|
|
209
209
|
}
|
|
210
|
-
async runTurn({ messages, modelConfig, stream, onChunk, params, abortSignal,
|
|
211
|
-
const timeoutMs = modelConfig.timeout || CODEX_DEFAULT_TIMEOUT_MS;
|
|
212
|
-
const deadlineAt = Date.now() + timeoutMs;
|
|
210
|
+
async runTurn({ messages, modelConfig, stream, onChunk, params, abortSignal, onRecordEvent }) {
|
|
213
211
|
const isStreaming = !!(stream && onChunk);
|
|
214
|
-
const { developerInstructions, input } = buildCodexTurnPayloadFromMessages(messages
|
|
212
|
+
const { developerInstructions, input } = buildCodexTurnPayloadFromMessages(messages);
|
|
215
213
|
let threadId;
|
|
216
214
|
let turnId;
|
|
217
215
|
let latestErrorMessage;
|
|
@@ -251,7 +249,6 @@ class CodexAppServerConnection {
|
|
|
251
249
|
const threadStartResponse = await this.request({
|
|
252
250
|
method: 'thread/start',
|
|
253
251
|
params: threadStartParams,
|
|
254
|
-
deadlineAt,
|
|
255
252
|
abortSignal
|
|
256
253
|
});
|
|
257
254
|
onRecordEvent?.({
|
|
@@ -280,7 +277,6 @@ class CodexAppServerConnection {
|
|
|
280
277
|
const turnStartResponse = await this.request({
|
|
281
278
|
method: 'turn/start',
|
|
282
279
|
params: turnStartParams,
|
|
283
|
-
deadlineAt,
|
|
284
280
|
abortSignal
|
|
285
281
|
});
|
|
286
282
|
onRecordEvent?.({
|
|
@@ -296,7 +292,6 @@ class CodexAppServerConnection {
|
|
|
296
292
|
let turnStatus;
|
|
297
293
|
while(!turnStatus){
|
|
298
294
|
const message = await this.nextMessage({
|
|
299
|
-
deadlineAt,
|
|
300
295
|
abortSignal
|
|
301
296
|
});
|
|
302
297
|
if (this.isResponseMessage(message)) continue;
|
|
@@ -385,7 +380,7 @@ class CodexAppServerConnection {
|
|
|
385
380
|
threadId,
|
|
386
381
|
turnId
|
|
387
382
|
},
|
|
388
|
-
deadlineAt: Date.now() +
|
|
383
|
+
deadlineAt: Date.now() + CODEX_INTERRUPT_TIMEOUT_MS
|
|
389
384
|
}).catch(()=>{});
|
|
390
385
|
throw error;
|
|
391
386
|
} finally{
|
|
@@ -480,6 +475,7 @@ class CodexAppServerConnection {
|
|
|
480
475
|
return message?.id !== void 0 && (message?.result !== void 0 || message?.error !== void 0) && 'string' != typeof message?.method;
|
|
481
476
|
}
|
|
482
477
|
async request({ method, params, deadlineAt, abortSignal }) {
|
|
478
|
+
abortSignal?.throwIfAborted();
|
|
483
479
|
const requestId = this.nextRequestId++;
|
|
484
480
|
await this.sendMessage({
|
|
485
481
|
id: requestId,
|
|
@@ -586,9 +582,11 @@ class CodexAppServerConnection {
|
|
|
586
582
|
}
|
|
587
583
|
}
|
|
588
584
|
class CodexAppServerConnectionManager {
|
|
589
|
-
async runTurn({ messages, modelConfig, stream, onChunk, params, abortSignal,
|
|
585
|
+
async runTurn({ messages, modelConfig, stream, onChunk, params, abortSignal, onRecordEvent }) {
|
|
590
586
|
return this.runner.run(async ()=>{
|
|
587
|
+
abortSignal?.throwIfAborted();
|
|
591
588
|
const connection = await this.getConnection();
|
|
589
|
+
abortSignal?.throwIfAborted();
|
|
592
590
|
try {
|
|
593
591
|
return await connection.runTurn({
|
|
594
592
|
messages,
|
|
@@ -597,7 +595,6 @@ class CodexAppServerConnectionManager {
|
|
|
597
595
|
onChunk,
|
|
598
596
|
params,
|
|
599
597
|
abortSignal,
|
|
600
|
-
imageDetail,
|
|
601
598
|
onRecordEvent
|
|
602
599
|
});
|
|
603
600
|
} catch (error) {
|
|
@@ -638,7 +635,6 @@ async function callAIWithCodexAppServer(messages, modelConfig, options) {
|
|
|
638
635
|
onChunk: options?.onChunk,
|
|
639
636
|
params: options?.params,
|
|
640
637
|
abortSignal: options?.abortSignal,
|
|
641
|
-
imageDetail: options?.imageDetail,
|
|
642
638
|
onRecordEvent: options?.onRecordEvent
|
|
643
639
|
});
|
|
644
640
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-model/service-caller/codex/codex-app-server.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../../../src/ai-model/service-caller/codex/codex-app-server.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { CodeGenerationChunk, StreamingCallback } from '@/types';\nimport type { IModelConfig } from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { ifInBrowser } from '@midscene/shared/utils';\nimport type OpenAI from 'openai';\nimport type { ChatCompletionMessageParam } from 'openai/resources/index';\nimport type { CodexAppServerParamsResult } from '../../model-adapter/types';\n\nconst CODEX_PROVIDER_SCHEME = 'codex://';\nconst CODEX_DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;\nconst CODEX_DEFAULT_PROCESS_START_TIMEOUT_MS = 15 * 1000;\nconst CODEX_DEFAULT_CLEANUP_TIMEOUT_MS = 8 * 1000;\nconst CODEX_TEXT_INPUT_MAX_LENGTH = 256 * 1024;\n\nconst debugCodex = getDebug('ai:call:codex');\nconst warnCodex = getDebug('ai:call:codex', { console: true });\n\ntype JsonRpcRequest = {\n id: string | number;\n method: string;\n params?: unknown;\n};\n\ntype JsonRpcResponse = {\n id: string | number;\n result?: unknown;\n error?: {\n code?: number;\n message?: string;\n data?: unknown;\n };\n};\n\ntype JsonRpcNotification = {\n method: string;\n params?: Record<string, any>;\n};\n\ntype JsonRpcMessage = JsonRpcRequest | JsonRpcResponse | JsonRpcNotification;\n\ntype CodexTextInput = {\n type: 'text';\n text: string;\n text_elements: any[];\n};\n\n// Codex app-server v2 accepts `detail` on both image input variants:\n// https://github.com/openai/codex/blob/main/codex-rs/app-server-protocol/src/protocol/v2/turn.rs#L276-L329\n// Codex has also reported `original` as a supported value in production:\n// https://github.com/openai/codex/issues/24797\ntype CodexImageInput = {\n type: 'image';\n url: string;\n detail?: CodexImageDetail;\n};\n\ntype CodexLocalImageInput = {\n type: 'localImage';\n path: string;\n detail?: CodexImageDetail;\n};\n\ntype CodexTurnInput = CodexTextInput | CodexImageInput | CodexLocalImageInput;\n\ntype CodexImageDetail = 'auto' | 'low' | 'high' | 'original';\n\nexport type CodexAppServerRecordEvent = {\n type: 'request' | 'chunk';\n protocol: Record<string, unknown>;\n};\n\ntype CodexTurnResult = {\n content: string;\n reasoning_content?: string;\n usage?: OpenAI.CompletionUsage;\n isStreamed: boolean;\n protocolMetadata: {\n transport: 'json-rpc';\n threadId: string;\n turnId: string;\n turnStatus: string;\n };\n};\n\ntype CodexTurnStartResponse = {\n turn?: {\n id?: string;\n };\n};\n\ntype CodexThreadStartResponse = {\n thread?: {\n id?: string;\n };\n};\n\ntype CodexUsageNotification = {\n threadId?: string;\n turnId?: string;\n tokenUsage?: {\n total?: {\n totalTokens?: number;\n inputTokens?: number;\n cachedInputTokens?: number;\n outputTokens?: number;\n reasoningOutputTokens?: number;\n };\n last?: {\n totalTokens?: number;\n inputTokens?: number;\n cachedInputTokens?: number;\n outputTokens?: number;\n reasoningOutputTokens?: number;\n };\n };\n};\n\nclass SerializedRunner {\n private tail: Promise<void> = Promise.resolve();\n\n async run<T>(work: () => Promise<T>): Promise<T> {\n const previous = this.tail;\n let release!: () => void;\n this.tail = new Promise<void>((resolve) => {\n release = resolve;\n });\n\n await previous;\n try {\n return await work();\n } finally {\n release();\n }\n }\n}\n\nexport const isCodexAppServerProvider = (baseURL?: string): boolean => {\n if (!baseURL) return false;\n return baseURL.trim().toLowerCase().startsWith(CODEX_PROVIDER_SCHEME);\n};\n\nconst isAbortError = (error: unknown): boolean => {\n if (!error) return false;\n if (error instanceof Error && error.name === 'AbortError') return true;\n const message =\n error instanceof Error ? error.message : String(error ?? 'unknown error');\n return /aborted|abort/i.test(message);\n};\n\nconst toNonEmptyString = (value: unknown): string | undefined => {\n if (typeof value !== 'string') return undefined;\n const trimmed = value.trim();\n return trimmed || undefined;\n};\n\nconst toCodexImageDetail = (value: unknown): CodexImageDetail | undefined =>\n value === 'auto' ||\n value === 'low' ||\n value === 'high' ||\n value === 'original'\n ? value\n : undefined;\n\nexport const normalizeCodexLocalImagePath = (\n imageUrl: string,\n platform: NodeJS.Platform = process.platform,\n): string => {\n if (!imageUrl.startsWith('file://')) {\n return imageUrl;\n }\n\n try {\n const parsed = new URL(imageUrl);\n const pathname = decodeURIComponent(parsed.pathname);\n const host = parsed.hostname.toLowerCase();\n\n if (platform === 'win32') {\n const windowsPath = pathname\n .replace(/\\//g, '\\\\')\n .replace(/^\\\\([A-Za-z]:)/, '$1');\n\n if (host && host !== 'localhost') {\n return `\\\\\\\\${parsed.hostname}${windowsPath}`;\n }\n\n return windowsPath;\n }\n\n if (host && host !== 'localhost') {\n return `//${parsed.hostname}${pathname}`;\n }\n\n return pathname;\n } catch {\n return decodeURIComponent(imageUrl.slice('file://'.length));\n }\n};\n\nconst extractTextFromMessage = (\n message: ChatCompletionMessageParam,\n): string => {\n const content = (message as any).content;\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n return content\n .map((part) => {\n if (!part || typeof part !== 'object') return '';\n\n if (part.type === 'text' && typeof part.text === 'string') {\n return part.text;\n }\n\n if (part.type === 'input_text' && typeof part.text === 'string') {\n return part.text;\n }\n\n return '';\n })\n .filter(Boolean)\n .join('\\n');\n }\n\n return '';\n};\n\nconst extractImageInputs = (\n message: ChatCompletionMessageParam,\n imageDetailOverride?: CodexImageDetail,\n): Array<CodexImageInput | CodexLocalImageInput> => {\n const content = (message as any).content;\n if (!Array.isArray(content)) return [];\n\n const inputs: Array<CodexImageInput | CodexLocalImageInput> = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') continue;\n\n const partType = String(part.type || '');\n const imageUrl =\n partType === 'image_url'\n ? toNonEmptyString(part.image_url?.url)\n : partType === 'input_image'\n ? toNonEmptyString(part.image_url || part.url)\n : undefined;\n const imageDetail =\n imageDetailOverride ??\n toCodexImageDetail(\n partType === 'image_url' ? part.image_url?.detail : part.detail,\n );\n\n if (!imageUrl) continue;\n\n if (\n imageUrl.startsWith('/') ||\n imageUrl.startsWith('./') ||\n imageUrl.startsWith('../') ||\n imageUrl.startsWith('file://')\n ) {\n const path = imageUrl.startsWith('file://')\n ? normalizeCodexLocalImagePath(imageUrl)\n : imageUrl;\n\n inputs.push({\n type: 'localImage',\n path,\n ...(imageDetail ? { detail: imageDetail } : {}),\n });\n continue;\n }\n\n inputs.push({\n type: 'image',\n url: imageUrl,\n ...(imageDetail ? { detail: imageDetail } : {}),\n });\n }\n\n return inputs;\n};\n\nexport const buildCodexTurnPayloadFromMessages = (\n messages: ChatCompletionMessageParam[],\n imageDetailOverride?: CodexImageDetail,\n): {\n developerInstructions?: string;\n input: CodexTurnInput[];\n} => {\n const developerInstructionParts: string[] = [];\n const transcriptParts: string[] = [];\n const imageInputs: Array<CodexImageInput | CodexLocalImageInput> = [];\n\n for (const message of messages) {\n const role = String((message as any).role || 'user');\n const text = extractTextFromMessage(message);\n\n if (role === 'system') {\n if (text.trim()) developerInstructionParts.push(text.trim());\n continue;\n }\n\n const roleTag = role.toUpperCase();\n if (text.trim()) {\n transcriptParts.push(`[${roleTag}]\\n${text.trim()}`);\n } else {\n transcriptParts.push(`[${roleTag}]\\n(no text content)`);\n }\n\n if (role === 'user') {\n imageInputs.push(...extractImageInputs(message, imageDetailOverride));\n }\n }\n\n const fullTranscript = transcriptParts.join('\\n\\n');\n const transcriptText =\n (fullTranscript.length > CODEX_TEXT_INPUT_MAX_LENGTH\n ? fullTranscript.slice(-CODEX_TEXT_INPUT_MAX_LENGTH)\n : fullTranscript) || 'Please answer the latest user request.';\n\n const input: CodexTurnInput[] = [\n {\n type: 'text',\n text: transcriptText,\n text_elements: [],\n },\n ...imageInputs,\n ];\n\n const developerInstructions = developerInstructionParts.length\n ? developerInstructionParts.join('\\n\\n')\n : undefined;\n\n return {\n developerInstructions,\n input,\n };\n};\n\nclass CodexAppServerConnection {\n private child: any;\n private lineReader: any;\n private pendingMessages: JsonRpcMessage[] = [];\n private lineBuffer: string[] = [];\n private nextRequestId = 1;\n private closed = false;\n private lastExitCode: number | null = null;\n private processErrorMessage: string | null = null;\n private stderrBuffer = '';\n\n private constructor(child: any, lineReader: any) {\n this.child = child;\n this.lineReader = lineReader;\n }\n\n static async create(): Promise<CodexAppServerConnection> {\n if (ifInBrowser) {\n throw new Error(\n 'codex app-server provider is not supported in browser runtime',\n );\n }\n\n const childProcessModuleName = 'node:child_process';\n const readlineModuleName = 'node:readline';\n const { spawn } = await import(childProcessModuleName);\n const readline = await import(readlineModuleName);\n\n const child = spawn('codex', ['app-server'], {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n if (!child.stdin || !child.stdout || !child.stderr) {\n throw new Error('failed to start codex app-server: stdio unavailable');\n }\n\n const lineReader = readline.createInterface({\n input: child.stdout,\n crlfDelay: Number.POSITIVE_INFINITY,\n });\n const connection = new CodexAppServerConnection(child, lineReader);\n connection.detachFromEventLoop();\n connection.attachProcessListeners();\n await connection.initializeHandshake();\n\n return connection;\n }\n\n isClosed(): boolean {\n return this.closed;\n }\n\n async runTurn({\n messages,\n modelConfig,\n stream,\n onChunk,\n params,\n abortSignal,\n imageDetail,\n onRecordEvent,\n }: {\n messages: ChatCompletionMessageParam[];\n modelConfig: IModelConfig;\n stream?: boolean;\n onChunk?: StreamingCallback;\n params?: CodexAppServerParamsResult['config'];\n abortSignal?: AbortSignal;\n imageDetail?: CodexImageDetail;\n onRecordEvent?: (event: CodexAppServerRecordEvent) => void;\n }): Promise<CodexTurnResult> {\n const timeoutMs = modelConfig.timeout || CODEX_DEFAULT_TIMEOUT_MS;\n const deadlineAt = Date.now() + timeoutMs;\n const isStreaming = !!(stream && onChunk);\n\n const { developerInstructions, input } = buildCodexTurnPayloadFromMessages(\n messages,\n imageDetail,\n );\n\n let threadId: string | undefined;\n let turnId: string | undefined;\n let latestErrorMessage: string | undefined;\n let accumulatedText = '';\n let accumulatedReasoning = '';\n let latestUsage: OpenAI.CompletionUsage | undefined;\n\n const emitChunk = ({\n content,\n reasoning,\n isComplete,\n usage,\n }: {\n content: string;\n reasoning: string;\n isComplete: boolean;\n usage?: OpenAI.CompletionUsage;\n }) => {\n if (!isStreaming || !onChunk) return;\n const chunk: CodeGenerationChunk = {\n content,\n reasoning_content: reasoning,\n accumulated: accumulatedText,\n isComplete,\n usage,\n };\n onChunk(chunk);\n };\n\n try {\n const threadStartParams = {\n model: modelConfig.modelName,\n cwd: process.cwd(),\n approvalPolicy: 'never',\n sandbox: 'read-only',\n ephemeral: true,\n experimentalRawEvents: false,\n persistExtendedHistory: false,\n developerInstructions: developerInstructions || null,\n };\n onRecordEvent?.({\n type: 'request',\n protocol: {\n direction: 'client',\n method: 'thread/start',\n params: threadStartParams,\n },\n });\n const threadStartResponse = await this.request<CodexThreadStartResponse>({\n method: 'thread/start',\n params: threadStartParams,\n deadlineAt,\n abortSignal,\n });\n onRecordEvent?.({\n type: 'chunk',\n protocol: {\n direction: 'server',\n method: 'thread/start',\n result: threadStartResponse,\n },\n });\n\n threadId = threadStartResponse?.thread?.id;\n if (!threadId) {\n throw new Error('thread/start did not return a thread id');\n }\n\n const turnStartParams = {\n ...params,\n threadId,\n input,\n };\n onRecordEvent?.({\n type: 'request',\n protocol: {\n direction: 'client',\n method: 'turn/start',\n params: turnStartParams,\n },\n });\n const turnStartResponse = await this.request<CodexTurnStartResponse>({\n method: 'turn/start',\n params: turnStartParams,\n deadlineAt,\n abortSignal,\n });\n onRecordEvent?.({\n type: 'chunk',\n protocol: {\n direction: 'server',\n method: 'turn/start',\n result: turnStartResponse,\n },\n });\n\n turnId = turnStartResponse?.turn?.id;\n if (!turnId) {\n throw new Error('turn/start did not return a turn id');\n }\n\n let turnStatus: string | undefined;\n while (!turnStatus) {\n const message = await this.nextMessage({ deadlineAt, abortSignal });\n\n if (this.isResponseMessage(message)) {\n // No concurrent requests in adapter runtime.\n continue;\n }\n\n if (this.isRequestMessage(message)) {\n await this.respondToServerRequest(message);\n continue;\n }\n\n const notification = message as JsonRpcNotification;\n const method = notification.method;\n const params = notification.params || {};\n const belongsToCurrentTurn =\n params.threadId === threadId &&\n (params.turnId === turnId || params.turn?.id === turnId);\n\n if (belongsToCurrentTurn) {\n onRecordEvent?.({\n type: 'chunk',\n protocol: {\n direction: 'server',\n method,\n params,\n },\n });\n }\n\n if (method === 'error') {\n const messageText =\n params.error?.message ||\n params.message ||\n 'codex app-server reported turn error';\n latestErrorMessage = String(messageText);\n continue;\n }\n\n if (\n method === 'item/agentMessage/delta' &&\n params.threadId === threadId &&\n params.turnId === turnId\n ) {\n const delta = String(params.delta || '');\n if (delta) {\n accumulatedText += delta;\n emitChunk({\n content: delta,\n reasoning: '',\n isComplete: false,\n });\n }\n continue;\n }\n\n if (\n (method === 'item/reasoning/summaryTextDelta' ||\n method === 'item/reasoning/textDelta') &&\n params.threadId === threadId &&\n params.turnId === turnId\n ) {\n const delta = String(params.delta || '');\n if (delta) {\n accumulatedReasoning += delta;\n emitChunk({\n content: '',\n reasoning: delta,\n isComplete: false,\n });\n }\n continue;\n }\n\n if (\n method === 'item/completed' &&\n params.threadId === threadId &&\n params.turnId === turnId &&\n params.item?.type === 'agentMessage' &&\n typeof params.item?.text === 'string' &&\n !accumulatedText\n ) {\n accumulatedText = params.item.text;\n continue;\n }\n\n if (\n method === 'thread/tokenUsage/updated' &&\n params.threadId === threadId &&\n params.turnId === turnId\n ) {\n latestUsage = this.mapUsage(params as CodexUsageNotification);\n continue;\n }\n\n if (\n method === 'turn/completed' &&\n params.threadId === threadId &&\n params.turn?.id === turnId\n ) {\n turnStatus = String(params.turn.status || '');\n latestErrorMessage =\n params.turn?.error?.message || latestErrorMessage || undefined;\n break;\n }\n }\n\n if (turnStatus !== 'completed') {\n throw new Error(\n latestErrorMessage ||\n `codex turn finished with status \"${turnStatus || 'unknown'}\"`,\n );\n }\n\n if (isStreaming) {\n emitChunk({\n content: '',\n reasoning: '',\n isComplete: true,\n usage: latestUsage,\n });\n }\n\n return {\n content: accumulatedText,\n reasoning_content: accumulatedReasoning || undefined,\n usage: latestUsage,\n isStreamed: isStreaming,\n protocolMetadata: {\n transport: 'json-rpc',\n threadId,\n turnId,\n turnStatus,\n },\n };\n } catch (error) {\n if (isAbortError(error) && threadId && turnId) {\n await this.request({\n method: 'turn/interrupt',\n params: {\n threadId,\n turnId,\n },\n deadlineAt: Date.now() + 5_000,\n }).catch(() => {});\n }\n throw error;\n } finally {\n if (threadId) {\n await this.request({\n method: 'thread/unsubscribe',\n params: { threadId },\n deadlineAt: Date.now() + CODEX_DEFAULT_CLEANUP_TIMEOUT_MS,\n }).catch((error) => {\n warnCodex(\n `failed to unsubscribe codex thread ${threadId}: ${String(error)}`,\n );\n });\n }\n }\n }\n\n async dispose(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n\n try {\n this.lineReader?.close?.();\n } catch {}\n\n try {\n this.child?.stdin?.end?.();\n } catch {}\n\n try {\n this.child?.kill?.();\n } catch {}\n }\n\n private attachProcessListeners() {\n this.lineReader.on('line', (line: string) => {\n this.lineBuffer.push(line);\n });\n\n this.child.stderr.on('data', (chunk: Buffer | string) => {\n const text = Buffer.isBuffer(chunk)\n ? chunk.toString('utf8')\n : String(chunk);\n this.stderrBuffer += text;\n if (this.stderrBuffer.length > 8192) {\n this.stderrBuffer = this.stderrBuffer.slice(-8192);\n }\n });\n\n this.child.on('exit', (code: number | null) => {\n this.closed = true;\n this.lastExitCode = code;\n });\n\n this.child.on('error', (error: Error) => {\n this.closed = true;\n this.processErrorMessage = error.message;\n });\n }\n\n /**\n * Keep codex process reusable but let short-lived callers exit naturally.\n * Without unref, one-shot scripts/tests that call AI once can hang.\n */\n private detachFromEventLoop() {\n this.child.unref?.();\n this.child.stdin?.unref?.();\n this.child.stdout?.unref?.();\n this.child.stderr?.unref?.();\n }\n\n private async initializeHandshake() {\n const deadlineAt = Date.now() + CODEX_DEFAULT_PROCESS_START_TIMEOUT_MS;\n await this.request({\n method: 'initialize',\n params: {\n clientInfo: {\n name: 'midscene_codex_provider',\n title: 'Midscene Codex Provider',\n version: '1.0.0',\n },\n capabilities: {\n experimentalApi: false,\n },\n },\n deadlineAt,\n });\n await this.sendMessage({\n method: 'initialized',\n });\n }\n\n private mapUsage(\n usage: CodexUsageNotification,\n ): OpenAI.CompletionUsage | undefined {\n const tokenUsage = usage.tokenUsage;\n const picked = tokenUsage?.last || tokenUsage?.total;\n if (!picked) return undefined;\n\n return {\n prompt_tokens: picked.inputTokens ?? 0,\n completion_tokens: picked.outputTokens ?? 0,\n total_tokens: picked.totalTokens ?? 0,\n prompt_tokens_details: { cached_tokens: picked.cachedInputTokens ?? 0 },\n completion_tokens_details: {\n reasoning_tokens: picked.reasoningOutputTokens ?? 0,\n },\n } satisfies OpenAI.CompletionUsage;\n }\n\n private isRequestMessage(message: JsonRpcMessage): message is JsonRpcRequest {\n return (\n typeof (message as any)?.method === 'string' &&\n (message as any)?.id !== undefined\n );\n }\n\n private isResponseMessage(\n message: JsonRpcMessage,\n ): message is JsonRpcResponse {\n return (\n (message as any)?.id !== undefined &&\n ((message as any)?.result !== undefined ||\n (message as any)?.error !== undefined) &&\n typeof (message as any)?.method !== 'string'\n );\n }\n\n private async request<T = unknown>({\n method,\n params,\n deadlineAt,\n abortSignal,\n }: {\n method: string;\n params: unknown;\n deadlineAt?: number;\n abortSignal?: AbortSignal;\n }): Promise<T> {\n const requestId = this.nextRequestId++;\n\n await this.sendMessage({\n id: requestId,\n method,\n params,\n });\n\n while (true) {\n const message = await this.nextMessage({\n deadlineAt,\n abortSignal,\n includePending: false,\n });\n\n if (this.isResponseMessage(message) && message.id === requestId) {\n if (message.error) {\n throw new Error(\n `codex app-server ${method} failed: ${\n message.error.message || 'unknown error'\n }`,\n );\n }\n return (message.result || {}) as T;\n }\n\n if (this.isRequestMessage(message)) {\n await this.respondToServerRequest(message);\n continue;\n }\n\n // Keep unmatched notifications/other responses for later stream handling.\n this.pendingMessages.push(message);\n }\n }\n\n private async respondToServerRequest(request: JsonRpcRequest): Promise<void> {\n const requestId = request.id;\n const method = request.method;\n\n let result: unknown = {};\n if (method === 'item/commandExecution/requestApproval') {\n result = { decision: 'decline' };\n } else if (method === 'item/fileChange/requestApproval') {\n result = { decision: 'decline' };\n } else if (method === 'mcpServer/elicitation/request') {\n result = { action: 'cancel', content: null };\n } else if (method === 'item/tool/requestUserInput') {\n result = { answers: [] };\n } else {\n await this.sendMessage({\n id: requestId,\n error: {\n code: -32601,\n message: `unsupported server request: ${method}`,\n },\n });\n return;\n }\n\n await this.sendMessage({\n id: requestId,\n result,\n });\n }\n\n private async nextMessage({\n deadlineAt,\n abortSignal,\n includePending = true,\n }: {\n deadlineAt?: number;\n abortSignal?: AbortSignal;\n includePending?: boolean;\n }): Promise<JsonRpcMessage> {\n if (includePending && this.pendingMessages.length) {\n return this.pendingMessages.shift() as JsonRpcMessage;\n }\n\n while (true) {\n if (abortSignal?.aborted) {\n throw new Error('codex app-server request aborted');\n }\n\n if (deadlineAt && Date.now() > deadlineAt) {\n throw new Error('codex app-server request timed out');\n }\n\n if (this.lineBuffer.length) {\n const line = this.lineBuffer.shift()!;\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let parsed: JsonRpcMessage;\n try {\n parsed = JSON.parse(trimmed);\n } catch (error) {\n warnCodex(\n `ignored non-JSON message from codex app-server: ${trimmed}`,\n );\n continue;\n }\n\n return parsed;\n }\n\n if (this.closed) {\n throw this.createClosedConnectionError();\n }\n\n await new Promise((resolve) => setTimeout(resolve, 20));\n }\n }\n\n private async sendMessage(payload: Record<string, unknown>): Promise<void> {\n if (this.closed) {\n throw this.createClosedConnectionError();\n }\n\n const line = JSON.stringify(payload);\n await new Promise<void>((resolve, reject) => {\n this.child.stdin.write(`${line}\\n`, (error: Error | null | undefined) => {\n if (error) {\n reject(\n new Error(\n `failed writing to codex app-server stdin: ${error.message}`,\n ),\n );\n return;\n }\n resolve();\n });\n });\n }\n\n private createClosedConnectionError(): Error {\n const stderr = this.stderrBuffer.trim();\n if (this.processErrorMessage) {\n return new Error(\n stderr\n ? `codex app-server process error: ${this.processErrorMessage}. stderr=${stderr}`\n : `codex app-server process error: ${this.processErrorMessage}`,\n );\n }\n\n return new Error(\n stderr\n ? `codex app-server connection closed (exitCode=${this.lastExitCode}). stderr=${stderr}`\n : `codex app-server connection closed (exitCode=${this.lastExitCode})`,\n );\n }\n}\n\nclass CodexAppServerConnectionManager {\n private connection: CodexAppServerConnection | null = null;\n private runner = new SerializedRunner();\n\n async runTurn({\n messages,\n modelConfig,\n stream,\n onChunk,\n params,\n abortSignal,\n imageDetail,\n onRecordEvent,\n }: {\n messages: ChatCompletionMessageParam[];\n modelConfig: IModelConfig;\n stream?: boolean;\n onChunk?: StreamingCallback;\n params?: CodexAppServerParamsResult['config'];\n abortSignal?: AbortSignal;\n imageDetail?: CodexImageDetail;\n onRecordEvent?: (event: CodexAppServerRecordEvent) => void;\n }): Promise<CodexTurnResult> {\n return this.runner.run(async () => {\n const connection = await this.getConnection();\n try {\n return await connection.runTurn({\n messages,\n modelConfig,\n stream,\n onChunk,\n params,\n abortSignal,\n imageDetail,\n onRecordEvent,\n });\n } catch (error) {\n if (connection.isClosed() || !isAbortError(error)) {\n await this.resetConnection();\n }\n throw error;\n }\n });\n }\n\n async shutdownForTests(): Promise<void> {\n await this.resetConnection();\n }\n\n private async getConnection(): Promise<CodexAppServerConnection> {\n if (!this.connection || this.connection.isClosed()) {\n this.connection = await CodexAppServerConnection.create();\n debugCodex('started long-lived codex app-server connection');\n }\n return this.connection;\n }\n\n private async resetConnection(): Promise<void> {\n if (!this.connection) return;\n const staleConnection = this.connection;\n this.connection = null;\n await staleConnection.dispose();\n debugCodex('reset codex app-server connection');\n }\n}\n\nconst codexConnectionManager = new CodexAppServerConnectionManager();\n\nexport async function callAIWithCodexAppServer(\n messages: ChatCompletionMessageParam[],\n modelConfig: IModelConfig,\n options?: {\n stream?: boolean;\n onChunk?: StreamingCallback;\n params?: CodexAppServerParamsResult['config'];\n abortSignal?: AbortSignal;\n imageDetail?: CodexImageDetail;\n onRecordEvent?: (event: CodexAppServerRecordEvent) => void;\n },\n): Promise<CodexTurnResult> {\n if (ifInBrowser) {\n throw new Error(\n 'codex app-server provider is not supported in browser runtime',\n );\n }\n\n return codexConnectionManager.runTurn({\n messages,\n modelConfig,\n stream: options?.stream,\n onChunk: options?.onChunk,\n params: options?.params,\n abortSignal: options?.abortSignal,\n imageDetail: options?.imageDetail,\n onRecordEvent: options?.onRecordEvent,\n });\n}\n\nexport async function __shutdownCodexAppServerForTests() {\n await codexConnectionManager.shutdownForTests();\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","CODEX_PROVIDER_SCHEME","CODEX_DEFAULT_TIMEOUT_MS","CODEX_DEFAULT_PROCESS_START_TIMEOUT_MS","CODEX_DEFAULT_CLEANUP_TIMEOUT_MS","CODEX_TEXT_INPUT_MAX_LENGTH","debugCodex","getDebug","warnCodex","SerializedRunner","work","previous","release","Promise","resolve","isCodexAppServerProvider","baseURL","isAbortError","error","Error","message","String","toNonEmptyString","value","trimmed","undefined","toCodexImageDetail","normalizeCodexLocalImagePath","imageUrl","platform","process","parsed","URL","pathname","decodeURIComponent","host","windowsPath","extractTextFromMessage","content","Array","part","Boolean","extractImageInputs","imageDetailOverride","inputs","partType","imageDetail","path","buildCodexTurnPayloadFromMessages","messages","developerInstructionParts","transcriptParts","imageInputs","role","text","roleTag","fullTranscript","transcriptText","input","developerInstructions","CodexAppServerConnection","ifInBrowser","childProcessModuleName","readlineModuleName","spawn","readline","child","lineReader","Number","connection","modelConfig","stream","onChunk","params","abortSignal","onRecordEvent","timeoutMs","deadlineAt","Date","isStreaming","threadId","turnId","latestErrorMessage","accumulatedText","accumulatedReasoning","latestUsage","emitChunk","reasoning","isComplete","usage","chunk","threadStartParams","threadStartResponse","turnStartParams","turnStartResponse","turnStatus","notification","method","belongsToCurrentTurn","messageText","delta","line","Buffer","code","tokenUsage","picked","requestId","request","result","includePending","JSON","setTimeout","payload","reject","stderr","CodexAppServerConnectionManager","staleConnection","codexConnectionManager","callAIWithCodexAppServer","options","__shutdownCodexAppServerForTests"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-model/service-caller/codex/codex-app-server.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../../../src/ai-model/service-caller/codex/codex-app-server.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { CodeGenerationChunk, StreamingCallback } from '@/types';\nimport type { IModelConfig } from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { ifInBrowser } from '@midscene/shared/utils';\nimport type OpenAI from 'openai';\nimport type { ChatCompletionMessageParam } from 'openai/resources/index';\nimport type { CodexAppServerParamsResult } from '../../model-adapter/types';\n\nconst CODEX_PROVIDER_SCHEME = 'codex://';\nconst CODEX_INTERRUPT_TIMEOUT_MS = 5_000;\nconst CODEX_DEFAULT_PROCESS_START_TIMEOUT_MS = 15 * 1000;\nconst CODEX_DEFAULT_CLEANUP_TIMEOUT_MS = 8 * 1000;\nconst CODEX_TEXT_INPUT_MAX_LENGTH = 256 * 1024;\n\nconst debugCodex = getDebug('ai:call:codex');\nconst warnCodex = getDebug('ai:call:codex', { console: true });\n\ntype JsonRpcRequest = {\n id: string | number;\n method: string;\n params?: unknown;\n};\n\ntype JsonRpcResponse = {\n id: string | number;\n result?: unknown;\n error?: {\n code?: number;\n message?: string;\n data?: unknown;\n };\n};\n\ntype JsonRpcNotification = {\n method: string;\n params?: Record<string, any>;\n};\n\ntype JsonRpcMessage = JsonRpcRequest | JsonRpcResponse | JsonRpcNotification;\n\ntype CodexTextInput = {\n type: 'text';\n text: string;\n text_elements: any[];\n};\n\n// Codex app-server v2 accepts `detail` on both image input variants:\n// https://github.com/openai/codex/blob/main/codex-rs/app-server-protocol/src/protocol/v2/turn.rs#L276-L329\n// Codex has also reported `original` as a supported value in production:\n// https://github.com/openai/codex/issues/24797\ntype CodexImageInput = {\n type: 'image';\n url: string;\n detail?: CodexImageDetail;\n};\n\ntype CodexLocalImageInput = {\n type: 'localImage';\n path: string;\n detail?: CodexImageDetail;\n};\n\ntype CodexTurnInput = CodexTextInput | CodexImageInput | CodexLocalImageInput;\n\ntype CodexImageDetail = 'auto' | 'low' | 'high' | 'original';\n\nexport type CodexAppServerRecordEvent = {\n type: 'request' | 'chunk';\n protocol: Record<string, unknown>;\n};\n\ntype CodexTurnResult = {\n content: string;\n reasoning_content?: string;\n usage?: OpenAI.CompletionUsage;\n isStreamed: boolean;\n protocolMetadata: {\n transport: 'json-rpc';\n threadId: string;\n turnId: string;\n turnStatus: string;\n };\n};\n\ntype CodexTurnStartResponse = {\n turn?: {\n id?: string;\n };\n};\n\ntype CodexThreadStartResponse = {\n thread?: {\n id?: string;\n };\n};\n\ntype CodexUsageNotification = {\n threadId?: string;\n turnId?: string;\n tokenUsage?: {\n total?: {\n totalTokens?: number;\n inputTokens?: number;\n cachedInputTokens?: number;\n outputTokens?: number;\n reasoningOutputTokens?: number;\n };\n last?: {\n totalTokens?: number;\n inputTokens?: number;\n cachedInputTokens?: number;\n outputTokens?: number;\n reasoningOutputTokens?: number;\n };\n };\n};\n\nclass SerializedRunner {\n private tail: Promise<void> = Promise.resolve();\n\n async run<T>(work: () => Promise<T>): Promise<T> {\n const previous = this.tail;\n let release!: () => void;\n this.tail = new Promise<void>((resolve) => {\n release = resolve;\n });\n\n await previous;\n try {\n return await work();\n } finally {\n release();\n }\n }\n}\n\nexport const isCodexAppServerProvider = (baseURL?: string): boolean => {\n if (!baseURL) return false;\n return baseURL.trim().toLowerCase().startsWith(CODEX_PROVIDER_SCHEME);\n};\n\nconst isAbortError = (error: unknown): boolean => {\n if (!error) return false;\n if (error instanceof Error && error.name === 'AbortError') return true;\n const message =\n error instanceof Error ? error.message : String(error ?? 'unknown error');\n return /aborted|abort/i.test(message);\n};\n\nconst toNonEmptyString = (value: unknown): string | undefined => {\n if (typeof value !== 'string') return undefined;\n const trimmed = value.trim();\n return trimmed || undefined;\n};\n\nconst toCodexImageDetail = (value: unknown): CodexImageDetail | undefined =>\n value === 'auto' ||\n value === 'low' ||\n value === 'high' ||\n value === 'original'\n ? value\n : undefined;\n\nexport const normalizeCodexLocalImagePath = (\n imageUrl: string,\n platform: NodeJS.Platform = process.platform,\n): string => {\n if (!imageUrl.startsWith('file://')) {\n return imageUrl;\n }\n\n try {\n const parsed = new URL(imageUrl);\n const pathname = decodeURIComponent(parsed.pathname);\n const host = parsed.hostname.toLowerCase();\n\n if (platform === 'win32') {\n const windowsPath = pathname\n .replace(/\\//g, '\\\\')\n .replace(/^\\\\([A-Za-z]:)/, '$1');\n\n if (host && host !== 'localhost') {\n return `\\\\\\\\${parsed.hostname}${windowsPath}`;\n }\n\n return windowsPath;\n }\n\n if (host && host !== 'localhost') {\n return `//${parsed.hostname}${pathname}`;\n }\n\n return pathname;\n } catch {\n return decodeURIComponent(imageUrl.slice('file://'.length));\n }\n};\n\nconst extractTextFromMessage = (\n message: ChatCompletionMessageParam,\n): string => {\n const content = (message as any).content;\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n return content\n .map((part) => {\n if (!part || typeof part !== 'object') return '';\n\n if (part.type === 'text' && typeof part.text === 'string') {\n return part.text;\n }\n\n if (part.type === 'input_text' && typeof part.text === 'string') {\n return part.text;\n }\n\n return '';\n })\n .filter(Boolean)\n .join('\\n');\n }\n\n return '';\n};\n\nconst extractImageInputs = (\n message: ChatCompletionMessageParam,\n): Array<CodexImageInput | CodexLocalImageInput> => {\n const content = (message as any).content;\n if (!Array.isArray(content)) return [];\n\n const inputs: Array<CodexImageInput | CodexLocalImageInput> = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') continue;\n\n const partType = String(part.type || '');\n const imageUrl =\n partType === 'image_url'\n ? toNonEmptyString(part.image_url?.url)\n : partType === 'input_image'\n ? toNonEmptyString(part.image_url || part.url)\n : undefined;\n const imageDetail = toCodexImageDetail(\n partType === 'image_url' ? part.image_url?.detail : part.detail,\n );\n\n if (!imageUrl) continue;\n\n if (\n imageUrl.startsWith('/') ||\n imageUrl.startsWith('./') ||\n imageUrl.startsWith('../') ||\n imageUrl.startsWith('file://')\n ) {\n const path = imageUrl.startsWith('file://')\n ? normalizeCodexLocalImagePath(imageUrl)\n : imageUrl;\n\n inputs.push({\n type: 'localImage',\n path,\n ...(imageDetail ? { detail: imageDetail } : {}),\n });\n continue;\n }\n\n inputs.push({\n type: 'image',\n url: imageUrl,\n ...(imageDetail ? { detail: imageDetail } : {}),\n });\n }\n\n return inputs;\n};\n\nexport const buildCodexTurnPayloadFromMessages = (\n messages: ChatCompletionMessageParam[],\n): {\n developerInstructions?: string;\n input: CodexTurnInput[];\n} => {\n const developerInstructionParts: string[] = [];\n const transcriptParts: string[] = [];\n const imageInputs: Array<CodexImageInput | CodexLocalImageInput> = [];\n\n for (const message of messages) {\n const role = String((message as any).role || 'user');\n const text = extractTextFromMessage(message);\n\n if (role === 'system') {\n if (text.trim()) developerInstructionParts.push(text.trim());\n continue;\n }\n\n const roleTag = role.toUpperCase();\n if (text.trim()) {\n transcriptParts.push(`[${roleTag}]\\n${text.trim()}`);\n } else {\n transcriptParts.push(`[${roleTag}]\\n(no text content)`);\n }\n\n if (role === 'user') {\n imageInputs.push(...extractImageInputs(message));\n }\n }\n\n const fullTranscript = transcriptParts.join('\\n\\n');\n const transcriptText =\n (fullTranscript.length > CODEX_TEXT_INPUT_MAX_LENGTH\n ? fullTranscript.slice(-CODEX_TEXT_INPUT_MAX_LENGTH)\n : fullTranscript) || 'Please answer the latest user request.';\n\n const input: CodexTurnInput[] = [\n {\n type: 'text',\n text: transcriptText,\n text_elements: [],\n },\n ...imageInputs,\n ];\n\n const developerInstructions = developerInstructionParts.length\n ? developerInstructionParts.join('\\n\\n')\n : undefined;\n\n return {\n developerInstructions,\n input,\n };\n};\n\nclass CodexAppServerConnection {\n private child: any;\n private lineReader: any;\n private pendingMessages: JsonRpcMessage[] = [];\n private lineBuffer: string[] = [];\n private nextRequestId = 1;\n private closed = false;\n private lastExitCode: number | null = null;\n private processErrorMessage: string | null = null;\n private stderrBuffer = '';\n\n private constructor(child: any, lineReader: any) {\n this.child = child;\n this.lineReader = lineReader;\n }\n\n static async create(): Promise<CodexAppServerConnection> {\n if (ifInBrowser) {\n throw new Error(\n 'codex app-server provider is not supported in browser runtime',\n );\n }\n\n const childProcessModuleName = 'node:child_process';\n const readlineModuleName = 'node:readline';\n const { spawn } = await import(childProcessModuleName);\n const readline = await import(readlineModuleName);\n\n const child = spawn('codex', ['app-server'], {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n if (!child.stdin || !child.stdout || !child.stderr) {\n throw new Error('failed to start codex app-server: stdio unavailable');\n }\n\n const lineReader = readline.createInterface({\n input: child.stdout,\n crlfDelay: Number.POSITIVE_INFINITY,\n });\n const connection = new CodexAppServerConnection(child, lineReader);\n connection.detachFromEventLoop();\n connection.attachProcessListeners();\n await connection.initializeHandshake();\n\n return connection;\n }\n\n isClosed(): boolean {\n return this.closed;\n }\n\n async runTurn({\n messages,\n modelConfig,\n stream,\n onChunk,\n params,\n abortSignal,\n onRecordEvent,\n }: {\n messages: ChatCompletionMessageParam[];\n modelConfig: IModelConfig;\n stream?: boolean;\n onChunk?: StreamingCallback;\n params?: CodexAppServerParamsResult['config'];\n abortSignal?: AbortSignal;\n onRecordEvent?: (event: CodexAppServerRecordEvent) => void;\n }): Promise<CodexTurnResult> {\n const isStreaming = !!(stream && onChunk);\n\n const { developerInstructions, input } =\n buildCodexTurnPayloadFromMessages(messages);\n\n let threadId: string | undefined;\n let turnId: string | undefined;\n let latestErrorMessage: string | undefined;\n let accumulatedText = '';\n let accumulatedReasoning = '';\n let latestUsage: OpenAI.CompletionUsage | undefined;\n\n const emitChunk = ({\n content,\n reasoning,\n isComplete,\n usage,\n }: {\n content: string;\n reasoning: string;\n isComplete: boolean;\n usage?: OpenAI.CompletionUsage;\n }) => {\n if (!isStreaming || !onChunk) return;\n const chunk: CodeGenerationChunk = {\n content,\n reasoning_content: reasoning,\n accumulated: accumulatedText,\n isComplete,\n usage,\n };\n onChunk(chunk);\n };\n\n try {\n const threadStartParams = {\n model: modelConfig.modelName,\n cwd: process.cwd(),\n approvalPolicy: 'never',\n sandbox: 'read-only',\n ephemeral: true,\n experimentalRawEvents: false,\n persistExtendedHistory: false,\n developerInstructions: developerInstructions || null,\n };\n onRecordEvent?.({\n type: 'request',\n protocol: {\n direction: 'client',\n method: 'thread/start',\n params: threadStartParams,\n },\n });\n const threadStartResponse = await this.request<CodexThreadStartResponse>({\n method: 'thread/start',\n params: threadStartParams,\n abortSignal,\n });\n onRecordEvent?.({\n type: 'chunk',\n protocol: {\n direction: 'server',\n method: 'thread/start',\n result: threadStartResponse,\n },\n });\n\n threadId = threadStartResponse?.thread?.id;\n if (!threadId) {\n throw new Error('thread/start did not return a thread id');\n }\n\n const turnStartParams = {\n ...params,\n threadId,\n input,\n };\n onRecordEvent?.({\n type: 'request',\n protocol: {\n direction: 'client',\n method: 'turn/start',\n params: turnStartParams,\n },\n });\n const turnStartResponse = await this.request<CodexTurnStartResponse>({\n method: 'turn/start',\n params: turnStartParams,\n abortSignal,\n });\n onRecordEvent?.({\n type: 'chunk',\n protocol: {\n direction: 'server',\n method: 'turn/start',\n result: turnStartResponse,\n },\n });\n\n turnId = turnStartResponse?.turn?.id;\n if (!turnId) {\n throw new Error('turn/start did not return a turn id');\n }\n\n let turnStatus: string | undefined;\n while (!turnStatus) {\n const message = await this.nextMessage({ abortSignal });\n\n if (this.isResponseMessage(message)) {\n // No concurrent requests in adapter runtime.\n continue;\n }\n\n if (this.isRequestMessage(message)) {\n await this.respondToServerRequest(message);\n continue;\n }\n\n const notification = message as JsonRpcNotification;\n const method = notification.method;\n const params = notification.params || {};\n const belongsToCurrentTurn =\n params.threadId === threadId &&\n (params.turnId === turnId || params.turn?.id === turnId);\n\n if (belongsToCurrentTurn) {\n onRecordEvent?.({\n type: 'chunk',\n protocol: {\n direction: 'server',\n method,\n params,\n },\n });\n }\n\n if (method === 'error') {\n const messageText =\n params.error?.message ||\n params.message ||\n 'codex app-server reported turn error';\n latestErrorMessage = String(messageText);\n continue;\n }\n\n if (\n method === 'item/agentMessage/delta' &&\n params.threadId === threadId &&\n params.turnId === turnId\n ) {\n const delta = String(params.delta || '');\n if (delta) {\n accumulatedText += delta;\n emitChunk({\n content: delta,\n reasoning: '',\n isComplete: false,\n });\n }\n continue;\n }\n\n if (\n (method === 'item/reasoning/summaryTextDelta' ||\n method === 'item/reasoning/textDelta') &&\n params.threadId === threadId &&\n params.turnId === turnId\n ) {\n const delta = String(params.delta || '');\n if (delta) {\n accumulatedReasoning += delta;\n emitChunk({\n content: '',\n reasoning: delta,\n isComplete: false,\n });\n }\n continue;\n }\n\n if (\n method === 'item/completed' &&\n params.threadId === threadId &&\n params.turnId === turnId &&\n params.item?.type === 'agentMessage' &&\n typeof params.item?.text === 'string' &&\n !accumulatedText\n ) {\n accumulatedText = params.item.text;\n continue;\n }\n\n if (\n method === 'thread/tokenUsage/updated' &&\n params.threadId === threadId &&\n params.turnId === turnId\n ) {\n latestUsage = this.mapUsage(params as CodexUsageNotification);\n continue;\n }\n\n if (\n method === 'turn/completed' &&\n params.threadId === threadId &&\n params.turn?.id === turnId\n ) {\n turnStatus = String(params.turn.status || '');\n latestErrorMessage =\n params.turn?.error?.message || latestErrorMessage || undefined;\n break;\n }\n }\n\n if (turnStatus !== 'completed') {\n throw new Error(\n latestErrorMessage ||\n `codex turn finished with status \"${turnStatus || 'unknown'}\"`,\n );\n }\n\n if (isStreaming) {\n emitChunk({\n content: '',\n reasoning: '',\n isComplete: true,\n usage: latestUsage,\n });\n }\n\n return {\n content: accumulatedText,\n reasoning_content: accumulatedReasoning || undefined,\n usage: latestUsage,\n isStreamed: isStreaming,\n protocolMetadata: {\n transport: 'json-rpc',\n threadId,\n turnId,\n turnStatus,\n },\n };\n } catch (error) {\n if (isAbortError(error) && threadId && turnId) {\n await this.request({\n method: 'turn/interrupt',\n params: {\n threadId,\n turnId,\n },\n deadlineAt: Date.now() + CODEX_INTERRUPT_TIMEOUT_MS,\n }).catch(() => {});\n }\n throw error;\n } finally {\n if (threadId) {\n await this.request({\n method: 'thread/unsubscribe',\n params: { threadId },\n deadlineAt: Date.now() + CODEX_DEFAULT_CLEANUP_TIMEOUT_MS,\n }).catch((error) => {\n warnCodex(\n `failed to unsubscribe codex thread ${threadId}: ${String(error)}`,\n );\n });\n }\n }\n }\n\n async dispose(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n\n try {\n this.lineReader?.close?.();\n } catch {}\n\n try {\n this.child?.stdin?.end?.();\n } catch {}\n\n try {\n this.child?.kill?.();\n } catch {}\n }\n\n private attachProcessListeners() {\n this.lineReader.on('line', (line: string) => {\n this.lineBuffer.push(line);\n });\n\n this.child.stderr.on('data', (chunk: Buffer | string) => {\n const text = Buffer.isBuffer(chunk)\n ? chunk.toString('utf8')\n : String(chunk);\n this.stderrBuffer += text;\n if (this.stderrBuffer.length > 8192) {\n this.stderrBuffer = this.stderrBuffer.slice(-8192);\n }\n });\n\n this.child.on('exit', (code: number | null) => {\n this.closed = true;\n this.lastExitCode = code;\n });\n\n this.child.on('error', (error: Error) => {\n this.closed = true;\n this.processErrorMessage = error.message;\n });\n }\n\n /**\n * Keep codex process reusable but let short-lived callers exit naturally.\n * Without unref, one-shot scripts/tests that call AI once can hang.\n */\n private detachFromEventLoop() {\n this.child.unref?.();\n this.child.stdin?.unref?.();\n this.child.stdout?.unref?.();\n this.child.stderr?.unref?.();\n }\n\n private async initializeHandshake() {\n const deadlineAt = Date.now() + CODEX_DEFAULT_PROCESS_START_TIMEOUT_MS;\n await this.request({\n method: 'initialize',\n params: {\n clientInfo: {\n name: 'midscene_codex_provider',\n title: 'Midscene Codex Provider',\n version: '1.0.0',\n },\n capabilities: {\n experimentalApi: false,\n },\n },\n deadlineAt,\n });\n await this.sendMessage({\n method: 'initialized',\n });\n }\n\n private mapUsage(\n usage: CodexUsageNotification,\n ): OpenAI.CompletionUsage | undefined {\n const tokenUsage = usage.tokenUsage;\n const picked = tokenUsage?.last || tokenUsage?.total;\n if (!picked) return undefined;\n\n return {\n prompt_tokens: picked.inputTokens ?? 0,\n completion_tokens: picked.outputTokens ?? 0,\n total_tokens: picked.totalTokens ?? 0,\n prompt_tokens_details: { cached_tokens: picked.cachedInputTokens ?? 0 },\n completion_tokens_details: {\n reasoning_tokens: picked.reasoningOutputTokens ?? 0,\n },\n } satisfies OpenAI.CompletionUsage;\n }\n\n private isRequestMessage(message: JsonRpcMessage): message is JsonRpcRequest {\n return (\n typeof (message as any)?.method === 'string' &&\n (message as any)?.id !== undefined\n );\n }\n\n private isResponseMessage(\n message: JsonRpcMessage,\n ): message is JsonRpcResponse {\n return (\n (message as any)?.id !== undefined &&\n ((message as any)?.result !== undefined ||\n (message as any)?.error !== undefined) &&\n typeof (message as any)?.method !== 'string'\n );\n }\n\n private async request<T = unknown>({\n method,\n params,\n deadlineAt,\n abortSignal,\n }: {\n method: string;\n params: unknown;\n deadlineAt?: number;\n abortSignal?: AbortSignal;\n }): Promise<T> {\n abortSignal?.throwIfAborted();\n const requestId = this.nextRequestId++;\n\n await this.sendMessage({\n id: requestId,\n method,\n params,\n });\n\n while (true) {\n const message = await this.nextMessage({\n deadlineAt,\n abortSignal,\n includePending: false,\n });\n\n if (this.isResponseMessage(message) && message.id === requestId) {\n if (message.error) {\n throw new Error(\n `codex app-server ${method} failed: ${\n message.error.message || 'unknown error'\n }`,\n );\n }\n return (message.result || {}) as T;\n }\n\n if (this.isRequestMessage(message)) {\n await this.respondToServerRequest(message);\n continue;\n }\n\n // Keep unmatched notifications/other responses for later stream handling.\n this.pendingMessages.push(message);\n }\n }\n\n private async respondToServerRequest(request: JsonRpcRequest): Promise<void> {\n const requestId = request.id;\n const method = request.method;\n\n let result: unknown = {};\n if (method === 'item/commandExecution/requestApproval') {\n result = { decision: 'decline' };\n } else if (method === 'item/fileChange/requestApproval') {\n result = { decision: 'decline' };\n } else if (method === 'mcpServer/elicitation/request') {\n result = { action: 'cancel', content: null };\n } else if (method === 'item/tool/requestUserInput') {\n result = { answers: [] };\n } else {\n await this.sendMessage({\n id: requestId,\n error: {\n code: -32601,\n message: `unsupported server request: ${method}`,\n },\n });\n return;\n }\n\n await this.sendMessage({\n id: requestId,\n result,\n });\n }\n\n private async nextMessage({\n deadlineAt,\n abortSignal,\n includePending = true,\n }: {\n deadlineAt?: number;\n abortSignal?: AbortSignal;\n includePending?: boolean;\n }): Promise<JsonRpcMessage> {\n if (includePending && this.pendingMessages.length) {\n return this.pendingMessages.shift() as JsonRpcMessage;\n }\n\n while (true) {\n if (abortSignal?.aborted) {\n throw new Error('codex app-server request aborted');\n }\n\n if (deadlineAt && Date.now() > deadlineAt) {\n throw new Error('codex app-server request timed out');\n }\n\n if (this.lineBuffer.length) {\n const line = this.lineBuffer.shift()!;\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let parsed: JsonRpcMessage;\n try {\n parsed = JSON.parse(trimmed);\n } catch (error) {\n warnCodex(\n `ignored non-JSON message from codex app-server: ${trimmed}`,\n );\n continue;\n }\n\n return parsed;\n }\n\n if (this.closed) {\n throw this.createClosedConnectionError();\n }\n\n await new Promise((resolve) => setTimeout(resolve, 20));\n }\n }\n\n private async sendMessage(payload: Record<string, unknown>): Promise<void> {\n if (this.closed) {\n throw this.createClosedConnectionError();\n }\n\n const line = JSON.stringify(payload);\n await new Promise<void>((resolve, reject) => {\n this.child.stdin.write(`${line}\\n`, (error: Error | null | undefined) => {\n if (error) {\n reject(\n new Error(\n `failed writing to codex app-server stdin: ${error.message}`,\n ),\n );\n return;\n }\n resolve();\n });\n });\n }\n\n private createClosedConnectionError(): Error {\n const stderr = this.stderrBuffer.trim();\n if (this.processErrorMessage) {\n return new Error(\n stderr\n ? `codex app-server process error: ${this.processErrorMessage}. stderr=${stderr}`\n : `codex app-server process error: ${this.processErrorMessage}`,\n );\n }\n\n return new Error(\n stderr\n ? `codex app-server connection closed (exitCode=${this.lastExitCode}). stderr=${stderr}`\n : `codex app-server connection closed (exitCode=${this.lastExitCode})`,\n );\n }\n}\n\nclass CodexAppServerConnectionManager {\n private connection: CodexAppServerConnection | null = null;\n private runner = new SerializedRunner();\n\n async runTurn({\n messages,\n modelConfig,\n stream,\n onChunk,\n params,\n abortSignal,\n onRecordEvent,\n }: {\n messages: ChatCompletionMessageParam[];\n modelConfig: IModelConfig;\n stream?: boolean;\n onChunk?: StreamingCallback;\n params?: CodexAppServerParamsResult['config'];\n abortSignal?: AbortSignal;\n onRecordEvent?: (event: CodexAppServerRecordEvent) => void;\n }): Promise<CodexTurnResult> {\n return this.runner.run(async () => {\n abortSignal?.throwIfAborted();\n const connection = await this.getConnection();\n abortSignal?.throwIfAborted();\n try {\n return await connection.runTurn({\n messages,\n modelConfig,\n stream,\n onChunk,\n params,\n abortSignal,\n onRecordEvent,\n });\n } catch (error) {\n if (connection.isClosed() || !isAbortError(error)) {\n await this.resetConnection();\n }\n throw error;\n }\n });\n }\n\n async shutdownForTests(): Promise<void> {\n await this.resetConnection();\n }\n\n private async getConnection(): Promise<CodexAppServerConnection> {\n if (!this.connection || this.connection.isClosed()) {\n this.connection = await CodexAppServerConnection.create();\n debugCodex('started long-lived codex app-server connection');\n }\n return this.connection;\n }\n\n private async resetConnection(): Promise<void> {\n if (!this.connection) return;\n const staleConnection = this.connection;\n this.connection = null;\n await staleConnection.dispose();\n debugCodex('reset codex app-server connection');\n }\n}\n\nconst codexConnectionManager = new CodexAppServerConnectionManager();\n\nexport async function callAIWithCodexAppServer(\n messages: ChatCompletionMessageParam[],\n modelConfig: IModelConfig,\n options?: {\n stream?: boolean;\n onChunk?: StreamingCallback;\n params?: CodexAppServerParamsResult['config'];\n abortSignal?: AbortSignal;\n onRecordEvent?: (event: CodexAppServerRecordEvent) => void;\n },\n): Promise<CodexTurnResult> {\n if (ifInBrowser) {\n throw new Error(\n 'codex app-server provider is not supported in browser runtime',\n );\n }\n\n return codexConnectionManager.runTurn({\n messages,\n modelConfig,\n stream: options?.stream,\n onChunk: options?.onChunk,\n params: options?.params,\n abortSignal: options?.abortSignal,\n onRecordEvent: options?.onRecordEvent,\n });\n}\n\nexport async function __shutdownCodexAppServerForTests() {\n await codexConnectionManager.shutdownForTests();\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","CODEX_PROVIDER_SCHEME","CODEX_INTERRUPT_TIMEOUT_MS","CODEX_DEFAULT_PROCESS_START_TIMEOUT_MS","CODEX_DEFAULT_CLEANUP_TIMEOUT_MS","CODEX_TEXT_INPUT_MAX_LENGTH","debugCodex","getDebug","warnCodex","SerializedRunner","work","previous","release","Promise","resolve","isCodexAppServerProvider","baseURL","isAbortError","error","Error","message","String","toNonEmptyString","value","trimmed","undefined","toCodexImageDetail","normalizeCodexLocalImagePath","imageUrl","platform","process","parsed","URL","pathname","decodeURIComponent","host","windowsPath","extractTextFromMessage","content","Array","part","Boolean","extractImageInputs","inputs","partType","imageDetail","path","buildCodexTurnPayloadFromMessages","messages","developerInstructionParts","transcriptParts","imageInputs","role","text","roleTag","fullTranscript","transcriptText","input","developerInstructions","CodexAppServerConnection","ifInBrowser","childProcessModuleName","readlineModuleName","spawn","readline","child","lineReader","Number","connection","modelConfig","stream","onChunk","params","abortSignal","onRecordEvent","isStreaming","threadId","turnId","latestErrorMessage","accumulatedText","accumulatedReasoning","latestUsage","emitChunk","reasoning","isComplete","usage","chunk","threadStartParams","threadStartResponse","turnStartParams","turnStartResponse","turnStatus","notification","method","belongsToCurrentTurn","messageText","delta","Date","line","Buffer","code","deadlineAt","tokenUsage","picked","requestId","request","result","includePending","JSON","setTimeout","payload","reject","stderr","CodexAppServerConnectionManager","staleConnection","codexConnectionManager","callAIWithCodexAppServer","options","__shutdownCodexAppServerForTests"],"mappings":"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"}
|
|
@@ -24,19 +24,19 @@ var __webpack_require__ = {};
|
|
|
24
24
|
var __webpack_exports__ = {};
|
|
25
25
|
__webpack_require__.r(__webpack_exports__);
|
|
26
26
|
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
-
callAIWithObjectResponse: ()=>
|
|
27
|
+
callAIWithObjectResponse: ()=>external_model_call_js_namespaceObject.callAIWithObjectResponse,
|
|
28
28
|
extractJSONFromCodeBlock: ()=>json_js_namespaceObject.extractJSONFromCodeBlock,
|
|
29
|
-
parseAIObjectResponse: ()=>
|
|
30
|
-
callAI: ()=>
|
|
29
|
+
parseAIObjectResponse: ()=>external_model_call_js_namespaceObject.parseAIObjectResponse,
|
|
30
|
+
callAI: ()=>external_call_ai_js_namespaceObject.callAI,
|
|
31
31
|
parseModelResponseJson: ()=>json_js_namespaceObject.parseModelResponseJson,
|
|
32
|
-
createChatClient: ()=>
|
|
32
|
+
createChatClient: ()=>openai_client_js_namespaceObject.createChatClient,
|
|
33
33
|
AIResponseParseError: ()=>external_utils_js_namespaceObject.AIResponseParseError,
|
|
34
34
|
INTERNAL_CALL_ID_FIELD: ()=>external_utils_js_namespaceObject.INTERNAL_CALL_ID_FIELD,
|
|
35
|
-
callAIWithStringResponse: ()=>
|
|
35
|
+
callAIWithStringResponse: ()=>external_model_call_js_namespaceObject.callAIWithStringResponse
|
|
36
36
|
});
|
|
37
|
+
const external_model_call_js_namespaceObject = require("./model-call.js");
|
|
37
38
|
const external_call_ai_js_namespaceObject = require("./call-ai.js");
|
|
38
|
-
const
|
|
39
|
-
const external_openai_client_js_namespaceObject = require("./openai-client.js");
|
|
39
|
+
const openai_client_js_namespaceObject = require("./openai/openai-client.js");
|
|
40
40
|
const external_utils_js_namespaceObject = require("./utils.js");
|
|
41
41
|
const json_js_namespaceObject = require("../shared/json.js");
|
|
42
42
|
exports.AIResponseParseError = __webpack_exports__.AIResponseParseError;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
callAIWithStringResponse: ()=>callAIWithStringResponse,
|
|
28
|
+
callAIWithObjectResponse: ()=>callAIWithObjectResponse,
|
|
29
|
+
parseAIObjectResponse: ()=>parseAIObjectResponse
|
|
30
|
+
});
|
|
31
|
+
const utils_namespaceObject = require("@midscene/shared/utils");
|
|
32
|
+
const json_js_namespaceObject = require("../shared/json.js");
|
|
33
|
+
const external_call_ai_js_namespaceObject = require("./call-ai.js");
|
|
34
|
+
const external_semantic_retry_js_namespaceObject = require("./semantic-retry.js");
|
|
35
|
+
const external_utils_js_namespaceObject = require("./utils.js");
|
|
36
|
+
function parseAIObjectResponse(response, modelRuntime, jsonParserSource = 'generic-object') {
|
|
37
|
+
const { adapter } = modelRuntime;
|
|
38
|
+
(0, utils_namespaceObject.assert)(response, 'empty response');
|
|
39
|
+
const jsonContent = adapter.jsonParser(response.content, {
|
|
40
|
+
source: jsonParserSource
|
|
41
|
+
});
|
|
42
|
+
(0, json_js_namespaceObject.assertJsonObject)(jsonContent);
|
|
43
|
+
return {
|
|
44
|
+
content: jsonContent,
|
|
45
|
+
contentString: response.content,
|
|
46
|
+
usage: response.usage,
|
|
47
|
+
reasoning_content: response.reasoning_content,
|
|
48
|
+
rawChoiceMessage: response.rawChoiceMessage
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async function callAIWithObjectResponse(messages, modelRuntime, options) {
|
|
52
|
+
const { config: modelConfig } = modelRuntime;
|
|
53
|
+
return (0, external_semantic_retry_js_namespaceObject.callAiAndParseWithRetry)({
|
|
54
|
+
callAi: (retryAttempt, previousParseError)=>(0, external_call_ai_js_namespaceObject.callAI)((0, external_semantic_retry_js_namespaceObject.withSemanticRetryFeedback)(messages, previousParseError), modelRuntime, {
|
|
55
|
+
abortSignal: options?.abortSignal,
|
|
56
|
+
expectedJsonObjectResponse: true,
|
|
57
|
+
semanticRetryAttempt: retryAttempt
|
|
58
|
+
}),
|
|
59
|
+
parseResponse: (response)=>parseAIObjectResponse(response, modelRuntime, options?.jsonParserSource),
|
|
60
|
+
toParseError: (error, response)=>{
|
|
61
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
62
|
+
return new external_utils_js_namespaceObject.AIResponseParseError(errorMessage, response.content, response.usage, response.rawChoiceMessage, response.reasoning_content);
|
|
63
|
+
},
|
|
64
|
+
parseRetryTimes: options?.retryTimes ?? modelConfig.retryCount,
|
|
65
|
+
parseRetryInterval: options?.retryInterval ?? modelConfig.retryInterval,
|
|
66
|
+
abortSignal: options?.abortSignal
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async function callAIWithStringResponse(msgs, modelRuntime, options) {
|
|
70
|
+
const { content, usage, rawChoiceMessage } = await (0, external_call_ai_js_namespaceObject.callAI)(msgs, modelRuntime, options);
|
|
71
|
+
return {
|
|
72
|
+
content,
|
|
73
|
+
usage,
|
|
74
|
+
rawChoiceMessage
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
exports.callAIWithObjectResponse = __webpack_exports__.callAIWithObjectResponse;
|
|
78
|
+
exports.callAIWithStringResponse = __webpack_exports__.callAIWithStringResponse;
|
|
79
|
+
exports.parseAIObjectResponse = __webpack_exports__.parseAIObjectResponse;
|
|
80
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
81
|
+
"callAIWithObjectResponse",
|
|
82
|
+
"callAIWithStringResponse",
|
|
83
|
+
"parseAIObjectResponse"
|
|
84
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
85
|
+
Object.defineProperty(exports, '__esModule', {
|
|
86
|
+
value: true
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
//# sourceMappingURL=model-call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-model/service-caller/model-call.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../../src/ai-model/service-caller/model-call.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { AIUsageInfo } from '@/types';\nimport { assert } from '@midscene/shared/utils';\nimport type { ChatCompletionMessageParam } from 'openai/resources/index';\nimport type { ModelRuntime } from '../models';\nimport { type JsonParserSource, assertJsonObject } from '../shared/json';\nimport { callAI } from './call-ai';\nimport {\n callAiAndParseWithRetry,\n withSemanticRetryFeedback,\n} from './semantic-retry';\nimport type { CallAIOptions } from './types';\nimport type { AIArgs } from './types';\nimport { AIResponseParseError } from './utils';\n\nexport type AIObjectResponse<T> = {\n // TODO: `content` is a misleading name here because this is already the parsed object response. Consider renaming it to `object` or `data`.\n content: T;\n contentString: string;\n usage?: AIUsageInfo;\n reasoning_content?: string;\n rawChoiceMessage?: unknown;\n};\n\nexport function parseAIObjectResponse<T>(\n response: Awaited<ReturnType<typeof callAI>>,\n modelRuntime: ModelRuntime,\n jsonParserSource: JsonParserSource = 'generic-object',\n): AIObjectResponse<T> {\n const { adapter } = modelRuntime;\n assert(response, 'empty response');\n const jsonContent = adapter.jsonParser(response.content, {\n source: jsonParserSource,\n });\n assertJsonObject(jsonContent);\n return {\n content: jsonContent as T,\n contentString: response.content,\n usage: response.usage,\n reasoning_content: response.reasoning_content,\n rawChoiceMessage: response.rawChoiceMessage,\n };\n}\n\nexport async function callAIWithObjectResponse<T>(\n messages: ChatCompletionMessageParam[],\n modelRuntime: ModelRuntime,\n options?: {\n abortSignal?: AbortSignal;\n jsonParserSource?: JsonParserSource;\n retryTimes?: number;\n retryInterval?: number;\n },\n): Promise<AIObjectResponse<T>> {\n const { config: modelConfig } = modelRuntime;\n return callAiAndParseWithRetry({\n callAi: (retryAttempt, previousParseError) =>\n callAI(\n withSemanticRetryFeedback(messages, previousParseError),\n modelRuntime,\n {\n abortSignal: options?.abortSignal,\n expectedJsonObjectResponse: true,\n semanticRetryAttempt: retryAttempt,\n },\n ),\n parseResponse: (response) =>\n parseAIObjectResponse<T>(\n response,\n modelRuntime,\n options?.jsonParserSource,\n ),\n toParseError: (error, response) => {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n return new AIResponseParseError(\n errorMessage,\n response.content,\n response.usage,\n response.rawChoiceMessage,\n response.reasoning_content,\n );\n },\n parseRetryTimes: options?.retryTimes ?? modelConfig.retryCount,\n parseRetryInterval: options?.retryInterval ?? modelConfig.retryInterval,\n abortSignal: options?.abortSignal,\n });\n}\n\nexport async function callAIWithStringResponse(\n msgs: AIArgs,\n modelRuntime: ModelRuntime,\n options?: Pick<CallAIOptions, 'abortSignal' | 'requiresOriginalImageDetail'>,\n): Promise<{\n content: string;\n usage?: AIUsageInfo;\n rawChoiceMessage?: unknown;\n}> {\n const { content, usage, rawChoiceMessage } = await callAI(\n msgs,\n modelRuntime,\n options,\n );\n return { content, usage, rawChoiceMessage };\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","parseAIObjectResponse","response","modelRuntime","jsonParserSource","adapter","assert","jsonContent","assertJsonObject","callAIWithObjectResponse","messages","options","modelConfig","callAiAndParseWithRetry","retryAttempt","previousParseError","callAI","withSemanticRetryFeedback","error","errorMessage","Error","String","AIResponseParseError","callAIWithStringResponse","msgs","content","usage","rawChoiceMessage"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;ACiBO,SAASI,sBACdC,QAA4C,EAC5CC,YAA0B,EAC1BC,mBAAqC,gBAAgB;IAErD,MAAM,EAAEC,OAAO,EAAE,GAAGF;IACpBG,IAAAA,sBAAAA,MAAAA,AAAAA,EAAOJ,UAAU;IACjB,MAAMK,cAAcF,QAAQ,UAAU,CAACH,SAAS,OAAO,EAAE;QACvD,QAAQE;IACV;IACAI,IAAAA,wBAAAA,gBAAAA,AAAAA,EAAiBD;IACjB,OAAO;QACL,SAASA;QACT,eAAeL,SAAS,OAAO;QAC/B,OAAOA,SAAS,KAAK;QACrB,mBAAmBA,SAAS,iBAAiB;QAC7C,kBAAkBA,SAAS,gBAAgB;IAC7C;AACF;AAEO,eAAeO,yBACpBC,QAAsC,EACtCP,YAA0B,EAC1BQ,OAKC;IAED,MAAM,EAAE,QAAQC,WAAW,EAAE,GAAGT;IAChC,OAAOU,AAAAA,IAAAA,2CAAAA,uBAAAA,AAAAA,EAAwB;QAC7B,QAAQ,CAACC,cAAcC,qBACrBC,AAAAA,IAAAA,oCAAAA,MAAAA,AAAAA,EACEC,AAAAA,IAAAA,2CAAAA,yBAAAA,AAAAA,EAA0BP,UAAUK,qBACpCZ,cACA;gBACE,aAAaQ,SAAS;gBACtB,4BAA4B;gBAC5B,sBAAsBG;YACxB;QAEJ,eAAe,CAACZ,WACdD,sBACEC,UACAC,cACAQ,SAAS;QAEb,cAAc,CAACO,OAAOhB;YACpB,MAAMiB,eACJD,iBAAiBE,QAAQF,MAAM,OAAO,GAAGG,OAAOH;YAClD,OAAO,IAAII,kCAAAA,oBAAoBA,CAC7BH,cACAjB,SAAS,OAAO,EAChBA,SAAS,KAAK,EACdA,SAAS,gBAAgB,EACzBA,SAAS,iBAAiB;QAE9B;QACA,iBAAiBS,SAAS,cAAcC,YAAY,UAAU;QAC9D,oBAAoBD,SAAS,iBAAiBC,YAAY,aAAa;QACvE,aAAaD,SAAS;IACxB;AACF;AAEO,eAAeY,yBACpBC,IAAY,EACZrB,YAA0B,EAC1BQ,OAA4E;IAM5E,MAAM,EAAEc,OAAO,EAAEC,KAAK,EAAEC,gBAAgB,EAAE,GAAG,MAAMX,AAAAA,IAAAA,oCAAAA,MAAAA,AAAAA,EACjDQ,MACArB,cACAQ;IAEF,OAAO;QAAEc;QAASC;QAAOC;IAAiB;AAC5C"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
callOpenAI: ()=>callOpenAI
|
|
28
|
+
});
|
|
29
|
+
const logger_namespaceObject = require("@midscene/shared/logger");
|
|
30
|
+
const external_utils_js_namespaceObject = require("../utils.js");
|
|
31
|
+
const chat_completion_js_namespaceObject = require("./chat-completion/chat-completion.js");
|
|
32
|
+
const external_openai_client_js_namespaceObject = require("./openai-client.js");
|
|
33
|
+
const external_openai_request_context_js_namespaceObject = require("./openai-request-context.js");
|
|
34
|
+
async function callOpenAI({ modelRuntime, options, executionId, recordEvent, requestSignal, effectiveTimeoutMs }, prepared) {
|
|
35
|
+
const { config: modelConfig } = modelRuntime;
|
|
36
|
+
const { modelName } = modelConfig;
|
|
37
|
+
const { completion, openAIRequestContext } = await (0, external_openai_client_js_namespaceObject.createChatClient)({
|
|
38
|
+
modelConfig,
|
|
39
|
+
proxyAgent: prepared.proxyAgent,
|
|
40
|
+
effectiveTimeoutMs,
|
|
41
|
+
executionId,
|
|
42
|
+
recordEvent
|
|
43
|
+
});
|
|
44
|
+
const isStreaming = options?.stream === true;
|
|
45
|
+
const debugCall = (0, logger_namespaceObject.getDebug)('ai:call');
|
|
46
|
+
debugCall(`sending ${isStreaming ? 'streaming ' : ''}request to ${modelName}`);
|
|
47
|
+
const requestOptions = {
|
|
48
|
+
requestSignal,
|
|
49
|
+
openAIRequestContext,
|
|
50
|
+
onChunk: options?.onChunk,
|
|
51
|
+
recordEvent
|
|
52
|
+
};
|
|
53
|
+
try {
|
|
54
|
+
const startTime = Date.now();
|
|
55
|
+
const response = await (0, chat_completion_js_namespaceObject.callChatCompletion)({
|
|
56
|
+
...requestOptions,
|
|
57
|
+
completion,
|
|
58
|
+
modelRuntime,
|
|
59
|
+
messages: prepared.messages,
|
|
60
|
+
requestBodyParams: prepared.requestParams
|
|
61
|
+
}, isStreaming);
|
|
62
|
+
const { reasoningContent, ...result } = response;
|
|
63
|
+
requestSignal.throwIfAborted();
|
|
64
|
+
const timeCost = Date.now() - startTime;
|
|
65
|
+
debugCall(`response reasoning content: ${reasoningContent}`);
|
|
66
|
+
debugCall(`response content: ${result.content}`);
|
|
67
|
+
recordEvent?.({
|
|
68
|
+
type: 'response',
|
|
69
|
+
http: openAIRequestContext.httpResponse,
|
|
70
|
+
final: {
|
|
71
|
+
content: result.content,
|
|
72
|
+
reasoningContent,
|
|
73
|
+
usage: result.rawUsage,
|
|
74
|
+
requestId: result.requestId,
|
|
75
|
+
timeCost,
|
|
76
|
+
responseModelName: result.responseModelName
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
...result,
|
|
81
|
+
reasoning_content: reasoningContent,
|
|
82
|
+
isStreamed: isStreaming,
|
|
83
|
+
timeCost
|
|
84
|
+
};
|
|
85
|
+
} catch (error) {
|
|
86
|
+
(0, logger_namespaceObject.getDebug)('ai:call', {
|
|
87
|
+
console: true
|
|
88
|
+
})('call AI error', error);
|
|
89
|
+
if (error instanceof external_utils_js_namespaceObject.AIResponseParseError) throw error;
|
|
90
|
+
throw new Error(`failed to call ${isStreaming ? 'streaming ' : ''}AI model service (${modelName}): ${error.message}${(0, external_openai_request_context_js_namespaceObject.formatOpenAIAPIErrorDetails)(error, openAIRequestContext)}\nTrouble shooting: https://midscenejs.com/model-provider.html`, {
|
|
91
|
+
cause: error
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.callOpenAI = __webpack_exports__.callOpenAI;
|
|
96
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
97
|
+
"callOpenAI"
|
|
98
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
99
|
+
Object.defineProperty(exports, '__esModule', {
|
|
100
|
+
value: true
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
//# sourceMappingURL=call-openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-model/service-caller/openai/call-openai.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../../../src/ai-model/service-caller/openai/call-openai.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { getDebug } from '@midscene/shared/logger';\nimport type {\n ModelCallContext,\n ModelCallResult,\n OpenAIProtocolCallOptions,\n} from '../types';\nimport { AIResponseParseError } from '../utils';\nimport {\n callChatCompletion,\n type prepareChatCompletion,\n} from './chat-completion/chat-completion';\nimport { createChatClient } from './openai-client';\nimport { formatOpenAIAPIErrorDetails } from './openai-request-context';\n\nexport async function callOpenAI(\n {\n modelRuntime,\n options,\n executionId,\n recordEvent,\n requestSignal,\n effectiveTimeoutMs,\n }: ModelCallContext,\n prepared: Awaited<ReturnType<typeof prepareChatCompletion>>,\n): Promise<ModelCallResult> {\n const { config: modelConfig } = modelRuntime;\n const { modelName } = modelConfig;\n const { completion, openAIRequestContext } = await createChatClient({\n modelConfig,\n proxyAgent: prepared.proxyAgent,\n effectiveTimeoutMs,\n executionId,\n recordEvent,\n });\n const isStreaming = options?.stream === true;\n const debugCall = getDebug('ai:call');\n debugCall(\n `sending ${isStreaming ? 'streaming ' : ''}request to ${modelName}`,\n );\n const requestOptions: OpenAIProtocolCallOptions = {\n requestSignal,\n openAIRequestContext,\n onChunk: options?.onChunk,\n recordEvent,\n };\n try {\n const startTime = Date.now();\n const response = await callChatCompletion(\n {\n ...requestOptions,\n completion,\n modelRuntime,\n messages: prepared.messages,\n requestBodyParams: prepared.requestParams,\n },\n isStreaming,\n );\n const { reasoningContent, ...result } = response;\n requestSignal.throwIfAborted();\n const timeCost = Date.now() - startTime;\n debugCall(`response reasoning content: ${reasoningContent}`);\n debugCall(`response content: ${result.content}`);\n recordEvent?.({\n type: 'response',\n http: openAIRequestContext.httpResponse,\n final: {\n content: result.content,\n reasoningContent,\n usage: result.rawUsage,\n requestId: result.requestId,\n timeCost,\n responseModelName: result.responseModelName,\n },\n });\n return {\n ...result,\n reasoning_content: reasoningContent,\n isStreamed: isStreaming,\n timeCost,\n };\n } catch (error: any) {\n getDebug('ai:call', { console: true })('call AI error', error);\n if (error instanceof AIResponseParseError) {\n throw error;\n }\n throw new Error(\n `failed to call ${isStreaming ? 'streaming ' : ''}AI model service (${modelName}): ${error.message}${formatOpenAIAPIErrorDetails(error, openAIRequestContext)}\\nTrouble shooting: https://midscenejs.com/model-provider.html`,\n { cause: error },\n );\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","callOpenAI","modelRuntime","options","executionId","recordEvent","requestSignal","effectiveTimeoutMs","prepared","modelConfig","modelName","completion","openAIRequestContext","createChatClient","isStreaming","debugCall","getDebug","requestOptions","startTime","Date","response","callChatCompletion","reasoningContent","result","timeCost","error","AIResponseParseError","Error","formatOpenAIAPIErrorDetails"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;ACQO,eAAeI,WACpB,EACEC,YAAY,EACZC,OAAO,EACPC,WAAW,EACXC,WAAW,EACXC,aAAa,EACbC,kBAAkB,EACD,EACnBC,QAA2D;IAE3D,MAAM,EAAE,QAAQC,WAAW,EAAE,GAAGP;IAChC,MAAM,EAAEQ,SAAS,EAAE,GAAGD;IACtB,MAAM,EAAEE,UAAU,EAAEC,oBAAoB,EAAE,GAAG,MAAMC,AAAAA,IAAAA,0CAAAA,gBAAAA,AAAAA,EAAiB;QAClEJ;QACA,YAAYD,SAAS,UAAU;QAC/BD;QACAH;QACAC;IACF;IACA,MAAMS,cAAcX,SAAS,WAAW;IACxC,MAAMY,YAAYC,AAAAA,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS;IAC3BD,UACE,CAAC,QAAQ,EAAED,cAAc,eAAe,GAAG,WAAW,EAAEJ,WAAW;IAErE,MAAMO,iBAA4C;QAChDX;QACAM;QACA,SAAST,SAAS;QAClBE;IACF;IACA,IAAI;QACF,MAAMa,YAAYC,KAAK,GAAG;QAC1B,MAAMC,WAAW,MAAMC,AAAAA,IAAAA,mCAAAA,kBAAAA,AAAAA,EACrB;YACE,GAAGJ,cAAc;YACjBN;YACAT;YACA,UAAUM,SAAS,QAAQ;YAC3B,mBAAmBA,SAAS,aAAa;QAC3C,GACAM;QAEF,MAAM,EAAEQ,gBAAgB,EAAE,GAAGC,QAAQ,GAAGH;QACxCd,cAAc,cAAc;QAC5B,MAAMkB,WAAWL,KAAK,GAAG,KAAKD;QAC9BH,UAAU,CAAC,4BAA4B,EAAEO,kBAAkB;QAC3DP,UAAU,CAAC,kBAAkB,EAAEQ,OAAO,OAAO,EAAE;QAC/ClB,cAAc;YACZ,MAAM;YACN,MAAMO,qBAAqB,YAAY;YACvC,OAAO;gBACL,SAASW,OAAO,OAAO;gBACvBD;gBACA,OAAOC,OAAO,QAAQ;gBACtB,WAAWA,OAAO,SAAS;gBAC3BC;gBACA,mBAAmBD,OAAO,iBAAiB;YAC7C;QACF;QACA,OAAO;YACL,GAAGA,MAAM;YACT,mBAAmBD;YACnB,YAAYR;YACZU;QACF;IACF,EAAE,OAAOC,OAAY;QACnBT,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS,WAAW;YAAE,SAAS;QAAK,GAAG,iBAAiBS;QACxD,IAAIA,iBAAiBC,kCAAAA,oBAAoBA,EACvC,MAAMD;QAER,MAAM,IAAIE,MACR,CAAC,eAAe,EAAEb,cAAc,eAAe,GAAG,kBAAkB,EAAEJ,UAAU,GAAG,EAAEe,MAAM,OAAO,GAAGG,AAAAA,IAAAA,mDAAAA,2BAAAA,AAAAA,EAA4BH,OAAOb,sBAAsB,8DAA8D,CAAC,EAC7N;YAAE,OAAOa;QAAM;IAEnB;AACF"}
|