@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 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 = [data];
135
+ input = data;
121
136
  } else {
122
- input = [String(data)];
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 !== "function") continue;
238
- const funcDef = { name: t.name };
239
- if (t.description) funcDef.description = t.description;
240
- const params = t.parameters;
241
- if (params && Array.isArray(params)) {
242
- funcDef.parameters = schemaToWire(params);
243
- }
244
- const strict = t.strict;
245
- if (strict) {
246
- funcDef.strict = true;
247
- if (funcDef.parameters) {
248
- funcDef.parameters.additionalProperties = false;
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 = (agent.name || "response").toLowerCase().replace(/[\s-]/g, "_");
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 !== "function") continue;
347
- const tool = {
348
- type: "function",
349
- name: t.name
350
- };
351
- if (t.description) tool.description = t.description;
352
- const params = t.parameters;
353
- if (params && Array.isArray(params)) {
354
- tool.parameters = schemaToWire(params);
355
- }
356
- const strict = t.strict;
357
- if (strict) {
358
- tool.strict = true;
359
- if (tool.parameters) {
360
- tool.parameters.additionalProperties = false;
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 = (agent.name || "response").toLowerCase().replace(/[\s-]/g, "_");
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, import_core3.traceSpan)("OpenAIExecutor", async (emit) => {
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, import_core3.traceSpan)(clientName, async (ctorEmit) => {
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 import_core.ReferenceConnection) {
476
+ if (conn instanceof import_core2.ReferenceConnection) {
405
477
  ctorEmit("inputs", { source: "reference", name: conn.name });
406
478
  } else {
407
- ctorEmit("inputs", (0, import_core3.sanitizeValue)("ctor", this.clientKwargs(agent)));
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, import_core3.traceSpan)("create", async (callEmit) => {
495
+ return (0, import_core4.traceSpan)("create", async (callEmit) => {
424
496
  callEmit("signature", `${clientName}.chat.completions.create`);
425
- callEmit("inputs", (0, import_core3.sanitizeValue)("create", args));
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 import_core.PromptyStream(`${clientName}Executor`, result);
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, import_core3.traceSpan)("create", async (callEmit) => {
510
+ return (0, import_core4.traceSpan)("create", async (callEmit) => {
439
511
  callEmit("signature", `${clientName}.embeddings.create`);
440
- callEmit("inputs", (0, import_core3.sanitizeValue)("create", args));
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, import_core3.traceSpan)("generate", async (callEmit) => {
522
+ return (0, import_core4.traceSpan)("generate", async (callEmit) => {
451
523
  callEmit("signature", `${clientName}.images.generate`);
452
- callEmit("inputs", (0, import_core3.sanitizeValue)("generate", args));
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, import_core3.traceSpan)("create", async (callEmit) => {
535
+ return (0, import_core4.traceSpan)("create", async (callEmit) => {
464
536
  callEmit("signature", `${clientName}.responses.create`);
465
- callEmit("inputs", (0, import_core3.sanitizeValue)("create", args));
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 import_core.PromptyStream(`${clientName}Executor`, result);
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 import_core.ReferenceConnection) {
483
- return (0, import_core2.getConnection)(conn.name);
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 import_core.ApiKeyConnection) {
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 import_core4 = require("@prompty/core");
576
+ var import_core5 = require("@prompty/core");
501
577
  var OpenAIProcessor = class {
502
578
  async process(agent, response) {
503
- return (0, import_core4.traceSpan)("OpenAIProcessor", async (emit) => {
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) return 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 import_core5 = require("@prompty/core");
674
- (0, import_core5.registerExecutor)("openai", new OpenAIExecutor());
675
- (0, import_core5.registerProcessor)("openai", new OpenAIProcessor());
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,
@@ -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":"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","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":"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","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 = [data];
92
+ input = data;
78
93
  } else {
79
- input = [String(data)];
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 !== "function") continue;
195
- const funcDef = { name: t.name };
196
- if (t.description) funcDef.description = t.description;
197
- const params = t.parameters;
198
- if (params && Array.isArray(params)) {
199
- funcDef.parameters = schemaToWire(params);
200
- }
201
- const strict = t.strict;
202
- if (strict) {
203
- funcDef.strict = true;
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 = (agent.name || "response").toLowerCase().replace(/[\s-]/g, "_");
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 !== "function") continue;
304
- const tool = {
305
- type: "function",
306
- name: t.name
307
- };
308
- if (t.description) tool.description = t.description;
309
- const params = t.parameters;
310
- if (params && Array.isArray(params)) {
311
- tool.parameters = schemaToWire(params);
312
- }
313
- const strict = t.strict;
314
- if (strict) {
315
- tool.strict = true;
316
- if (tool.parameters) {
317
- tool.parameters.additionalProperties = false;
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 = (agent.name || "response").toLowerCase().replace(/[\s-]/g, "_");
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) return 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",
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.3"
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.3",
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"