@prompty/openai 2.0.0-alpha.3 → 2.0.0-alpha.5
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/index.cjs +139 -59
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +116 -36
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
package/dist/index.cjs
CHANGED
|
@@ -43,11 +43,13 @@ module.exports = __toCommonJS(index_exports);
|
|
|
43
43
|
|
|
44
44
|
// src/executor.ts
|
|
45
45
|
var import_openai = __toESM(require("openai"), 1);
|
|
46
|
-
var import_core = require("@prompty/core");
|
|
47
46
|
var import_core2 = require("@prompty/core");
|
|
48
47
|
var import_core3 = require("@prompty/core");
|
|
48
|
+
var import_core4 = require("@prompty/core");
|
|
49
49
|
|
|
50
50
|
// src/wire.ts
|
|
51
|
+
var import_core = require("@prompty/core");
|
|
52
|
+
var import_node_path = require("path");
|
|
51
53
|
function messageToWire(msg) {
|
|
52
54
|
const wire = { role: msg.role };
|
|
53
55
|
for (const [k, v] of Object.entries(msg.metadata)) {
|
|
@@ -77,13 +79,26 @@ function partToWire(part) {
|
|
|
77
79
|
type: "input_audio",
|
|
78
80
|
input_audio: {
|
|
79
81
|
data: part.source,
|
|
80
|
-
...part.mediaType && { format: part.mediaType }
|
|
82
|
+
...part.mediaType && { format: mimeToAudioFormat(part.mediaType) }
|
|
81
83
|
}
|
|
82
84
|
};
|
|
83
85
|
case "file":
|
|
84
86
|
return { type: "file", file: { url: part.source } };
|
|
85
87
|
}
|
|
86
88
|
}
|
|
89
|
+
var AUDIO_MIME_MAP = {
|
|
90
|
+
"audio/wav": "wav",
|
|
91
|
+
"audio/mpeg": "mp3",
|
|
92
|
+
"audio/mp3": "mp3",
|
|
93
|
+
"audio/mp4": "mp4",
|
|
94
|
+
"audio/ogg": "ogg",
|
|
95
|
+
"audio/flac": "flac",
|
|
96
|
+
"audio/webm": "webm",
|
|
97
|
+
"audio/pcm": "pcm"
|
|
98
|
+
};
|
|
99
|
+
function mimeToAudioFormat(mediaType) {
|
|
100
|
+
return AUDIO_MIME_MAP[mediaType.toLowerCase()] ?? mediaType;
|
|
101
|
+
}
|
|
87
102
|
function buildChatArgs(agent, messages) {
|
|
88
103
|
const model = agent.model?.id || "gpt-4";
|
|
89
104
|
const wireMessages = messages.map(messageToWire);
|
|
@@ -115,11 +130,11 @@ function buildEmbeddingArgs(agent, data) {
|
|
|
115
130
|
}
|
|
116
131
|
return String(item);
|
|
117
132
|
});
|
|
118
|
-
input = texts;
|
|
133
|
+
input = texts.length === 1 ? texts[0] : texts;
|
|
119
134
|
} else if (typeof data === "string") {
|
|
120
|
-
input =
|
|
135
|
+
input = data;
|
|
121
136
|
} else {
|
|
122
|
-
input =
|
|
137
|
+
input = String(data);
|
|
123
138
|
}
|
|
124
139
|
const args = { input, model };
|
|
125
140
|
const extra = agent.model?.options?.additionalProperties;
|
|
@@ -234,24 +249,64 @@ function toolsToWire(agent) {
|
|
|
234
249
|
if (!tools || tools.length === 0) return [];
|
|
235
250
|
const result = [];
|
|
236
251
|
for (const t of tools) {
|
|
237
|
-
if (t.kind
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
252
|
+
if (t.kind === "function") {
|
|
253
|
+
const funcDef = { name: t.name };
|
|
254
|
+
if (t.description) funcDef.description = t.description;
|
|
255
|
+
const boundNames = new Set((t.bindings ?? []).map((b) => b.name));
|
|
256
|
+
let params = t.parameters;
|
|
257
|
+
if (params && Array.isArray(params)) {
|
|
258
|
+
if (boundNames.size > 0) {
|
|
259
|
+
params = params.filter((p) => !boundNames.has(p.name));
|
|
260
|
+
}
|
|
261
|
+
funcDef.parameters = schemaToWire(params);
|
|
262
|
+
}
|
|
263
|
+
const strict = t.strict;
|
|
264
|
+
if (strict) {
|
|
265
|
+
funcDef.strict = true;
|
|
266
|
+
if (funcDef.parameters) {
|
|
267
|
+
funcDef.parameters.additionalProperties = false;
|
|
268
|
+
}
|
|
249
269
|
}
|
|
270
|
+
result.push({ type: "function", function: funcDef });
|
|
271
|
+
} else if (t.kind === "prompty") {
|
|
272
|
+
const funcDef = projectPromptyTool(t, agent);
|
|
273
|
+
result.push({ type: "function", function: funcDef });
|
|
250
274
|
}
|
|
251
|
-
result.push({ type: "function", function: funcDef });
|
|
252
275
|
}
|
|
253
276
|
return result;
|
|
254
277
|
}
|
|
278
|
+
function projectPromptyTool(tool, parent) {
|
|
279
|
+
const toolPath = tool.path;
|
|
280
|
+
if (!toolPath) {
|
|
281
|
+
throw new Error(`PromptyTool '${tool.name}' has no path`);
|
|
282
|
+
}
|
|
283
|
+
const parentPath = (parent.metadata ?? {}).__source_path;
|
|
284
|
+
if (!parentPath) {
|
|
285
|
+
throw new Error(
|
|
286
|
+
`Cannot resolve PromptyTool '${tool.name}': parent agent has no __source_path in metadata`
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
const childPath = (0, import_node_path.resolve)((0, import_node_path.dirname)(parentPath), toolPath);
|
|
290
|
+
const child = (0, import_core.load)(childPath);
|
|
291
|
+
const funcDef = { name: tool.name };
|
|
292
|
+
funcDef.description = tool.description || child.description || "";
|
|
293
|
+
const bindings = tool.bindings;
|
|
294
|
+
const boundNames = new Set((bindings ?? []).map((b) => b.name));
|
|
295
|
+
const childInputs = child.inputs ?? [];
|
|
296
|
+
let params = childInputs;
|
|
297
|
+
if (boundNames.size > 0) {
|
|
298
|
+
params = params.filter((p) => !boundNames.has(p.name));
|
|
299
|
+
}
|
|
300
|
+
funcDef.parameters = schemaToWire(params);
|
|
301
|
+
const strict = tool.strict;
|
|
302
|
+
if (strict) {
|
|
303
|
+
funcDef.strict = true;
|
|
304
|
+
if (funcDef.parameters) {
|
|
305
|
+
funcDef.parameters.additionalProperties = false;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return funcDef;
|
|
309
|
+
}
|
|
255
310
|
function outputSchemaToWire(agent) {
|
|
256
311
|
const outputs = agent.outputs;
|
|
257
312
|
if (!outputs || outputs.length === 0) return null;
|
|
@@ -262,7 +317,7 @@ function outputSchemaToWire(agent) {
|
|
|
262
317
|
properties[prop.name] = propertyToJsonSchema(prop);
|
|
263
318
|
required.push(prop.name);
|
|
264
319
|
}
|
|
265
|
-
const name =
|
|
320
|
+
const name = "structured_output";
|
|
266
321
|
return {
|
|
267
322
|
type: "json_schema",
|
|
268
323
|
json_schema: {
|
|
@@ -343,24 +398,41 @@ function responsesToolsToWire(agent) {
|
|
|
343
398
|
if (!tools || tools.length === 0) return [];
|
|
344
399
|
const result = [];
|
|
345
400
|
for (const t of tools) {
|
|
346
|
-
if (t.kind
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
401
|
+
if (t.kind === "function") {
|
|
402
|
+
const tool = {
|
|
403
|
+
type: "function",
|
|
404
|
+
name: t.name
|
|
405
|
+
};
|
|
406
|
+
if (t.description) tool.description = t.description;
|
|
407
|
+
const params = t.parameters;
|
|
408
|
+
if (params && Array.isArray(params)) {
|
|
409
|
+
tool.parameters = schemaToWire(params);
|
|
410
|
+
}
|
|
411
|
+
const strict = t.strict;
|
|
412
|
+
if (strict) {
|
|
413
|
+
tool.strict = true;
|
|
414
|
+
if (tool.parameters) {
|
|
415
|
+
tool.parameters.additionalProperties = false;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
result.push(tool);
|
|
419
|
+
} else if (t.kind === "prompty") {
|
|
420
|
+
const projected = projectPromptyTool(t, agent);
|
|
421
|
+
const tool = {
|
|
422
|
+
type: "function",
|
|
423
|
+
name: projected.name
|
|
424
|
+
};
|
|
425
|
+
if (projected.description) tool.description = projected.description;
|
|
426
|
+
if (projected.parameters) tool.parameters = projected.parameters;
|
|
427
|
+
const strict = projected.strict;
|
|
428
|
+
if (strict) {
|
|
429
|
+
tool.strict = true;
|
|
430
|
+
if (tool.parameters) {
|
|
431
|
+
tool.parameters.additionalProperties = false;
|
|
432
|
+
}
|
|
361
433
|
}
|
|
434
|
+
result.push(tool);
|
|
362
435
|
}
|
|
363
|
-
result.push(tool);
|
|
364
436
|
}
|
|
365
437
|
return result;
|
|
366
438
|
}
|
|
@@ -374,7 +446,7 @@ function outputSchemaToResponsesWire(agent) {
|
|
|
374
446
|
properties[prop.name] = propertyToJsonSchema(prop);
|
|
375
447
|
required.push(prop.name);
|
|
376
448
|
}
|
|
377
|
-
const name =
|
|
449
|
+
const name = "structured_output";
|
|
378
450
|
return {
|
|
379
451
|
format: {
|
|
380
452
|
type: "json_schema",
|
|
@@ -393,18 +465,18 @@ function outputSchemaToResponsesWire(agent) {
|
|
|
393
465
|
// src/executor.ts
|
|
394
466
|
var OpenAIExecutor = class {
|
|
395
467
|
async execute(agent, messages) {
|
|
396
|
-
return (0,
|
|
468
|
+
return (0, import_core4.traceSpan)("OpenAIExecutor", async (emit) => {
|
|
397
469
|
emit("signature", "prompty.openai.executor.OpenAIExecutor.invoke");
|
|
398
470
|
emit("inputs", { data: messages });
|
|
399
471
|
const client = this.resolveClient(agent);
|
|
400
472
|
const clientName = client.constructor?.name ?? "OpenAI";
|
|
401
|
-
await (0,
|
|
473
|
+
await (0, import_core4.traceSpan)(clientName, async (ctorEmit) => {
|
|
402
474
|
ctorEmit("signature", `${clientName}.ctor`);
|
|
403
475
|
const conn = agent.model?.connection;
|
|
404
|
-
if (conn instanceof
|
|
476
|
+
if (conn instanceof import_core2.ReferenceConnection) {
|
|
405
477
|
ctorEmit("inputs", { source: "reference", name: conn.name });
|
|
406
478
|
} else {
|
|
407
|
-
ctorEmit("inputs", (0,
|
|
479
|
+
ctorEmit("inputs", (0, import_core4.sanitizeValue)("ctor", this.clientKwargs(agent)));
|
|
408
480
|
}
|
|
409
481
|
ctorEmit("result", clientName);
|
|
410
482
|
});
|
|
@@ -420,14 +492,14 @@ var OpenAIExecutor = class {
|
|
|
420
492
|
case "chat": {
|
|
421
493
|
const args = buildChatArgs(agent, messages);
|
|
422
494
|
const isStreaming = !!args.stream;
|
|
423
|
-
return (0,
|
|
495
|
+
return (0, import_core4.traceSpan)("create", async (callEmit) => {
|
|
424
496
|
callEmit("signature", `${clientName}.chat.completions.create`);
|
|
425
|
-
callEmit("inputs", (0,
|
|
497
|
+
callEmit("inputs", (0, import_core4.sanitizeValue)("create", args));
|
|
426
498
|
const result = await client.chat.completions.create(
|
|
427
499
|
args
|
|
428
500
|
);
|
|
429
501
|
if (isStreaming) {
|
|
430
|
-
return new
|
|
502
|
+
return new import_core2.PromptyStream(`${clientName}Executor`, result);
|
|
431
503
|
}
|
|
432
504
|
callEmit("result", result);
|
|
433
505
|
return result;
|
|
@@ -435,9 +507,9 @@ var OpenAIExecutor = class {
|
|
|
435
507
|
}
|
|
436
508
|
case "embedding": {
|
|
437
509
|
const args = buildEmbeddingArgs(agent, messages);
|
|
438
|
-
return (0,
|
|
510
|
+
return (0, import_core4.traceSpan)("create", async (callEmit) => {
|
|
439
511
|
callEmit("signature", `${clientName}.embeddings.create`);
|
|
440
|
-
callEmit("inputs", (0,
|
|
512
|
+
callEmit("inputs", (0, import_core4.sanitizeValue)("create", args));
|
|
441
513
|
const result = await client.embeddings.create(
|
|
442
514
|
args
|
|
443
515
|
);
|
|
@@ -447,9 +519,9 @@ var OpenAIExecutor = class {
|
|
|
447
519
|
}
|
|
448
520
|
case "image": {
|
|
449
521
|
const args = buildImageArgs(agent, messages);
|
|
450
|
-
return (0,
|
|
522
|
+
return (0, import_core4.traceSpan)("generate", async (callEmit) => {
|
|
451
523
|
callEmit("signature", `${clientName}.images.generate`);
|
|
452
|
-
callEmit("inputs", (0,
|
|
524
|
+
callEmit("inputs", (0, import_core4.sanitizeValue)("generate", args));
|
|
453
525
|
const result = await client.images.generate(
|
|
454
526
|
args
|
|
455
527
|
);
|
|
@@ -460,14 +532,14 @@ var OpenAIExecutor = class {
|
|
|
460
532
|
case "responses": {
|
|
461
533
|
const args = buildResponsesArgs(agent, messages);
|
|
462
534
|
const isStreaming = !!args.stream;
|
|
463
|
-
return (0,
|
|
535
|
+
return (0, import_core4.traceSpan)("create", async (callEmit) => {
|
|
464
536
|
callEmit("signature", `${clientName}.responses.create`);
|
|
465
|
-
callEmit("inputs", (0,
|
|
537
|
+
callEmit("inputs", (0, import_core4.sanitizeValue)("create", args));
|
|
466
538
|
const result = await client.responses.create(
|
|
467
539
|
args
|
|
468
540
|
);
|
|
469
541
|
if (isStreaming) {
|
|
470
|
-
return new
|
|
542
|
+
return new import_core2.PromptyStream(`${clientName}Executor`, result);
|
|
471
543
|
}
|
|
472
544
|
callEmit("result", result);
|
|
473
545
|
return result;
|
|
@@ -479,8 +551,8 @@ var OpenAIExecutor = class {
|
|
|
479
551
|
}
|
|
480
552
|
resolveClient(agent) {
|
|
481
553
|
const conn = agent.model?.connection;
|
|
482
|
-
if (conn instanceof
|
|
483
|
-
return (0,
|
|
554
|
+
if (conn instanceof import_core2.ReferenceConnection) {
|
|
555
|
+
return (0, import_core3.getConnection)(conn.name);
|
|
484
556
|
}
|
|
485
557
|
const kwargs = this.clientKwargs(agent);
|
|
486
558
|
return new import_openai.default(kwargs);
|
|
@@ -488,19 +560,23 @@ var OpenAIExecutor = class {
|
|
|
488
560
|
clientKwargs(agent) {
|
|
489
561
|
const kwargs = {};
|
|
490
562
|
const conn = agent.model?.connection;
|
|
491
|
-
if (conn instanceof
|
|
563
|
+
if (conn instanceof import_core2.ApiKeyConnection) {
|
|
492
564
|
if (conn.apiKey) kwargs.apiKey = conn.apiKey;
|
|
493
565
|
if (conn.endpoint) kwargs.baseURL = conn.endpoint;
|
|
566
|
+
} else if (conn) {
|
|
567
|
+
throw new Error(
|
|
568
|
+
`Connection kind '${conn.kind}' is not supported by the OpenAI executor. Use 'key' for API key auth or 'reference' with registerConnection() for pre-configured clients.`
|
|
569
|
+
);
|
|
494
570
|
}
|
|
495
571
|
return kwargs;
|
|
496
572
|
}
|
|
497
573
|
};
|
|
498
574
|
|
|
499
575
|
// src/processor.ts
|
|
500
|
-
var
|
|
576
|
+
var import_core5 = require("@prompty/core");
|
|
501
577
|
var OpenAIProcessor = class {
|
|
502
578
|
async process(agent, response) {
|
|
503
|
-
return (0,
|
|
579
|
+
return (0, import_core5.traceSpan)("OpenAIProcessor", async (emit) => {
|
|
504
580
|
emit("signature", "prompty.openai.processor.OpenAIProcessor.invoke");
|
|
505
581
|
emit("inputs", { data: response });
|
|
506
582
|
const result = processResponse(agent, response);
|
|
@@ -644,7 +720,11 @@ function processChatCompletion(agent, response) {
|
|
|
644
720
|
});
|
|
645
721
|
}
|
|
646
722
|
const content = message.content;
|
|
647
|
-
if (content === null)
|
|
723
|
+
if (content === null) {
|
|
724
|
+
const refusal = message.refusal;
|
|
725
|
+
if (typeof refusal === "string") return refusal;
|
|
726
|
+
return null;
|
|
727
|
+
}
|
|
648
728
|
if (agent.outputs && agent.outputs.length > 0) {
|
|
649
729
|
try {
|
|
650
730
|
return JSON.parse(content);
|
|
@@ -670,9 +750,9 @@ function processImage(response) {
|
|
|
670
750
|
}
|
|
671
751
|
|
|
672
752
|
// src/index.ts
|
|
673
|
-
var
|
|
674
|
-
(0,
|
|
675
|
-
(0,
|
|
753
|
+
var import_core6 = require("@prompty/core");
|
|
754
|
+
(0, import_core6.registerExecutor)("openai", new OpenAIExecutor());
|
|
755
|
+
(0, import_core6.registerProcessor)("openai", new OpenAIProcessor());
|
|
676
756
|
// Annotate the CommonJS export names for ESM import in node:
|
|
677
757
|
0 && (module.exports = {
|
|
678
758
|
OpenAIExecutor,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/executor.ts","../src/wire.ts","../src/processor.ts"],"sourcesContent":["/**\n * @prompty/openai — OpenAI provider for Prompty.\n *\n * Importing this package auto-registers the \"openai\" executor and processor.\n *\n * @module @prompty/openai\n */\n\nexport { OpenAIExecutor } from \"./executor.js\";\nexport { OpenAIProcessor, processResponse } from \"./processor.js\";\nexport { messageToWire, buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\n\n// Auto-register on import\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\nimport { OpenAIExecutor } from \"./executor.js\";\nimport { OpenAIProcessor } from \"./processor.js\";\n\nregisterExecutor(\"openai\", new OpenAIExecutor());\nregisterProcessor(\"openai\", new OpenAIProcessor());\n","/**\n * OpenAI executor — sends messages to OpenAI APIs.\n *\n * Dispatches on `agent.model.apiType`: chat, embedding, image.\n *\n * @module\n */\n\nimport OpenAI from \"openai\";\nimport type { Prompty } from \"@prompty/core\";\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\nimport type { Executor } from \"@prompty/core\";\nimport type { Message } from \"@prompty/core\";\nimport { getConnection } from \"@prompty/core\";\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\nimport { buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\n\nexport class OpenAIExecutor implements Executor {\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\n return traceSpan(\"OpenAIExecutor\", async (emit) => {\n emit(\"signature\", \"prompty.openai.executor.OpenAIExecutor.invoke\");\n emit(\"inputs\", { data: messages });\n\n const client = this.resolveClient(agent);\n const clientName = client.constructor?.name ?? \"OpenAI\";\n\n // Trace what client we resolved and how\n await traceSpan(clientName, async (ctorEmit) => {\n ctorEmit(\"signature\", `${clientName}.ctor`);\n const conn = agent.model?.connection;\n if (conn instanceof ReferenceConnection) {\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\n } else {\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\n }\n ctorEmit(\"result\", clientName);\n });\n\n const apiType = agent.model?.apiType ?? \"chat\";\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\n emit(\"result\", result);\n return result;\n });\n }\n\n /** Dispatch to the appropriate API and trace the call. */\n private async executeApiCall(\n client: OpenAI,\n clientName: string,\n agent: Prompty,\n messages: Message[],\n apiType: string,\n ): Promise<unknown> {\n switch (apiType) {\n case \"chat\": {\n const args = buildChatArgs(agent, messages);\n const isStreaming = !!args.stream;\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.chat.completions.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.chat.completions.create(\n args as unknown as Parameters<typeof client.chat.completions.create>[0],\n );\n if (isStreaming) {\n // Wrap streaming response for tracing — don't emit result yet,\n // PromptyStream will trace on exhaustion\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\n }\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"embedding\": {\n const args = buildEmbeddingArgs(agent, messages);\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.embeddings.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.embeddings.create(\n args as unknown as Parameters<typeof client.embeddings.create>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"image\": {\n const args = buildImageArgs(agent, messages);\n return traceSpan(\"generate\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.images.generate`);\n callEmit(\"inputs\", sanitizeValue(\"generate\", args));\n const result = await client.images.generate(\n args as unknown as Parameters<typeof client.images.generate>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"responses\": {\n const args = buildResponsesArgs(agent, messages);\n const isStreaming = !!args.stream;\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.responses.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.responses.create(\n args as unknown as Parameters<typeof client.responses.create>[0],\n );\n if (isStreaming) {\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\n }\n callEmit(\"result\", result);\n return result;\n });\n }\n default:\n throw new Error(`Unsupported apiType: ${apiType}`);\n }\n }\n\n protected resolveClient(agent: Prompty): OpenAI {\n const conn = agent.model?.connection;\n\n if (conn instanceof ReferenceConnection) {\n return getConnection(conn.name) as OpenAI;\n }\n\n const kwargs = this.clientKwargs(agent);\n return new OpenAI(kwargs);\n }\n\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\n const kwargs: Record<string, unknown> = {};\n const conn = agent.model?.connection;\n\n if (conn instanceof ApiKeyConnection) {\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\n }\n\n return kwargs;\n }\n}\n","/**\n * Wire format conversion: Message → OpenAI API JSON.\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { ContentPart, Message } from \"@prompty/core\";\n\n/**\n * Convert an abstract Message to OpenAI wire format.\n */\nexport function messageToWire(msg: Message): Record<string, unknown> {\n const wire: Record<string, unknown> = { role: msg.role };\n\n // Include metadata fields (e.g., name, tool_call_id, tool_calls)\n for (const [k, v] of Object.entries(msg.metadata)) {\n if (k !== \"role\" && k !== \"content\") {\n wire[k] = v;\n }\n }\n\n const content = msg.toTextContent();\n if (typeof content === \"string\") {\n wire.content = content;\n } else {\n // Multimodal — convert parts to OpenAI format\n wire.content = msg.parts.map(partToWire);\n }\n\n return wire;\n}\n\n/**\n * Convert a ContentPart to OpenAI wire format.\n */\nfunction partToWire(part: ContentPart): Record<string, unknown> {\n switch (part.kind) {\n case \"text\":\n return { type: \"text\", text: part.value };\n case \"image\": {\n const imageUrl: Record<string, unknown> = { url: part.source };\n if (part.detail) imageUrl.detail = part.detail;\n return { type: \"image_url\", image_url: imageUrl };\n }\n case \"audio\":\n return {\n type: \"input_audio\",\n input_audio: {\n data: part.source,\n ...(part.mediaType && { format: part.mediaType }),\n },\n };\n case \"file\":\n return { type: \"file\", file: { url: part.source } };\n }\n}\n\n/**\n * Build chat completion arguments from agent config and messages.\n */\nexport function buildChatArgs(\n agent: Prompty,\n messages: Message[],\n): Record<string, unknown> {\n const model = agent.model?.id || \"gpt-4\";\n const wireMessages = messages.map(messageToWire);\n\n const args: Record<string, unknown> = {\n model,\n messages: wireMessages,\n ...buildOptions(agent),\n };\n\n // Tools\n const tools = toolsToWire(agent);\n if (tools.length > 0) {\n args.tools = tools;\n }\n\n // Structured output\n const responseFormat = outputSchemaToWire(agent);\n if (responseFormat) {\n args.response_format = responseFormat;\n }\n\n return args;\n}\n\n/**\n * Build embedding arguments.\n * Only additionalProperties are passed — chat options are not valid here.\n */\nexport function buildEmbeddingArgs(\n agent: Prompty,\n data: unknown,\n): Record<string, unknown> {\n const model = agent.model?.id || \"text-embedding-ada-002\";\n\n // Extract text content from Message objects if needed\n let input: unknown;\n if (Array.isArray(data)) {\n const texts = data.map((item: unknown) => {\n if (typeof item === \"string\") return item;\n if (item && typeof item === \"object\" && \"text\" in item) return (item as { text: string }).text;\n if (item && typeof item === \"object\" && \"toTextContent\" in item) {\n const content = (item as { toTextContent: () => unknown }).toTextContent();\n return typeof content === \"string\" ? content : String(content);\n }\n return String(item);\n });\n input = texts;\n } else if (typeof data === \"string\") {\n input = [data];\n } else {\n input = [String(data)];\n }\n\n const args: Record<string, unknown> = { input, model };\n const extra = agent.model?.options?.additionalProperties;\n if (extra) {\n for (const [k, v] of Object.entries(extra)) {\n args[k] = v;\n }\n }\n return args;\n}\n\n/**\n * Build image generation arguments.\n * Only additionalProperties are passed — chat options are not valid here.\n */\nexport function buildImageArgs(\n agent: Prompty,\n data: unknown,\n): Record<string, unknown> {\n const model = agent.model?.id || \"dall-e-3\";\n\n // Extract prompt text: data may be a string, or a Message[] from the parser\n let prompt: string;\n if (typeof data === \"string\") {\n prompt = data;\n } else if (Array.isArray(data)) {\n // Messages have .parts[].value for text content, or a .text getter\n prompt = data\n .map((m: { text?: string; parts?: { kind: string; value: string }[] }) => {\n if (typeof m.text === \"string\") return m.text;\n if (Array.isArray(m.parts)) {\n return m.parts\n .filter((p) => p.kind === \"text\")\n .map((p) => p.value)\n .join(\"\");\n }\n return String(m);\n })\n .join(\"\\n\")\n .trim();\n } else {\n prompt = String(data);\n }\n\n const args: Record<string, unknown> = { prompt, model };\n const extra = agent.model?.options?.additionalProperties;\n if (extra) {\n for (const [k, v] of Object.entries(extra)) {\n args[k] = v;\n }\n }\n return args;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Map AgentSchema kind strings to JSON Schema type strings. */\nconst KIND_TO_JSON_TYPE: Record<string, string> = {\n string: \"string\",\n integer: \"integer\",\n float: \"number\",\n number: \"number\",\n boolean: \"boolean\",\n array: \"array\",\n object: \"object\",\n};\n\nfunction buildOptions(agent: Prompty): Record<string, unknown> {\n const opts = agent.model?.options;\n if (!opts) return {};\n\n const result: Record<string, unknown> = {};\n\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\n if (opts.maxOutputTokens !== undefined) result.max_completion_tokens = opts.maxOutputTokens;\n if (opts.topP !== undefined) result.top_p = opts.topP;\n if (opts.frequencyPenalty !== undefined) result.frequency_penalty = opts.frequencyPenalty;\n if (opts.presencePenalty !== undefined) result.presence_penalty = opts.presencePenalty;\n if (opts.stopSequences !== undefined && opts.stopSequences.length > 0) result.stop = opts.stopSequences;\n if (opts.seed !== undefined) result.seed = opts.seed;\n\n // Pass through additionalProperties — but don't overwrite mapped keys\n if (opts.additionalProperties) {\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\n if (!(k in result)) {\n result[k] = v;\n }\n }\n }\n\n return result;\n}\n\n/** Convert a Property list to a JSON Schema `{type: \"object\", properties: ...}`. */\nfunction schemaToWire(properties: unknown[]): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const p of properties as Array<{ name?: string; kind?: string; description?: string; required?: boolean; enumValues?: unknown[] }>) {\n if (!p.name) continue;\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[p.kind ?? \"string\"] ?? \"string\",\n };\n if (p.description) schema.description = p.description;\n if (p.enumValues && p.enumValues.length > 0) schema.enum = p.enumValues;\n props[p.name] = schema;\n if (p.required) required.push(p.name);\n }\n\n const result: Record<string, unknown> = { type: \"object\", properties: props };\n if (required.length > 0) result.required = required;\n return result;\n}\n\n/** Convert a single Property to a JSON Schema definition (recursive for structured output). */\nfunction propertyToJsonSchema(prop: {\n kind?: string;\n description?: string;\n enumValues?: unknown[];\n items?: unknown;\n properties?: unknown[];\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[prop.kind ?? \"string\"] ?? \"string\",\n };\n\n if (prop.description) schema.description = prop.description;\n if (prop.enumValues && prop.enumValues.length > 0) schema.enum = prop.enumValues;\n\n // Array items\n if (prop.kind === \"array\") {\n schema.items = prop.items\n ? propertyToJsonSchema(prop.items as typeof prop)\n : { type: \"string\" };\n }\n\n // Nested object\n if (prop.kind === \"object\") {\n if (prop.properties) {\n const nested: Record<string, unknown> = {};\n const req: string[] = [];\n for (const p of prop.properties as Array<{ name?: string } & typeof prop>) {\n if (!p.name) continue;\n nested[p.name] = propertyToJsonSchema(p);\n req.push(p.name);\n }\n schema.properties = nested;\n schema.required = req;\n } else {\n schema.properties = {};\n schema.required = [];\n }\n schema.additionalProperties = false;\n }\n\n return schema;\n}\n\nfunction toolsToWire(agent: Prompty): Record<string, unknown>[] {\n const tools = agent.tools;\n if (!tools || tools.length === 0) return [];\n\n const result: Record<string, unknown>[] = [];\n\n for (const t of tools) {\n if (t.kind !== \"function\") continue;\n\n const funcDef: Record<string, unknown> = { name: t.name };\n if (t.description) funcDef.description = t.description;\n\n // Serialize parameters via schemaToWire\n const params = (t as { parameters?: unknown[] }).parameters;\n if (params && Array.isArray(params)) {\n funcDef.parameters = schemaToWire(params);\n }\n\n // Strict mode\n const strict = (t as { strict?: boolean }).strict;\n if (strict) {\n funcDef.strict = true;\n if (funcDef.parameters) {\n (funcDef.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n result.push({ type: \"function\", function: funcDef });\n }\n\n return result;\n}\n\nfunction outputSchemaToWire(agent: Prompty): Record<string, unknown> | null {\n const outputs = agent.outputs;\n if (!outputs || outputs.length === 0) return null;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const prop of outputs) {\n if (!prop.name) continue;\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\n required.push(prop.name);\n }\n\n const name = (agent.name || \"response\").toLowerCase().replace(/[\\s-]/g, \"_\");\n\n return {\n type: \"json_schema\",\n json_schema: {\n name,\n strict: true,\n schema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Responses API wire format\n// ---------------------------------------------------------------------------\n\n/**\n * Build Responses API arguments from agent config and messages.\n *\n * Key differences from Chat Completions:\n * - System messages → `instructions` parameter\n * - Other messages → `input` as EasyInputMessage[]\n * - `maxOutputTokens` → `max_output_tokens`\n * - Structured output → `text.format` (not `response_format`)\n * - Tools use flat `{ type: \"function\", name, parameters }` (not nested `function:`)\n */\nexport function buildResponsesArgs(\n agent: Prompty,\n messages: Message[],\n): Record<string, unknown> {\n const model = agent.model?.id || \"gpt-4o\";\n\n // Separate system messages as instructions, rest as input\n const systemParts: string[] = [];\n const inputMessages: Record<string, unknown>[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\" || msg.role === \"developer\") {\n systemParts.push(msg.text);\n } else {\n inputMessages.push(messageToResponsesInput(msg));\n }\n }\n\n const args: Record<string, unknown> = {\n model,\n input: inputMessages,\n };\n\n // Set instructions from system messages\n if (systemParts.length > 0) {\n args.instructions = systemParts.join(\"\\n\\n\");\n }\n\n // Map model options\n const responseOpts = buildResponsesOptions(agent);\n Object.assign(args, responseOpts);\n\n // Tools\n const tools = responsesToolsToWire(agent);\n if (tools.length > 0) {\n args.tools = tools;\n }\n\n // Structured output via text.format\n const textConfig = outputSchemaToResponsesWire(agent);\n if (textConfig) {\n args.text = textConfig;\n }\n\n return args;\n}\n\n/** Convert a Message to Responses API EasyInputMessage format. */\nfunction messageToResponsesInput(msg: Message): Record<string, unknown> {\n const content = msg.toTextContent();\n\n // Pass-through original function_call items from the agent loop\n if (msg.metadata.responses_function_call) {\n return msg.metadata.responses_function_call as Record<string, unknown>;\n }\n\n // Tool result messages → function_call_output\n if (msg.metadata.tool_call_id) {\n return {\n type: \"function_call_output\",\n call_id: msg.metadata.tool_call_id,\n output: typeof content === \"string\" ? content : JSON.stringify(content),\n };\n }\n\n const role = msg.role === \"tool\" ? \"user\" : msg.role;\n return { role, content };\n}\n\n/** Build Responses-specific model options. */\nfunction buildResponsesOptions(agent: Prompty): Record<string, unknown> {\n const opts = agent.model?.options;\n if (!opts) return {};\n\n const result: Record<string, unknown> = {};\n\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\n if (opts.maxOutputTokens !== undefined) result.max_output_tokens = opts.maxOutputTokens;\n if (opts.topP !== undefined) result.top_p = opts.topP;\n\n // Pass through additionalProperties — but don't overwrite mapped keys\n if (opts.additionalProperties) {\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\n if (!(k in result)) {\n result[k] = v;\n }\n }\n }\n\n return result;\n}\n\n/** Convert agent tools to Responses API tool format. */\nfunction responsesToolsToWire(agent: Prompty): Record<string, unknown>[] {\n const tools = agent.tools;\n if (!tools || tools.length === 0) return [];\n\n const result: Record<string, unknown>[] = [];\n\n for (const t of tools) {\n if (t.kind !== \"function\") continue;\n\n // Responses API uses flat tool format (not nested under \"function:\")\n const tool: Record<string, unknown> = {\n type: \"function\",\n name: t.name,\n };\n if (t.description) tool.description = t.description;\n\n const params = (t as { parameters?: unknown[] }).parameters;\n if (params && Array.isArray(params)) {\n tool.parameters = schemaToWire(params);\n }\n\n const strict = (t as { strict?: boolean }).strict;\n if (strict) {\n tool.strict = true;\n if (tool.parameters) {\n (tool.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n result.push(tool);\n }\n\n return result;\n}\n\n/** Convert outputSchema to Responses API text.format config. */\nfunction outputSchemaToResponsesWire(agent: Prompty): Record<string, unknown> | null {\n const outputs = agent.outputs;\n if (!outputs || outputs.length === 0) return null;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const prop of outputs) {\n if (!prop.name) continue;\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\n required.push(prop.name);\n }\n\n const name = (agent.name || \"response\").toLowerCase().replace(/[\\s-]/g, \"_\");\n\n return {\n format: {\n type: \"json_schema\",\n name,\n strict: true,\n schema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n },\n };\n}\n","/**\n * OpenAI processor — extracts clean results from raw OpenAI responses.\n *\n * Handles ChatCompletion, Embedding, Image, and streaming responses.\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { Processor } from \"@prompty/core\";\nimport type { ToolCall } from \"@prompty/core\";\nimport { traceSpan } from \"@prompty/core\";\n\nexport class OpenAIProcessor implements Processor {\n async process(agent: Prompty, response: unknown): Promise<unknown> {\n return traceSpan(\"OpenAIProcessor\", async (emit) => {\n emit(\"signature\", \"prompty.openai.processor.OpenAIProcessor.invoke\");\n emit(\"inputs\", { data: response });\n const result = processResponse(agent, response);\n // Don't emit result for streaming — it's a generator, not a value\n if (!isAsyncIterable(response)) {\n emit(\"result\", result);\n }\n return result;\n });\n }\n}\n\n/**\n * Extract clean content from an OpenAI response.\n */\nexport function processResponse(agent: Prompty, response: unknown): unknown {\n if (typeof response !== \"object\" || response === null) return response;\n\n // Streaming response — return content-extracting async generator\n if (isAsyncIterable(response)) {\n return streamGenerator(response);\n }\n\n const r = response as Record<string, unknown>;\n\n // Responses API — has output[] and object === \"response\"\n if (r.object === \"response\" && Array.isArray(r.output)) {\n return processResponsesApi(agent, r);\n }\n\n // ChatCompletion\n if (r.choices) {\n return processChatCompletion(agent, r);\n }\n\n // Embedding response\n if (r.data && r.object === \"list\") {\n return processEmbedding(r);\n }\n\n // Image response\n if (r.data && Array.isArray(r.data)) {\n const data = r.data as Record<string, unknown>[];\n if (data.length > 0 && (\"url\" in data[0] || \"b64_json\" in data[0])) {\n return processImage(r);\n }\n }\n\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Streaming\n// ---------------------------------------------------------------------------\n\n/** Type guard for async iterables (PromptyStream or raw SDK stream). */\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value\n );\n}\n\n/**\n * Yield content chunks, tool calls, or refusals from a streaming response.\n *\n * Handles three types of streaming deltas:\n * - `delta.content` — yields content strings\n * - `delta.tool_calls` — accumulates partial tool call chunks,\n * yields ToolCall objects when the stream ends\n * - `delta.refusal` — throws Error with the refusal message\n *\n * Matches the Python `_stream_generator` / `_async_stream_generator`.\n */\nasync function* streamGenerator(\n response: AsyncIterable<unknown>,\n): AsyncGenerator<string | ToolCall> {\n const toolCallAcc: Map<number, { id: string; name: string; arguments: string }> = new Map();\n\n for await (const chunk of response) {\n const c = chunk as Record<string, unknown>;\n const choices = c.choices as Record<string, unknown>[] | undefined;\n if (!choices || choices.length === 0) continue;\n\n const delta = (choices[0] as Record<string, unknown>).delta as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n // Content\n if (delta.content != null) {\n yield delta.content as string;\n }\n\n // Tool call deltas — accumulate index-keyed partial chunks\n const tcDeltas = delta.tool_calls as Record<string, unknown>[] | undefined;\n if (tcDeltas) {\n for (const tcDelta of tcDeltas) {\n const idx = tcDelta.index as number;\n if (!toolCallAcc.has(idx)) {\n toolCallAcc.set(idx, { id: \"\", name: \"\", arguments: \"\" });\n }\n const acc = toolCallAcc.get(idx)!;\n if (tcDelta.id) acc.id = tcDelta.id as string;\n const fn = tcDelta.function as Record<string, unknown> | undefined;\n if (fn) {\n if (fn.name) acc.name = fn.name as string;\n if (fn.arguments) acc.arguments += fn.arguments as string;\n }\n }\n }\n\n // Refusal\n if (delta.refusal != null) {\n throw new Error(`Model refused: ${delta.refusal}`);\n }\n }\n\n // Yield accumulated tool calls at the end of the stream\n const sortedIndices = [...toolCallAcc.keys()].sort((a, b) => a - b);\n for (const idx of sortedIndices) {\n const tc = toolCallAcc.get(idx)!;\n yield { id: tc.id, name: tc.name, arguments: tc.arguments } as ToolCall;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Responses API processing\n// ---------------------------------------------------------------------------\n\n/**\n * Process a Responses API response.\n *\n * Extracts:\n * - Text content from `output_text` or output message items\n * - Function tool calls from `function_call` output items\n * - JSON-parsed content when outputSchema is present\n */\nfunction processResponsesApi(\n agent: Prompty,\n response: Record<string, unknown>,\n): unknown {\n const output = response.output as Record<string, unknown>[];\n\n // Collect function calls\n const funcCalls: ToolCall[] = [];\n for (const item of output) {\n if (item.type === \"function_call\") {\n funcCalls.push({\n id: (item.call_id ?? item.id ?? \"\") as string,\n name: item.name as string,\n arguments: item.arguments as string,\n });\n }\n }\n\n if (funcCalls.length > 0) {\n return funcCalls;\n }\n\n // Text content — use output_text convenience field\n const outputText = response.output_text as string | undefined;\n if (outputText !== undefined) {\n // Structured output — JSON parse when outputs schema exists\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(outputText);\n } catch {\n return outputText;\n }\n }\n return outputText;\n }\n\n // Fallback: extract from output message items\n const texts: string[] = [];\n for (const item of output) {\n if (item.type === \"message\") {\n const content = item.content as Record<string, unknown>[] | undefined;\n if (content) {\n for (const part of content) {\n if (part.type === \"output_text\" || part.type === \"text\") {\n texts.push(part.text as string);\n }\n }\n }\n }\n }\n\n if (texts.length > 0) {\n const text = texts.join(\"\");\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n }\n\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response processing\n// ---------------------------------------------------------------------------\n\nfunction processChatCompletion(\n agent: Prompty,\n response: Record<string, unknown>,\n): unknown {\n const choices = response.choices as Record<string, unknown>[];\n if (!choices || choices.length === 0) return null;\n\n const choice = choices[0];\n const message = choice.message as Record<string, unknown>;\n if (!message) return null;\n\n // Tool calls\n const toolCalls = message.tool_calls as Record<string, unknown>[] | undefined;\n if (toolCalls && toolCalls.length > 0) {\n return toolCalls.map((tc): ToolCall => {\n const fn = tc.function as Record<string, unknown>;\n return {\n id: tc.id as string,\n name: fn.name as string,\n arguments: fn.arguments as string,\n };\n });\n }\n\n // Content\n const content = message.content as string | null;\n if (content === null) return null;\n\n // Structured output — JSON parse when outputs schema exists\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(content);\n } catch {\n return content;\n }\n }\n\n return content;\n}\n\nfunction processEmbedding(response: Record<string, unknown>): unknown {\n const data = response.data as Record<string, unknown>[];\n if (data.length === 1) {\n return (data[0] as Record<string, unknown>).embedding;\n }\n return data.map((d) => (d as Record<string, unknown>).embedding);\n}\n\nfunction processImage(response: Record<string, unknown>): unknown {\n const data = response.data as Record<string, unknown>[];\n if (data.length === 1) {\n return data[0].url ?? data[0].b64_json;\n }\n return data.map((d) => d.url ?? d.b64_json);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQA,oBAAmB;AAEnB,kBAAqE;AAGrE,IAAAA,eAA8B;AAC9B,IAAAA,eAAyC;;;ACFlC,SAAS,cAAc,KAAuC;AACnE,QAAM,OAAgC,EAAE,MAAM,IAAI,KAAK;AAGvD,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,QAAQ,GAAG;AACjD,QAAI,MAAM,UAAU,MAAM,WAAW;AACnC,WAAK,CAAC,IAAI;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,cAAc;AAClC,MAAI,OAAO,YAAY,UAAU;AAC/B,SAAK,UAAU;AAAA,EACjB,OAAO;AAEL,SAAK,UAAU,IAAI,MAAM,IAAI,UAAU;AAAA,EACzC;AAEA,SAAO;AACT;AAKA,SAAS,WAAW,MAA4C;AAC9D,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,MAAM;AAAA,IAC1C,KAAK,SAAS;AACZ,YAAM,WAAoC,EAAE,KAAK,KAAK,OAAO;AAC7D,UAAI,KAAK,OAAQ,UAAS,SAAS,KAAK;AACxC,aAAO,EAAE,MAAM,aAAa,WAAW,SAAS;AAAA,IAClD;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,UACX,MAAM,KAAK;AAAA,UACX,GAAI,KAAK,aAAa,EAAE,QAAQ,KAAK,UAAU;AAAA,QACjD;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,MAAM,EAAE,KAAK,KAAK,OAAO,EAAE;AAAA,EACtD;AACF;AAKO,SAAS,cACd,OACA,UACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AACjC,QAAM,eAAe,SAAS,IAAI,aAAa;AAE/C,QAAM,OAAgC;AAAA,IACpC;AAAA,IACA,UAAU;AAAA,IACV,GAAG,aAAa,KAAK;AAAA,EACvB;AAGA,QAAM,QAAQ,YAAY,KAAK;AAC/B,MAAI,MAAM,SAAS,GAAG;AACpB,SAAK,QAAQ;AAAA,EACf;AAGA,QAAM,iBAAiB,mBAAmB,KAAK;AAC/C,MAAI,gBAAgB;AAClB,SAAK,kBAAkB;AAAA,EACzB;AAEA,SAAO;AACT;AAMO,SAAS,mBACd,OACA,MACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AAGjC,MAAI;AACJ,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,UAAM,QAAQ,KAAK,IAAI,CAAC,SAAkB;AACxC,UAAI,OAAO,SAAS,SAAU,QAAO;AACrC,UAAI,QAAQ,OAAO,SAAS,YAAY,UAAU,KAAM,QAAQ,KAA0B;AAC1F,UAAI,QAAQ,OAAO,SAAS,YAAY,mBAAmB,MAAM;AAC/D,cAAM,UAAW,KAA0C,cAAc;AACzE,eAAO,OAAO,YAAY,WAAW,UAAU,OAAO,OAAO;AAAA,MAC/D;AACA,aAAO,OAAO,IAAI;AAAA,IACpB,CAAC;AACD,YAAQ;AAAA,EACV,WAAW,OAAO,SAAS,UAAU;AACnC,YAAQ,CAAC,IAAI;AAAA,EACf,OAAO;AACL,YAAQ,CAAC,OAAO,IAAI,CAAC;AAAA,EACvB;AAEA,QAAM,OAAgC,EAAE,OAAO,MAAM;AACrD,QAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,MAAI,OAAO;AACT,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,WAAK,CAAC,IAAI;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,eACd,OACA,MACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AAGjC,MAAI;AACJ,MAAI,OAAO,SAAS,UAAU;AAC5B,aAAS;AAAA,EACX,WAAW,MAAM,QAAQ,IAAI,GAAG;AAE9B,aAAS,KACN,IAAI,CAAC,MAAoE;AACxE,UAAI,OAAO,EAAE,SAAS,SAAU,QAAO,EAAE;AACzC,UAAI,MAAM,QAAQ,EAAE,KAAK,GAAG;AAC1B,eAAO,EAAE,MACN,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,IAAI,CAAC,MAAM,EAAE,KAAK,EAClB,KAAK,EAAE;AAAA,MACZ;AACA,aAAO,OAAO,CAAC;AAAA,IACjB,CAAC,EACA,KAAK,IAAI,EACT,KAAK;AAAA,EACV,OAAO;AACL,aAAS,OAAO,IAAI;AAAA,EACtB;AAEA,QAAM,OAAgC,EAAE,QAAQ,MAAM;AACtD,QAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,MAAI,OAAO;AACT,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,WAAK,CAAC,IAAI;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAOA,IAAM,oBAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,SAAS,aAAa,OAAyC;AAC7D,QAAM,OAAO,MAAM,OAAO;AAC1B,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,QAAM,SAAkC,CAAC;AAEzC,MAAI,KAAK,gBAAgB,OAAW,QAAO,cAAc,KAAK;AAC9D,MAAI,KAAK,oBAAoB,OAAW,QAAO,wBAAwB,KAAK;AAC5E,MAAI,KAAK,SAAS,OAAW,QAAO,QAAQ,KAAK;AACjD,MAAI,KAAK,qBAAqB,OAAW,QAAO,oBAAoB,KAAK;AACzE,MAAI,KAAK,oBAAoB,OAAW,QAAO,mBAAmB,KAAK;AACvE,MAAI,KAAK,kBAAkB,UAAa,KAAK,cAAc,SAAS,EAAG,QAAO,OAAO,KAAK;AAC1F,MAAI,KAAK,SAAS,OAAW,QAAO,OAAO,KAAK;AAGhD,MAAI,KAAK,sBAAsB;AAC7B,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,oBAAoB,GAAG;AAC9D,UAAI,EAAE,KAAK,SAAS;AAClB,eAAO,CAAC,IAAI;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,aAAa,YAAgD;AACpE,QAAM,QAAiC,CAAC;AACxC,QAAM,WAAqB,CAAC;AAE5B,aAAW,KAAK,YAAyH;AACvI,QAAI,CAAC,EAAE,KAAM;AACb,UAAM,SAAkC;AAAA,MACtC,MAAM,kBAAkB,EAAE,QAAQ,QAAQ,KAAK;AAAA,IACjD;AACA,QAAI,EAAE,YAAa,QAAO,cAAc,EAAE;AAC1C,QAAI,EAAE,cAAc,EAAE,WAAW,SAAS,EAAG,QAAO,OAAO,EAAE;AAC7D,UAAM,EAAE,IAAI,IAAI;AAChB,QAAI,EAAE,SAAU,UAAS,KAAK,EAAE,IAAI;AAAA,EACtC;AAEA,QAAM,SAAkC,EAAE,MAAM,UAAU,YAAY,MAAM;AAC5E,MAAI,SAAS,SAAS,EAAG,QAAO,WAAW;AAC3C,SAAO;AACT;AAGA,SAAS,qBAAqB,MAMF;AAC1B,QAAM,SAAkC;AAAA,IACtC,MAAM,kBAAkB,KAAK,QAAQ,QAAQ,KAAK;AAAA,EACpD;AAEA,MAAI,KAAK,YAAa,QAAO,cAAc,KAAK;AAChD,MAAI,KAAK,cAAc,KAAK,WAAW,SAAS,EAAG,QAAO,OAAO,KAAK;AAGtE,MAAI,KAAK,SAAS,SAAS;AACzB,WAAO,QAAQ,KAAK,QAChB,qBAAqB,KAAK,KAAoB,IAC9C,EAAE,MAAM,SAAS;AAAA,EACvB;AAGA,MAAI,KAAK,SAAS,UAAU;AAC1B,QAAI,KAAK,YAAY;AACnB,YAAM,SAAkC,CAAC;AACzC,YAAM,MAAgB,CAAC;AACvB,iBAAW,KAAK,KAAK,YAAsD;AACzE,YAAI,CAAC,EAAE,KAAM;AACb,eAAO,EAAE,IAAI,IAAI,qBAAqB,CAAC;AACvC,YAAI,KAAK,EAAE,IAAI;AAAA,MACjB;AACA,aAAO,aAAa;AACpB,aAAO,WAAW;AAAA,IACpB,OAAO;AACL,aAAO,aAAa,CAAC;AACrB,aAAO,WAAW,CAAC;AAAA,IACrB;AACA,WAAO,uBAAuB;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,OAA2C;AAC9D,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO,CAAC;AAE1C,QAAM,SAAoC,CAAC;AAE3C,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,SAAS,WAAY;AAE3B,UAAM,UAAmC,EAAE,MAAM,EAAE,KAAK;AACxD,QAAI,EAAE,YAAa,SAAQ,cAAc,EAAE;AAG3C,UAAM,SAAU,EAAiC;AACjD,QAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACnC,cAAQ,aAAa,aAAa,MAAM;AAAA,IAC1C;AAGA,UAAM,SAAU,EAA2B;AAC3C,QAAI,QAAQ;AACV,cAAQ,SAAS;AACjB,UAAI,QAAQ,YAAY;AACtB,QAAC,QAAQ,WAAuC,uBAAuB;AAAA,MACzE;AAAA,IACF;AAEA,WAAO,KAAK,EAAE,MAAM,YAAY,UAAU,QAAQ,CAAC;AAAA,EACrD;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAgD;AAC1E,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,QAAM,aAAsC,CAAC;AAC7C,QAAM,WAAqB,CAAC;AAE5B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,KAAK,KAAM;AAChB,eAAW,KAAK,IAAI,IAAI,qBAAqB,IAAkD;AAC/F,aAAS,KAAK,KAAK,IAAI;AAAA,EACzB;AAEA,QAAM,QAAQ,MAAM,QAAQ,YAAY,YAAY,EAAE,QAAQ,UAAU,GAAG;AAE3E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,sBAAsB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;AAgBO,SAAS,mBACd,OACA,UACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AAGjC,QAAM,cAAwB,CAAC;AAC/B,QAAM,gBAA2C,CAAC;AAElD,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,SAAS,YAAY,IAAI,SAAS,aAAa;AACrD,kBAAY,KAAK,IAAI,IAAI;AAAA,IAC3B,OAAO;AACL,oBAAc,KAAK,wBAAwB,GAAG,CAAC;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,OAAgC;AAAA,IACpC;AAAA,IACA,OAAO;AAAA,EACT;AAGA,MAAI,YAAY,SAAS,GAAG;AAC1B,SAAK,eAAe,YAAY,KAAK,MAAM;AAAA,EAC7C;AAGA,QAAM,eAAe,sBAAsB,KAAK;AAChD,SAAO,OAAO,MAAM,YAAY;AAGhC,QAAM,QAAQ,qBAAqB,KAAK;AACxC,MAAI,MAAM,SAAS,GAAG;AACpB,SAAK,QAAQ;AAAA,EACf;AAGA,QAAM,aAAa,4BAA4B,KAAK;AACpD,MAAI,YAAY;AACd,SAAK,OAAO;AAAA,EACd;AAEA,SAAO;AACT;AAGA,SAAS,wBAAwB,KAAuC;AACtE,QAAM,UAAU,IAAI,cAAc;AAGlC,MAAI,IAAI,SAAS,yBAAyB;AACxC,WAAO,IAAI,SAAS;AAAA,EACtB;AAGA,MAAI,IAAI,SAAS,cAAc;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,IAAI,SAAS;AAAA,MACtB,QAAQ,OAAO,YAAY,WAAW,UAAU,KAAK,UAAU,OAAO;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,OAAO,IAAI,SAAS,SAAS,SAAS,IAAI;AAChD,SAAO,EAAE,MAAM,QAAQ;AACzB;AAGA,SAAS,sBAAsB,OAAyC;AACtE,QAAM,OAAO,MAAM,OAAO;AAC1B,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,QAAM,SAAkC,CAAC;AAEzC,MAAI,KAAK,gBAAgB,OAAW,QAAO,cAAc,KAAK;AAC9D,MAAI,KAAK,oBAAoB,OAAW,QAAO,oBAAoB,KAAK;AACxE,MAAI,KAAK,SAAS,OAAW,QAAO,QAAQ,KAAK;AAGjD,MAAI,KAAK,sBAAsB;AAC7B,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,oBAAoB,GAAG;AAC9D,UAAI,EAAE,KAAK,SAAS;AAClB,eAAO,CAAC,IAAI;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,qBAAqB,OAA2C;AACvE,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO,CAAC;AAE1C,QAAM,SAAoC,CAAC;AAE3C,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,SAAS,WAAY;AAG3B,UAAM,OAAgC;AAAA,MACpC,MAAM;AAAA,MACN,MAAM,EAAE;AAAA,IACV;AACA,QAAI,EAAE,YAAa,MAAK,cAAc,EAAE;AAExC,UAAM,SAAU,EAAiC;AACjD,QAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACnC,WAAK,aAAa,aAAa,MAAM;AAAA,IACvC;AAEA,UAAM,SAAU,EAA2B;AAC3C,QAAI,QAAQ;AACV,WAAK,SAAS;AACd,UAAI,KAAK,YAAY;AACnB,QAAC,KAAK,WAAuC,uBAAuB;AAAA,MACtE;AAAA,IACF;AAEA,WAAO,KAAK,IAAI;AAAA,EAClB;AAEA,SAAO;AACT;AAGA,SAAS,4BAA4B,OAAgD;AACnF,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,QAAM,aAAsC,CAAC;AAC7C,QAAM,WAAqB,CAAC;AAE5B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,KAAK,KAAM;AAChB,eAAW,KAAK,IAAI,IAAI,qBAAqB,IAAkD;AAC/F,aAAS,KAAK,KAAK,IAAI;AAAA,EACzB;AAEA,QAAM,QAAQ,MAAM,QAAQ,YAAY,YAAY,EAAE,QAAQ,UAAU,GAAG;AAE3E,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,sBAAsB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;;;AD9eO,IAAM,iBAAN,MAAyC;AAAA,EAC9C,MAAM,QAAQ,OAAgB,UAAuC;AACnE,eAAO,wBAAU,kBAAkB,OAAO,SAAS;AACjD,WAAK,aAAa,+CAA+C;AACjE,WAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjC,YAAM,SAAS,KAAK,cAAc,KAAK;AACvC,YAAM,aAAa,OAAO,aAAa,QAAQ;AAG/C,gBAAM,wBAAU,YAAY,OAAO,aAAa;AAC9C,iBAAS,aAAa,GAAG,UAAU,OAAO;AAC1C,cAAM,OAAO,MAAM,OAAO;AAC1B,YAAI,gBAAgB,iCAAqB;AACvC,mBAAS,UAAU,EAAE,QAAQ,aAAa,MAAM,KAAK,KAAK,CAAC;AAAA,QAC7D,OAAO;AACL,mBAAS,cAAU,4BAAc,QAAQ,KAAK,aAAa,KAAK,CAAC,CAAC;AAAA,QACpE;AACA,iBAAS,UAAU,UAAU;AAAA,MAC/B,CAAC;AAED,YAAM,UAAU,MAAM,OAAO,WAAW;AACxC,YAAM,SAAS,MAAM,KAAK,eAAe,QAAQ,YAAY,OAAO,UAAU,OAAO;AACrF,WAAK,UAAU,MAAM;AACrB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAc,eACZ,QACA,YACA,OACA,UACA,SACkB;AAClB,YAAQ,SAAS;AAAA,MACf,KAAK,QAAQ;AACX,cAAM,OAAO,cAAc,OAAO,QAAQ;AAC1C,cAAM,cAAc,CAAC,CAAC,KAAK;AAC3B,mBAAO,wBAAU,UAAU,OAAO,aAAa;AAC7C,mBAAS,aAAa,GAAG,UAAU,0BAA0B;AAC7D,mBAAS,cAAU,4BAAc,UAAU,IAAI,CAAC;AAChD,gBAAM,SAAS,MAAM,OAAO,KAAK,YAAY;AAAA,YAC3C;AAAA,UACF;AACA,cAAI,aAAa;AAGf,mBAAO,IAAI,0BAAc,GAAG,UAAU,YAAY,MAA2C;AAAA,UAC/F;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,OAAO,mBAAmB,OAAO,QAAQ;AAC/C,mBAAO,wBAAU,UAAU,OAAO,aAAa;AAC7C,mBAAS,aAAa,GAAG,UAAU,oBAAoB;AACvD,mBAAS,cAAU,4BAAc,UAAU,IAAI,CAAC;AAChD,gBAAM,SAAS,MAAM,OAAO,WAAW;AAAA,YACrC;AAAA,UACF;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,OAAO,eAAe,OAAO,QAAQ;AAC3C,mBAAO,wBAAU,YAAY,OAAO,aAAa;AAC/C,mBAAS,aAAa,GAAG,UAAU,kBAAkB;AACrD,mBAAS,cAAU,4BAAc,YAAY,IAAI,CAAC;AAClD,gBAAM,SAAS,MAAM,OAAO,OAAO;AAAA,YACjC;AAAA,UACF;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,OAAO,mBAAmB,OAAO,QAAQ;AAC/C,cAAM,cAAc,CAAC,CAAC,KAAK;AAC3B,mBAAO,wBAAU,UAAU,OAAO,aAAa;AAC7C,mBAAS,aAAa,GAAG,UAAU,mBAAmB;AACtD,mBAAS,cAAU,4BAAc,UAAU,IAAI,CAAC;AAChD,gBAAM,SAAS,MAAM,OAAO,UAAU;AAAA,YACpC;AAAA,UACF;AACA,cAAI,aAAa;AACf,mBAAO,IAAI,0BAAc,GAAG,UAAU,YAAY,MAA2C;AAAA,UAC/F;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA;AACE,cAAM,IAAI,MAAM,wBAAwB,OAAO,EAAE;AAAA,IACrD;AAAA,EACF;AAAA,EAEU,cAAc,OAAwB;AAC9C,UAAM,OAAO,MAAM,OAAO;AAE1B,QAAI,gBAAgB,iCAAqB;AACvC,iBAAO,4BAAc,KAAK,IAAI;AAAA,IAChC;AAEA,UAAM,SAAS,KAAK,aAAa,KAAK;AACtC,WAAO,IAAI,cAAAC,QAAO,MAAM;AAAA,EAC1B;AAAA,EAEU,aAAa,OAAyC;AAC9D,UAAM,SAAkC,CAAC;AACzC,UAAM,OAAO,MAAM,OAAO;AAE1B,QAAI,gBAAgB,8BAAkB;AACpC,UAAI,KAAK,OAAQ,QAAO,SAAS,KAAK;AACtC,UAAI,KAAK,SAAU,QAAO,UAAU,KAAK;AAAA,IAC3C;AAEA,WAAO;AAAA,EACT;AACF;;;AEhIA,IAAAC,eAA0B;AAEnB,IAAM,kBAAN,MAA2C;AAAA,EAChD,MAAM,QAAQ,OAAgB,UAAqC;AACjE,eAAO,wBAAU,mBAAmB,OAAO,SAAS;AAClD,WAAK,aAAa,iDAAiD;AACnE,WAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AACjC,YAAM,SAAS,gBAAgB,OAAO,QAAQ;AAE9C,UAAI,CAAC,gBAAgB,QAAQ,GAAG;AAC9B,aAAK,UAAU,MAAM;AAAA,MACvB;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAKO,SAAS,gBAAgB,OAAgB,UAA4B;AAC1E,MAAI,OAAO,aAAa,YAAY,aAAa,KAAM,QAAO;AAG9D,MAAI,gBAAgB,QAAQ,GAAG;AAC7B,WAAO,gBAAgB,QAAQ;AAAA,EACjC;AAEA,QAAM,IAAI;AAGV,MAAI,EAAE,WAAW,cAAc,MAAM,QAAQ,EAAE,MAAM,GAAG;AACtD,WAAO,oBAAoB,OAAO,CAAC;AAAA,EACrC;AAGA,MAAI,EAAE,SAAS;AACb,WAAO,sBAAsB,OAAO,CAAC;AAAA,EACvC;AAGA,MAAI,EAAE,QAAQ,EAAE,WAAW,QAAQ;AACjC,WAAO,iBAAiB,CAAC;AAAA,EAC3B;AAGA,MAAI,EAAE,QAAQ,MAAM,QAAQ,EAAE,IAAI,GAAG;AACnC,UAAM,OAAO,EAAE;AACf,QAAI,KAAK,SAAS,MAAM,SAAS,KAAK,CAAC,KAAK,cAAc,KAAK,CAAC,IAAI;AAClE,aAAO,aAAa,CAAC;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAOA,SAAS,gBAAgB,OAAiD;AACxE,SACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAO,iBAAiB;AAE5B;AAaA,gBAAgB,gBACd,UACmC;AACnC,QAAM,cAA4E,oBAAI,IAAI;AAE1F,mBAAiB,SAAS,UAAU;AAClC,UAAM,IAAI;AACV,UAAM,UAAU,EAAE;AAClB,QAAI,CAAC,WAAW,QAAQ,WAAW,EAAG;AAEtC,UAAM,QAAS,QAAQ,CAAC,EAA8B;AACtD,QAAI,CAAC,MAAO;AAGZ,QAAI,MAAM,WAAW,MAAM;AACzB,YAAM,MAAM;AAAA,IACd;AAGA,UAAM,WAAW,MAAM;AACvB,QAAI,UAAU;AACZ,iBAAW,WAAW,UAAU;AAC9B,cAAM,MAAM,QAAQ;AACpB,YAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AACzB,sBAAY,IAAI,KAAK,EAAE,IAAI,IAAI,MAAM,IAAI,WAAW,GAAG,CAAC;AAAA,QAC1D;AACA,cAAM,MAAM,YAAY,IAAI,GAAG;AAC/B,YAAI,QAAQ,GAAI,KAAI,KAAK,QAAQ;AACjC,cAAM,KAAK,QAAQ;AACnB,YAAI,IAAI;AACN,cAAI,GAAG,KAAM,KAAI,OAAO,GAAG;AAC3B,cAAI,GAAG,UAAW,KAAI,aAAa,GAAG;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAGA,QAAI,MAAM,WAAW,MAAM;AACzB,YAAM,IAAI,MAAM,kBAAkB,MAAM,OAAO,EAAE;AAAA,IACnD;AAAA,EACF;AAGA,QAAM,gBAAgB,CAAC,GAAG,YAAY,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAClE,aAAW,OAAO,eAAe;AAC/B,UAAM,KAAK,YAAY,IAAI,GAAG;AAC9B,UAAM,EAAE,IAAI,GAAG,IAAI,MAAM,GAAG,MAAM,WAAW,GAAG,UAAU;AAAA,EAC5D;AACF;AAcA,SAAS,oBACP,OACA,UACS;AACT,QAAM,SAAS,SAAS;AAGxB,QAAM,YAAwB,CAAC;AAC/B,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,SAAS,iBAAiB;AACjC,gBAAU,KAAK;AAAA,QACb,IAAK,KAAK,WAAW,KAAK,MAAM;AAAA,QAChC,MAAM,KAAK;AAAA,QACX,WAAW,KAAK;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,SAAS;AAC5B,MAAI,eAAe,QAAW;AAE5B,QAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,UAAI;AACF,eAAO,KAAK,MAAM,UAAU;AAAA,MAC9B,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,SAAS,WAAW;AAC3B,YAAM,UAAU,KAAK;AACrB,UAAI,SAAS;AACX,mBAAW,QAAQ,SAAS;AAC1B,cAAI,KAAK,SAAS,iBAAiB,KAAK,SAAS,QAAQ;AACvD,kBAAM,KAAK,KAAK,IAAc;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,OAAO,MAAM,KAAK,EAAE;AAC1B,QAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,UAAI;AACF,eAAO,KAAK,MAAM,IAAI;AAAA,MACxB,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAMA,SAAS,sBACP,OACA,UACS;AACT,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,QAAM,SAAS,QAAQ,CAAC;AACxB,QAAM,UAAU,OAAO;AACvB,MAAI,CAAC,QAAS,QAAO;AAGrB,QAAM,YAAY,QAAQ;AAC1B,MAAI,aAAa,UAAU,SAAS,GAAG;AACrC,WAAO,UAAU,IAAI,CAAC,OAAiB;AACrC,YAAM,KAAK,GAAG;AACd,aAAO;AAAA,QACL,IAAI,GAAG;AAAA,QACP,MAAM,GAAG;AAAA,QACT,WAAW,GAAG;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,UAAU,QAAQ;AACxB,MAAI,YAAY,KAAM,QAAO;AAG7B,MAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,QAAI;AACF,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,UAA4C;AACpE,QAAM,OAAO,SAAS;AACtB,MAAI,KAAK,WAAW,GAAG;AACrB,WAAQ,KAAK,CAAC,EAA8B;AAAA,EAC9C;AACA,SAAO,KAAK,IAAI,CAAC,MAAO,EAA8B,SAAS;AACjE;AAEA,SAAS,aAAa,UAA4C;AAChE,QAAM,OAAO,SAAS;AACtB,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC,EAAE;AAAA,EAChC;AACA,SAAO,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ;AAC5C;;;AHxQA,IAAAC,eAAoD;IAIpD,+BAAiB,UAAU,IAAI,eAAe,CAAC;AAAA,IAC/C,gCAAkB,UAAU,IAAI,gBAAgB,CAAC;","names":["import_core","OpenAI","import_core","import_core"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/executor.ts","../src/wire.ts","../src/processor.ts"],"sourcesContent":["/**\n * @prompty/openai — OpenAI provider for Prompty.\n *\n * Importing this package auto-registers the \"openai\" executor and processor.\n *\n * @module @prompty/openai\n */\n\nexport { OpenAIExecutor } from \"./executor.js\";\nexport { OpenAIProcessor, processResponse } from \"./processor.js\";\nexport { messageToWire, buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\n\n// Auto-register on import\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\nimport { OpenAIExecutor } from \"./executor.js\";\nimport { OpenAIProcessor } from \"./processor.js\";\n\nregisterExecutor(\"openai\", new OpenAIExecutor());\nregisterProcessor(\"openai\", new OpenAIProcessor());\n","/**\n * OpenAI executor — sends messages to OpenAI APIs.\n *\n * Dispatches on `agent.model.apiType`: chat, embedding, image.\n *\n * @module\n */\n\nimport OpenAI from \"openai\";\nimport type { Prompty } from \"@prompty/core\";\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\nimport type { Executor } from \"@prompty/core\";\nimport type { Message } from \"@prompty/core\";\nimport { getConnection } from \"@prompty/core\";\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\nimport { buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\n\nexport class OpenAIExecutor implements Executor {\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\n return traceSpan(\"OpenAIExecutor\", async (emit) => {\n emit(\"signature\", \"prompty.openai.executor.OpenAIExecutor.invoke\");\n emit(\"inputs\", { data: messages });\n\n const client = this.resolveClient(agent);\n const clientName = client.constructor?.name ?? \"OpenAI\";\n\n // Trace what client we resolved and how\n await traceSpan(clientName, async (ctorEmit) => {\n ctorEmit(\"signature\", `${clientName}.ctor`);\n const conn = agent.model?.connection;\n if (conn instanceof ReferenceConnection) {\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\n } else {\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\n }\n ctorEmit(\"result\", clientName);\n });\n\n const apiType = agent.model?.apiType ?? \"chat\";\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\n emit(\"result\", result);\n return result;\n });\n }\n\n /** Dispatch to the appropriate API and trace the call. */\n private async executeApiCall(\n client: OpenAI,\n clientName: string,\n agent: Prompty,\n messages: Message[],\n apiType: string,\n ): Promise<unknown> {\n switch (apiType) {\n case \"chat\": {\n const args = buildChatArgs(agent, messages);\n const isStreaming = !!args.stream;\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.chat.completions.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.chat.completions.create(\n args as unknown as Parameters<typeof client.chat.completions.create>[0],\n );\n if (isStreaming) {\n // Wrap streaming response for tracing — don't emit result yet,\n // PromptyStream will trace on exhaustion\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\n }\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"embedding\": {\n const args = buildEmbeddingArgs(agent, messages);\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.embeddings.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.embeddings.create(\n args as unknown as Parameters<typeof client.embeddings.create>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"image\": {\n const args = buildImageArgs(agent, messages);\n return traceSpan(\"generate\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.images.generate`);\n callEmit(\"inputs\", sanitizeValue(\"generate\", args));\n const result = await client.images.generate(\n args as unknown as Parameters<typeof client.images.generate>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"responses\": {\n const args = buildResponsesArgs(agent, messages);\n const isStreaming = !!args.stream;\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.responses.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.responses.create(\n args as unknown as Parameters<typeof client.responses.create>[0],\n );\n if (isStreaming) {\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\n }\n callEmit(\"result\", result);\n return result;\n });\n }\n default:\n throw new Error(`Unsupported apiType: ${apiType}`);\n }\n }\n\n protected resolveClient(agent: Prompty): OpenAI {\n const conn = agent.model?.connection;\n\n if (conn instanceof ReferenceConnection) {\n return getConnection(conn.name) as OpenAI;\n }\n\n const kwargs = this.clientKwargs(agent);\n return new OpenAI(kwargs);\n }\n\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\n const kwargs: Record<string, unknown> = {};\n const conn = agent.model?.connection;\n\n if (conn instanceof ApiKeyConnection) {\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\n } else if (conn) {\n throw new Error(\n `Connection kind '${conn.kind}' is not supported by the OpenAI executor. ` +\n `Use 'key' for API key auth or 'reference' with registerConnection() for pre-configured clients.`,\n );\n }\n\n return kwargs;\n }\n}\n","/**\n * Wire format conversion: Message → OpenAI API JSON.\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { ContentPart, Message } from \"@prompty/core\";\nimport { load as loadPrompty } from \"@prompty/core\";\nimport { dirname, resolve } from \"node:path\";\n\n/**\n * Convert an abstract Message to OpenAI wire format.\n */\nexport function messageToWire(msg: Message): Record<string, unknown> {\n const wire: Record<string, unknown> = { role: msg.role };\n\n // Include metadata fields (e.g., name, tool_call_id, tool_calls)\n for (const [k, v] of Object.entries(msg.metadata)) {\n if (k !== \"role\" && k !== \"content\") {\n wire[k] = v;\n }\n }\n\n const content = msg.toTextContent();\n if (typeof content === \"string\") {\n wire.content = content;\n } else {\n // Multimodal — convert parts to OpenAI format\n wire.content = msg.parts.map(partToWire);\n }\n\n return wire;\n}\n\n/**\n * Convert a ContentPart to OpenAI wire format.\n */\nfunction partToWire(part: ContentPart): Record<string, unknown> {\n switch (part.kind) {\n case \"text\":\n return { type: \"text\", text: part.value };\n case \"image\": {\n const imageUrl: Record<string, unknown> = { url: part.source };\n if (part.detail) imageUrl.detail = part.detail;\n return { type: \"image_url\", image_url: imageUrl };\n }\n case \"audio\":\n return {\n type: \"input_audio\",\n input_audio: {\n data: part.source,\n ...(part.mediaType && { format: mimeToAudioFormat(part.mediaType) }),\n },\n };\n case \"file\":\n return { type: \"file\", file: { url: part.source } };\n }\n}\n\n/** Map audio MIME types to OpenAI short format names. */\nconst AUDIO_MIME_MAP: Record<string, string> = {\n \"audio/wav\": \"wav\",\n \"audio/mpeg\": \"mp3\",\n \"audio/mp3\": \"mp3\",\n \"audio/mp4\": \"mp4\",\n \"audio/ogg\": \"ogg\",\n \"audio/flac\": \"flac\",\n \"audio/webm\": \"webm\",\n \"audio/pcm\": \"pcm\",\n};\n\nfunction mimeToAudioFormat(mediaType: string): string {\n return AUDIO_MIME_MAP[mediaType.toLowerCase()] ?? mediaType;\n}\n\n/**\n * Build chat completion arguments from agent config and messages.\n */\nexport function buildChatArgs(\n agent: Prompty,\n messages: Message[],\n): Record<string, unknown> {\n const model = agent.model?.id || \"gpt-4\";\n const wireMessages = messages.map(messageToWire);\n\n const args: Record<string, unknown> = {\n model,\n messages: wireMessages,\n ...buildOptions(agent),\n };\n\n // Tools\n const tools = toolsToWire(agent);\n if (tools.length > 0) {\n args.tools = tools;\n }\n\n // Structured output\n const responseFormat = outputSchemaToWire(agent);\n if (responseFormat) {\n args.response_format = responseFormat;\n }\n\n return args;\n}\n\n/**\n * Build embedding arguments.\n * Only additionalProperties are passed — chat options are not valid here.\n */\nexport function buildEmbeddingArgs(\n agent: Prompty,\n data: unknown,\n): Record<string, unknown> {\n const model = agent.model?.id || \"text-embedding-ada-002\";\n\n // Extract text content from Message objects if needed\n let input: unknown;\n if (Array.isArray(data)) {\n const texts = data.map((item: unknown) => {\n if (typeof item === \"string\") return item;\n if (item && typeof item === \"object\" && \"text\" in item) return (item as { text: string }).text;\n if (item && typeof item === \"object\" && \"toTextContent\" in item) {\n const content = (item as { toTextContent: () => unknown }).toTextContent();\n return typeof content === \"string\" ? content : String(content);\n }\n return String(item);\n });\n // Single input → string, multiple → array\n input = texts.length === 1 ? texts[0] : texts;\n } else if (typeof data === \"string\") {\n input = data;\n } else {\n input = String(data);\n }\n\n const args: Record<string, unknown> = { input, model };\n const extra = agent.model?.options?.additionalProperties;\n if (extra) {\n for (const [k, v] of Object.entries(extra)) {\n args[k] = v;\n }\n }\n return args;\n}\n\n/**\n * Build image generation arguments.\n * Only additionalProperties are passed — chat options are not valid here.\n */\nexport function buildImageArgs(\n agent: Prompty,\n data: unknown,\n): Record<string, unknown> {\n const model = agent.model?.id || \"dall-e-3\";\n\n // Extract prompt text: data may be a string, or a Message[] from the parser\n let prompt: string;\n if (typeof data === \"string\") {\n prompt = data;\n } else if (Array.isArray(data)) {\n // Messages have .parts[].value for text content, or a .text getter\n prompt = data\n .map((m: { text?: string; parts?: { kind: string; value: string }[] }) => {\n if (typeof m.text === \"string\") return m.text;\n if (Array.isArray(m.parts)) {\n return m.parts\n .filter((p) => p.kind === \"text\")\n .map((p) => p.value)\n .join(\"\");\n }\n return String(m);\n })\n .join(\"\\n\")\n .trim();\n } else {\n prompt = String(data);\n }\n\n const args: Record<string, unknown> = { prompt, model };\n const extra = agent.model?.options?.additionalProperties;\n if (extra) {\n for (const [k, v] of Object.entries(extra)) {\n args[k] = v;\n }\n }\n return args;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Map AgentSchema kind strings to JSON Schema type strings. */\nconst KIND_TO_JSON_TYPE: Record<string, string> = {\n string: \"string\",\n integer: \"integer\",\n float: \"number\",\n number: \"number\",\n boolean: \"boolean\",\n array: \"array\",\n object: \"object\",\n};\n\nfunction buildOptions(agent: Prompty): Record<string, unknown> {\n const opts = agent.model?.options;\n if (!opts) return {};\n\n const result: Record<string, unknown> = {};\n\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\n if (opts.maxOutputTokens !== undefined) result.max_completion_tokens = opts.maxOutputTokens;\n if (opts.topP !== undefined) result.top_p = opts.topP;\n if (opts.frequencyPenalty !== undefined) result.frequency_penalty = opts.frequencyPenalty;\n if (opts.presencePenalty !== undefined) result.presence_penalty = opts.presencePenalty;\n if (opts.stopSequences !== undefined && opts.stopSequences.length > 0) result.stop = opts.stopSequences;\n if (opts.seed !== undefined) result.seed = opts.seed;\n\n // Pass through additionalProperties — but don't overwrite mapped keys\n if (opts.additionalProperties) {\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\n if (!(k in result)) {\n result[k] = v;\n }\n }\n }\n\n return result;\n}\n\n/** Convert a Property list to a JSON Schema `{type: \"object\", properties: ...}`. */\nfunction schemaToWire(properties: unknown[]): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const p of properties as Array<{ name?: string; kind?: string; description?: string; required?: boolean; enumValues?: unknown[] }>) {\n if (!p.name) continue;\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[p.kind ?? \"string\"] ?? \"string\",\n };\n if (p.description) schema.description = p.description;\n if (p.enumValues && p.enumValues.length > 0) schema.enum = p.enumValues;\n props[p.name] = schema;\n if (p.required) required.push(p.name);\n }\n\n const result: Record<string, unknown> = { type: \"object\", properties: props };\n if (required.length > 0) result.required = required;\n return result;\n}\n\n/** Convert a single Property to a JSON Schema definition (recursive for structured output). */\nfunction propertyToJsonSchema(prop: {\n kind?: string;\n description?: string;\n enumValues?: unknown[];\n items?: unknown;\n properties?: unknown[];\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[prop.kind ?? \"string\"] ?? \"string\",\n };\n\n if (prop.description) schema.description = prop.description;\n if (prop.enumValues && prop.enumValues.length > 0) schema.enum = prop.enumValues;\n\n // Array items\n if (prop.kind === \"array\") {\n schema.items = prop.items\n ? propertyToJsonSchema(prop.items as typeof prop)\n : { type: \"string\" };\n }\n\n // Nested object\n if (prop.kind === \"object\") {\n if (prop.properties) {\n const nested: Record<string, unknown> = {};\n const req: string[] = [];\n for (const p of prop.properties as Array<{ name?: string } & typeof prop>) {\n if (!p.name) continue;\n nested[p.name] = propertyToJsonSchema(p);\n req.push(p.name);\n }\n schema.properties = nested;\n schema.required = req;\n } else {\n schema.properties = {};\n schema.required = [];\n }\n schema.additionalProperties = false;\n }\n\n return schema;\n}\n\nfunction toolsToWire(agent: Prompty): Record<string, unknown>[] {\n const tools = agent.tools;\n if (!tools || tools.length === 0) return [];\n\n const result: Record<string, unknown>[] = [];\n\n for (const t of tools) {\n if (t.kind === \"function\") {\n const funcDef: Record<string, unknown> = { name: t.name };\n if (t.description) funcDef.description = t.description;\n\n // Collect bound parameter names to strip from wire format\n const boundNames = new Set((t.bindings ?? []).map((b) => b.name));\n\n // Serialize parameters via schemaToWire, filtering out bound params\n let params = (t as { parameters?: unknown[] }).parameters;\n if (params && Array.isArray(params)) {\n if (boundNames.size > 0) {\n params = params.filter((p) => !boundNames.has((p as Record<string, unknown>).name as string));\n }\n funcDef.parameters = schemaToWire(params);\n }\n\n // Strict mode\n const strict = (t as { strict?: boolean }).strict;\n if (strict) {\n funcDef.strict = true;\n if (funcDef.parameters) {\n (funcDef.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n result.push({ type: \"function\", function: funcDef });\n } else if (t.kind === \"prompty\") {\n const funcDef = projectPromptyTool(t as unknown as Record<string, unknown>, agent);\n result.push({ type: \"function\", function: funcDef });\n }\n }\n\n return result;\n}\n\n/**\n * Project a PromptyTool as an OpenAI function definition.\n *\n * Loads the child `.prompty` file, uses its `inputs` as the\n * function parameters, and applies binding/strict stripping.\n */\nfunction projectPromptyTool(tool: Record<string, unknown>, parent: Prompty): Record<string, unknown> {\n const toolPath = tool.path as string | undefined;\n if (!toolPath) {\n throw new Error(`PromptyTool '${tool.name}' has no path`);\n }\n\n // Resolve child path relative to the parent .prompty file\n const parentPath = (parent.metadata ?? {}).__source_path as string | undefined;\n if (!parentPath) {\n throw new Error(\n `Cannot resolve PromptyTool '${tool.name}': parent agent has no __source_path in metadata`,\n );\n }\n const childPath = resolve(dirname(parentPath), toolPath);\n const child = loadPrompty(childPath);\n\n const funcDef: Record<string, unknown> = { name: tool.name };\n funcDef.description = (tool.description as string) || child.description || \"\";\n\n // Use child's inputs as parameters, stripping bound params\n const bindings = (tool as { bindings?: { name: string }[] }).bindings;\n const boundNames = new Set((bindings ?? []).map((b) => b.name));\n\n const childInputs = child.inputs ?? [];\n let params: unknown[] = childInputs;\n if (boundNames.size > 0) {\n params = params.filter((p) => !boundNames.has((p as Record<string, unknown>).name as string));\n }\n funcDef.parameters = schemaToWire(params);\n\n const strict = (tool as { strict?: boolean }).strict;\n if (strict) {\n funcDef.strict = true;\n if (funcDef.parameters) {\n (funcDef.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n return funcDef;\n}\n\nfunction outputSchemaToWire(agent: Prompty): Record<string, unknown> | null {\n const outputs = agent.outputs;\n if (!outputs || outputs.length === 0) return null;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const prop of outputs) {\n if (!prop.name) continue;\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\n required.push(prop.name);\n }\n\n const name = \"structured_output\";\n\n return {\n type: \"json_schema\",\n json_schema: {\n name,\n strict: true,\n schema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Responses API wire format\n// ---------------------------------------------------------------------------\n\n/**\n * Build Responses API arguments from agent config and messages.\n *\n * Key differences from Chat Completions:\n * - System messages → `instructions` parameter\n * - Other messages → `input` as EasyInputMessage[]\n * - `maxOutputTokens` → `max_output_tokens`\n * - Structured output → `text.format` (not `response_format`)\n * - Tools use flat `{ type: \"function\", name, parameters }` (not nested `function:`)\n */\nexport function buildResponsesArgs(\n agent: Prompty,\n messages: Message[],\n): Record<string, unknown> {\n const model = agent.model?.id || \"gpt-4o\";\n\n // Separate system messages as instructions, rest as input\n const systemParts: string[] = [];\n const inputMessages: Record<string, unknown>[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\" || msg.role === \"developer\") {\n systemParts.push(msg.text);\n } else {\n inputMessages.push(messageToResponsesInput(msg));\n }\n }\n\n const args: Record<string, unknown> = {\n model,\n input: inputMessages,\n };\n\n // Set instructions from system messages\n if (systemParts.length > 0) {\n args.instructions = systemParts.join(\"\\n\\n\");\n }\n\n // Map model options\n const responseOpts = buildResponsesOptions(agent);\n Object.assign(args, responseOpts);\n\n // Tools\n const tools = responsesToolsToWire(agent);\n if (tools.length > 0) {\n args.tools = tools;\n }\n\n // Structured output via text.format\n const textConfig = outputSchemaToResponsesWire(agent);\n if (textConfig) {\n args.text = textConfig;\n }\n\n return args;\n}\n\n/** Convert a Message to Responses API EasyInputMessage format. */\nfunction messageToResponsesInput(msg: Message): Record<string, unknown> {\n const content = msg.toTextContent();\n\n // Pass-through original function_call items from the agent loop\n if (msg.metadata.responses_function_call) {\n return msg.metadata.responses_function_call as Record<string, unknown>;\n }\n\n // Tool result messages → function_call_output\n if (msg.metadata.tool_call_id) {\n return {\n type: \"function_call_output\",\n call_id: msg.metadata.tool_call_id,\n output: typeof content === \"string\" ? content : JSON.stringify(content),\n };\n }\n\n const role = msg.role === \"tool\" ? \"user\" : msg.role;\n return { role, content };\n}\n\n/** Build Responses-specific model options. */\nfunction buildResponsesOptions(agent: Prompty): Record<string, unknown> {\n const opts = agent.model?.options;\n if (!opts) return {};\n\n const result: Record<string, unknown> = {};\n\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\n if (opts.maxOutputTokens !== undefined) result.max_output_tokens = opts.maxOutputTokens;\n if (opts.topP !== undefined) result.top_p = opts.topP;\n\n // Pass through additionalProperties — but don't overwrite mapped keys\n if (opts.additionalProperties) {\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\n if (!(k in result)) {\n result[k] = v;\n }\n }\n }\n\n return result;\n}\n\n/** Convert agent tools to Responses API tool format. */\nfunction responsesToolsToWire(agent: Prompty): Record<string, unknown>[] {\n const tools = agent.tools;\n if (!tools || tools.length === 0) return [];\n\n const result: Record<string, unknown>[] = [];\n\n for (const t of tools) {\n if (t.kind === \"function\") {\n // Responses API uses flat tool format (not nested under \"function:\")\n const tool: Record<string, unknown> = {\n type: \"function\",\n name: t.name,\n };\n if (t.description) tool.description = t.description;\n\n const params = (t as { parameters?: unknown[] }).parameters;\n if (params && Array.isArray(params)) {\n tool.parameters = schemaToWire(params);\n }\n\n const strict = (t as { strict?: boolean }).strict;\n if (strict) {\n tool.strict = true;\n if (tool.parameters) {\n (tool.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n result.push(tool);\n } else if (t.kind === \"prompty\") {\n // Project prompty tool as a flat function definition (Responses API format)\n const projected = projectPromptyTool(t as unknown as Record<string, unknown>, agent);\n const tool: Record<string, unknown> = {\n type: \"function\",\n name: projected.name,\n };\n if (projected.description) tool.description = projected.description;\n if (projected.parameters) tool.parameters = projected.parameters;\n\n const strict = (projected as Record<string, unknown>).strict;\n if (strict) {\n tool.strict = true;\n if (tool.parameters) {\n (tool.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n result.push(tool);\n }\n }\n\n return result;\n}\n\n/** Convert outputSchema to Responses API text.format config. */\nfunction outputSchemaToResponsesWire(agent: Prompty): Record<string, unknown> | null {\n const outputs = agent.outputs;\n if (!outputs || outputs.length === 0) return null;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const prop of outputs) {\n if (!prop.name) continue;\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\n required.push(prop.name);\n }\n\n const name = \"structured_output\";\n\n return {\n format: {\n type: \"json_schema\",\n name,\n strict: true,\n schema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n },\n };\n}\n","/**\n * OpenAI processor — extracts clean results from raw OpenAI responses.\n *\n * Handles ChatCompletion, Embedding, Image, and streaming responses.\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { Processor } from \"@prompty/core\";\nimport type { ToolCall } from \"@prompty/core\";\nimport { traceSpan } from \"@prompty/core\";\n\nexport class OpenAIProcessor implements Processor {\n async process(agent: Prompty, response: unknown): Promise<unknown> {\n return traceSpan(\"OpenAIProcessor\", async (emit) => {\n emit(\"signature\", \"prompty.openai.processor.OpenAIProcessor.invoke\");\n emit(\"inputs\", { data: response });\n const result = processResponse(agent, response);\n // Don't emit result for streaming — it's a generator, not a value\n if (!isAsyncIterable(response)) {\n emit(\"result\", result);\n }\n return result;\n });\n }\n}\n\n/**\n * Extract clean content from an OpenAI response.\n */\nexport function processResponse(agent: Prompty, response: unknown): unknown {\n if (typeof response !== \"object\" || response === null) return response;\n\n // Streaming response — return content-extracting async generator\n if (isAsyncIterable(response)) {\n return streamGenerator(response);\n }\n\n const r = response as Record<string, unknown>;\n\n // Responses API — has output[] and object === \"response\"\n if (r.object === \"response\" && Array.isArray(r.output)) {\n return processResponsesApi(agent, r);\n }\n\n // ChatCompletion\n if (r.choices) {\n return processChatCompletion(agent, r);\n }\n\n // Embedding response\n if (r.data && r.object === \"list\") {\n return processEmbedding(r);\n }\n\n // Image response\n if (r.data && Array.isArray(r.data)) {\n const data = r.data as Record<string, unknown>[];\n if (data.length > 0 && (\"url\" in data[0] || \"b64_json\" in data[0])) {\n return processImage(r);\n }\n }\n\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Streaming\n// ---------------------------------------------------------------------------\n\n/** Type guard for async iterables (PromptyStream or raw SDK stream). */\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value\n );\n}\n\n/**\n * Yield content chunks, tool calls, or refusals from a streaming response.\n *\n * Handles three types of streaming deltas:\n * - `delta.content` — yields content strings\n * - `delta.tool_calls` — accumulates partial tool call chunks,\n * yields ToolCall objects when the stream ends\n * - `delta.refusal` — throws Error with the refusal message\n *\n * Matches the Python `_stream_generator` / `_async_stream_generator`.\n */\nasync function* streamGenerator(\n response: AsyncIterable<unknown>,\n): AsyncGenerator<string | ToolCall> {\n const toolCallAcc: Map<number, { id: string; name: string; arguments: string }> = new Map();\n\n for await (const chunk of response) {\n const c = chunk as Record<string, unknown>;\n const choices = c.choices as Record<string, unknown>[] | undefined;\n if (!choices || choices.length === 0) continue;\n\n const delta = (choices[0] as Record<string, unknown>).delta as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n // Content\n if (delta.content != null) {\n yield delta.content as string;\n }\n\n // Tool call deltas — accumulate index-keyed partial chunks\n const tcDeltas = delta.tool_calls as Record<string, unknown>[] | undefined;\n if (tcDeltas) {\n for (const tcDelta of tcDeltas) {\n const idx = tcDelta.index as number;\n if (!toolCallAcc.has(idx)) {\n toolCallAcc.set(idx, { id: \"\", name: \"\", arguments: \"\" });\n }\n const acc = toolCallAcc.get(idx)!;\n if (tcDelta.id) acc.id = tcDelta.id as string;\n const fn = tcDelta.function as Record<string, unknown> | undefined;\n if (fn) {\n if (fn.name) acc.name = fn.name as string;\n if (fn.arguments) acc.arguments += fn.arguments as string;\n }\n }\n }\n\n // Refusal\n if (delta.refusal != null) {\n throw new Error(`Model refused: ${delta.refusal}`);\n }\n }\n\n // Yield accumulated tool calls at the end of the stream\n const sortedIndices = [...toolCallAcc.keys()].sort((a, b) => a - b);\n for (const idx of sortedIndices) {\n const tc = toolCallAcc.get(idx)!;\n yield { id: tc.id, name: tc.name, arguments: tc.arguments } as ToolCall;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Responses API processing\n// ---------------------------------------------------------------------------\n\n/**\n * Process a Responses API response.\n *\n * Extracts:\n * - Text content from `output_text` or output message items\n * - Function tool calls from `function_call` output items\n * - JSON-parsed content when outputSchema is present\n */\nfunction processResponsesApi(\n agent: Prompty,\n response: Record<string, unknown>,\n): unknown {\n const output = response.output as Record<string, unknown>[];\n\n // Collect function calls\n const funcCalls: ToolCall[] = [];\n for (const item of output) {\n if (item.type === \"function_call\") {\n funcCalls.push({\n id: (item.call_id ?? item.id ?? \"\") as string,\n name: item.name as string,\n arguments: item.arguments as string,\n });\n }\n }\n\n if (funcCalls.length > 0) {\n return funcCalls;\n }\n\n // Text content — use output_text convenience field\n const outputText = response.output_text as string | undefined;\n if (outputText !== undefined) {\n // Structured output — JSON parse when outputs schema exists\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(outputText);\n } catch {\n return outputText;\n }\n }\n return outputText;\n }\n\n // Fallback: extract from output message items\n const texts: string[] = [];\n for (const item of output) {\n if (item.type === \"message\") {\n const content = item.content as Record<string, unknown>[] | undefined;\n if (content) {\n for (const part of content) {\n if (part.type === \"output_text\" || part.type === \"text\") {\n texts.push(part.text as string);\n }\n }\n }\n }\n }\n\n if (texts.length > 0) {\n const text = texts.join(\"\");\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n }\n\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response processing\n// ---------------------------------------------------------------------------\n\nfunction processChatCompletion(\n agent: Prompty,\n response: Record<string, unknown>,\n): unknown {\n const choices = response.choices as Record<string, unknown>[];\n if (!choices || choices.length === 0) return null;\n\n const choice = choices[0];\n const message = choice.message as Record<string, unknown>;\n if (!message) return null;\n\n // Tool calls\n const toolCalls = message.tool_calls as Record<string, unknown>[] | undefined;\n if (toolCalls && toolCalls.length > 0) {\n return toolCalls.map((tc): ToolCall => {\n const fn = tc.function as Record<string, unknown>;\n return {\n id: tc.id as string,\n name: fn.name as string,\n arguments: fn.arguments as string,\n };\n });\n }\n\n // Content\n const content = message.content as string | null;\n\n // Refusal — when content is null but refusal is present, return the refusal\n if (content === null) {\n const refusal = message.refusal as string | undefined;\n if (typeof refusal === \"string\") return refusal;\n return null;\n }\n\n // Structured output — JSON parse when outputs schema exists\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(content);\n } catch {\n return content;\n }\n }\n\n return content;\n}\n\nfunction processEmbedding(response: Record<string, unknown>): unknown {\n const data = response.data as Record<string, unknown>[];\n if (data.length === 1) {\n return (data[0] as Record<string, unknown>).embedding;\n }\n return data.map((d) => (d as Record<string, unknown>).embedding);\n}\n\nfunction processImage(response: Record<string, unknown>): unknown {\n const data = response.data as Record<string, unknown>[];\n if (data.length === 1) {\n return data[0].url ?? data[0].b64_json;\n }\n return data.map((d) => d.url ?? d.b64_json);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQA,oBAAmB;AAEnB,IAAAA,eAAqE;AAGrE,IAAAA,eAA8B;AAC9B,IAAAA,eAAyC;;;ACNzC,kBAAoC;AACpC,uBAAiC;AAK1B,SAAS,cAAc,KAAuC;AACnE,QAAM,OAAgC,EAAE,MAAM,IAAI,KAAK;AAGvD,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,QAAQ,GAAG;AACjD,QAAI,MAAM,UAAU,MAAM,WAAW;AACnC,WAAK,CAAC,IAAI;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,cAAc;AAClC,MAAI,OAAO,YAAY,UAAU;AAC/B,SAAK,UAAU;AAAA,EACjB,OAAO;AAEL,SAAK,UAAU,IAAI,MAAM,IAAI,UAAU;AAAA,EACzC;AAEA,SAAO;AACT;AAKA,SAAS,WAAW,MAA4C;AAC9D,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,MAAM;AAAA,IAC1C,KAAK,SAAS;AACZ,YAAM,WAAoC,EAAE,KAAK,KAAK,OAAO;AAC7D,UAAI,KAAK,OAAQ,UAAS,SAAS,KAAK;AACxC,aAAO,EAAE,MAAM,aAAa,WAAW,SAAS;AAAA,IAClD;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,UACX,MAAM,KAAK;AAAA,UACX,GAAI,KAAK,aAAa,EAAE,QAAQ,kBAAkB,KAAK,SAAS,EAAE;AAAA,QACpE;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,MAAM,EAAE,KAAK,KAAK,OAAO,EAAE;AAAA,EACtD;AACF;AAGA,IAAM,iBAAyC;AAAA,EAC7C,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AACf;AAEA,SAAS,kBAAkB,WAA2B;AACpD,SAAO,eAAe,UAAU,YAAY,CAAC,KAAK;AACpD;AAKO,SAAS,cACd,OACA,UACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AACjC,QAAM,eAAe,SAAS,IAAI,aAAa;AAE/C,QAAM,OAAgC;AAAA,IACpC;AAAA,IACA,UAAU;AAAA,IACV,GAAG,aAAa,KAAK;AAAA,EACvB;AAGA,QAAM,QAAQ,YAAY,KAAK;AAC/B,MAAI,MAAM,SAAS,GAAG;AACpB,SAAK,QAAQ;AAAA,EACf;AAGA,QAAM,iBAAiB,mBAAmB,KAAK;AAC/C,MAAI,gBAAgB;AAClB,SAAK,kBAAkB;AAAA,EACzB;AAEA,SAAO;AACT;AAMO,SAAS,mBACd,OACA,MACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AAGjC,MAAI;AACJ,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,UAAM,QAAQ,KAAK,IAAI,CAAC,SAAkB;AACxC,UAAI,OAAO,SAAS,SAAU,QAAO;AACrC,UAAI,QAAQ,OAAO,SAAS,YAAY,UAAU,KAAM,QAAQ,KAA0B;AAC1F,UAAI,QAAQ,OAAO,SAAS,YAAY,mBAAmB,MAAM;AAC/D,cAAM,UAAW,KAA0C,cAAc;AACzE,eAAO,OAAO,YAAY,WAAW,UAAU,OAAO,OAAO;AAAA,MAC/D;AACA,aAAO,OAAO,IAAI;AAAA,IACpB,CAAC;AAED,YAAQ,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI;AAAA,EAC1C,WAAW,OAAO,SAAS,UAAU;AACnC,YAAQ;AAAA,EACV,OAAO;AACL,YAAQ,OAAO,IAAI;AAAA,EACrB;AAEA,QAAM,OAAgC,EAAE,OAAO,MAAM;AACrD,QAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,MAAI,OAAO;AACT,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,WAAK,CAAC,IAAI;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,eACd,OACA,MACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AAGjC,MAAI;AACJ,MAAI,OAAO,SAAS,UAAU;AAC5B,aAAS;AAAA,EACX,WAAW,MAAM,QAAQ,IAAI,GAAG;AAE9B,aAAS,KACN,IAAI,CAAC,MAAoE;AACxE,UAAI,OAAO,EAAE,SAAS,SAAU,QAAO,EAAE;AACzC,UAAI,MAAM,QAAQ,EAAE,KAAK,GAAG;AAC1B,eAAO,EAAE,MACN,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,IAAI,CAAC,MAAM,EAAE,KAAK,EAClB,KAAK,EAAE;AAAA,MACZ;AACA,aAAO,OAAO,CAAC;AAAA,IACjB,CAAC,EACA,KAAK,IAAI,EACT,KAAK;AAAA,EACV,OAAO;AACL,aAAS,OAAO,IAAI;AAAA,EACtB;AAEA,QAAM,OAAgC,EAAE,QAAQ,MAAM;AACtD,QAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,MAAI,OAAO;AACT,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,WAAK,CAAC,IAAI;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAOA,IAAM,oBAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,SAAS,aAAa,OAAyC;AAC7D,QAAM,OAAO,MAAM,OAAO;AAC1B,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,QAAM,SAAkC,CAAC;AAEzC,MAAI,KAAK,gBAAgB,OAAW,QAAO,cAAc,KAAK;AAC9D,MAAI,KAAK,oBAAoB,OAAW,QAAO,wBAAwB,KAAK;AAC5E,MAAI,KAAK,SAAS,OAAW,QAAO,QAAQ,KAAK;AACjD,MAAI,KAAK,qBAAqB,OAAW,QAAO,oBAAoB,KAAK;AACzE,MAAI,KAAK,oBAAoB,OAAW,QAAO,mBAAmB,KAAK;AACvE,MAAI,KAAK,kBAAkB,UAAa,KAAK,cAAc,SAAS,EAAG,QAAO,OAAO,KAAK;AAC1F,MAAI,KAAK,SAAS,OAAW,QAAO,OAAO,KAAK;AAGhD,MAAI,KAAK,sBAAsB;AAC7B,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,oBAAoB,GAAG;AAC9D,UAAI,EAAE,KAAK,SAAS;AAClB,eAAO,CAAC,IAAI;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,aAAa,YAAgD;AACpE,QAAM,QAAiC,CAAC;AACxC,QAAM,WAAqB,CAAC;AAE5B,aAAW,KAAK,YAAyH;AACvI,QAAI,CAAC,EAAE,KAAM;AACb,UAAM,SAAkC;AAAA,MACtC,MAAM,kBAAkB,EAAE,QAAQ,QAAQ,KAAK;AAAA,IACjD;AACA,QAAI,EAAE,YAAa,QAAO,cAAc,EAAE;AAC1C,QAAI,EAAE,cAAc,EAAE,WAAW,SAAS,EAAG,QAAO,OAAO,EAAE;AAC7D,UAAM,EAAE,IAAI,IAAI;AAChB,QAAI,EAAE,SAAU,UAAS,KAAK,EAAE,IAAI;AAAA,EACtC;AAEA,QAAM,SAAkC,EAAE,MAAM,UAAU,YAAY,MAAM;AAC5E,MAAI,SAAS,SAAS,EAAG,QAAO,WAAW;AAC3C,SAAO;AACT;AAGA,SAAS,qBAAqB,MAMF;AAC1B,QAAM,SAAkC;AAAA,IACtC,MAAM,kBAAkB,KAAK,QAAQ,QAAQ,KAAK;AAAA,EACpD;AAEA,MAAI,KAAK,YAAa,QAAO,cAAc,KAAK;AAChD,MAAI,KAAK,cAAc,KAAK,WAAW,SAAS,EAAG,QAAO,OAAO,KAAK;AAGtE,MAAI,KAAK,SAAS,SAAS;AACzB,WAAO,QAAQ,KAAK,QAChB,qBAAqB,KAAK,KAAoB,IAC9C,EAAE,MAAM,SAAS;AAAA,EACvB;AAGA,MAAI,KAAK,SAAS,UAAU;AAC1B,QAAI,KAAK,YAAY;AACnB,YAAM,SAAkC,CAAC;AACzC,YAAM,MAAgB,CAAC;AACvB,iBAAW,KAAK,KAAK,YAAsD;AACzE,YAAI,CAAC,EAAE,KAAM;AACb,eAAO,EAAE,IAAI,IAAI,qBAAqB,CAAC;AACvC,YAAI,KAAK,EAAE,IAAI;AAAA,MACjB;AACA,aAAO,aAAa;AACpB,aAAO,WAAW;AAAA,IACpB,OAAO;AACL,aAAO,aAAa,CAAC;AACrB,aAAO,WAAW,CAAC;AAAA,IACrB;AACA,WAAO,uBAAuB;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,OAA2C;AAC9D,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO,CAAC;AAE1C,QAAM,SAAoC,CAAC;AAE3C,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,SAAS,YAAY;AACzB,YAAM,UAAmC,EAAE,MAAM,EAAE,KAAK;AACxD,UAAI,EAAE,YAAa,SAAQ,cAAc,EAAE;AAG3C,YAAM,aAAa,IAAI,KAAK,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAGhE,UAAI,SAAU,EAAiC;AAC/C,UAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACnC,YAAI,WAAW,OAAO,GAAG;AACvB,mBAAS,OAAO,OAAO,CAAC,MAAM,CAAC,WAAW,IAAK,EAA8B,IAAc,CAAC;AAAA,QAC9F;AACA,gBAAQ,aAAa,aAAa,MAAM;AAAA,MAC1C;AAGA,YAAM,SAAU,EAA2B;AAC3C,UAAI,QAAQ;AACV,gBAAQ,SAAS;AACjB,YAAI,QAAQ,YAAY;AACtB,UAAC,QAAQ,WAAuC,uBAAuB;AAAA,QACzE;AAAA,MACF;AAEA,aAAO,KAAK,EAAE,MAAM,YAAY,UAAU,QAAQ,CAAC;AAAA,IACrD,WAAW,EAAE,SAAS,WAAW;AAC/B,YAAM,UAAU,mBAAmB,GAAyC,KAAK;AACjF,aAAO,KAAK,EAAE,MAAM,YAAY,UAAU,QAAQ,CAAC;AAAA,IACrD;AAAA,EACF;AAEA,SAAO;AACT;AAQA,SAAS,mBAAmB,MAA+B,QAA0C;AACnG,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,gBAAgB,KAAK,IAAI,eAAe;AAAA,EAC1D;AAGA,QAAM,cAAc,OAAO,YAAY,CAAC,GAAG;AAC3C,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR,+BAA+B,KAAK,IAAI;AAAA,IAC1C;AAAA,EACF;AACA,QAAM,gBAAY,8BAAQ,0BAAQ,UAAU,GAAG,QAAQ;AACvD,QAAM,YAAQ,YAAAC,MAAY,SAAS;AAEnC,QAAM,UAAmC,EAAE,MAAM,KAAK,KAAK;AAC3D,UAAQ,cAAe,KAAK,eAA0B,MAAM,eAAe;AAG3E,QAAM,WAAY,KAA2C;AAC7D,QAAM,aAAa,IAAI,KAAK,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAE9D,QAAM,cAAc,MAAM,UAAU,CAAC;AACrC,MAAI,SAAoB;AACxB,MAAI,WAAW,OAAO,GAAG;AACvB,aAAS,OAAO,OAAO,CAAC,MAAM,CAAC,WAAW,IAAK,EAA8B,IAAc,CAAC;AAAA,EAC9F;AACA,UAAQ,aAAa,aAAa,MAAM;AAExC,QAAM,SAAU,KAA8B;AAC9C,MAAI,QAAQ;AACV,YAAQ,SAAS;AACjB,QAAI,QAAQ,YAAY;AACtB,MAAC,QAAQ,WAAuC,uBAAuB;AAAA,IACzE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAgD;AAC1E,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,QAAM,aAAsC,CAAC;AAC7C,QAAM,WAAqB,CAAC;AAE5B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,KAAK,KAAM;AAChB,eAAW,KAAK,IAAI,IAAI,qBAAqB,IAAkD;AAC/F,aAAS,KAAK,KAAK,IAAI;AAAA,EACzB;AAEA,QAAM,OAAO;AAEb,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,sBAAsB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;AAgBO,SAAS,mBACd,OACA,UACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AAGjC,QAAM,cAAwB,CAAC;AAC/B,QAAM,gBAA2C,CAAC;AAElD,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,SAAS,YAAY,IAAI,SAAS,aAAa;AACrD,kBAAY,KAAK,IAAI,IAAI;AAAA,IAC3B,OAAO;AACL,oBAAc,KAAK,wBAAwB,GAAG,CAAC;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,OAAgC;AAAA,IACpC;AAAA,IACA,OAAO;AAAA,EACT;AAGA,MAAI,YAAY,SAAS,GAAG;AAC1B,SAAK,eAAe,YAAY,KAAK,MAAM;AAAA,EAC7C;AAGA,QAAM,eAAe,sBAAsB,KAAK;AAChD,SAAO,OAAO,MAAM,YAAY;AAGhC,QAAM,QAAQ,qBAAqB,KAAK;AACxC,MAAI,MAAM,SAAS,GAAG;AACpB,SAAK,QAAQ;AAAA,EACf;AAGA,QAAM,aAAa,4BAA4B,KAAK;AACpD,MAAI,YAAY;AACd,SAAK,OAAO;AAAA,EACd;AAEA,SAAO;AACT;AAGA,SAAS,wBAAwB,KAAuC;AACtE,QAAM,UAAU,IAAI,cAAc;AAGlC,MAAI,IAAI,SAAS,yBAAyB;AACxC,WAAO,IAAI,SAAS;AAAA,EACtB;AAGA,MAAI,IAAI,SAAS,cAAc;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,IAAI,SAAS;AAAA,MACtB,QAAQ,OAAO,YAAY,WAAW,UAAU,KAAK,UAAU,OAAO;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,OAAO,IAAI,SAAS,SAAS,SAAS,IAAI;AAChD,SAAO,EAAE,MAAM,QAAQ;AACzB;AAGA,SAAS,sBAAsB,OAAyC;AACtE,QAAM,OAAO,MAAM,OAAO;AAC1B,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,QAAM,SAAkC,CAAC;AAEzC,MAAI,KAAK,gBAAgB,OAAW,QAAO,cAAc,KAAK;AAC9D,MAAI,KAAK,oBAAoB,OAAW,QAAO,oBAAoB,KAAK;AACxE,MAAI,KAAK,SAAS,OAAW,QAAO,QAAQ,KAAK;AAGjD,MAAI,KAAK,sBAAsB;AAC7B,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,oBAAoB,GAAG;AAC9D,UAAI,EAAE,KAAK,SAAS;AAClB,eAAO,CAAC,IAAI;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,qBAAqB,OAA2C;AACvE,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO,CAAC;AAE1C,QAAM,SAAoC,CAAC;AAE3C,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,SAAS,YAAY;AAEzB,YAAM,OAAgC;AAAA,QACpC,MAAM;AAAA,QACN,MAAM,EAAE;AAAA,MACV;AACA,UAAI,EAAE,YAAa,MAAK,cAAc,EAAE;AAExC,YAAM,SAAU,EAAiC;AACjD,UAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACnC,aAAK,aAAa,aAAa,MAAM;AAAA,MACvC;AAEA,YAAM,SAAU,EAA2B;AAC3C,UAAI,QAAQ;AACV,aAAK,SAAS;AACd,YAAI,KAAK,YAAY;AACnB,UAAC,KAAK,WAAuC,uBAAuB;AAAA,QACtE;AAAA,MACF;AAEA,aAAO,KAAK,IAAI;AAAA,IAClB,WAAW,EAAE,SAAS,WAAW;AAE/B,YAAM,YAAY,mBAAmB,GAAyC,KAAK;AACnF,YAAM,OAAgC;AAAA,QACpC,MAAM;AAAA,QACN,MAAM,UAAU;AAAA,MAClB;AACA,UAAI,UAAU,YAAa,MAAK,cAAc,UAAU;AACxD,UAAI,UAAU,WAAY,MAAK,aAAa,UAAU;AAEtD,YAAM,SAAU,UAAsC;AACtD,UAAI,QAAQ;AACV,aAAK,SAAS;AACd,YAAI,KAAK,YAAY;AACnB,UAAC,KAAK,WAAuC,uBAAuB;AAAA,QACtE;AAAA,MACF;AAEA,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,4BAA4B,OAAgD;AACnF,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,QAAM,aAAsC,CAAC;AAC7C,QAAM,WAAqB,CAAC;AAE5B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,KAAK,KAAM;AAChB,eAAW,KAAK,IAAI,IAAI,qBAAqB,IAAkD;AAC/F,aAAS,KAAK,KAAK,IAAI;AAAA,EACzB;AAEA,QAAM,OAAO;AAEb,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,sBAAsB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;;;AD5kBO,IAAM,iBAAN,MAAyC;AAAA,EAC9C,MAAM,QAAQ,OAAgB,UAAuC;AACnE,eAAO,wBAAU,kBAAkB,OAAO,SAAS;AACjD,WAAK,aAAa,+CAA+C;AACjE,WAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjC,YAAM,SAAS,KAAK,cAAc,KAAK;AACvC,YAAM,aAAa,OAAO,aAAa,QAAQ;AAG/C,gBAAM,wBAAU,YAAY,OAAO,aAAa;AAC9C,iBAAS,aAAa,GAAG,UAAU,OAAO;AAC1C,cAAM,OAAO,MAAM,OAAO;AAC1B,YAAI,gBAAgB,kCAAqB;AACvC,mBAAS,UAAU,EAAE,QAAQ,aAAa,MAAM,KAAK,KAAK,CAAC;AAAA,QAC7D,OAAO;AACL,mBAAS,cAAU,4BAAc,QAAQ,KAAK,aAAa,KAAK,CAAC,CAAC;AAAA,QACpE;AACA,iBAAS,UAAU,UAAU;AAAA,MAC/B,CAAC;AAED,YAAM,UAAU,MAAM,OAAO,WAAW;AACxC,YAAM,SAAS,MAAM,KAAK,eAAe,QAAQ,YAAY,OAAO,UAAU,OAAO;AACrF,WAAK,UAAU,MAAM;AACrB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAc,eACZ,QACA,YACA,OACA,UACA,SACkB;AAClB,YAAQ,SAAS;AAAA,MACf,KAAK,QAAQ;AACX,cAAM,OAAO,cAAc,OAAO,QAAQ;AAC1C,cAAM,cAAc,CAAC,CAAC,KAAK;AAC3B,mBAAO,wBAAU,UAAU,OAAO,aAAa;AAC7C,mBAAS,aAAa,GAAG,UAAU,0BAA0B;AAC7D,mBAAS,cAAU,4BAAc,UAAU,IAAI,CAAC;AAChD,gBAAM,SAAS,MAAM,OAAO,KAAK,YAAY;AAAA,YAC3C;AAAA,UACF;AACA,cAAI,aAAa;AAGf,mBAAO,IAAI,2BAAc,GAAG,UAAU,YAAY,MAA2C;AAAA,UAC/F;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,OAAO,mBAAmB,OAAO,QAAQ;AAC/C,mBAAO,wBAAU,UAAU,OAAO,aAAa;AAC7C,mBAAS,aAAa,GAAG,UAAU,oBAAoB;AACvD,mBAAS,cAAU,4BAAc,UAAU,IAAI,CAAC;AAChD,gBAAM,SAAS,MAAM,OAAO,WAAW;AAAA,YACrC;AAAA,UACF;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,OAAO,eAAe,OAAO,QAAQ;AAC3C,mBAAO,wBAAU,YAAY,OAAO,aAAa;AAC/C,mBAAS,aAAa,GAAG,UAAU,kBAAkB;AACrD,mBAAS,cAAU,4BAAc,YAAY,IAAI,CAAC;AAClD,gBAAM,SAAS,MAAM,OAAO,OAAO;AAAA,YACjC;AAAA,UACF;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,OAAO,mBAAmB,OAAO,QAAQ;AAC/C,cAAM,cAAc,CAAC,CAAC,KAAK;AAC3B,mBAAO,wBAAU,UAAU,OAAO,aAAa;AAC7C,mBAAS,aAAa,GAAG,UAAU,mBAAmB;AACtD,mBAAS,cAAU,4BAAc,UAAU,IAAI,CAAC;AAChD,gBAAM,SAAS,MAAM,OAAO,UAAU;AAAA,YACpC;AAAA,UACF;AACA,cAAI,aAAa;AACf,mBAAO,IAAI,2BAAc,GAAG,UAAU,YAAY,MAA2C;AAAA,UAC/F;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA;AACE,cAAM,IAAI,MAAM,wBAAwB,OAAO,EAAE;AAAA,IACrD;AAAA,EACF;AAAA,EAEU,cAAc,OAAwB;AAC9C,UAAM,OAAO,MAAM,OAAO;AAE1B,QAAI,gBAAgB,kCAAqB;AACvC,iBAAO,4BAAc,KAAK,IAAI;AAAA,IAChC;AAEA,UAAM,SAAS,KAAK,aAAa,KAAK;AACtC,WAAO,IAAI,cAAAC,QAAO,MAAM;AAAA,EAC1B;AAAA,EAEU,aAAa,OAAyC;AAC9D,UAAM,SAAkC,CAAC;AACzC,UAAM,OAAO,MAAM,OAAO;AAE1B,QAAI,gBAAgB,+BAAkB;AACpC,UAAI,KAAK,OAAQ,QAAO,SAAS,KAAK;AACtC,UAAI,KAAK,SAAU,QAAO,UAAU,KAAK;AAAA,IAC3C,WAAW,MAAM;AACf,YAAM,IAAI;AAAA,QACR,oBAAoB,KAAK,IAAI;AAAA,MAE/B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AErIA,IAAAC,eAA0B;AAEnB,IAAM,kBAAN,MAA2C;AAAA,EAChD,MAAM,QAAQ,OAAgB,UAAqC;AACjE,eAAO,wBAAU,mBAAmB,OAAO,SAAS;AAClD,WAAK,aAAa,iDAAiD;AACnE,WAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AACjC,YAAM,SAAS,gBAAgB,OAAO,QAAQ;AAE9C,UAAI,CAAC,gBAAgB,QAAQ,GAAG;AAC9B,aAAK,UAAU,MAAM;AAAA,MACvB;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAKO,SAAS,gBAAgB,OAAgB,UAA4B;AAC1E,MAAI,OAAO,aAAa,YAAY,aAAa,KAAM,QAAO;AAG9D,MAAI,gBAAgB,QAAQ,GAAG;AAC7B,WAAO,gBAAgB,QAAQ;AAAA,EACjC;AAEA,QAAM,IAAI;AAGV,MAAI,EAAE,WAAW,cAAc,MAAM,QAAQ,EAAE,MAAM,GAAG;AACtD,WAAO,oBAAoB,OAAO,CAAC;AAAA,EACrC;AAGA,MAAI,EAAE,SAAS;AACb,WAAO,sBAAsB,OAAO,CAAC;AAAA,EACvC;AAGA,MAAI,EAAE,QAAQ,EAAE,WAAW,QAAQ;AACjC,WAAO,iBAAiB,CAAC;AAAA,EAC3B;AAGA,MAAI,EAAE,QAAQ,MAAM,QAAQ,EAAE,IAAI,GAAG;AACnC,UAAM,OAAO,EAAE;AACf,QAAI,KAAK,SAAS,MAAM,SAAS,KAAK,CAAC,KAAK,cAAc,KAAK,CAAC,IAAI;AAClE,aAAO,aAAa,CAAC;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAOA,SAAS,gBAAgB,OAAiD;AACxE,SACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAO,iBAAiB;AAE5B;AAaA,gBAAgB,gBACd,UACmC;AACnC,QAAM,cAA4E,oBAAI,IAAI;AAE1F,mBAAiB,SAAS,UAAU;AAClC,UAAM,IAAI;AACV,UAAM,UAAU,EAAE;AAClB,QAAI,CAAC,WAAW,QAAQ,WAAW,EAAG;AAEtC,UAAM,QAAS,QAAQ,CAAC,EAA8B;AACtD,QAAI,CAAC,MAAO;AAGZ,QAAI,MAAM,WAAW,MAAM;AACzB,YAAM,MAAM;AAAA,IACd;AAGA,UAAM,WAAW,MAAM;AACvB,QAAI,UAAU;AACZ,iBAAW,WAAW,UAAU;AAC9B,cAAM,MAAM,QAAQ;AACpB,YAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AACzB,sBAAY,IAAI,KAAK,EAAE,IAAI,IAAI,MAAM,IAAI,WAAW,GAAG,CAAC;AAAA,QAC1D;AACA,cAAM,MAAM,YAAY,IAAI,GAAG;AAC/B,YAAI,QAAQ,GAAI,KAAI,KAAK,QAAQ;AACjC,cAAM,KAAK,QAAQ;AACnB,YAAI,IAAI;AACN,cAAI,GAAG,KAAM,KAAI,OAAO,GAAG;AAC3B,cAAI,GAAG,UAAW,KAAI,aAAa,GAAG;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAGA,QAAI,MAAM,WAAW,MAAM;AACzB,YAAM,IAAI,MAAM,kBAAkB,MAAM,OAAO,EAAE;AAAA,IACnD;AAAA,EACF;AAGA,QAAM,gBAAgB,CAAC,GAAG,YAAY,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAClE,aAAW,OAAO,eAAe;AAC/B,UAAM,KAAK,YAAY,IAAI,GAAG;AAC9B,UAAM,EAAE,IAAI,GAAG,IAAI,MAAM,GAAG,MAAM,WAAW,GAAG,UAAU;AAAA,EAC5D;AACF;AAcA,SAAS,oBACP,OACA,UACS;AACT,QAAM,SAAS,SAAS;AAGxB,QAAM,YAAwB,CAAC;AAC/B,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,SAAS,iBAAiB;AACjC,gBAAU,KAAK;AAAA,QACb,IAAK,KAAK,WAAW,KAAK,MAAM;AAAA,QAChC,MAAM,KAAK;AAAA,QACX,WAAW,KAAK;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,SAAS;AAC5B,MAAI,eAAe,QAAW;AAE5B,QAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,UAAI;AACF,eAAO,KAAK,MAAM,UAAU;AAAA,MAC9B,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,SAAS,WAAW;AAC3B,YAAM,UAAU,KAAK;AACrB,UAAI,SAAS;AACX,mBAAW,QAAQ,SAAS;AAC1B,cAAI,KAAK,SAAS,iBAAiB,KAAK,SAAS,QAAQ;AACvD,kBAAM,KAAK,KAAK,IAAc;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,OAAO,MAAM,KAAK,EAAE;AAC1B,QAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,UAAI;AACF,eAAO,KAAK,MAAM,IAAI;AAAA,MACxB,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAMA,SAAS,sBACP,OACA,UACS;AACT,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,QAAM,SAAS,QAAQ,CAAC;AACxB,QAAM,UAAU,OAAO;AACvB,MAAI,CAAC,QAAS,QAAO;AAGrB,QAAM,YAAY,QAAQ;AAC1B,MAAI,aAAa,UAAU,SAAS,GAAG;AACrC,WAAO,UAAU,IAAI,CAAC,OAAiB;AACrC,YAAM,KAAK,GAAG;AACd,aAAO;AAAA,QACL,IAAI,GAAG;AAAA,QACP,MAAM,GAAG;AAAA,QACT,WAAW,GAAG;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,UAAU,QAAQ;AAGxB,MAAI,YAAY,MAAM;AACpB,UAAM,UAAU,QAAQ;AACxB,QAAI,OAAO,YAAY,SAAU,QAAO;AACxC,WAAO;AAAA,EACT;AAGA,MAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,QAAI;AACF,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,UAA4C;AACpE,QAAM,OAAO,SAAS;AACtB,MAAI,KAAK,WAAW,GAAG;AACrB,WAAQ,KAAK,CAAC,EAA8B;AAAA,EAC9C;AACA,SAAO,KAAK,IAAI,CAAC,MAAO,EAA8B,SAAS;AACjE;AAEA,SAAS,aAAa,UAA4C;AAChE,QAAM,OAAO,SAAS;AACtB,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC,EAAE;AAAA,EAChC;AACA,SAAO,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ;AAC5C;;;AH9QA,IAAAC,eAAoD;IAIpD,+BAAiB,UAAU,IAAI,eAAe,CAAC;AAAA,IAC/C,gCAAkB,UAAU,IAAI,gBAAgB,CAAC;","names":["import_core","loadPrompty","OpenAI","import_core","import_core"]}
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,8 @@ import { getConnection } from "@prompty/core";
|
|
|
5
5
|
import { traceSpan, sanitizeValue } from "@prompty/core";
|
|
6
6
|
|
|
7
7
|
// src/wire.ts
|
|
8
|
+
import { load as loadPrompty } from "@prompty/core";
|
|
9
|
+
import { dirname, resolve } from "path";
|
|
8
10
|
function messageToWire(msg) {
|
|
9
11
|
const wire = { role: msg.role };
|
|
10
12
|
for (const [k, v] of Object.entries(msg.metadata)) {
|
|
@@ -34,13 +36,26 @@ function partToWire(part) {
|
|
|
34
36
|
type: "input_audio",
|
|
35
37
|
input_audio: {
|
|
36
38
|
data: part.source,
|
|
37
|
-
...part.mediaType && { format: part.mediaType }
|
|
39
|
+
...part.mediaType && { format: mimeToAudioFormat(part.mediaType) }
|
|
38
40
|
}
|
|
39
41
|
};
|
|
40
42
|
case "file":
|
|
41
43
|
return { type: "file", file: { url: part.source } };
|
|
42
44
|
}
|
|
43
45
|
}
|
|
46
|
+
var AUDIO_MIME_MAP = {
|
|
47
|
+
"audio/wav": "wav",
|
|
48
|
+
"audio/mpeg": "mp3",
|
|
49
|
+
"audio/mp3": "mp3",
|
|
50
|
+
"audio/mp4": "mp4",
|
|
51
|
+
"audio/ogg": "ogg",
|
|
52
|
+
"audio/flac": "flac",
|
|
53
|
+
"audio/webm": "webm",
|
|
54
|
+
"audio/pcm": "pcm"
|
|
55
|
+
};
|
|
56
|
+
function mimeToAudioFormat(mediaType) {
|
|
57
|
+
return AUDIO_MIME_MAP[mediaType.toLowerCase()] ?? mediaType;
|
|
58
|
+
}
|
|
44
59
|
function buildChatArgs(agent, messages) {
|
|
45
60
|
const model = agent.model?.id || "gpt-4";
|
|
46
61
|
const wireMessages = messages.map(messageToWire);
|
|
@@ -72,11 +87,11 @@ function buildEmbeddingArgs(agent, data) {
|
|
|
72
87
|
}
|
|
73
88
|
return String(item);
|
|
74
89
|
});
|
|
75
|
-
input = texts;
|
|
90
|
+
input = texts.length === 1 ? texts[0] : texts;
|
|
76
91
|
} else if (typeof data === "string") {
|
|
77
|
-
input =
|
|
92
|
+
input = data;
|
|
78
93
|
} else {
|
|
79
|
-
input =
|
|
94
|
+
input = String(data);
|
|
80
95
|
}
|
|
81
96
|
const args = { input, model };
|
|
82
97
|
const extra = agent.model?.options?.additionalProperties;
|
|
@@ -191,24 +206,64 @@ function toolsToWire(agent) {
|
|
|
191
206
|
if (!tools || tools.length === 0) return [];
|
|
192
207
|
const result = [];
|
|
193
208
|
for (const t of tools) {
|
|
194
|
-
if (t.kind
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
if (funcDef.parameters) {
|
|
205
|
-
funcDef.parameters.additionalProperties = false;
|
|
209
|
+
if (t.kind === "function") {
|
|
210
|
+
const funcDef = { name: t.name };
|
|
211
|
+
if (t.description) funcDef.description = t.description;
|
|
212
|
+
const boundNames = new Set((t.bindings ?? []).map((b) => b.name));
|
|
213
|
+
let params = t.parameters;
|
|
214
|
+
if (params && Array.isArray(params)) {
|
|
215
|
+
if (boundNames.size > 0) {
|
|
216
|
+
params = params.filter((p) => !boundNames.has(p.name));
|
|
217
|
+
}
|
|
218
|
+
funcDef.parameters = schemaToWire(params);
|
|
206
219
|
}
|
|
220
|
+
const strict = t.strict;
|
|
221
|
+
if (strict) {
|
|
222
|
+
funcDef.strict = true;
|
|
223
|
+
if (funcDef.parameters) {
|
|
224
|
+
funcDef.parameters.additionalProperties = false;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
result.push({ type: "function", function: funcDef });
|
|
228
|
+
} else if (t.kind === "prompty") {
|
|
229
|
+
const funcDef = projectPromptyTool(t, agent);
|
|
230
|
+
result.push({ type: "function", function: funcDef });
|
|
207
231
|
}
|
|
208
|
-
result.push({ type: "function", function: funcDef });
|
|
209
232
|
}
|
|
210
233
|
return result;
|
|
211
234
|
}
|
|
235
|
+
function projectPromptyTool(tool, parent) {
|
|
236
|
+
const toolPath = tool.path;
|
|
237
|
+
if (!toolPath) {
|
|
238
|
+
throw new Error(`PromptyTool '${tool.name}' has no path`);
|
|
239
|
+
}
|
|
240
|
+
const parentPath = (parent.metadata ?? {}).__source_path;
|
|
241
|
+
if (!parentPath) {
|
|
242
|
+
throw new Error(
|
|
243
|
+
`Cannot resolve PromptyTool '${tool.name}': parent agent has no __source_path in metadata`
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
const childPath = resolve(dirname(parentPath), toolPath);
|
|
247
|
+
const child = loadPrompty(childPath);
|
|
248
|
+
const funcDef = { name: tool.name };
|
|
249
|
+
funcDef.description = tool.description || child.description || "";
|
|
250
|
+
const bindings = tool.bindings;
|
|
251
|
+
const boundNames = new Set((bindings ?? []).map((b) => b.name));
|
|
252
|
+
const childInputs = child.inputs ?? [];
|
|
253
|
+
let params = childInputs;
|
|
254
|
+
if (boundNames.size > 0) {
|
|
255
|
+
params = params.filter((p) => !boundNames.has(p.name));
|
|
256
|
+
}
|
|
257
|
+
funcDef.parameters = schemaToWire(params);
|
|
258
|
+
const strict = tool.strict;
|
|
259
|
+
if (strict) {
|
|
260
|
+
funcDef.strict = true;
|
|
261
|
+
if (funcDef.parameters) {
|
|
262
|
+
funcDef.parameters.additionalProperties = false;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return funcDef;
|
|
266
|
+
}
|
|
212
267
|
function outputSchemaToWire(agent) {
|
|
213
268
|
const outputs = agent.outputs;
|
|
214
269
|
if (!outputs || outputs.length === 0) return null;
|
|
@@ -219,7 +274,7 @@ function outputSchemaToWire(agent) {
|
|
|
219
274
|
properties[prop.name] = propertyToJsonSchema(prop);
|
|
220
275
|
required.push(prop.name);
|
|
221
276
|
}
|
|
222
|
-
const name =
|
|
277
|
+
const name = "structured_output";
|
|
223
278
|
return {
|
|
224
279
|
type: "json_schema",
|
|
225
280
|
json_schema: {
|
|
@@ -300,24 +355,41 @@ function responsesToolsToWire(agent) {
|
|
|
300
355
|
if (!tools || tools.length === 0) return [];
|
|
301
356
|
const result = [];
|
|
302
357
|
for (const t of tools) {
|
|
303
|
-
if (t.kind
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
358
|
+
if (t.kind === "function") {
|
|
359
|
+
const tool = {
|
|
360
|
+
type: "function",
|
|
361
|
+
name: t.name
|
|
362
|
+
};
|
|
363
|
+
if (t.description) tool.description = t.description;
|
|
364
|
+
const params = t.parameters;
|
|
365
|
+
if (params && Array.isArray(params)) {
|
|
366
|
+
tool.parameters = schemaToWire(params);
|
|
367
|
+
}
|
|
368
|
+
const strict = t.strict;
|
|
369
|
+
if (strict) {
|
|
370
|
+
tool.strict = true;
|
|
371
|
+
if (tool.parameters) {
|
|
372
|
+
tool.parameters.additionalProperties = false;
|
|
373
|
+
}
|
|
318
374
|
}
|
|
375
|
+
result.push(tool);
|
|
376
|
+
} else if (t.kind === "prompty") {
|
|
377
|
+
const projected = projectPromptyTool(t, agent);
|
|
378
|
+
const tool = {
|
|
379
|
+
type: "function",
|
|
380
|
+
name: projected.name
|
|
381
|
+
};
|
|
382
|
+
if (projected.description) tool.description = projected.description;
|
|
383
|
+
if (projected.parameters) tool.parameters = projected.parameters;
|
|
384
|
+
const strict = projected.strict;
|
|
385
|
+
if (strict) {
|
|
386
|
+
tool.strict = true;
|
|
387
|
+
if (tool.parameters) {
|
|
388
|
+
tool.parameters.additionalProperties = false;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
result.push(tool);
|
|
319
392
|
}
|
|
320
|
-
result.push(tool);
|
|
321
393
|
}
|
|
322
394
|
return result;
|
|
323
395
|
}
|
|
@@ -331,7 +403,7 @@ function outputSchemaToResponsesWire(agent) {
|
|
|
331
403
|
properties[prop.name] = propertyToJsonSchema(prop);
|
|
332
404
|
required.push(prop.name);
|
|
333
405
|
}
|
|
334
|
-
const name =
|
|
406
|
+
const name = "structured_output";
|
|
335
407
|
return {
|
|
336
408
|
format: {
|
|
337
409
|
type: "json_schema",
|
|
@@ -448,6 +520,10 @@ var OpenAIExecutor = class {
|
|
|
448
520
|
if (conn instanceof ApiKeyConnection) {
|
|
449
521
|
if (conn.apiKey) kwargs.apiKey = conn.apiKey;
|
|
450
522
|
if (conn.endpoint) kwargs.baseURL = conn.endpoint;
|
|
523
|
+
} else if (conn) {
|
|
524
|
+
throw new Error(
|
|
525
|
+
`Connection kind '${conn.kind}' is not supported by the OpenAI executor. Use 'key' for API key auth or 'reference' with registerConnection() for pre-configured clients.`
|
|
526
|
+
);
|
|
451
527
|
}
|
|
452
528
|
return kwargs;
|
|
453
529
|
}
|
|
@@ -601,7 +677,11 @@ function processChatCompletion(agent, response) {
|
|
|
601
677
|
});
|
|
602
678
|
}
|
|
603
679
|
const content = message.content;
|
|
604
|
-
if (content === null)
|
|
680
|
+
if (content === null) {
|
|
681
|
+
const refusal = message.refusal;
|
|
682
|
+
if (typeof refusal === "string") return refusal;
|
|
683
|
+
return null;
|
|
684
|
+
}
|
|
605
685
|
if (agent.outputs && agent.outputs.length > 0) {
|
|
606
686
|
try {
|
|
607
687
|
return JSON.parse(content);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/executor.ts","../src/wire.ts","../src/processor.ts","../src/index.ts"],"sourcesContent":["/**\n * OpenAI executor — sends messages to OpenAI APIs.\n *\n * Dispatches on `agent.model.apiType`: chat, embedding, image.\n *\n * @module\n */\n\nimport OpenAI from \"openai\";\nimport type { Prompty } from \"@prompty/core\";\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\nimport type { Executor } from \"@prompty/core\";\nimport type { Message } from \"@prompty/core\";\nimport { getConnection } from \"@prompty/core\";\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\nimport { buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\n\nexport class OpenAIExecutor implements Executor {\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\n return traceSpan(\"OpenAIExecutor\", async (emit) => {\n emit(\"signature\", \"prompty.openai.executor.OpenAIExecutor.invoke\");\n emit(\"inputs\", { data: messages });\n\n const client = this.resolveClient(agent);\n const clientName = client.constructor?.name ?? \"OpenAI\";\n\n // Trace what client we resolved and how\n await traceSpan(clientName, async (ctorEmit) => {\n ctorEmit(\"signature\", `${clientName}.ctor`);\n const conn = agent.model?.connection;\n if (conn instanceof ReferenceConnection) {\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\n } else {\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\n }\n ctorEmit(\"result\", clientName);\n });\n\n const apiType = agent.model?.apiType ?? \"chat\";\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\n emit(\"result\", result);\n return result;\n });\n }\n\n /** Dispatch to the appropriate API and trace the call. */\n private async executeApiCall(\n client: OpenAI,\n clientName: string,\n agent: Prompty,\n messages: Message[],\n apiType: string,\n ): Promise<unknown> {\n switch (apiType) {\n case \"chat\": {\n const args = buildChatArgs(agent, messages);\n const isStreaming = !!args.stream;\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.chat.completions.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.chat.completions.create(\n args as unknown as Parameters<typeof client.chat.completions.create>[0],\n );\n if (isStreaming) {\n // Wrap streaming response for tracing — don't emit result yet,\n // PromptyStream will trace on exhaustion\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\n }\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"embedding\": {\n const args = buildEmbeddingArgs(agent, messages);\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.embeddings.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.embeddings.create(\n args as unknown as Parameters<typeof client.embeddings.create>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"image\": {\n const args = buildImageArgs(agent, messages);\n return traceSpan(\"generate\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.images.generate`);\n callEmit(\"inputs\", sanitizeValue(\"generate\", args));\n const result = await client.images.generate(\n args as unknown as Parameters<typeof client.images.generate>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"responses\": {\n const args = buildResponsesArgs(agent, messages);\n const isStreaming = !!args.stream;\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.responses.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.responses.create(\n args as unknown as Parameters<typeof client.responses.create>[0],\n );\n if (isStreaming) {\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\n }\n callEmit(\"result\", result);\n return result;\n });\n }\n default:\n throw new Error(`Unsupported apiType: ${apiType}`);\n }\n }\n\n protected resolveClient(agent: Prompty): OpenAI {\n const conn = agent.model?.connection;\n\n if (conn instanceof ReferenceConnection) {\n return getConnection(conn.name) as OpenAI;\n }\n\n const kwargs = this.clientKwargs(agent);\n return new OpenAI(kwargs);\n }\n\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\n const kwargs: Record<string, unknown> = {};\n const conn = agent.model?.connection;\n\n if (conn instanceof ApiKeyConnection) {\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\n }\n\n return kwargs;\n }\n}\n","/**\n * Wire format conversion: Message → OpenAI API JSON.\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { ContentPart, Message } from \"@prompty/core\";\n\n/**\n * Convert an abstract Message to OpenAI wire format.\n */\nexport function messageToWire(msg: Message): Record<string, unknown> {\n const wire: Record<string, unknown> = { role: msg.role };\n\n // Include metadata fields (e.g., name, tool_call_id, tool_calls)\n for (const [k, v] of Object.entries(msg.metadata)) {\n if (k !== \"role\" && k !== \"content\") {\n wire[k] = v;\n }\n }\n\n const content = msg.toTextContent();\n if (typeof content === \"string\") {\n wire.content = content;\n } else {\n // Multimodal — convert parts to OpenAI format\n wire.content = msg.parts.map(partToWire);\n }\n\n return wire;\n}\n\n/**\n * Convert a ContentPart to OpenAI wire format.\n */\nfunction partToWire(part: ContentPart): Record<string, unknown> {\n switch (part.kind) {\n case \"text\":\n return { type: \"text\", text: part.value };\n case \"image\": {\n const imageUrl: Record<string, unknown> = { url: part.source };\n if (part.detail) imageUrl.detail = part.detail;\n return { type: \"image_url\", image_url: imageUrl };\n }\n case \"audio\":\n return {\n type: \"input_audio\",\n input_audio: {\n data: part.source,\n ...(part.mediaType && { format: part.mediaType }),\n },\n };\n case \"file\":\n return { type: \"file\", file: { url: part.source } };\n }\n}\n\n/**\n * Build chat completion arguments from agent config and messages.\n */\nexport function buildChatArgs(\n agent: Prompty,\n messages: Message[],\n): Record<string, unknown> {\n const model = agent.model?.id || \"gpt-4\";\n const wireMessages = messages.map(messageToWire);\n\n const args: Record<string, unknown> = {\n model,\n messages: wireMessages,\n ...buildOptions(agent),\n };\n\n // Tools\n const tools = toolsToWire(agent);\n if (tools.length > 0) {\n args.tools = tools;\n }\n\n // Structured output\n const responseFormat = outputSchemaToWire(agent);\n if (responseFormat) {\n args.response_format = responseFormat;\n }\n\n return args;\n}\n\n/**\n * Build embedding arguments.\n * Only additionalProperties are passed — chat options are not valid here.\n */\nexport function buildEmbeddingArgs(\n agent: Prompty,\n data: unknown,\n): Record<string, unknown> {\n const model = agent.model?.id || \"text-embedding-ada-002\";\n\n // Extract text content from Message objects if needed\n let input: unknown;\n if (Array.isArray(data)) {\n const texts = data.map((item: unknown) => {\n if (typeof item === \"string\") return item;\n if (item && typeof item === \"object\" && \"text\" in item) return (item as { text: string }).text;\n if (item && typeof item === \"object\" && \"toTextContent\" in item) {\n const content = (item as { toTextContent: () => unknown }).toTextContent();\n return typeof content === \"string\" ? content : String(content);\n }\n return String(item);\n });\n input = texts;\n } else if (typeof data === \"string\") {\n input = [data];\n } else {\n input = [String(data)];\n }\n\n const args: Record<string, unknown> = { input, model };\n const extra = agent.model?.options?.additionalProperties;\n if (extra) {\n for (const [k, v] of Object.entries(extra)) {\n args[k] = v;\n }\n }\n return args;\n}\n\n/**\n * Build image generation arguments.\n * Only additionalProperties are passed — chat options are not valid here.\n */\nexport function buildImageArgs(\n agent: Prompty,\n data: unknown,\n): Record<string, unknown> {\n const model = agent.model?.id || \"dall-e-3\";\n\n // Extract prompt text: data may be a string, or a Message[] from the parser\n let prompt: string;\n if (typeof data === \"string\") {\n prompt = data;\n } else if (Array.isArray(data)) {\n // Messages have .parts[].value for text content, or a .text getter\n prompt = data\n .map((m: { text?: string; parts?: { kind: string; value: string }[] }) => {\n if (typeof m.text === \"string\") return m.text;\n if (Array.isArray(m.parts)) {\n return m.parts\n .filter((p) => p.kind === \"text\")\n .map((p) => p.value)\n .join(\"\");\n }\n return String(m);\n })\n .join(\"\\n\")\n .trim();\n } else {\n prompt = String(data);\n }\n\n const args: Record<string, unknown> = { prompt, model };\n const extra = agent.model?.options?.additionalProperties;\n if (extra) {\n for (const [k, v] of Object.entries(extra)) {\n args[k] = v;\n }\n }\n return args;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Map AgentSchema kind strings to JSON Schema type strings. */\nconst KIND_TO_JSON_TYPE: Record<string, string> = {\n string: \"string\",\n integer: \"integer\",\n float: \"number\",\n number: \"number\",\n boolean: \"boolean\",\n array: \"array\",\n object: \"object\",\n};\n\nfunction buildOptions(agent: Prompty): Record<string, unknown> {\n const opts = agent.model?.options;\n if (!opts) return {};\n\n const result: Record<string, unknown> = {};\n\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\n if (opts.maxOutputTokens !== undefined) result.max_completion_tokens = opts.maxOutputTokens;\n if (opts.topP !== undefined) result.top_p = opts.topP;\n if (opts.frequencyPenalty !== undefined) result.frequency_penalty = opts.frequencyPenalty;\n if (opts.presencePenalty !== undefined) result.presence_penalty = opts.presencePenalty;\n if (opts.stopSequences !== undefined && opts.stopSequences.length > 0) result.stop = opts.stopSequences;\n if (opts.seed !== undefined) result.seed = opts.seed;\n\n // Pass through additionalProperties — but don't overwrite mapped keys\n if (opts.additionalProperties) {\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\n if (!(k in result)) {\n result[k] = v;\n }\n }\n }\n\n return result;\n}\n\n/** Convert a Property list to a JSON Schema `{type: \"object\", properties: ...}`. */\nfunction schemaToWire(properties: unknown[]): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const p of properties as Array<{ name?: string; kind?: string; description?: string; required?: boolean; enumValues?: unknown[] }>) {\n if (!p.name) continue;\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[p.kind ?? \"string\"] ?? \"string\",\n };\n if (p.description) schema.description = p.description;\n if (p.enumValues && p.enumValues.length > 0) schema.enum = p.enumValues;\n props[p.name] = schema;\n if (p.required) required.push(p.name);\n }\n\n const result: Record<string, unknown> = { type: \"object\", properties: props };\n if (required.length > 0) result.required = required;\n return result;\n}\n\n/** Convert a single Property to a JSON Schema definition (recursive for structured output). */\nfunction propertyToJsonSchema(prop: {\n kind?: string;\n description?: string;\n enumValues?: unknown[];\n items?: unknown;\n properties?: unknown[];\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[prop.kind ?? \"string\"] ?? \"string\",\n };\n\n if (prop.description) schema.description = prop.description;\n if (prop.enumValues && prop.enumValues.length > 0) schema.enum = prop.enumValues;\n\n // Array items\n if (prop.kind === \"array\") {\n schema.items = prop.items\n ? propertyToJsonSchema(prop.items as typeof prop)\n : { type: \"string\" };\n }\n\n // Nested object\n if (prop.kind === \"object\") {\n if (prop.properties) {\n const nested: Record<string, unknown> = {};\n const req: string[] = [];\n for (const p of prop.properties as Array<{ name?: string } & typeof prop>) {\n if (!p.name) continue;\n nested[p.name] = propertyToJsonSchema(p);\n req.push(p.name);\n }\n schema.properties = nested;\n schema.required = req;\n } else {\n schema.properties = {};\n schema.required = [];\n }\n schema.additionalProperties = false;\n }\n\n return schema;\n}\n\nfunction toolsToWire(agent: Prompty): Record<string, unknown>[] {\n const tools = agent.tools;\n if (!tools || tools.length === 0) return [];\n\n const result: Record<string, unknown>[] = [];\n\n for (const t of tools) {\n if (t.kind !== \"function\") continue;\n\n const funcDef: Record<string, unknown> = { name: t.name };\n if (t.description) funcDef.description = t.description;\n\n // Serialize parameters via schemaToWire\n const params = (t as { parameters?: unknown[] }).parameters;\n if (params && Array.isArray(params)) {\n funcDef.parameters = schemaToWire(params);\n }\n\n // Strict mode\n const strict = (t as { strict?: boolean }).strict;\n if (strict) {\n funcDef.strict = true;\n if (funcDef.parameters) {\n (funcDef.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n result.push({ type: \"function\", function: funcDef });\n }\n\n return result;\n}\n\nfunction outputSchemaToWire(agent: Prompty): Record<string, unknown> | null {\n const outputs = agent.outputs;\n if (!outputs || outputs.length === 0) return null;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const prop of outputs) {\n if (!prop.name) continue;\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\n required.push(prop.name);\n }\n\n const name = (agent.name || \"response\").toLowerCase().replace(/[\\s-]/g, \"_\");\n\n return {\n type: \"json_schema\",\n json_schema: {\n name,\n strict: true,\n schema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Responses API wire format\n// ---------------------------------------------------------------------------\n\n/**\n * Build Responses API arguments from agent config and messages.\n *\n * Key differences from Chat Completions:\n * - System messages → `instructions` parameter\n * - Other messages → `input` as EasyInputMessage[]\n * - `maxOutputTokens` → `max_output_tokens`\n * - Structured output → `text.format` (not `response_format`)\n * - Tools use flat `{ type: \"function\", name, parameters }` (not nested `function:`)\n */\nexport function buildResponsesArgs(\n agent: Prompty,\n messages: Message[],\n): Record<string, unknown> {\n const model = agent.model?.id || \"gpt-4o\";\n\n // Separate system messages as instructions, rest as input\n const systemParts: string[] = [];\n const inputMessages: Record<string, unknown>[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\" || msg.role === \"developer\") {\n systemParts.push(msg.text);\n } else {\n inputMessages.push(messageToResponsesInput(msg));\n }\n }\n\n const args: Record<string, unknown> = {\n model,\n input: inputMessages,\n };\n\n // Set instructions from system messages\n if (systemParts.length > 0) {\n args.instructions = systemParts.join(\"\\n\\n\");\n }\n\n // Map model options\n const responseOpts = buildResponsesOptions(agent);\n Object.assign(args, responseOpts);\n\n // Tools\n const tools = responsesToolsToWire(agent);\n if (tools.length > 0) {\n args.tools = tools;\n }\n\n // Structured output via text.format\n const textConfig = outputSchemaToResponsesWire(agent);\n if (textConfig) {\n args.text = textConfig;\n }\n\n return args;\n}\n\n/** Convert a Message to Responses API EasyInputMessage format. */\nfunction messageToResponsesInput(msg: Message): Record<string, unknown> {\n const content = msg.toTextContent();\n\n // Pass-through original function_call items from the agent loop\n if (msg.metadata.responses_function_call) {\n return msg.metadata.responses_function_call as Record<string, unknown>;\n }\n\n // Tool result messages → function_call_output\n if (msg.metadata.tool_call_id) {\n return {\n type: \"function_call_output\",\n call_id: msg.metadata.tool_call_id,\n output: typeof content === \"string\" ? content : JSON.stringify(content),\n };\n }\n\n const role = msg.role === \"tool\" ? \"user\" : msg.role;\n return { role, content };\n}\n\n/** Build Responses-specific model options. */\nfunction buildResponsesOptions(agent: Prompty): Record<string, unknown> {\n const opts = agent.model?.options;\n if (!opts) return {};\n\n const result: Record<string, unknown> = {};\n\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\n if (opts.maxOutputTokens !== undefined) result.max_output_tokens = opts.maxOutputTokens;\n if (opts.topP !== undefined) result.top_p = opts.topP;\n\n // Pass through additionalProperties — but don't overwrite mapped keys\n if (opts.additionalProperties) {\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\n if (!(k in result)) {\n result[k] = v;\n }\n }\n }\n\n return result;\n}\n\n/** Convert agent tools to Responses API tool format. */\nfunction responsesToolsToWire(agent: Prompty): Record<string, unknown>[] {\n const tools = agent.tools;\n if (!tools || tools.length === 0) return [];\n\n const result: Record<string, unknown>[] = [];\n\n for (const t of tools) {\n if (t.kind !== \"function\") continue;\n\n // Responses API uses flat tool format (not nested under \"function:\")\n const tool: Record<string, unknown> = {\n type: \"function\",\n name: t.name,\n };\n if (t.description) tool.description = t.description;\n\n const params = (t as { parameters?: unknown[] }).parameters;\n if (params && Array.isArray(params)) {\n tool.parameters = schemaToWire(params);\n }\n\n const strict = (t as { strict?: boolean }).strict;\n if (strict) {\n tool.strict = true;\n if (tool.parameters) {\n (tool.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n result.push(tool);\n }\n\n return result;\n}\n\n/** Convert outputSchema to Responses API text.format config. */\nfunction outputSchemaToResponsesWire(agent: Prompty): Record<string, unknown> | null {\n const outputs = agent.outputs;\n if (!outputs || outputs.length === 0) return null;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const prop of outputs) {\n if (!prop.name) continue;\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\n required.push(prop.name);\n }\n\n const name = (agent.name || \"response\").toLowerCase().replace(/[\\s-]/g, \"_\");\n\n return {\n format: {\n type: \"json_schema\",\n name,\n strict: true,\n schema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n },\n };\n}\n","/**\n * OpenAI processor — extracts clean results from raw OpenAI responses.\n *\n * Handles ChatCompletion, Embedding, Image, and streaming responses.\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { Processor } from \"@prompty/core\";\nimport type { ToolCall } from \"@prompty/core\";\nimport { traceSpan } from \"@prompty/core\";\n\nexport class OpenAIProcessor implements Processor {\n async process(agent: Prompty, response: unknown): Promise<unknown> {\n return traceSpan(\"OpenAIProcessor\", async (emit) => {\n emit(\"signature\", \"prompty.openai.processor.OpenAIProcessor.invoke\");\n emit(\"inputs\", { data: response });\n const result = processResponse(agent, response);\n // Don't emit result for streaming — it's a generator, not a value\n if (!isAsyncIterable(response)) {\n emit(\"result\", result);\n }\n return result;\n });\n }\n}\n\n/**\n * Extract clean content from an OpenAI response.\n */\nexport function processResponse(agent: Prompty, response: unknown): unknown {\n if (typeof response !== \"object\" || response === null) return response;\n\n // Streaming response — return content-extracting async generator\n if (isAsyncIterable(response)) {\n return streamGenerator(response);\n }\n\n const r = response as Record<string, unknown>;\n\n // Responses API — has output[] and object === \"response\"\n if (r.object === \"response\" && Array.isArray(r.output)) {\n return processResponsesApi(agent, r);\n }\n\n // ChatCompletion\n if (r.choices) {\n return processChatCompletion(agent, r);\n }\n\n // Embedding response\n if (r.data && r.object === \"list\") {\n return processEmbedding(r);\n }\n\n // Image response\n if (r.data && Array.isArray(r.data)) {\n const data = r.data as Record<string, unknown>[];\n if (data.length > 0 && (\"url\" in data[0] || \"b64_json\" in data[0])) {\n return processImage(r);\n }\n }\n\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Streaming\n// ---------------------------------------------------------------------------\n\n/** Type guard for async iterables (PromptyStream or raw SDK stream). */\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value\n );\n}\n\n/**\n * Yield content chunks, tool calls, or refusals from a streaming response.\n *\n * Handles three types of streaming deltas:\n * - `delta.content` — yields content strings\n * - `delta.tool_calls` — accumulates partial tool call chunks,\n * yields ToolCall objects when the stream ends\n * - `delta.refusal` — throws Error with the refusal message\n *\n * Matches the Python `_stream_generator` / `_async_stream_generator`.\n */\nasync function* streamGenerator(\n response: AsyncIterable<unknown>,\n): AsyncGenerator<string | ToolCall> {\n const toolCallAcc: Map<number, { id: string; name: string; arguments: string }> = new Map();\n\n for await (const chunk of response) {\n const c = chunk as Record<string, unknown>;\n const choices = c.choices as Record<string, unknown>[] | undefined;\n if (!choices || choices.length === 0) continue;\n\n const delta = (choices[0] as Record<string, unknown>).delta as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n // Content\n if (delta.content != null) {\n yield delta.content as string;\n }\n\n // Tool call deltas — accumulate index-keyed partial chunks\n const tcDeltas = delta.tool_calls as Record<string, unknown>[] | undefined;\n if (tcDeltas) {\n for (const tcDelta of tcDeltas) {\n const idx = tcDelta.index as number;\n if (!toolCallAcc.has(idx)) {\n toolCallAcc.set(idx, { id: \"\", name: \"\", arguments: \"\" });\n }\n const acc = toolCallAcc.get(idx)!;\n if (tcDelta.id) acc.id = tcDelta.id as string;\n const fn = tcDelta.function as Record<string, unknown> | undefined;\n if (fn) {\n if (fn.name) acc.name = fn.name as string;\n if (fn.arguments) acc.arguments += fn.arguments as string;\n }\n }\n }\n\n // Refusal\n if (delta.refusal != null) {\n throw new Error(`Model refused: ${delta.refusal}`);\n }\n }\n\n // Yield accumulated tool calls at the end of the stream\n const sortedIndices = [...toolCallAcc.keys()].sort((a, b) => a - b);\n for (const idx of sortedIndices) {\n const tc = toolCallAcc.get(idx)!;\n yield { id: tc.id, name: tc.name, arguments: tc.arguments } as ToolCall;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Responses API processing\n// ---------------------------------------------------------------------------\n\n/**\n * Process a Responses API response.\n *\n * Extracts:\n * - Text content from `output_text` or output message items\n * - Function tool calls from `function_call` output items\n * - JSON-parsed content when outputSchema is present\n */\nfunction processResponsesApi(\n agent: Prompty,\n response: Record<string, unknown>,\n): unknown {\n const output = response.output as Record<string, unknown>[];\n\n // Collect function calls\n const funcCalls: ToolCall[] = [];\n for (const item of output) {\n if (item.type === \"function_call\") {\n funcCalls.push({\n id: (item.call_id ?? item.id ?? \"\") as string,\n name: item.name as string,\n arguments: item.arguments as string,\n });\n }\n }\n\n if (funcCalls.length > 0) {\n return funcCalls;\n }\n\n // Text content — use output_text convenience field\n const outputText = response.output_text as string | undefined;\n if (outputText !== undefined) {\n // Structured output — JSON parse when outputs schema exists\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(outputText);\n } catch {\n return outputText;\n }\n }\n return outputText;\n }\n\n // Fallback: extract from output message items\n const texts: string[] = [];\n for (const item of output) {\n if (item.type === \"message\") {\n const content = item.content as Record<string, unknown>[] | undefined;\n if (content) {\n for (const part of content) {\n if (part.type === \"output_text\" || part.type === \"text\") {\n texts.push(part.text as string);\n }\n }\n }\n }\n }\n\n if (texts.length > 0) {\n const text = texts.join(\"\");\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n }\n\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response processing\n// ---------------------------------------------------------------------------\n\nfunction processChatCompletion(\n agent: Prompty,\n response: Record<string, unknown>,\n): unknown {\n const choices = response.choices as Record<string, unknown>[];\n if (!choices || choices.length === 0) return null;\n\n const choice = choices[0];\n const message = choice.message as Record<string, unknown>;\n if (!message) return null;\n\n // Tool calls\n const toolCalls = message.tool_calls as Record<string, unknown>[] | undefined;\n if (toolCalls && toolCalls.length > 0) {\n return toolCalls.map((tc): ToolCall => {\n const fn = tc.function as Record<string, unknown>;\n return {\n id: tc.id as string,\n name: fn.name as string,\n arguments: fn.arguments as string,\n };\n });\n }\n\n // Content\n const content = message.content as string | null;\n if (content === null) return null;\n\n // Structured output — JSON parse when outputs schema exists\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(content);\n } catch {\n return content;\n }\n }\n\n return content;\n}\n\nfunction processEmbedding(response: Record<string, unknown>): unknown {\n const data = response.data as Record<string, unknown>[];\n if (data.length === 1) {\n return (data[0] as Record<string, unknown>).embedding;\n }\n return data.map((d) => (d as Record<string, unknown>).embedding);\n}\n\nfunction processImage(response: Record<string, unknown>): unknown {\n const data = response.data as Record<string, unknown>[];\n if (data.length === 1) {\n return data[0].url ?? data[0].b64_json;\n }\n return data.map((d) => d.url ?? d.b64_json);\n}\n","/**\n * @prompty/openai — OpenAI provider for Prompty.\n *\n * Importing this package auto-registers the \"openai\" executor and processor.\n *\n * @module @prompty/openai\n */\n\nexport { OpenAIExecutor } from \"./executor.js\";\nexport { OpenAIProcessor, processResponse } from \"./processor.js\";\nexport { messageToWire, buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\n\n// Auto-register on import\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\nimport { OpenAIExecutor } from \"./executor.js\";\nimport { OpenAIProcessor } from \"./processor.js\";\n\nregisterExecutor(\"openai\", new OpenAIExecutor());\nregisterProcessor(\"openai\", new OpenAIProcessor());\n"],"mappings":"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","names":["traceSpan"]}
|
|
1
|
+
{"version":3,"sources":["../src/executor.ts","../src/wire.ts","../src/processor.ts","../src/index.ts"],"sourcesContent":["/**\n * OpenAI executor — sends messages to OpenAI APIs.\n *\n * Dispatches on `agent.model.apiType`: chat, embedding, image.\n *\n * @module\n */\n\nimport OpenAI from \"openai\";\nimport type { Prompty } from \"@prompty/core\";\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\nimport type { Executor } from \"@prompty/core\";\nimport type { Message } from \"@prompty/core\";\nimport { getConnection } from \"@prompty/core\";\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\nimport { buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\n\nexport class OpenAIExecutor implements Executor {\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\n return traceSpan(\"OpenAIExecutor\", async (emit) => {\n emit(\"signature\", \"prompty.openai.executor.OpenAIExecutor.invoke\");\n emit(\"inputs\", { data: messages });\n\n const client = this.resolveClient(agent);\n const clientName = client.constructor?.name ?? \"OpenAI\";\n\n // Trace what client we resolved and how\n await traceSpan(clientName, async (ctorEmit) => {\n ctorEmit(\"signature\", `${clientName}.ctor`);\n const conn = agent.model?.connection;\n if (conn instanceof ReferenceConnection) {\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\n } else {\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\n }\n ctorEmit(\"result\", clientName);\n });\n\n const apiType = agent.model?.apiType ?? \"chat\";\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\n emit(\"result\", result);\n return result;\n });\n }\n\n /** Dispatch to the appropriate API and trace the call. */\n private async executeApiCall(\n client: OpenAI,\n clientName: string,\n agent: Prompty,\n messages: Message[],\n apiType: string,\n ): Promise<unknown> {\n switch (apiType) {\n case \"chat\": {\n const args = buildChatArgs(agent, messages);\n const isStreaming = !!args.stream;\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.chat.completions.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.chat.completions.create(\n args as unknown as Parameters<typeof client.chat.completions.create>[0],\n );\n if (isStreaming) {\n // Wrap streaming response for tracing — don't emit result yet,\n // PromptyStream will trace on exhaustion\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\n }\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"embedding\": {\n const args = buildEmbeddingArgs(agent, messages);\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.embeddings.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.embeddings.create(\n args as unknown as Parameters<typeof client.embeddings.create>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"image\": {\n const args = buildImageArgs(agent, messages);\n return traceSpan(\"generate\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.images.generate`);\n callEmit(\"inputs\", sanitizeValue(\"generate\", args));\n const result = await client.images.generate(\n args as unknown as Parameters<typeof client.images.generate>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"responses\": {\n const args = buildResponsesArgs(agent, messages);\n const isStreaming = !!args.stream;\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.responses.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.responses.create(\n args as unknown as Parameters<typeof client.responses.create>[0],\n );\n if (isStreaming) {\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\n }\n callEmit(\"result\", result);\n return result;\n });\n }\n default:\n throw new Error(`Unsupported apiType: ${apiType}`);\n }\n }\n\n protected resolveClient(agent: Prompty): OpenAI {\n const conn = agent.model?.connection;\n\n if (conn instanceof ReferenceConnection) {\n return getConnection(conn.name) as OpenAI;\n }\n\n const kwargs = this.clientKwargs(agent);\n return new OpenAI(kwargs);\n }\n\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\n const kwargs: Record<string, unknown> = {};\n const conn = agent.model?.connection;\n\n if (conn instanceof ApiKeyConnection) {\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\n } else if (conn) {\n throw new Error(\n `Connection kind '${conn.kind}' is not supported by the OpenAI executor. ` +\n `Use 'key' for API key auth or 'reference' with registerConnection() for pre-configured clients.`,\n );\n }\n\n return kwargs;\n }\n}\n","/**\n * Wire format conversion: Message → OpenAI API JSON.\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { ContentPart, Message } from \"@prompty/core\";\nimport { load as loadPrompty } from \"@prompty/core\";\nimport { dirname, resolve } from \"node:path\";\n\n/**\n * Convert an abstract Message to OpenAI wire format.\n */\nexport function messageToWire(msg: Message): Record<string, unknown> {\n const wire: Record<string, unknown> = { role: msg.role };\n\n // Include metadata fields (e.g., name, tool_call_id, tool_calls)\n for (const [k, v] of Object.entries(msg.metadata)) {\n if (k !== \"role\" && k !== \"content\") {\n wire[k] = v;\n }\n }\n\n const content = msg.toTextContent();\n if (typeof content === \"string\") {\n wire.content = content;\n } else {\n // Multimodal — convert parts to OpenAI format\n wire.content = msg.parts.map(partToWire);\n }\n\n return wire;\n}\n\n/**\n * Convert a ContentPart to OpenAI wire format.\n */\nfunction partToWire(part: ContentPart): Record<string, unknown> {\n switch (part.kind) {\n case \"text\":\n return { type: \"text\", text: part.value };\n case \"image\": {\n const imageUrl: Record<string, unknown> = { url: part.source };\n if (part.detail) imageUrl.detail = part.detail;\n return { type: \"image_url\", image_url: imageUrl };\n }\n case \"audio\":\n return {\n type: \"input_audio\",\n input_audio: {\n data: part.source,\n ...(part.mediaType && { format: mimeToAudioFormat(part.mediaType) }),\n },\n };\n case \"file\":\n return { type: \"file\", file: { url: part.source } };\n }\n}\n\n/** Map audio MIME types to OpenAI short format names. */\nconst AUDIO_MIME_MAP: Record<string, string> = {\n \"audio/wav\": \"wav\",\n \"audio/mpeg\": \"mp3\",\n \"audio/mp3\": \"mp3\",\n \"audio/mp4\": \"mp4\",\n \"audio/ogg\": \"ogg\",\n \"audio/flac\": \"flac\",\n \"audio/webm\": \"webm\",\n \"audio/pcm\": \"pcm\",\n};\n\nfunction mimeToAudioFormat(mediaType: string): string {\n return AUDIO_MIME_MAP[mediaType.toLowerCase()] ?? mediaType;\n}\n\n/**\n * Build chat completion arguments from agent config and messages.\n */\nexport function buildChatArgs(\n agent: Prompty,\n messages: Message[],\n): Record<string, unknown> {\n const model = agent.model?.id || \"gpt-4\";\n const wireMessages = messages.map(messageToWire);\n\n const args: Record<string, unknown> = {\n model,\n messages: wireMessages,\n ...buildOptions(agent),\n };\n\n // Tools\n const tools = toolsToWire(agent);\n if (tools.length > 0) {\n args.tools = tools;\n }\n\n // Structured output\n const responseFormat = outputSchemaToWire(agent);\n if (responseFormat) {\n args.response_format = responseFormat;\n }\n\n return args;\n}\n\n/**\n * Build embedding arguments.\n * Only additionalProperties are passed — chat options are not valid here.\n */\nexport function buildEmbeddingArgs(\n agent: Prompty,\n data: unknown,\n): Record<string, unknown> {\n const model = agent.model?.id || \"text-embedding-ada-002\";\n\n // Extract text content from Message objects if needed\n let input: unknown;\n if (Array.isArray(data)) {\n const texts = data.map((item: unknown) => {\n if (typeof item === \"string\") return item;\n if (item && typeof item === \"object\" && \"text\" in item) return (item as { text: string }).text;\n if (item && typeof item === \"object\" && \"toTextContent\" in item) {\n const content = (item as { toTextContent: () => unknown }).toTextContent();\n return typeof content === \"string\" ? content : String(content);\n }\n return String(item);\n });\n // Single input → string, multiple → array\n input = texts.length === 1 ? texts[0] : texts;\n } else if (typeof data === \"string\") {\n input = data;\n } else {\n input = String(data);\n }\n\n const args: Record<string, unknown> = { input, model };\n const extra = agent.model?.options?.additionalProperties;\n if (extra) {\n for (const [k, v] of Object.entries(extra)) {\n args[k] = v;\n }\n }\n return args;\n}\n\n/**\n * Build image generation arguments.\n * Only additionalProperties are passed — chat options are not valid here.\n */\nexport function buildImageArgs(\n agent: Prompty,\n data: unknown,\n): Record<string, unknown> {\n const model = agent.model?.id || \"dall-e-3\";\n\n // Extract prompt text: data may be a string, or a Message[] from the parser\n let prompt: string;\n if (typeof data === \"string\") {\n prompt = data;\n } else if (Array.isArray(data)) {\n // Messages have .parts[].value for text content, or a .text getter\n prompt = data\n .map((m: { text?: string; parts?: { kind: string; value: string }[] }) => {\n if (typeof m.text === \"string\") return m.text;\n if (Array.isArray(m.parts)) {\n return m.parts\n .filter((p) => p.kind === \"text\")\n .map((p) => p.value)\n .join(\"\");\n }\n return String(m);\n })\n .join(\"\\n\")\n .trim();\n } else {\n prompt = String(data);\n }\n\n const args: Record<string, unknown> = { prompt, model };\n const extra = agent.model?.options?.additionalProperties;\n if (extra) {\n for (const [k, v] of Object.entries(extra)) {\n args[k] = v;\n }\n }\n return args;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Map AgentSchema kind strings to JSON Schema type strings. */\nconst KIND_TO_JSON_TYPE: Record<string, string> = {\n string: \"string\",\n integer: \"integer\",\n float: \"number\",\n number: \"number\",\n boolean: \"boolean\",\n array: \"array\",\n object: \"object\",\n};\n\nfunction buildOptions(agent: Prompty): Record<string, unknown> {\n const opts = agent.model?.options;\n if (!opts) return {};\n\n const result: Record<string, unknown> = {};\n\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\n if (opts.maxOutputTokens !== undefined) result.max_completion_tokens = opts.maxOutputTokens;\n if (opts.topP !== undefined) result.top_p = opts.topP;\n if (opts.frequencyPenalty !== undefined) result.frequency_penalty = opts.frequencyPenalty;\n if (opts.presencePenalty !== undefined) result.presence_penalty = opts.presencePenalty;\n if (opts.stopSequences !== undefined && opts.stopSequences.length > 0) result.stop = opts.stopSequences;\n if (opts.seed !== undefined) result.seed = opts.seed;\n\n // Pass through additionalProperties — but don't overwrite mapped keys\n if (opts.additionalProperties) {\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\n if (!(k in result)) {\n result[k] = v;\n }\n }\n }\n\n return result;\n}\n\n/** Convert a Property list to a JSON Schema `{type: \"object\", properties: ...}`. */\nfunction schemaToWire(properties: unknown[]): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const p of properties as Array<{ name?: string; kind?: string; description?: string; required?: boolean; enumValues?: unknown[] }>) {\n if (!p.name) continue;\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[p.kind ?? \"string\"] ?? \"string\",\n };\n if (p.description) schema.description = p.description;\n if (p.enumValues && p.enumValues.length > 0) schema.enum = p.enumValues;\n props[p.name] = schema;\n if (p.required) required.push(p.name);\n }\n\n const result: Record<string, unknown> = { type: \"object\", properties: props };\n if (required.length > 0) result.required = required;\n return result;\n}\n\n/** Convert a single Property to a JSON Schema definition (recursive for structured output). */\nfunction propertyToJsonSchema(prop: {\n kind?: string;\n description?: string;\n enumValues?: unknown[];\n items?: unknown;\n properties?: unknown[];\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[prop.kind ?? \"string\"] ?? \"string\",\n };\n\n if (prop.description) schema.description = prop.description;\n if (prop.enumValues && prop.enumValues.length > 0) schema.enum = prop.enumValues;\n\n // Array items\n if (prop.kind === \"array\") {\n schema.items = prop.items\n ? propertyToJsonSchema(prop.items as typeof prop)\n : { type: \"string\" };\n }\n\n // Nested object\n if (prop.kind === \"object\") {\n if (prop.properties) {\n const nested: Record<string, unknown> = {};\n const req: string[] = [];\n for (const p of prop.properties as Array<{ name?: string } & typeof prop>) {\n if (!p.name) continue;\n nested[p.name] = propertyToJsonSchema(p);\n req.push(p.name);\n }\n schema.properties = nested;\n schema.required = req;\n } else {\n schema.properties = {};\n schema.required = [];\n }\n schema.additionalProperties = false;\n }\n\n return schema;\n}\n\nfunction toolsToWire(agent: Prompty): Record<string, unknown>[] {\n const tools = agent.tools;\n if (!tools || tools.length === 0) return [];\n\n const result: Record<string, unknown>[] = [];\n\n for (const t of tools) {\n if (t.kind === \"function\") {\n const funcDef: Record<string, unknown> = { name: t.name };\n if (t.description) funcDef.description = t.description;\n\n // Collect bound parameter names to strip from wire format\n const boundNames = new Set((t.bindings ?? []).map((b) => b.name));\n\n // Serialize parameters via schemaToWire, filtering out bound params\n let params = (t as { parameters?: unknown[] }).parameters;\n if (params && Array.isArray(params)) {\n if (boundNames.size > 0) {\n params = params.filter((p) => !boundNames.has((p as Record<string, unknown>).name as string));\n }\n funcDef.parameters = schemaToWire(params);\n }\n\n // Strict mode\n const strict = (t as { strict?: boolean }).strict;\n if (strict) {\n funcDef.strict = true;\n if (funcDef.parameters) {\n (funcDef.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n result.push({ type: \"function\", function: funcDef });\n } else if (t.kind === \"prompty\") {\n const funcDef = projectPromptyTool(t as unknown as Record<string, unknown>, agent);\n result.push({ type: \"function\", function: funcDef });\n }\n }\n\n return result;\n}\n\n/**\n * Project a PromptyTool as an OpenAI function definition.\n *\n * Loads the child `.prompty` file, uses its `inputs` as the\n * function parameters, and applies binding/strict stripping.\n */\nfunction projectPromptyTool(tool: Record<string, unknown>, parent: Prompty): Record<string, unknown> {\n const toolPath = tool.path as string | undefined;\n if (!toolPath) {\n throw new Error(`PromptyTool '${tool.name}' has no path`);\n }\n\n // Resolve child path relative to the parent .prompty file\n const parentPath = (parent.metadata ?? {}).__source_path as string | undefined;\n if (!parentPath) {\n throw new Error(\n `Cannot resolve PromptyTool '${tool.name}': parent agent has no __source_path in metadata`,\n );\n }\n const childPath = resolve(dirname(parentPath), toolPath);\n const child = loadPrompty(childPath);\n\n const funcDef: Record<string, unknown> = { name: tool.name };\n funcDef.description = (tool.description as string) || child.description || \"\";\n\n // Use child's inputs as parameters, stripping bound params\n const bindings = (tool as { bindings?: { name: string }[] }).bindings;\n const boundNames = new Set((bindings ?? []).map((b) => b.name));\n\n const childInputs = child.inputs ?? [];\n let params: unknown[] = childInputs;\n if (boundNames.size > 0) {\n params = params.filter((p) => !boundNames.has((p as Record<string, unknown>).name as string));\n }\n funcDef.parameters = schemaToWire(params);\n\n const strict = (tool as { strict?: boolean }).strict;\n if (strict) {\n funcDef.strict = true;\n if (funcDef.parameters) {\n (funcDef.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n return funcDef;\n}\n\nfunction outputSchemaToWire(agent: Prompty): Record<string, unknown> | null {\n const outputs = agent.outputs;\n if (!outputs || outputs.length === 0) return null;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const prop of outputs) {\n if (!prop.name) continue;\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\n required.push(prop.name);\n }\n\n const name = \"structured_output\";\n\n return {\n type: \"json_schema\",\n json_schema: {\n name,\n strict: true,\n schema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Responses API wire format\n// ---------------------------------------------------------------------------\n\n/**\n * Build Responses API arguments from agent config and messages.\n *\n * Key differences from Chat Completions:\n * - System messages → `instructions` parameter\n * - Other messages → `input` as EasyInputMessage[]\n * - `maxOutputTokens` → `max_output_tokens`\n * - Structured output → `text.format` (not `response_format`)\n * - Tools use flat `{ type: \"function\", name, parameters }` (not nested `function:`)\n */\nexport function buildResponsesArgs(\n agent: Prompty,\n messages: Message[],\n): Record<string, unknown> {\n const model = agent.model?.id || \"gpt-4o\";\n\n // Separate system messages as instructions, rest as input\n const systemParts: string[] = [];\n const inputMessages: Record<string, unknown>[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\" || msg.role === \"developer\") {\n systemParts.push(msg.text);\n } else {\n inputMessages.push(messageToResponsesInput(msg));\n }\n }\n\n const args: Record<string, unknown> = {\n model,\n input: inputMessages,\n };\n\n // Set instructions from system messages\n if (systemParts.length > 0) {\n args.instructions = systemParts.join(\"\\n\\n\");\n }\n\n // Map model options\n const responseOpts = buildResponsesOptions(agent);\n Object.assign(args, responseOpts);\n\n // Tools\n const tools = responsesToolsToWire(agent);\n if (tools.length > 0) {\n args.tools = tools;\n }\n\n // Structured output via text.format\n const textConfig = outputSchemaToResponsesWire(agent);\n if (textConfig) {\n args.text = textConfig;\n }\n\n return args;\n}\n\n/** Convert a Message to Responses API EasyInputMessage format. */\nfunction messageToResponsesInput(msg: Message): Record<string, unknown> {\n const content = msg.toTextContent();\n\n // Pass-through original function_call items from the agent loop\n if (msg.metadata.responses_function_call) {\n return msg.metadata.responses_function_call as Record<string, unknown>;\n }\n\n // Tool result messages → function_call_output\n if (msg.metadata.tool_call_id) {\n return {\n type: \"function_call_output\",\n call_id: msg.metadata.tool_call_id,\n output: typeof content === \"string\" ? content : JSON.stringify(content),\n };\n }\n\n const role = msg.role === \"tool\" ? \"user\" : msg.role;\n return { role, content };\n}\n\n/** Build Responses-specific model options. */\nfunction buildResponsesOptions(agent: Prompty): Record<string, unknown> {\n const opts = agent.model?.options;\n if (!opts) return {};\n\n const result: Record<string, unknown> = {};\n\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\n if (opts.maxOutputTokens !== undefined) result.max_output_tokens = opts.maxOutputTokens;\n if (opts.topP !== undefined) result.top_p = opts.topP;\n\n // Pass through additionalProperties — but don't overwrite mapped keys\n if (opts.additionalProperties) {\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\n if (!(k in result)) {\n result[k] = v;\n }\n }\n }\n\n return result;\n}\n\n/** Convert agent tools to Responses API tool format. */\nfunction responsesToolsToWire(agent: Prompty): Record<string, unknown>[] {\n const tools = agent.tools;\n if (!tools || tools.length === 0) return [];\n\n const result: Record<string, unknown>[] = [];\n\n for (const t of tools) {\n if (t.kind === \"function\") {\n // Responses API uses flat tool format (not nested under \"function:\")\n const tool: Record<string, unknown> = {\n type: \"function\",\n name: t.name,\n };\n if (t.description) tool.description = t.description;\n\n const params = (t as { parameters?: unknown[] }).parameters;\n if (params && Array.isArray(params)) {\n tool.parameters = schemaToWire(params);\n }\n\n const strict = (t as { strict?: boolean }).strict;\n if (strict) {\n tool.strict = true;\n if (tool.parameters) {\n (tool.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n result.push(tool);\n } else if (t.kind === \"prompty\") {\n // Project prompty tool as a flat function definition (Responses API format)\n const projected = projectPromptyTool(t as unknown as Record<string, unknown>, agent);\n const tool: Record<string, unknown> = {\n type: \"function\",\n name: projected.name,\n };\n if (projected.description) tool.description = projected.description;\n if (projected.parameters) tool.parameters = projected.parameters;\n\n const strict = (projected as Record<string, unknown>).strict;\n if (strict) {\n tool.strict = true;\n if (tool.parameters) {\n (tool.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n result.push(tool);\n }\n }\n\n return result;\n}\n\n/** Convert outputSchema to Responses API text.format config. */\nfunction outputSchemaToResponsesWire(agent: Prompty): Record<string, unknown> | null {\n const outputs = agent.outputs;\n if (!outputs || outputs.length === 0) return null;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const prop of outputs) {\n if (!prop.name) continue;\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\n required.push(prop.name);\n }\n\n const name = \"structured_output\";\n\n return {\n format: {\n type: \"json_schema\",\n name,\n strict: true,\n schema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n },\n };\n}\n","/**\n * OpenAI processor — extracts clean results from raw OpenAI responses.\n *\n * Handles ChatCompletion, Embedding, Image, and streaming responses.\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { Processor } from \"@prompty/core\";\nimport type { ToolCall } from \"@prompty/core\";\nimport { traceSpan } from \"@prompty/core\";\n\nexport class OpenAIProcessor implements Processor {\n async process(agent: Prompty, response: unknown): Promise<unknown> {\n return traceSpan(\"OpenAIProcessor\", async (emit) => {\n emit(\"signature\", \"prompty.openai.processor.OpenAIProcessor.invoke\");\n emit(\"inputs\", { data: response });\n const result = processResponse(agent, response);\n // Don't emit result for streaming — it's a generator, not a value\n if (!isAsyncIterable(response)) {\n emit(\"result\", result);\n }\n return result;\n });\n }\n}\n\n/**\n * Extract clean content from an OpenAI response.\n */\nexport function processResponse(agent: Prompty, response: unknown): unknown {\n if (typeof response !== \"object\" || response === null) return response;\n\n // Streaming response — return content-extracting async generator\n if (isAsyncIterable(response)) {\n return streamGenerator(response);\n }\n\n const r = response as Record<string, unknown>;\n\n // Responses API — has output[] and object === \"response\"\n if (r.object === \"response\" && Array.isArray(r.output)) {\n return processResponsesApi(agent, r);\n }\n\n // ChatCompletion\n if (r.choices) {\n return processChatCompletion(agent, r);\n }\n\n // Embedding response\n if (r.data && r.object === \"list\") {\n return processEmbedding(r);\n }\n\n // Image response\n if (r.data && Array.isArray(r.data)) {\n const data = r.data as Record<string, unknown>[];\n if (data.length > 0 && (\"url\" in data[0] || \"b64_json\" in data[0])) {\n return processImage(r);\n }\n }\n\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Streaming\n// ---------------------------------------------------------------------------\n\n/** Type guard for async iterables (PromptyStream or raw SDK stream). */\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value\n );\n}\n\n/**\n * Yield content chunks, tool calls, or refusals from a streaming response.\n *\n * Handles three types of streaming deltas:\n * - `delta.content` — yields content strings\n * - `delta.tool_calls` — accumulates partial tool call chunks,\n * yields ToolCall objects when the stream ends\n * - `delta.refusal` — throws Error with the refusal message\n *\n * Matches the Python `_stream_generator` / `_async_stream_generator`.\n */\nasync function* streamGenerator(\n response: AsyncIterable<unknown>,\n): AsyncGenerator<string | ToolCall> {\n const toolCallAcc: Map<number, { id: string; name: string; arguments: string }> = new Map();\n\n for await (const chunk of response) {\n const c = chunk as Record<string, unknown>;\n const choices = c.choices as Record<string, unknown>[] | undefined;\n if (!choices || choices.length === 0) continue;\n\n const delta = (choices[0] as Record<string, unknown>).delta as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n // Content\n if (delta.content != null) {\n yield delta.content as string;\n }\n\n // Tool call deltas — accumulate index-keyed partial chunks\n const tcDeltas = delta.tool_calls as Record<string, unknown>[] | undefined;\n if (tcDeltas) {\n for (const tcDelta of tcDeltas) {\n const idx = tcDelta.index as number;\n if (!toolCallAcc.has(idx)) {\n toolCallAcc.set(idx, { id: \"\", name: \"\", arguments: \"\" });\n }\n const acc = toolCallAcc.get(idx)!;\n if (tcDelta.id) acc.id = tcDelta.id as string;\n const fn = tcDelta.function as Record<string, unknown> | undefined;\n if (fn) {\n if (fn.name) acc.name = fn.name as string;\n if (fn.arguments) acc.arguments += fn.arguments as string;\n }\n }\n }\n\n // Refusal\n if (delta.refusal != null) {\n throw new Error(`Model refused: ${delta.refusal}`);\n }\n }\n\n // Yield accumulated tool calls at the end of the stream\n const sortedIndices = [...toolCallAcc.keys()].sort((a, b) => a - b);\n for (const idx of sortedIndices) {\n const tc = toolCallAcc.get(idx)!;\n yield { id: tc.id, name: tc.name, arguments: tc.arguments } as ToolCall;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Responses API processing\n// ---------------------------------------------------------------------------\n\n/**\n * Process a Responses API response.\n *\n * Extracts:\n * - Text content from `output_text` or output message items\n * - Function tool calls from `function_call` output items\n * - JSON-parsed content when outputSchema is present\n */\nfunction processResponsesApi(\n agent: Prompty,\n response: Record<string, unknown>,\n): unknown {\n const output = response.output as Record<string, unknown>[];\n\n // Collect function calls\n const funcCalls: ToolCall[] = [];\n for (const item of output) {\n if (item.type === \"function_call\") {\n funcCalls.push({\n id: (item.call_id ?? item.id ?? \"\") as string,\n name: item.name as string,\n arguments: item.arguments as string,\n });\n }\n }\n\n if (funcCalls.length > 0) {\n return funcCalls;\n }\n\n // Text content — use output_text convenience field\n const outputText = response.output_text as string | undefined;\n if (outputText !== undefined) {\n // Structured output — JSON parse when outputs schema exists\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(outputText);\n } catch {\n return outputText;\n }\n }\n return outputText;\n }\n\n // Fallback: extract from output message items\n const texts: string[] = [];\n for (const item of output) {\n if (item.type === \"message\") {\n const content = item.content as Record<string, unknown>[] | undefined;\n if (content) {\n for (const part of content) {\n if (part.type === \"output_text\" || part.type === \"text\") {\n texts.push(part.text as string);\n }\n }\n }\n }\n }\n\n if (texts.length > 0) {\n const text = texts.join(\"\");\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n }\n\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response processing\n// ---------------------------------------------------------------------------\n\nfunction processChatCompletion(\n agent: Prompty,\n response: Record<string, unknown>,\n): unknown {\n const choices = response.choices as Record<string, unknown>[];\n if (!choices || choices.length === 0) return null;\n\n const choice = choices[0];\n const message = choice.message as Record<string, unknown>;\n if (!message) return null;\n\n // Tool calls\n const toolCalls = message.tool_calls as Record<string, unknown>[] | undefined;\n if (toolCalls && toolCalls.length > 0) {\n return toolCalls.map((tc): ToolCall => {\n const fn = tc.function as Record<string, unknown>;\n return {\n id: tc.id as string,\n name: fn.name as string,\n arguments: fn.arguments as string,\n };\n });\n }\n\n // Content\n const content = message.content as string | null;\n\n // Refusal — when content is null but refusal is present, return the refusal\n if (content === null) {\n const refusal = message.refusal as string | undefined;\n if (typeof refusal === \"string\") return refusal;\n return null;\n }\n\n // Structured output — JSON parse when outputs schema exists\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(content);\n } catch {\n return content;\n }\n }\n\n return content;\n}\n\nfunction processEmbedding(response: Record<string, unknown>): unknown {\n const data = response.data as Record<string, unknown>[];\n if (data.length === 1) {\n return (data[0] as Record<string, unknown>).embedding;\n }\n return data.map((d) => (d as Record<string, unknown>).embedding);\n}\n\nfunction processImage(response: Record<string, unknown>): unknown {\n const data = response.data as Record<string, unknown>[];\n if (data.length === 1) {\n return data[0].url ?? data[0].b64_json;\n }\n return data.map((d) => d.url ?? d.b64_json);\n}\n","/**\n * @prompty/openai — OpenAI provider for Prompty.\n *\n * Importing this package auto-registers the \"openai\" executor and processor.\n *\n * @module @prompty/openai\n */\n\nexport { OpenAIExecutor } from \"./executor.js\";\nexport { OpenAIProcessor, processResponse } from \"./processor.js\";\nexport { messageToWire, buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\n\n// Auto-register on import\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\nimport { OpenAIExecutor } from \"./executor.js\";\nimport { OpenAIProcessor } from \"./processor.js\";\n\nregisterExecutor(\"openai\", new OpenAIExecutor());\nregisterProcessor(\"openai\", new OpenAIProcessor());\n"],"mappings":"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","names":["traceSpan"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prompty/openai",
|
|
3
|
-
"version": "2.0.0-alpha.
|
|
3
|
+
"version": "2.0.0-alpha.5",
|
|
4
4
|
"description": "OpenAI provider for Prompty — executor and processor for OpenAI APIs",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -44,14 +44,15 @@
|
|
|
44
44
|
"node": ">=18.0.0"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
|
-
"@prompty/core": "^2.0.0-alpha.
|
|
47
|
+
"@prompty/core": "^2.0.0-alpha.5"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"openai": "^4.80.0"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@prompty/core": "^2.0.0-alpha.
|
|
53
|
+
"@prompty/core": "^2.0.0-alpha.5",
|
|
54
54
|
"@types/node": "^20.11.0",
|
|
55
|
+
"dotenv": "^16.4.0",
|
|
55
56
|
"tsup": "^8.4.0",
|
|
56
57
|
"typescript": "^5.7.0",
|
|
57
58
|
"vitest": "^3.0.0"
|