@prompty/openai 2.0.0-alpha.1 → 2.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,87 +1,87 @@
1
- # @prompty/openai
2
-
3
- OpenAI provider for Prompty — executor and processor for the OpenAI API.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- npm install @prompty/core @prompty/openai openai
9
- ```
10
-
11
- ## Usage
12
-
13
- Import `@prompty/openai` to auto-register the `openai` provider, then use `@prompty/core` as normal:
14
-
15
- ```typescript
16
- import "@prompty/openai";
17
- import { run } from "@prompty/core";
18
-
19
- const result = await run("./chat.prompty", {
20
- question: "What is quantum computing?",
21
- });
22
- ```
23
-
24
- ## `.prompty` Configuration
25
-
26
- Set `provider: openai` in your `.prompty` file:
27
-
28
- ```prompty
29
- ---
30
- name: my-prompt
31
- model:
32
- id: gpt-4o-mini
33
- provider: openai
34
- apiType: chat
35
- connection:
36
- kind: key
37
- endpoint: ${env:OPENAI_BASE_URL}
38
- apiKey: ${env:OPENAI_API_KEY}
39
- options:
40
- temperature: 0.7
41
- maxOutputTokens: 1000
42
- ---
43
- system:
44
- You are a helpful assistant.
45
-
46
- user:
47
- {{question}}
48
- ```
49
-
50
- ## Supported API Types
51
-
52
- | `apiType` | Description |
53
- |-----------|-------------|
54
- | `chat` (default) | Chat completions via `client.chat.completions.create()` |
55
- | `embedding` | Embeddings via `client.embeddings.create()` |
56
- | `image` | Image generation via `client.images.generate()` |
57
- | `responses` | Responses API via `client.responses.create()` |
58
-
59
- ## Streaming
60
-
61
- Enable streaming via `additionalProperties`:
62
-
63
- ```prompty
64
- model:
65
- options:
66
- additionalProperties:
67
- stream: true
68
- ```
69
-
70
- Returns a `PromptyStream` that can be iterated asynchronously.
71
-
72
- ## Exports
73
-
74
- | Export | Description |
75
- |--------|-------------|
76
- | `OpenAIExecutor` | Executor implementation for OpenAI |
77
- | `OpenAIProcessor` | Processor for OpenAI responses |
78
- | `processResponse` | Shared response processing helper |
79
- | `messageToWire` | Convert `Message` → OpenAI wire format |
80
- | `buildChatArgs` | Build chat completion arguments |
81
- | `buildEmbeddingArgs` | Build embedding arguments |
82
- | `buildImageArgs` | Build image generation arguments |
83
- | `buildResponsesArgs` | Build Responses API arguments |
84
-
85
- ## License
86
-
87
- MIT
1
+ # @prompty/openai
2
+
3
+ OpenAI provider for Prompty — executor and processor for the OpenAI API.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @prompty/core @prompty/openai openai
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ Import `@prompty/openai` to auto-register the `openai` provider, then use `@prompty/core` as normal:
14
+
15
+ ```typescript
16
+ import "@prompty/openai";
17
+ import { run } from "@prompty/core";
18
+
19
+ const result = await run("./chat.prompty", {
20
+ question: "What is quantum computing?",
21
+ });
22
+ ```
23
+
24
+ ## `.prompty` Configuration
25
+
26
+ Set `provider: openai` in your `.prompty` file:
27
+
28
+ ```prompty
29
+ ---
30
+ name: my-prompt
31
+ model:
32
+ id: gpt-4o-mini
33
+ provider: openai
34
+ apiType: chat
35
+ connection:
36
+ kind: key
37
+ endpoint: ${env:OPENAI_BASE_URL}
38
+ apiKey: ${env:OPENAI_API_KEY}
39
+ options:
40
+ temperature: 0.7
41
+ maxOutputTokens: 1000
42
+ ---
43
+ system:
44
+ You are a helpful assistant.
45
+
46
+ user:
47
+ {{question}}
48
+ ```
49
+
50
+ ## Supported API Types
51
+
52
+ | `apiType` | Description |
53
+ |-----------|-------------|
54
+ | `chat` (default) | Chat completions via `client.chat.completions.create()` |
55
+ | `embedding` | Embeddings via `client.embeddings.create()` |
56
+ | `image` | Image generation via `client.images.generate()` |
57
+ | `responses` | Responses API via `client.responses.create()` |
58
+
59
+ ## Streaming
60
+
61
+ Enable streaming via `additionalProperties`:
62
+
63
+ ```prompty
64
+ model:
65
+ options:
66
+ additionalProperties:
67
+ stream: true
68
+ ```
69
+
70
+ Returns a `PromptyStream` that can be iterated asynchronously.
71
+
72
+ ## Exports
73
+
74
+ | Export | Description |
75
+ |--------|-------------|
76
+ | `OpenAIExecutor` | Executor implementation for OpenAI |
77
+ | `OpenAIProcessor` | Processor for OpenAI responses |
78
+ | `processResponse` | Shared response processing helper |
79
+ | `messageToWire` | Convert `Message` → OpenAI wire format |
80
+ | `buildChatArgs` | Build chat completion arguments |
81
+ | `buildEmbeddingArgs` | Build embedding arguments |
82
+ | `buildImageArgs` | Build image generation arguments |
83
+ | `buildResponsesArgs` | Build Responses API arguments |
84
+
85
+ ## License
86
+
87
+ MIT
package/dist/index.cjs CHANGED
@@ -104,10 +104,24 @@ function buildChatArgs(agent, messages) {
104
104
  }
105
105
  function buildEmbeddingArgs(agent, data) {
106
106
  const model = agent.model?.id || "text-embedding-ada-002";
107
- const args = {
108
- input: Array.isArray(data) ? data : [data],
109
- model
110
- };
107
+ let input;
108
+ if (Array.isArray(data)) {
109
+ const texts = data.map((item) => {
110
+ if (typeof item === "string") return item;
111
+ if (item && typeof item === "object" && "text" in item) return item.text;
112
+ if (item && typeof item === "object" && "toTextContent" in item) {
113
+ const content = item.toTextContent();
114
+ return typeof content === "string" ? content : String(content);
115
+ }
116
+ return String(item);
117
+ });
118
+ input = texts;
119
+ } else if (typeof data === "string") {
120
+ input = [data];
121
+ } else {
122
+ input = [String(data)];
123
+ }
124
+ const args = { input, model };
111
125
  const extra = agent.model?.options?.additionalProperties;
112
126
  if (extra) {
113
127
  for (const [k, v] of Object.entries(extra)) {
@@ -159,7 +173,7 @@ function buildOptions(agent) {
159
173
  if (opts.topP !== void 0) result.top_p = opts.topP;
160
174
  if (opts.frequencyPenalty !== void 0) result.frequency_penalty = opts.frequencyPenalty;
161
175
  if (opts.presencePenalty !== void 0) result.presence_penalty = opts.presencePenalty;
162
- if (opts.stopSequences !== void 0) result.stop = opts.stopSequences;
176
+ if (opts.stopSequences !== void 0 && opts.stopSequences.length > 0) result.stop = opts.stopSequences;
163
177
  if (opts.seed !== void 0) result.seed = opts.seed;
164
178
  if (opts.additionalProperties) {
165
179
  for (const [k, v] of Object.entries(opts.additionalProperties)) {
@@ -295,6 +309,9 @@ function buildResponsesArgs(agent, messages) {
295
309
  }
296
310
  function messageToResponsesInput(msg) {
297
311
  const content = msg.toTextContent();
312
+ if (msg.metadata.responses_function_call) {
313
+ return msg.metadata.responses_function_call;
314
+ }
298
315
  if (msg.metadata.tool_call_id) {
299
316
  return {
300
317
  type: "function_call_output",
@@ -400,8 +417,7 @@ var OpenAIExecutor = class {
400
417
  /** Dispatch to the appropriate API and trace the call. */
401
418
  async executeApiCall(client, clientName, agent, messages, apiType) {
402
419
  switch (apiType) {
403
- case "chat":
404
- case "agent": {
420
+ case "chat": {
405
421
  const args = buildChatArgs(agent, messages);
406
422
  const isStreaming = !!args.stream;
407
423
  return (0, import_core3.traceSpan)("create", async (callEmit) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/executor.ts","../src/wire.ts","../src/processor.ts"],"sourcesContent":["/**\r\n * @prompty/openai — OpenAI provider for Prompty.\r\n *\r\n * Importing this package auto-registers the \"openai\" executor and processor.\r\n *\r\n * @module @prompty/openai\r\n */\r\n\r\nexport { OpenAIExecutor } from \"./executor.js\";\r\nexport { OpenAIProcessor, processResponse } from \"./processor.js\";\r\nexport { messageToWire, buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\r\n\r\n// Auto-register on import\r\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\r\nimport { OpenAIExecutor } from \"./executor.js\";\r\nimport { OpenAIProcessor } from \"./processor.js\";\r\n\r\nregisterExecutor(\"openai\", new OpenAIExecutor());\r\nregisterProcessor(\"openai\", new OpenAIProcessor());\r\n","/**\r\n * OpenAI executor — sends messages to OpenAI APIs.\r\n *\r\n * Dispatches on `agent.model.apiType`: chat, embedding, image.\r\n *\r\n * @module\r\n */\r\n\r\nimport OpenAI from \"openai\";\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\r\nimport type { Executor } from \"@prompty/core\";\r\nimport type { Message } from \"@prompty/core\";\r\nimport { getConnection } from \"@prompty/core\";\r\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\r\nimport { buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\r\n\r\nexport class OpenAIExecutor implements Executor {\r\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\r\n return traceSpan(\"OpenAIExecutor\", async (emit) => {\r\n emit(\"signature\", \"prompty.openai.executor.OpenAIExecutor.invoke\");\r\n emit(\"inputs\", { data: messages });\r\n\r\n const client = this.resolveClient(agent);\r\n const clientName = client.constructor?.name ?? \"OpenAI\";\r\n\r\n // Trace what client we resolved and how\r\n await traceSpan(clientName, async (ctorEmit) => {\r\n ctorEmit(\"signature\", `${clientName}.ctor`);\r\n const conn = agent.model?.connection;\r\n if (conn instanceof ReferenceConnection) {\r\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\r\n } else {\r\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\r\n }\r\n ctorEmit(\"result\", clientName);\r\n });\r\n\r\n const apiType = agent.model?.apiType ?? \"chat\";\r\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\r\n emit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n\r\n /** Dispatch to the appropriate API and trace the call. */\r\n private async executeApiCall(\r\n client: OpenAI,\r\n clientName: string,\r\n agent: Prompty,\r\n messages: Message[],\r\n apiType: string,\r\n ): Promise<unknown> {\r\n switch (apiType) {\r\n case \"chat\":\r\n case \"agent\": {\r\n const args = buildChatArgs(agent, messages);\r\n const isStreaming = !!args.stream;\r\n return traceSpan(\"create\", async (callEmit) => {\r\n callEmit(\"signature\", `${clientName}.chat.completions.create`);\r\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\r\n const result = await client.chat.completions.create(\r\n args as unknown as Parameters<typeof client.chat.completions.create>[0],\r\n );\r\n if (isStreaming) {\r\n // Wrap streaming response for tracing — don't emit result yet,\r\n // PromptyStream will trace on exhaustion\r\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\r\n }\r\n callEmit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n case \"embedding\": {\r\n const args = buildEmbeddingArgs(agent, messages);\r\n return traceSpan(\"create\", async (callEmit) => {\r\n callEmit(\"signature\", `${clientName}.embeddings.create`);\r\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\r\n const result = await client.embeddings.create(\r\n args as unknown as Parameters<typeof client.embeddings.create>[0],\r\n );\r\n callEmit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n case \"image\": {\r\n const args = buildImageArgs(agent, messages);\r\n return traceSpan(\"generate\", async (callEmit) => {\r\n callEmit(\"signature\", `${clientName}.images.generate`);\r\n callEmit(\"inputs\", sanitizeValue(\"generate\", args));\r\n const result = await client.images.generate(\r\n args as unknown as Parameters<typeof client.images.generate>[0],\r\n );\r\n callEmit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n case \"responses\": {\r\n const args = buildResponsesArgs(agent, messages);\r\n const isStreaming = !!args.stream;\r\n return traceSpan(\"create\", async (callEmit) => {\r\n callEmit(\"signature\", `${clientName}.responses.create`);\r\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\r\n const result = await client.responses.create(\r\n args as unknown as Parameters<typeof client.responses.create>[0],\r\n );\r\n if (isStreaming) {\r\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\r\n }\r\n callEmit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n default:\r\n throw new Error(`Unsupported apiType: ${apiType}`);\r\n }\r\n }\r\n\r\n protected resolveClient(agent: Prompty): OpenAI {\r\n const conn = agent.model?.connection;\r\n\r\n if (conn instanceof ReferenceConnection) {\r\n return getConnection(conn.name) as OpenAI;\r\n }\r\n\r\n const kwargs = this.clientKwargs(agent);\r\n return new OpenAI(kwargs);\r\n }\r\n\r\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\r\n const kwargs: Record<string, unknown> = {};\r\n const conn = agent.model?.connection;\r\n\r\n if (conn instanceof ApiKeyConnection) {\r\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\r\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\r\n }\r\n\r\n return kwargs;\r\n }\r\n}\r\n","/**\r\n * Wire format conversion: Message → OpenAI API JSON.\r\n *\r\n * @module\r\n */\r\n\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport type { ContentPart, Message } from \"@prompty/core\";\r\n\r\n/**\r\n * Convert an abstract Message to OpenAI wire format.\r\n */\r\nexport function messageToWire(msg: Message): Record<string, unknown> {\r\n const wire: Record<string, unknown> = { role: msg.role };\r\n\r\n // Include metadata fields (e.g., name, tool_call_id, tool_calls)\r\n for (const [k, v] of Object.entries(msg.metadata)) {\r\n if (k !== \"role\" && k !== \"content\") {\r\n wire[k] = v;\r\n }\r\n }\r\n\r\n const content = msg.toTextContent();\r\n if (typeof content === \"string\") {\r\n wire.content = content;\r\n } else {\r\n // Multimodal — convert parts to OpenAI format\r\n wire.content = msg.parts.map(partToWire);\r\n }\r\n\r\n return wire;\r\n}\r\n\r\n/**\r\n * Convert a ContentPart to OpenAI wire format.\r\n */\r\nfunction partToWire(part: ContentPart): Record<string, unknown> {\r\n switch (part.kind) {\r\n case \"text\":\r\n return { type: \"text\", text: part.value };\r\n case \"image\": {\r\n const imageUrl: Record<string, unknown> = { url: part.source };\r\n if (part.detail) imageUrl.detail = part.detail;\r\n return { type: \"image_url\", image_url: imageUrl };\r\n }\r\n case \"audio\":\r\n return {\r\n type: \"input_audio\",\r\n input_audio: {\r\n data: part.source,\r\n ...(part.mediaType && { format: part.mediaType }),\r\n },\r\n };\r\n case \"file\":\r\n return { type: \"file\", file: { url: part.source } };\r\n }\r\n}\r\n\r\n/**\r\n * Build chat completion arguments from agent config and messages.\r\n */\r\nexport function buildChatArgs(\r\n agent: Prompty,\r\n messages: Message[],\r\n): Record<string, unknown> {\r\n const model = agent.model?.id || \"gpt-4\";\r\n const wireMessages = messages.map(messageToWire);\r\n\r\n const args: Record<string, unknown> = {\r\n model,\r\n messages: wireMessages,\r\n ...buildOptions(agent),\r\n };\r\n\r\n // Tools\r\n const tools = toolsToWire(agent);\r\n if (tools.length > 0) {\r\n args.tools = tools;\r\n }\r\n\r\n // Structured output\r\n const responseFormat = outputSchemaToWire(agent);\r\n if (responseFormat) {\r\n args.response_format = responseFormat;\r\n }\r\n\r\n return args;\r\n}\r\n\r\n/**\r\n * Build embedding arguments.\r\n * Only additionalProperties are passed — chat options are not valid here.\r\n */\r\nexport function buildEmbeddingArgs(\r\n agent: Prompty,\r\n data: unknown,\r\n): Record<string, unknown> {\r\n const model = agent.model?.id || \"text-embedding-ada-002\";\r\n const args: Record<string, unknown> = {\r\n input: Array.isArray(data) ? data : [data],\r\n model,\r\n };\r\n const extra = agent.model?.options?.additionalProperties;\r\n if (extra) {\r\n for (const [k, v] of Object.entries(extra)) {\r\n args[k] = v;\r\n }\r\n }\r\n return args;\r\n}\r\n\r\n/**\r\n * Build image generation arguments.\r\n * Only additionalProperties are passed — chat options are not valid here.\r\n */\r\nexport function buildImageArgs(\r\n agent: Prompty,\r\n data: unknown,\r\n): Record<string, unknown> {\r\n const model = agent.model?.id || \"dall-e-3\";\r\n\r\n // Extract prompt text: data may be a string, or a Message[] from the parser\r\n let prompt: string;\r\n if (typeof data === \"string\") {\r\n prompt = data;\r\n } else if (Array.isArray(data)) {\r\n // Messages have .parts[].value for text content, or a .text getter\r\n prompt = data\r\n .map((m: { text?: string; parts?: { kind: string; value: string }[] }) => {\r\n if (typeof m.text === \"string\") return m.text;\r\n if (Array.isArray(m.parts)) {\r\n return m.parts\r\n .filter((p) => p.kind === \"text\")\r\n .map((p) => p.value)\r\n .join(\"\");\r\n }\r\n return String(m);\r\n })\r\n .join(\"\\n\")\r\n .trim();\r\n } else {\r\n prompt = String(data);\r\n }\r\n\r\n const args: Record<string, unknown> = { prompt, model };\r\n const extra = agent.model?.options?.additionalProperties;\r\n if (extra) {\r\n for (const [k, v] of Object.entries(extra)) {\r\n args[k] = v;\r\n }\r\n }\r\n return args;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Map AgentSchema kind strings to JSON Schema type strings. */\r\nconst KIND_TO_JSON_TYPE: Record<string, string> = {\r\n string: \"string\",\r\n integer: \"integer\",\r\n float: \"number\",\r\n number: \"number\",\r\n boolean: \"boolean\",\r\n array: \"array\",\r\n object: \"object\",\r\n};\r\n\r\nfunction buildOptions(agent: Prompty): Record<string, unknown> {\r\n const opts = agent.model?.options;\r\n if (!opts) return {};\r\n\r\n const result: Record<string, unknown> = {};\r\n\r\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\r\n if (opts.maxOutputTokens !== undefined) result.max_completion_tokens = opts.maxOutputTokens;\r\n if (opts.topP !== undefined) result.top_p = opts.topP;\r\n if (opts.frequencyPenalty !== undefined) result.frequency_penalty = opts.frequencyPenalty;\r\n if (opts.presencePenalty !== undefined) result.presence_penalty = opts.presencePenalty;\r\n if (opts.stopSequences !== undefined) result.stop = opts.stopSequences;\r\n if (opts.seed !== undefined) result.seed = opts.seed;\r\n\r\n // Pass through additionalProperties — but don't overwrite mapped keys\r\n if (opts.additionalProperties) {\r\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\r\n if (!(k in result)) {\r\n result[k] = v;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** Convert a Property list to a JSON Schema `{type: \"object\", properties: ...}`. */\r\nfunction schemaToWire(properties: unknown[]): Record<string, unknown> {\r\n const props: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n\r\n for (const p of properties as Array<{ name?: string; kind?: string; description?: string; required?: boolean; enumValues?: unknown[] }>) {\r\n if (!p.name) continue;\r\n const schema: Record<string, unknown> = {\r\n type: KIND_TO_JSON_TYPE[p.kind ?? \"string\"] ?? \"string\",\r\n };\r\n if (p.description) schema.description = p.description;\r\n if (p.enumValues && p.enumValues.length > 0) schema.enum = p.enumValues;\r\n props[p.name] = schema;\r\n if (p.required) required.push(p.name);\r\n }\r\n\r\n const result: Record<string, unknown> = { type: \"object\", properties: props };\r\n if (required.length > 0) result.required = required;\r\n return result;\r\n}\r\n\r\n/** Convert a single Property to a JSON Schema definition (recursive for structured output). */\r\nfunction propertyToJsonSchema(prop: {\r\n kind?: string;\r\n description?: string;\r\n enumValues?: unknown[];\r\n items?: unknown;\r\n properties?: unknown[];\r\n}): Record<string, unknown> {\r\n const schema: Record<string, unknown> = {\r\n type: KIND_TO_JSON_TYPE[prop.kind ?? \"string\"] ?? \"string\",\r\n };\r\n\r\n if (prop.description) schema.description = prop.description;\r\n if (prop.enumValues && prop.enumValues.length > 0) schema.enum = prop.enumValues;\r\n\r\n // Array items\r\n if (prop.kind === \"array\") {\r\n schema.items = prop.items\r\n ? propertyToJsonSchema(prop.items as typeof prop)\r\n : { type: \"string\" };\r\n }\r\n\r\n // Nested object\r\n if (prop.kind === \"object\") {\r\n if (prop.properties) {\r\n const nested: Record<string, unknown> = {};\r\n const req: string[] = [];\r\n for (const p of prop.properties as Array<{ name?: string } & typeof prop>) {\r\n if (!p.name) continue;\r\n nested[p.name] = propertyToJsonSchema(p);\r\n req.push(p.name);\r\n }\r\n schema.properties = nested;\r\n schema.required = req;\r\n } else {\r\n schema.properties = {};\r\n schema.required = [];\r\n }\r\n schema.additionalProperties = false;\r\n }\r\n\r\n return schema;\r\n}\r\n\r\nfunction toolsToWire(agent: Prompty): Record<string, unknown>[] {\r\n const tools = agent.tools;\r\n if (!tools || tools.length === 0) return [];\r\n\r\n const result: Record<string, unknown>[] = [];\r\n\r\n for (const t of tools) {\r\n if (t.kind !== \"function\") continue;\r\n\r\n const funcDef: Record<string, unknown> = { name: t.name };\r\n if (t.description) funcDef.description = t.description;\r\n\r\n // Serialize parameters via schemaToWire\r\n const params = (t as { parameters?: unknown[] }).parameters;\r\n if (params && Array.isArray(params)) {\r\n funcDef.parameters = schemaToWire(params);\r\n }\r\n\r\n // Strict mode\r\n const strict = (t as { strict?: boolean }).strict;\r\n if (strict) {\r\n funcDef.strict = true;\r\n if (funcDef.parameters) {\r\n (funcDef.parameters as Record<string, unknown>).additionalProperties = false;\r\n }\r\n }\r\n\r\n result.push({ type: \"function\", function: funcDef });\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction outputSchemaToWire(agent: Prompty): Record<string, unknown> | null {\r\n const outputs = agent.outputs;\r\n if (!outputs || outputs.length === 0) return null;\r\n\r\n const properties: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n\r\n for (const prop of outputs) {\r\n if (!prop.name) continue;\r\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\r\n required.push(prop.name);\r\n }\r\n\r\n const name = (agent.name || \"response\").toLowerCase().replace(/[\\s-]/g, \"_\");\r\n\r\n return {\r\n type: \"json_schema\",\r\n json_schema: {\r\n name,\r\n strict: true,\r\n schema: {\r\n type: \"object\",\r\n properties,\r\n required,\r\n additionalProperties: false,\r\n },\r\n },\r\n };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Responses API wire format\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Build Responses API arguments from agent config and messages.\r\n *\r\n * Key differences from Chat Completions:\r\n * - System messages → `instructions` parameter\r\n * - Other messages → `input` as EasyInputMessage[]\r\n * - `maxOutputTokens` → `max_output_tokens`\r\n * - Structured output → `text.format` (not `response_format`)\r\n * - Tools use flat `{ type: \"function\", name, parameters }` (not nested `function:`)\r\n */\r\nexport function buildResponsesArgs(\r\n agent: Prompty,\r\n messages: Message[],\r\n): Record<string, unknown> {\r\n const model = agent.model?.id || \"gpt-4o\";\r\n\r\n // Separate system messages as instructions, rest as input\r\n const systemParts: string[] = [];\r\n const inputMessages: Record<string, unknown>[] = [];\r\n\r\n for (const msg of messages) {\r\n if (msg.role === \"system\" || msg.role === \"developer\") {\r\n systemParts.push(msg.text);\r\n } else {\r\n inputMessages.push(messageToResponsesInput(msg));\r\n }\r\n }\r\n\r\n const args: Record<string, unknown> = {\r\n model,\r\n input: inputMessages,\r\n };\r\n\r\n // Set instructions from system messages\r\n if (systemParts.length > 0) {\r\n args.instructions = systemParts.join(\"\\n\\n\");\r\n }\r\n\r\n // Map model options\r\n const responseOpts = buildResponsesOptions(agent);\r\n Object.assign(args, responseOpts);\r\n\r\n // Tools\r\n const tools = responsesToolsToWire(agent);\r\n if (tools.length > 0) {\r\n args.tools = tools;\r\n }\r\n\r\n // Structured output via text.format\r\n const textConfig = outputSchemaToResponsesWire(agent);\r\n if (textConfig) {\r\n args.text = textConfig;\r\n }\r\n\r\n return args;\r\n}\r\n\r\n/** Convert a Message to Responses API EasyInputMessage format. */\r\nfunction messageToResponsesInput(msg: Message): Record<string, unknown> {\r\n const content = msg.toTextContent();\r\n\r\n // Tool result messages → function_call_output\r\n if (msg.metadata.tool_call_id) {\r\n return {\r\n type: \"function_call_output\",\r\n call_id: msg.metadata.tool_call_id,\r\n output: typeof content === \"string\" ? content : JSON.stringify(content),\r\n };\r\n }\r\n\r\n const role = msg.role === \"tool\" ? \"user\" : msg.role;\r\n return { role, content };\r\n}\r\n\r\n/** Build Responses-specific model options. */\r\nfunction buildResponsesOptions(agent: Prompty): Record<string, unknown> {\r\n const opts = agent.model?.options;\r\n if (!opts) return {};\r\n\r\n const result: Record<string, unknown> = {};\r\n\r\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\r\n if (opts.maxOutputTokens !== undefined) result.max_output_tokens = opts.maxOutputTokens;\r\n if (opts.topP !== undefined) result.top_p = opts.topP;\r\n\r\n // Pass through additionalProperties — but don't overwrite mapped keys\r\n if (opts.additionalProperties) {\r\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\r\n if (!(k in result)) {\r\n result[k] = v;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** Convert agent tools to Responses API tool format. */\r\nfunction responsesToolsToWire(agent: Prompty): Record<string, unknown>[] {\r\n const tools = agent.tools;\r\n if (!tools || tools.length === 0) return [];\r\n\r\n const result: Record<string, unknown>[] = [];\r\n\r\n for (const t of tools) {\r\n if (t.kind !== \"function\") continue;\r\n\r\n // Responses API uses flat tool format (not nested under \"function:\")\r\n const tool: Record<string, unknown> = {\r\n type: \"function\",\r\n name: t.name,\r\n };\r\n if (t.description) tool.description = t.description;\r\n\r\n const params = (t as { parameters?: unknown[] }).parameters;\r\n if (params && Array.isArray(params)) {\r\n tool.parameters = schemaToWire(params);\r\n }\r\n\r\n const strict = (t as { strict?: boolean }).strict;\r\n if (strict) {\r\n tool.strict = true;\r\n if (tool.parameters) {\r\n (tool.parameters as Record<string, unknown>).additionalProperties = false;\r\n }\r\n }\r\n\r\n result.push(tool);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** Convert outputSchema to Responses API text.format config. */\r\nfunction outputSchemaToResponsesWire(agent: Prompty): Record<string, unknown> | null {\r\n const outputs = agent.outputs;\r\n if (!outputs || outputs.length === 0) return null;\r\n\r\n const properties: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n\r\n for (const prop of outputs) {\r\n if (!prop.name) continue;\r\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\r\n required.push(prop.name);\r\n }\r\n\r\n const name = (agent.name || \"response\").toLowerCase().replace(/[\\s-]/g, \"_\");\r\n\r\n return {\r\n format: {\r\n type: \"json_schema\",\r\n name,\r\n strict: true,\r\n schema: {\r\n type: \"object\",\r\n properties,\r\n required,\r\n additionalProperties: false,\r\n },\r\n },\r\n };\r\n}\r\n","/**\r\n * OpenAI processor — extracts clean results from raw OpenAI responses.\r\n *\r\n * Handles ChatCompletion, Embedding, Image, and streaming responses.\r\n *\r\n * @module\r\n */\r\n\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport type { Processor } from \"@prompty/core\";\r\nimport type { ToolCall } from \"@prompty/core\";\r\nimport { traceSpan } from \"@prompty/core\";\r\n\r\nexport class OpenAIProcessor implements Processor {\r\n async process(agent: Prompty, response: unknown): Promise<unknown> {\r\n return traceSpan(\"OpenAIProcessor\", async (emit) => {\r\n emit(\"signature\", \"prompty.openai.processor.OpenAIProcessor.invoke\");\r\n emit(\"inputs\", { data: response });\r\n const result = processResponse(agent, response);\r\n // Don't emit result for streaming — it's a generator, not a value\r\n if (!isAsyncIterable(response)) {\r\n emit(\"result\", result);\r\n }\r\n return result;\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Extract clean content from an OpenAI response.\r\n */\r\nexport function processResponse(agent: Prompty, response: unknown): unknown {\r\n if (typeof response !== \"object\" || response === null) return response;\r\n\r\n // Streaming response — return content-extracting async generator\r\n if (isAsyncIterable(response)) {\r\n return streamGenerator(response);\r\n }\r\n\r\n const r = response as Record<string, unknown>;\r\n\r\n // Responses API — has output[] and object === \"response\"\r\n if (r.object === \"response\" && Array.isArray(r.output)) {\r\n return processResponsesApi(agent, r);\r\n }\r\n\r\n // ChatCompletion\r\n if (r.choices) {\r\n return processChatCompletion(agent, r);\r\n }\r\n\r\n // Embedding response\r\n if (r.data && r.object === \"list\") {\r\n return processEmbedding(r);\r\n }\r\n\r\n // Image response\r\n if (r.data && Array.isArray(r.data)) {\r\n const data = r.data as Record<string, unknown>[];\r\n if (data.length > 0 && (\"url\" in data[0] || \"b64_json\" in data[0])) {\r\n return processImage(r);\r\n }\r\n }\r\n\r\n return response;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Streaming\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Type guard for async iterables (PromptyStream or raw SDK stream). */\r\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n Symbol.asyncIterator in value\r\n );\r\n}\r\n\r\n/**\r\n * Yield content chunks, tool calls, or refusals from a streaming response.\r\n *\r\n * Handles three types of streaming deltas:\r\n * - `delta.content` — yields content strings\r\n * - `delta.tool_calls` — accumulates partial tool call chunks,\r\n * yields ToolCall objects when the stream ends\r\n * - `delta.refusal` — throws Error with the refusal message\r\n *\r\n * Matches the Python `_stream_generator` / `_async_stream_generator`.\r\n */\r\nasync function* streamGenerator(\r\n response: AsyncIterable<unknown>,\r\n): AsyncGenerator<string | ToolCall> {\r\n const toolCallAcc: Map<number, { id: string; name: string; arguments: string }> = new Map();\r\n\r\n for await (const chunk of response) {\r\n const c = chunk as Record<string, unknown>;\r\n const choices = c.choices as Record<string, unknown>[] | undefined;\r\n if (!choices || choices.length === 0) continue;\r\n\r\n const delta = (choices[0] as Record<string, unknown>).delta as Record<string, unknown> | undefined;\r\n if (!delta) continue;\r\n\r\n // Content\r\n if (delta.content != null) {\r\n yield delta.content as string;\r\n }\r\n\r\n // Tool call deltas — accumulate index-keyed partial chunks\r\n const tcDeltas = delta.tool_calls as Record<string, unknown>[] | undefined;\r\n if (tcDeltas) {\r\n for (const tcDelta of tcDeltas) {\r\n const idx = tcDelta.index as number;\r\n if (!toolCallAcc.has(idx)) {\r\n toolCallAcc.set(idx, { id: \"\", name: \"\", arguments: \"\" });\r\n }\r\n const acc = toolCallAcc.get(idx)!;\r\n if (tcDelta.id) acc.id = tcDelta.id as string;\r\n const fn = tcDelta.function as Record<string, unknown> | undefined;\r\n if (fn) {\r\n if (fn.name) acc.name = fn.name as string;\r\n if (fn.arguments) acc.arguments += fn.arguments as string;\r\n }\r\n }\r\n }\r\n\r\n // Refusal\r\n if (delta.refusal != null) {\r\n throw new Error(`Model refused: ${delta.refusal}`);\r\n }\r\n }\r\n\r\n // Yield accumulated tool calls at the end of the stream\r\n const sortedIndices = [...toolCallAcc.keys()].sort((a, b) => a - b);\r\n for (const idx of sortedIndices) {\r\n const tc = toolCallAcc.get(idx)!;\r\n yield { id: tc.id, name: tc.name, arguments: tc.arguments } as ToolCall;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Responses API processing\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Process a Responses API response.\r\n *\r\n * Extracts:\r\n * - Text content from `output_text` or output message items\r\n * - Function tool calls from `function_call` output items\r\n * - JSON-parsed content when outputSchema is present\r\n */\r\nfunction processResponsesApi(\r\n agent: Prompty,\r\n response: Record<string, unknown>,\r\n): unknown {\r\n const output = response.output as Record<string, unknown>[];\r\n\r\n // Collect function calls\r\n const funcCalls: ToolCall[] = [];\r\n for (const item of output) {\r\n if (item.type === \"function_call\") {\r\n funcCalls.push({\r\n id: (item.call_id ?? item.id ?? \"\") as string,\r\n name: item.name as string,\r\n arguments: item.arguments as string,\r\n });\r\n }\r\n }\r\n\r\n if (funcCalls.length > 0) {\r\n return funcCalls;\r\n }\r\n\r\n // Text content — use output_text convenience field\r\n const outputText = response.output_text as string | undefined;\r\n if (outputText !== undefined) {\r\n // Structured output — JSON parse when outputs schema exists\r\n if (agent.outputs && agent.outputs.length > 0) {\r\n try {\r\n return JSON.parse(outputText);\r\n } catch {\r\n return outputText;\r\n }\r\n }\r\n return outputText;\r\n }\r\n\r\n // Fallback: extract from output message items\r\n const texts: string[] = [];\r\n for (const item of output) {\r\n if (item.type === \"message\") {\r\n const content = item.content as Record<string, unknown>[] | undefined;\r\n if (content) {\r\n for (const part of content) {\r\n if (part.type === \"output_text\" || part.type === \"text\") {\r\n texts.push(part.text as string);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (texts.length > 0) {\r\n const text = texts.join(\"\");\r\n if (agent.outputs && agent.outputs.length > 0) {\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n }\r\n return text;\r\n }\r\n\r\n return response;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Non-streaming response processing\r\n// ---------------------------------------------------------------------------\r\n\r\nfunction processChatCompletion(\r\n agent: Prompty,\r\n response: Record<string, unknown>,\r\n): unknown {\r\n const choices = response.choices as Record<string, unknown>[];\r\n if (!choices || choices.length === 0) return null;\r\n\r\n const choice = choices[0];\r\n const message = choice.message as Record<string, unknown>;\r\n if (!message) return null;\r\n\r\n // Tool calls\r\n const toolCalls = message.tool_calls as Record<string, unknown>[] | undefined;\r\n if (toolCalls && toolCalls.length > 0) {\r\n return toolCalls.map((tc): ToolCall => {\r\n const fn = tc.function as Record<string, unknown>;\r\n return {\r\n id: tc.id as string,\r\n name: fn.name as string,\r\n arguments: fn.arguments as string,\r\n };\r\n });\r\n }\r\n\r\n // Content\r\n const content = message.content as string | null;\r\n if (content === null) return null;\r\n\r\n // Structured output — JSON parse when outputs schema exists\r\n if (agent.outputs && agent.outputs.length > 0) {\r\n try {\r\n return JSON.parse(content);\r\n } catch {\r\n return content;\r\n }\r\n }\r\n\r\n return content;\r\n}\r\n\r\nfunction processEmbedding(response: Record<string, unknown>): unknown {\r\n const data = response.data as Record<string, unknown>[];\r\n if (data.length === 1) {\r\n return (data[0] as Record<string, unknown>).embedding;\r\n }\r\n return data.map((d) => (d as Record<string, unknown>).embedding);\r\n}\r\n\r\nfunction processImage(response: Record<string, unknown>): unknown {\r\n const data = response.data as Record<string, unknown>[];\r\n if (data.length === 1) {\r\n return data[0].url ?? data[0].b64_json;\r\n }\r\n return data.map((d) => d.url ?? d.b64_json);\r\n}\r\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 }\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"]}
package/dist/index.js CHANGED
@@ -61,10 +61,24 @@ function buildChatArgs(agent, messages) {
61
61
  }
62
62
  function buildEmbeddingArgs(agent, data) {
63
63
  const model = agent.model?.id || "text-embedding-ada-002";
64
- const args = {
65
- input: Array.isArray(data) ? data : [data],
66
- model
67
- };
64
+ let input;
65
+ if (Array.isArray(data)) {
66
+ const texts = data.map((item) => {
67
+ if (typeof item === "string") return item;
68
+ if (item && typeof item === "object" && "text" in item) return item.text;
69
+ if (item && typeof item === "object" && "toTextContent" in item) {
70
+ const content = item.toTextContent();
71
+ return typeof content === "string" ? content : String(content);
72
+ }
73
+ return String(item);
74
+ });
75
+ input = texts;
76
+ } else if (typeof data === "string") {
77
+ input = [data];
78
+ } else {
79
+ input = [String(data)];
80
+ }
81
+ const args = { input, model };
68
82
  const extra = agent.model?.options?.additionalProperties;
69
83
  if (extra) {
70
84
  for (const [k, v] of Object.entries(extra)) {
@@ -116,7 +130,7 @@ function buildOptions(agent) {
116
130
  if (opts.topP !== void 0) result.top_p = opts.topP;
117
131
  if (opts.frequencyPenalty !== void 0) result.frequency_penalty = opts.frequencyPenalty;
118
132
  if (opts.presencePenalty !== void 0) result.presence_penalty = opts.presencePenalty;
119
- if (opts.stopSequences !== void 0) result.stop = opts.stopSequences;
133
+ if (opts.stopSequences !== void 0 && opts.stopSequences.length > 0) result.stop = opts.stopSequences;
120
134
  if (opts.seed !== void 0) result.seed = opts.seed;
121
135
  if (opts.additionalProperties) {
122
136
  for (const [k, v] of Object.entries(opts.additionalProperties)) {
@@ -252,6 +266,9 @@ function buildResponsesArgs(agent, messages) {
252
266
  }
253
267
  function messageToResponsesInput(msg) {
254
268
  const content = msg.toTextContent();
269
+ if (msg.metadata.responses_function_call) {
270
+ return msg.metadata.responses_function_call;
271
+ }
255
272
  if (msg.metadata.tool_call_id) {
256
273
  return {
257
274
  type: "function_call_output",
@@ -357,8 +374,7 @@ var OpenAIExecutor = class {
357
374
  /** Dispatch to the appropriate API and trace the call. */
358
375
  async executeApiCall(client, clientName, agent, messages, apiType) {
359
376
  switch (apiType) {
360
- case "chat":
361
- case "agent": {
377
+ case "chat": {
362
378
  const args = buildChatArgs(agent, messages);
363
379
  const isStreaming = !!args.stream;
364
380
  return traceSpan("create", async (callEmit) => {
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":["/**\r\n * OpenAI executor — sends messages to OpenAI APIs.\r\n *\r\n * Dispatches on `agent.model.apiType`: chat, embedding, image.\r\n *\r\n * @module\r\n */\r\n\r\nimport OpenAI from \"openai\";\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\r\nimport type { Executor } from \"@prompty/core\";\r\nimport type { Message } from \"@prompty/core\";\r\nimport { getConnection } from \"@prompty/core\";\r\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\r\nimport { buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\r\n\r\nexport class OpenAIExecutor implements Executor {\r\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\r\n return traceSpan(\"OpenAIExecutor\", async (emit) => {\r\n emit(\"signature\", \"prompty.openai.executor.OpenAIExecutor.invoke\");\r\n emit(\"inputs\", { data: messages });\r\n\r\n const client = this.resolveClient(agent);\r\n const clientName = client.constructor?.name ?? \"OpenAI\";\r\n\r\n // Trace what client we resolved and how\r\n await traceSpan(clientName, async (ctorEmit) => {\r\n ctorEmit(\"signature\", `${clientName}.ctor`);\r\n const conn = agent.model?.connection;\r\n if (conn instanceof ReferenceConnection) {\r\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\r\n } else {\r\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\r\n }\r\n ctorEmit(\"result\", clientName);\r\n });\r\n\r\n const apiType = agent.model?.apiType ?? \"chat\";\r\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\r\n emit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n\r\n /** Dispatch to the appropriate API and trace the call. */\r\n private async executeApiCall(\r\n client: OpenAI,\r\n clientName: string,\r\n agent: Prompty,\r\n messages: Message[],\r\n apiType: string,\r\n ): Promise<unknown> {\r\n switch (apiType) {\r\n case \"chat\":\r\n case \"agent\": {\r\n const args = buildChatArgs(agent, messages);\r\n const isStreaming = !!args.stream;\r\n return traceSpan(\"create\", async (callEmit) => {\r\n callEmit(\"signature\", `${clientName}.chat.completions.create`);\r\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\r\n const result = await client.chat.completions.create(\r\n args as unknown as Parameters<typeof client.chat.completions.create>[0],\r\n );\r\n if (isStreaming) {\r\n // Wrap streaming response for tracing — don't emit result yet,\r\n // PromptyStream will trace on exhaustion\r\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\r\n }\r\n callEmit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n case \"embedding\": {\r\n const args = buildEmbeddingArgs(agent, messages);\r\n return traceSpan(\"create\", async (callEmit) => {\r\n callEmit(\"signature\", `${clientName}.embeddings.create`);\r\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\r\n const result = await client.embeddings.create(\r\n args as unknown as Parameters<typeof client.embeddings.create>[0],\r\n );\r\n callEmit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n case \"image\": {\r\n const args = buildImageArgs(agent, messages);\r\n return traceSpan(\"generate\", async (callEmit) => {\r\n callEmit(\"signature\", `${clientName}.images.generate`);\r\n callEmit(\"inputs\", sanitizeValue(\"generate\", args));\r\n const result = await client.images.generate(\r\n args as unknown as Parameters<typeof client.images.generate>[0],\r\n );\r\n callEmit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n case \"responses\": {\r\n const args = buildResponsesArgs(agent, messages);\r\n const isStreaming = !!args.stream;\r\n return traceSpan(\"create\", async (callEmit) => {\r\n callEmit(\"signature\", `${clientName}.responses.create`);\r\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\r\n const result = await client.responses.create(\r\n args as unknown as Parameters<typeof client.responses.create>[0],\r\n );\r\n if (isStreaming) {\r\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\r\n }\r\n callEmit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n default:\r\n throw new Error(`Unsupported apiType: ${apiType}`);\r\n }\r\n }\r\n\r\n protected resolveClient(agent: Prompty): OpenAI {\r\n const conn = agent.model?.connection;\r\n\r\n if (conn instanceof ReferenceConnection) {\r\n return getConnection(conn.name) as OpenAI;\r\n }\r\n\r\n const kwargs = this.clientKwargs(agent);\r\n return new OpenAI(kwargs);\r\n }\r\n\r\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\r\n const kwargs: Record<string, unknown> = {};\r\n const conn = agent.model?.connection;\r\n\r\n if (conn instanceof ApiKeyConnection) {\r\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\r\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\r\n }\r\n\r\n return kwargs;\r\n }\r\n}\r\n","/**\r\n * Wire format conversion: Message → OpenAI API JSON.\r\n *\r\n * @module\r\n */\r\n\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport type { ContentPart, Message } from \"@prompty/core\";\r\n\r\n/**\r\n * Convert an abstract Message to OpenAI wire format.\r\n */\r\nexport function messageToWire(msg: Message): Record<string, unknown> {\r\n const wire: Record<string, unknown> = { role: msg.role };\r\n\r\n // Include metadata fields (e.g., name, tool_call_id, tool_calls)\r\n for (const [k, v] of Object.entries(msg.metadata)) {\r\n if (k !== \"role\" && k !== \"content\") {\r\n wire[k] = v;\r\n }\r\n }\r\n\r\n const content = msg.toTextContent();\r\n if (typeof content === \"string\") {\r\n wire.content = content;\r\n } else {\r\n // Multimodal — convert parts to OpenAI format\r\n wire.content = msg.parts.map(partToWire);\r\n }\r\n\r\n return wire;\r\n}\r\n\r\n/**\r\n * Convert a ContentPart to OpenAI wire format.\r\n */\r\nfunction partToWire(part: ContentPart): Record<string, unknown> {\r\n switch (part.kind) {\r\n case \"text\":\r\n return { type: \"text\", text: part.value };\r\n case \"image\": {\r\n const imageUrl: Record<string, unknown> = { url: part.source };\r\n if (part.detail) imageUrl.detail = part.detail;\r\n return { type: \"image_url\", image_url: imageUrl };\r\n }\r\n case \"audio\":\r\n return {\r\n type: \"input_audio\",\r\n input_audio: {\r\n data: part.source,\r\n ...(part.mediaType && { format: part.mediaType }),\r\n },\r\n };\r\n case \"file\":\r\n return { type: \"file\", file: { url: part.source } };\r\n }\r\n}\r\n\r\n/**\r\n * Build chat completion arguments from agent config and messages.\r\n */\r\nexport function buildChatArgs(\r\n agent: Prompty,\r\n messages: Message[],\r\n): Record<string, unknown> {\r\n const model = agent.model?.id || \"gpt-4\";\r\n const wireMessages = messages.map(messageToWire);\r\n\r\n const args: Record<string, unknown> = {\r\n model,\r\n messages: wireMessages,\r\n ...buildOptions(agent),\r\n };\r\n\r\n // Tools\r\n const tools = toolsToWire(agent);\r\n if (tools.length > 0) {\r\n args.tools = tools;\r\n }\r\n\r\n // Structured output\r\n const responseFormat = outputSchemaToWire(agent);\r\n if (responseFormat) {\r\n args.response_format = responseFormat;\r\n }\r\n\r\n return args;\r\n}\r\n\r\n/**\r\n * Build embedding arguments.\r\n * Only additionalProperties are passed — chat options are not valid here.\r\n */\r\nexport function buildEmbeddingArgs(\r\n agent: Prompty,\r\n data: unknown,\r\n): Record<string, unknown> {\r\n const model = agent.model?.id || \"text-embedding-ada-002\";\r\n const args: Record<string, unknown> = {\r\n input: Array.isArray(data) ? data : [data],\r\n model,\r\n };\r\n const extra = agent.model?.options?.additionalProperties;\r\n if (extra) {\r\n for (const [k, v] of Object.entries(extra)) {\r\n args[k] = v;\r\n }\r\n }\r\n return args;\r\n}\r\n\r\n/**\r\n * Build image generation arguments.\r\n * Only additionalProperties are passed — chat options are not valid here.\r\n */\r\nexport function buildImageArgs(\r\n agent: Prompty,\r\n data: unknown,\r\n): Record<string, unknown> {\r\n const model = agent.model?.id || \"dall-e-3\";\r\n\r\n // Extract prompt text: data may be a string, or a Message[] from the parser\r\n let prompt: string;\r\n if (typeof data === \"string\") {\r\n prompt = data;\r\n } else if (Array.isArray(data)) {\r\n // Messages have .parts[].value for text content, or a .text getter\r\n prompt = data\r\n .map((m: { text?: string; parts?: { kind: string; value: string }[] }) => {\r\n if (typeof m.text === \"string\") return m.text;\r\n if (Array.isArray(m.parts)) {\r\n return m.parts\r\n .filter((p) => p.kind === \"text\")\r\n .map((p) => p.value)\r\n .join(\"\");\r\n }\r\n return String(m);\r\n })\r\n .join(\"\\n\")\r\n .trim();\r\n } else {\r\n prompt = String(data);\r\n }\r\n\r\n const args: Record<string, unknown> = { prompt, model };\r\n const extra = agent.model?.options?.additionalProperties;\r\n if (extra) {\r\n for (const [k, v] of Object.entries(extra)) {\r\n args[k] = v;\r\n }\r\n }\r\n return args;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Map AgentSchema kind strings to JSON Schema type strings. */\r\nconst KIND_TO_JSON_TYPE: Record<string, string> = {\r\n string: \"string\",\r\n integer: \"integer\",\r\n float: \"number\",\r\n number: \"number\",\r\n boolean: \"boolean\",\r\n array: \"array\",\r\n object: \"object\",\r\n};\r\n\r\nfunction buildOptions(agent: Prompty): Record<string, unknown> {\r\n const opts = agent.model?.options;\r\n if (!opts) return {};\r\n\r\n const result: Record<string, unknown> = {};\r\n\r\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\r\n if (opts.maxOutputTokens !== undefined) result.max_completion_tokens = opts.maxOutputTokens;\r\n if (opts.topP !== undefined) result.top_p = opts.topP;\r\n if (opts.frequencyPenalty !== undefined) result.frequency_penalty = opts.frequencyPenalty;\r\n if (opts.presencePenalty !== undefined) result.presence_penalty = opts.presencePenalty;\r\n if (opts.stopSequences !== undefined) result.stop = opts.stopSequences;\r\n if (opts.seed !== undefined) result.seed = opts.seed;\r\n\r\n // Pass through additionalProperties — but don't overwrite mapped keys\r\n if (opts.additionalProperties) {\r\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\r\n if (!(k in result)) {\r\n result[k] = v;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** Convert a Property list to a JSON Schema `{type: \"object\", properties: ...}`. */\r\nfunction schemaToWire(properties: unknown[]): Record<string, unknown> {\r\n const props: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n\r\n for (const p of properties as Array<{ name?: string; kind?: string; description?: string; required?: boolean; enumValues?: unknown[] }>) {\r\n if (!p.name) continue;\r\n const schema: Record<string, unknown> = {\r\n type: KIND_TO_JSON_TYPE[p.kind ?? \"string\"] ?? \"string\",\r\n };\r\n if (p.description) schema.description = p.description;\r\n if (p.enumValues && p.enumValues.length > 0) schema.enum = p.enumValues;\r\n props[p.name] = schema;\r\n if (p.required) required.push(p.name);\r\n }\r\n\r\n const result: Record<string, unknown> = { type: \"object\", properties: props };\r\n if (required.length > 0) result.required = required;\r\n return result;\r\n}\r\n\r\n/** Convert a single Property to a JSON Schema definition (recursive for structured output). */\r\nfunction propertyToJsonSchema(prop: {\r\n kind?: string;\r\n description?: string;\r\n enumValues?: unknown[];\r\n items?: unknown;\r\n properties?: unknown[];\r\n}): Record<string, unknown> {\r\n const schema: Record<string, unknown> = {\r\n type: KIND_TO_JSON_TYPE[prop.kind ?? \"string\"] ?? \"string\",\r\n };\r\n\r\n if (prop.description) schema.description = prop.description;\r\n if (prop.enumValues && prop.enumValues.length > 0) schema.enum = prop.enumValues;\r\n\r\n // Array items\r\n if (prop.kind === \"array\") {\r\n schema.items = prop.items\r\n ? propertyToJsonSchema(prop.items as typeof prop)\r\n : { type: \"string\" };\r\n }\r\n\r\n // Nested object\r\n if (prop.kind === \"object\") {\r\n if (prop.properties) {\r\n const nested: Record<string, unknown> = {};\r\n const req: string[] = [];\r\n for (const p of prop.properties as Array<{ name?: string } & typeof prop>) {\r\n if (!p.name) continue;\r\n nested[p.name] = propertyToJsonSchema(p);\r\n req.push(p.name);\r\n }\r\n schema.properties = nested;\r\n schema.required = req;\r\n } else {\r\n schema.properties = {};\r\n schema.required = [];\r\n }\r\n schema.additionalProperties = false;\r\n }\r\n\r\n return schema;\r\n}\r\n\r\nfunction toolsToWire(agent: Prompty): Record<string, unknown>[] {\r\n const tools = agent.tools;\r\n if (!tools || tools.length === 0) return [];\r\n\r\n const result: Record<string, unknown>[] = [];\r\n\r\n for (const t of tools) {\r\n if (t.kind !== \"function\") continue;\r\n\r\n const funcDef: Record<string, unknown> = { name: t.name };\r\n if (t.description) funcDef.description = t.description;\r\n\r\n // Serialize parameters via schemaToWire\r\n const params = (t as { parameters?: unknown[] }).parameters;\r\n if (params && Array.isArray(params)) {\r\n funcDef.parameters = schemaToWire(params);\r\n }\r\n\r\n // Strict mode\r\n const strict = (t as { strict?: boolean }).strict;\r\n if (strict) {\r\n funcDef.strict = true;\r\n if (funcDef.parameters) {\r\n (funcDef.parameters as Record<string, unknown>).additionalProperties = false;\r\n }\r\n }\r\n\r\n result.push({ type: \"function\", function: funcDef });\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction outputSchemaToWire(agent: Prompty): Record<string, unknown> | null {\r\n const outputs = agent.outputs;\r\n if (!outputs || outputs.length === 0) return null;\r\n\r\n const properties: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n\r\n for (const prop of outputs) {\r\n if (!prop.name) continue;\r\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\r\n required.push(prop.name);\r\n }\r\n\r\n const name = (agent.name || \"response\").toLowerCase().replace(/[\\s-]/g, \"_\");\r\n\r\n return {\r\n type: \"json_schema\",\r\n json_schema: {\r\n name,\r\n strict: true,\r\n schema: {\r\n type: \"object\",\r\n properties,\r\n required,\r\n additionalProperties: false,\r\n },\r\n },\r\n };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Responses API wire format\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Build Responses API arguments from agent config and messages.\r\n *\r\n * Key differences from Chat Completions:\r\n * - System messages → `instructions` parameter\r\n * - Other messages → `input` as EasyInputMessage[]\r\n * - `maxOutputTokens` → `max_output_tokens`\r\n * - Structured output → `text.format` (not `response_format`)\r\n * - Tools use flat `{ type: \"function\", name, parameters }` (not nested `function:`)\r\n */\r\nexport function buildResponsesArgs(\r\n agent: Prompty,\r\n messages: Message[],\r\n): Record<string, unknown> {\r\n const model = agent.model?.id || \"gpt-4o\";\r\n\r\n // Separate system messages as instructions, rest as input\r\n const systemParts: string[] = [];\r\n const inputMessages: Record<string, unknown>[] = [];\r\n\r\n for (const msg of messages) {\r\n if (msg.role === \"system\" || msg.role === \"developer\") {\r\n systemParts.push(msg.text);\r\n } else {\r\n inputMessages.push(messageToResponsesInput(msg));\r\n }\r\n }\r\n\r\n const args: Record<string, unknown> = {\r\n model,\r\n input: inputMessages,\r\n };\r\n\r\n // Set instructions from system messages\r\n if (systemParts.length > 0) {\r\n args.instructions = systemParts.join(\"\\n\\n\");\r\n }\r\n\r\n // Map model options\r\n const responseOpts = buildResponsesOptions(agent);\r\n Object.assign(args, responseOpts);\r\n\r\n // Tools\r\n const tools = responsesToolsToWire(agent);\r\n if (tools.length > 0) {\r\n args.tools = tools;\r\n }\r\n\r\n // Structured output via text.format\r\n const textConfig = outputSchemaToResponsesWire(agent);\r\n if (textConfig) {\r\n args.text = textConfig;\r\n }\r\n\r\n return args;\r\n}\r\n\r\n/** Convert a Message to Responses API EasyInputMessage format. */\r\nfunction messageToResponsesInput(msg: Message): Record<string, unknown> {\r\n const content = msg.toTextContent();\r\n\r\n // Tool result messages → function_call_output\r\n if (msg.metadata.tool_call_id) {\r\n return {\r\n type: \"function_call_output\",\r\n call_id: msg.metadata.tool_call_id,\r\n output: typeof content === \"string\" ? content : JSON.stringify(content),\r\n };\r\n }\r\n\r\n const role = msg.role === \"tool\" ? \"user\" : msg.role;\r\n return { role, content };\r\n}\r\n\r\n/** Build Responses-specific model options. */\r\nfunction buildResponsesOptions(agent: Prompty): Record<string, unknown> {\r\n const opts = agent.model?.options;\r\n if (!opts) return {};\r\n\r\n const result: Record<string, unknown> = {};\r\n\r\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\r\n if (opts.maxOutputTokens !== undefined) result.max_output_tokens = opts.maxOutputTokens;\r\n if (opts.topP !== undefined) result.top_p = opts.topP;\r\n\r\n // Pass through additionalProperties — but don't overwrite mapped keys\r\n if (opts.additionalProperties) {\r\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\r\n if (!(k in result)) {\r\n result[k] = v;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** Convert agent tools to Responses API tool format. */\r\nfunction responsesToolsToWire(agent: Prompty): Record<string, unknown>[] {\r\n const tools = agent.tools;\r\n if (!tools || tools.length === 0) return [];\r\n\r\n const result: Record<string, unknown>[] = [];\r\n\r\n for (const t of tools) {\r\n if (t.kind !== \"function\") continue;\r\n\r\n // Responses API uses flat tool format (not nested under \"function:\")\r\n const tool: Record<string, unknown> = {\r\n type: \"function\",\r\n name: t.name,\r\n };\r\n if (t.description) tool.description = t.description;\r\n\r\n const params = (t as { parameters?: unknown[] }).parameters;\r\n if (params && Array.isArray(params)) {\r\n tool.parameters = schemaToWire(params);\r\n }\r\n\r\n const strict = (t as { strict?: boolean }).strict;\r\n if (strict) {\r\n tool.strict = true;\r\n if (tool.parameters) {\r\n (tool.parameters as Record<string, unknown>).additionalProperties = false;\r\n }\r\n }\r\n\r\n result.push(tool);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** Convert outputSchema to Responses API text.format config. */\r\nfunction outputSchemaToResponsesWire(agent: Prompty): Record<string, unknown> | null {\r\n const outputs = agent.outputs;\r\n if (!outputs || outputs.length === 0) return null;\r\n\r\n const properties: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n\r\n for (const prop of outputs) {\r\n if (!prop.name) continue;\r\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\r\n required.push(prop.name);\r\n }\r\n\r\n const name = (agent.name || \"response\").toLowerCase().replace(/[\\s-]/g, \"_\");\r\n\r\n return {\r\n format: {\r\n type: \"json_schema\",\r\n name,\r\n strict: true,\r\n schema: {\r\n type: \"object\",\r\n properties,\r\n required,\r\n additionalProperties: false,\r\n },\r\n },\r\n };\r\n}\r\n","/**\r\n * OpenAI processor — extracts clean results from raw OpenAI responses.\r\n *\r\n * Handles ChatCompletion, Embedding, Image, and streaming responses.\r\n *\r\n * @module\r\n */\r\n\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport type { Processor } from \"@prompty/core\";\r\nimport type { ToolCall } from \"@prompty/core\";\r\nimport { traceSpan } from \"@prompty/core\";\r\n\r\nexport class OpenAIProcessor implements Processor {\r\n async process(agent: Prompty, response: unknown): Promise<unknown> {\r\n return traceSpan(\"OpenAIProcessor\", async (emit) => {\r\n emit(\"signature\", \"prompty.openai.processor.OpenAIProcessor.invoke\");\r\n emit(\"inputs\", { data: response });\r\n const result = processResponse(agent, response);\r\n // Don't emit result for streaming — it's a generator, not a value\r\n if (!isAsyncIterable(response)) {\r\n emit(\"result\", result);\r\n }\r\n return result;\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Extract clean content from an OpenAI response.\r\n */\r\nexport function processResponse(agent: Prompty, response: unknown): unknown {\r\n if (typeof response !== \"object\" || response === null) return response;\r\n\r\n // Streaming response — return content-extracting async generator\r\n if (isAsyncIterable(response)) {\r\n return streamGenerator(response);\r\n }\r\n\r\n const r = response as Record<string, unknown>;\r\n\r\n // Responses API — has output[] and object === \"response\"\r\n if (r.object === \"response\" && Array.isArray(r.output)) {\r\n return processResponsesApi(agent, r);\r\n }\r\n\r\n // ChatCompletion\r\n if (r.choices) {\r\n return processChatCompletion(agent, r);\r\n }\r\n\r\n // Embedding response\r\n if (r.data && r.object === \"list\") {\r\n return processEmbedding(r);\r\n }\r\n\r\n // Image response\r\n if (r.data && Array.isArray(r.data)) {\r\n const data = r.data as Record<string, unknown>[];\r\n if (data.length > 0 && (\"url\" in data[0] || \"b64_json\" in data[0])) {\r\n return processImage(r);\r\n }\r\n }\r\n\r\n return response;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Streaming\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Type guard for async iterables (PromptyStream or raw SDK stream). */\r\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n Symbol.asyncIterator in value\r\n );\r\n}\r\n\r\n/**\r\n * Yield content chunks, tool calls, or refusals from a streaming response.\r\n *\r\n * Handles three types of streaming deltas:\r\n * - `delta.content` — yields content strings\r\n * - `delta.tool_calls` — accumulates partial tool call chunks,\r\n * yields ToolCall objects when the stream ends\r\n * - `delta.refusal` — throws Error with the refusal message\r\n *\r\n * Matches the Python `_stream_generator` / `_async_stream_generator`.\r\n */\r\nasync function* streamGenerator(\r\n response: AsyncIterable<unknown>,\r\n): AsyncGenerator<string | ToolCall> {\r\n const toolCallAcc: Map<number, { id: string; name: string; arguments: string }> = new Map();\r\n\r\n for await (const chunk of response) {\r\n const c = chunk as Record<string, unknown>;\r\n const choices = c.choices as Record<string, unknown>[] | undefined;\r\n if (!choices || choices.length === 0) continue;\r\n\r\n const delta = (choices[0] as Record<string, unknown>).delta as Record<string, unknown> | undefined;\r\n if (!delta) continue;\r\n\r\n // Content\r\n if (delta.content != null) {\r\n yield delta.content as string;\r\n }\r\n\r\n // Tool call deltas — accumulate index-keyed partial chunks\r\n const tcDeltas = delta.tool_calls as Record<string, unknown>[] | undefined;\r\n if (tcDeltas) {\r\n for (const tcDelta of tcDeltas) {\r\n const idx = tcDelta.index as number;\r\n if (!toolCallAcc.has(idx)) {\r\n toolCallAcc.set(idx, { id: \"\", name: \"\", arguments: \"\" });\r\n }\r\n const acc = toolCallAcc.get(idx)!;\r\n if (tcDelta.id) acc.id = tcDelta.id as string;\r\n const fn = tcDelta.function as Record<string, unknown> | undefined;\r\n if (fn) {\r\n if (fn.name) acc.name = fn.name as string;\r\n if (fn.arguments) acc.arguments += fn.arguments as string;\r\n }\r\n }\r\n }\r\n\r\n // Refusal\r\n if (delta.refusal != null) {\r\n throw new Error(`Model refused: ${delta.refusal}`);\r\n }\r\n }\r\n\r\n // Yield accumulated tool calls at the end of the stream\r\n const sortedIndices = [...toolCallAcc.keys()].sort((a, b) => a - b);\r\n for (const idx of sortedIndices) {\r\n const tc = toolCallAcc.get(idx)!;\r\n yield { id: tc.id, name: tc.name, arguments: tc.arguments } as ToolCall;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Responses API processing\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Process a Responses API response.\r\n *\r\n * Extracts:\r\n * - Text content from `output_text` or output message items\r\n * - Function tool calls from `function_call` output items\r\n * - JSON-parsed content when outputSchema is present\r\n */\r\nfunction processResponsesApi(\r\n agent: Prompty,\r\n response: Record<string, unknown>,\r\n): unknown {\r\n const output = response.output as Record<string, unknown>[];\r\n\r\n // Collect function calls\r\n const funcCalls: ToolCall[] = [];\r\n for (const item of output) {\r\n if (item.type === \"function_call\") {\r\n funcCalls.push({\r\n id: (item.call_id ?? item.id ?? \"\") as string,\r\n name: item.name as string,\r\n arguments: item.arguments as string,\r\n });\r\n }\r\n }\r\n\r\n if (funcCalls.length > 0) {\r\n return funcCalls;\r\n }\r\n\r\n // Text content — use output_text convenience field\r\n const outputText = response.output_text as string | undefined;\r\n if (outputText !== undefined) {\r\n // Structured output — JSON parse when outputs schema exists\r\n if (agent.outputs && agent.outputs.length > 0) {\r\n try {\r\n return JSON.parse(outputText);\r\n } catch {\r\n return outputText;\r\n }\r\n }\r\n return outputText;\r\n }\r\n\r\n // Fallback: extract from output message items\r\n const texts: string[] = [];\r\n for (const item of output) {\r\n if (item.type === \"message\") {\r\n const content = item.content as Record<string, unknown>[] | undefined;\r\n if (content) {\r\n for (const part of content) {\r\n if (part.type === \"output_text\" || part.type === \"text\") {\r\n texts.push(part.text as string);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (texts.length > 0) {\r\n const text = texts.join(\"\");\r\n if (agent.outputs && agent.outputs.length > 0) {\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n }\r\n return text;\r\n }\r\n\r\n return response;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Non-streaming response processing\r\n// ---------------------------------------------------------------------------\r\n\r\nfunction processChatCompletion(\r\n agent: Prompty,\r\n response: Record<string, unknown>,\r\n): unknown {\r\n const choices = response.choices as Record<string, unknown>[];\r\n if (!choices || choices.length === 0) return null;\r\n\r\n const choice = choices[0];\r\n const message = choice.message as Record<string, unknown>;\r\n if (!message) return null;\r\n\r\n // Tool calls\r\n const toolCalls = message.tool_calls as Record<string, unknown>[] | undefined;\r\n if (toolCalls && toolCalls.length > 0) {\r\n return toolCalls.map((tc): ToolCall => {\r\n const fn = tc.function as Record<string, unknown>;\r\n return {\r\n id: tc.id as string,\r\n name: fn.name as string,\r\n arguments: fn.arguments as string,\r\n };\r\n });\r\n }\r\n\r\n // Content\r\n const content = message.content as string | null;\r\n if (content === null) return null;\r\n\r\n // Structured output — JSON parse when outputs schema exists\r\n if (agent.outputs && agent.outputs.length > 0) {\r\n try {\r\n return JSON.parse(content);\r\n } catch {\r\n return content;\r\n }\r\n }\r\n\r\n return content;\r\n}\r\n\r\nfunction processEmbedding(response: Record<string, unknown>): unknown {\r\n const data = response.data as Record<string, unknown>[];\r\n if (data.length === 1) {\r\n return (data[0] as Record<string, unknown>).embedding;\r\n }\r\n return data.map((d) => (d as Record<string, unknown>).embedding);\r\n}\r\n\r\nfunction processImage(response: Record<string, unknown>): unknown {\r\n const data = response.data as Record<string, unknown>[];\r\n if (data.length === 1) {\r\n return data[0].url ?? data[0].b64_json;\r\n }\r\n return data.map((d) => d.url ?? d.b64_json);\r\n}\r\n","/**\r\n * @prompty/openai — OpenAI provider for Prompty.\r\n *\r\n * Importing this package auto-registers the \"openai\" executor and processor.\r\n *\r\n * @module @prompty/openai\r\n */\r\n\r\nexport { OpenAIExecutor } from \"./executor.js\";\r\nexport { OpenAIProcessor, processResponse } from \"./processor.js\";\r\nexport { messageToWire, buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\r\n\r\n// Auto-register on import\r\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\r\nimport { OpenAIExecutor } from \"./executor.js\";\r\nimport { OpenAIProcessor } from \"./processor.js\";\r\n\r\nregisterExecutor(\"openai\", new OpenAIExecutor());\r\nregisterProcessor(\"openai\", new OpenAIProcessor());\r\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 }\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"]}
package/package.json CHANGED
@@ -1,59 +1,59 @@
1
- {
2
- "name": "@prompty/openai",
3
- "version": "2.0.0-alpha.1",
4
- "description": "OpenAI provider for Prompty — executor and processor for OpenAI APIs",
5
- "type": "module",
6
- "main": "./dist/index.cjs",
7
- "module": "./dist/index.js",
8
- "types": "./dist/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "types": "./dist/index.d.ts",
12
- "import": "./dist/index.js",
13
- "require": "./dist/index.cjs"
14
- }
15
- },
16
- "files": [
17
- "dist"
18
- ],
19
- "scripts": {
20
- "build": "tsup",
21
- "dev": "tsup --watch",
22
- "test": "vitest run",
23
- "test:watch": "vitest",
24
- "lint": "tsc --noEmit",
25
- "clean": "rimraf dist"
26
- },
27
- "keywords": [
28
- "prompty",
29
- "openai",
30
- "llm",
31
- "ai"
32
- ],
33
- "author": "Microsoft",
34
- "license": "MIT",
35
- "publishConfig": {
36
- "access": "public"
37
- },
38
- "repository": {
39
- "type": "git",
40
- "url": "git+https://github.com/microsoft/prompty.git",
41
- "directory": "runtime/typescript/packages/openai"
42
- },
43
- "engines": {
44
- "node": ">=18.0.0"
45
- },
46
- "peerDependencies": {
47
- "@prompty/core": "^2.0.0-alpha.1"
48
- },
49
- "dependencies": {
50
- "openai": "^4.80.0"
51
- },
52
- "devDependencies": {
53
- "@prompty/core": "^2.0.0-alpha.1",
54
- "@types/node": "^20.11.0",
55
- "tsup": "^8.4.0",
56
- "typescript": "^5.7.0",
57
- "vitest": "^3.0.0"
58
- }
59
- }
1
+ {
2
+ "name": "@prompty/openai",
3
+ "version": "2.0.0-alpha.3",
4
+ "description": "OpenAI provider for Prompty — executor and processor for OpenAI APIs",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsup",
21
+ "dev": "tsup --watch",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest",
24
+ "lint": "tsc --noEmit",
25
+ "clean": "rimraf dist"
26
+ },
27
+ "keywords": [
28
+ "prompty",
29
+ "openai",
30
+ "llm",
31
+ "ai"
32
+ ],
33
+ "author": "Microsoft",
34
+ "license": "MIT",
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/microsoft/prompty.git",
41
+ "directory": "runtime/typescript/packages/openai"
42
+ },
43
+ "engines": {
44
+ "node": ">=18.0.0"
45
+ },
46
+ "peerDependencies": {
47
+ "@prompty/core": "^2.0.0-alpha.3"
48
+ },
49
+ "dependencies": {
50
+ "openai": "^4.80.0"
51
+ },
52
+ "devDependencies": {
53
+ "@prompty/core": "^2.0.0-alpha.3",
54
+ "@types/node": "^20.11.0",
55
+ "tsup": "^8.4.0",
56
+ "typescript": "^5.7.0",
57
+ "vitest": "^3.0.0"
58
+ }
59
+ }