@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 +87 -87
- package/dist/index.cjs +23 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +23 -7
- package/dist/index.js.map +1 -1
- package/package.json +59 -59
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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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) => {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/executor.ts","../src/wire.ts","../src/processor.ts"],"sourcesContent":["/**\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQA,oBAAmB;AAEnB,kBAAqE;AAGrE,IAAAA,eAA8B;AAC9B,IAAAA,eAAyC;;;ACFlC,SAAS,cAAc,KAAuC;AACnE,QAAM,OAAgC,EAAE,MAAM,IAAI,KAAK;AAGvD,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,QAAQ,GAAG;AACjD,QAAI,MAAM,UAAU,MAAM,WAAW;AACnC,WAAK,CAAC,IAAI;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,cAAc;AAClC,MAAI,OAAO,YAAY,UAAU;AAC/B,SAAK,UAAU;AAAA,EACjB,OAAO;AAEL,SAAK,UAAU,IAAI,MAAM,IAAI,UAAU;AAAA,EACzC;AAEA,SAAO;AACT;AAKA,SAAS,WAAW,MAA4C;AAC9D,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,MAAM;AAAA,IAC1C,KAAK,SAAS;AACZ,YAAM,WAAoC,EAAE,KAAK,KAAK,OAAO;AAC7D,UAAI,KAAK,OAAQ,UAAS,SAAS,KAAK;AACxC,aAAO,EAAE,MAAM,aAAa,WAAW,SAAS;AAAA,IAClD;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,UACX,MAAM,KAAK;AAAA,UACX,GAAI,KAAK,aAAa,EAAE,QAAQ,KAAK,UAAU;AAAA,QACjD;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,MAAM,EAAE,KAAK,KAAK,OAAO,EAAE;AAAA,EACtD;AACF;AAKO,SAAS,cACd,OACA,UACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AACjC,QAAM,eAAe,SAAS,IAAI,aAAa;AAE/C,QAAM,OAAgC;AAAA,IACpC;AAAA,IACA,UAAU;AAAA,IACV,GAAG,aAAa,KAAK;AAAA,EACvB;AAGA,QAAM,QAAQ,YAAY,KAAK;AAC/B,MAAI,MAAM,SAAS,GAAG;AACpB,SAAK,QAAQ;AAAA,EACf;AAGA,QAAM,iBAAiB,mBAAmB,KAAK;AAC/C,MAAI,gBAAgB;AAClB,SAAK,kBAAkB;AAAA,EACzB;AAEA,SAAO;AACT;AAMO,SAAS,mBACd,OACA,MACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AACjC,QAAM,OAAgC;AAAA,IACpC,OAAO,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAAA,IACzC;AAAA,EACF;AACA,QAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,MAAI,OAAO;AACT,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,WAAK,CAAC,IAAI;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,eACd,OACA,MACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AAGjC,MAAI;AACJ,MAAI,OAAO,SAAS,UAAU;AAC5B,aAAS;AAAA,EACX,WAAW,MAAM,QAAQ,IAAI,GAAG;AAE9B,aAAS,KACN,IAAI,CAAC,MAAoE;AACxE,UAAI,OAAO,EAAE,SAAS,SAAU,QAAO,EAAE;AACzC,UAAI,MAAM,QAAQ,EAAE,KAAK,GAAG;AAC1B,eAAO,EAAE,MACN,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,IAAI,CAAC,MAAM,EAAE,KAAK,EAClB,KAAK,EAAE;AAAA,MACZ;AACA,aAAO,OAAO,CAAC;AAAA,IACjB,CAAC,EACA,KAAK,IAAI,EACT,KAAK;AAAA,EACV,OAAO;AACL,aAAS,OAAO,IAAI;AAAA,EACtB;AAEA,QAAM,OAAgC,EAAE,QAAQ,MAAM;AACtD,QAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,MAAI,OAAO;AACT,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,WAAK,CAAC,IAAI;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAOA,IAAM,oBAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,SAAS,aAAa,OAAyC;AAC7D,QAAM,OAAO,MAAM,OAAO;AAC1B,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,QAAM,SAAkC,CAAC;AAEzC,MAAI,KAAK,gBAAgB,OAAW,QAAO,cAAc,KAAK;AAC9D,MAAI,KAAK,oBAAoB,OAAW,QAAO,wBAAwB,KAAK;AAC5E,MAAI,KAAK,SAAS,OAAW,QAAO,QAAQ,KAAK;AACjD,MAAI,KAAK,qBAAqB,OAAW,QAAO,oBAAoB,KAAK;AACzE,MAAI,KAAK,oBAAoB,OAAW,QAAO,mBAAmB,KAAK;AACvE,MAAI,KAAK,kBAAkB,OAAW,QAAO,OAAO,KAAK;AACzD,MAAI,KAAK,SAAS,OAAW,QAAO,OAAO,KAAK;AAGhD,MAAI,KAAK,sBAAsB;AAC7B,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,oBAAoB,GAAG;AAC9D,UAAI,EAAE,KAAK,SAAS;AAClB,eAAO,CAAC,IAAI;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,aAAa,YAAgD;AACpE,QAAM,QAAiC,CAAC;AACxC,QAAM,WAAqB,CAAC;AAE5B,aAAW,KAAK,YAAyH;AACvI,QAAI,CAAC,EAAE,KAAM;AACb,UAAM,SAAkC;AAAA,MACtC,MAAM,kBAAkB,EAAE,QAAQ,QAAQ,KAAK;AAAA,IACjD;AACA,QAAI,EAAE,YAAa,QAAO,cAAc,EAAE;AAC1C,QAAI,EAAE,cAAc,EAAE,WAAW,SAAS,EAAG,QAAO,OAAO,EAAE;AAC7D,UAAM,EAAE,IAAI,IAAI;AAChB,QAAI,EAAE,SAAU,UAAS,KAAK,EAAE,IAAI;AAAA,EACtC;AAEA,QAAM,SAAkC,EAAE,MAAM,UAAU,YAAY,MAAM;AAC5E,MAAI,SAAS,SAAS,EAAG,QAAO,WAAW;AAC3C,SAAO;AACT;AAGA,SAAS,qBAAqB,MAMF;AAC1B,QAAM,SAAkC;AAAA,IACtC,MAAM,kBAAkB,KAAK,QAAQ,QAAQ,KAAK;AAAA,EACpD;AAEA,MAAI,KAAK,YAAa,QAAO,cAAc,KAAK;AAChD,MAAI,KAAK,cAAc,KAAK,WAAW,SAAS,EAAG,QAAO,OAAO,KAAK;AAGtE,MAAI,KAAK,SAAS,SAAS;AACzB,WAAO,QAAQ,KAAK,QAChB,qBAAqB,KAAK,KAAoB,IAC9C,EAAE,MAAM,SAAS;AAAA,EACvB;AAGA,MAAI,KAAK,SAAS,UAAU;AAC1B,QAAI,KAAK,YAAY;AACnB,YAAM,SAAkC,CAAC;AACzC,YAAM,MAAgB,CAAC;AACvB,iBAAW,KAAK,KAAK,YAAsD;AACzE,YAAI,CAAC,EAAE,KAAM;AACb,eAAO,EAAE,IAAI,IAAI,qBAAqB,CAAC;AACvC,YAAI,KAAK,EAAE,IAAI;AAAA,MACjB;AACA,aAAO,aAAa;AACpB,aAAO,WAAW;AAAA,IACpB,OAAO;AACL,aAAO,aAAa,CAAC;AACrB,aAAO,WAAW,CAAC;AAAA,IACrB;AACA,WAAO,uBAAuB;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,OAA2C;AAC9D,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO,CAAC;AAE1C,QAAM,SAAoC,CAAC;AAE3C,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,SAAS,WAAY;AAE3B,UAAM,UAAmC,EAAE,MAAM,EAAE,KAAK;AACxD,QAAI,EAAE,YAAa,SAAQ,cAAc,EAAE;AAG3C,UAAM,SAAU,EAAiC;AACjD,QAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACnC,cAAQ,aAAa,aAAa,MAAM;AAAA,IAC1C;AAGA,UAAM,SAAU,EAA2B;AAC3C,QAAI,QAAQ;AACV,cAAQ,SAAS;AACjB,UAAI,QAAQ,YAAY;AACtB,QAAC,QAAQ,WAAuC,uBAAuB;AAAA,MACzE;AAAA,IACF;AAEA,WAAO,KAAK,EAAE,MAAM,YAAY,UAAU,QAAQ,CAAC;AAAA,EACrD;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAgD;AAC1E,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,QAAM,aAAsC,CAAC;AAC7C,QAAM,WAAqB,CAAC;AAE5B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,KAAK,KAAM;AAChB,eAAW,KAAK,IAAI,IAAI,qBAAqB,IAAkD;AAC/F,aAAS,KAAK,KAAK,IAAI;AAAA,EACzB;AAEA,QAAM,QAAQ,MAAM,QAAQ,YAAY,YAAY,EAAE,QAAQ,UAAU,GAAG;AAE3E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,sBAAsB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;AAgBO,SAAS,mBACd,OACA,UACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AAGjC,QAAM,cAAwB,CAAC;AAC/B,QAAM,gBAA2C,CAAC;AAElD,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,SAAS,YAAY,IAAI,SAAS,aAAa;AACrD,kBAAY,KAAK,IAAI,IAAI;AAAA,IAC3B,OAAO;AACL,oBAAc,KAAK,wBAAwB,GAAG,CAAC;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,OAAgC;AAAA,IACpC;AAAA,IACA,OAAO;AAAA,EACT;AAGA,MAAI,YAAY,SAAS,GAAG;AAC1B,SAAK,eAAe,YAAY,KAAK,MAAM;AAAA,EAC7C;AAGA,QAAM,eAAe,sBAAsB,KAAK;AAChD,SAAO,OAAO,MAAM,YAAY;AAGhC,QAAM,QAAQ,qBAAqB,KAAK;AACxC,MAAI,MAAM,SAAS,GAAG;AACpB,SAAK,QAAQ;AAAA,EACf;AAGA,QAAM,aAAa,4BAA4B,KAAK;AACpD,MAAI,YAAY;AACd,SAAK,OAAO;AAAA,EACd;AAEA,SAAO;AACT;AAGA,SAAS,wBAAwB,KAAuC;AACtE,QAAM,UAAU,IAAI,cAAc;AAGlC,MAAI,IAAI,SAAS,cAAc;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,IAAI,SAAS;AAAA,MACtB,QAAQ,OAAO,YAAY,WAAW,UAAU,KAAK,UAAU,OAAO;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,OAAO,IAAI,SAAS,SAAS,SAAS,IAAI;AAChD,SAAO,EAAE,MAAM,QAAQ;AACzB;AAGA,SAAS,sBAAsB,OAAyC;AACtE,QAAM,OAAO,MAAM,OAAO;AAC1B,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,QAAM,SAAkC,CAAC;AAEzC,MAAI,KAAK,gBAAgB,OAAW,QAAO,cAAc,KAAK;AAC9D,MAAI,KAAK,oBAAoB,OAAW,QAAO,oBAAoB,KAAK;AACxE,MAAI,KAAK,SAAS,OAAW,QAAO,QAAQ,KAAK;AAGjD,MAAI,KAAK,sBAAsB;AAC7B,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,oBAAoB,GAAG;AAC9D,UAAI,EAAE,KAAK,SAAS;AAClB,eAAO,CAAC,IAAI;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,qBAAqB,OAA2C;AACvE,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO,CAAC;AAE1C,QAAM,SAAoC,CAAC;AAE3C,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,SAAS,WAAY;AAG3B,UAAM,OAAgC;AAAA,MACpC,MAAM;AAAA,MACN,MAAM,EAAE;AAAA,IACV;AACA,QAAI,EAAE,YAAa,MAAK,cAAc,EAAE;AAExC,UAAM,SAAU,EAAiC;AACjD,QAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACnC,WAAK,aAAa,aAAa,MAAM;AAAA,IACvC;AAEA,UAAM,SAAU,EAA2B;AAC3C,QAAI,QAAQ;AACV,WAAK,SAAS;AACd,UAAI,KAAK,YAAY;AACnB,QAAC,KAAK,WAAuC,uBAAuB;AAAA,MACtE;AAAA,IACF;AAEA,WAAO,KAAK,IAAI;AAAA,EAClB;AAEA,SAAO;AACT;AAGA,SAAS,4BAA4B,OAAgD;AACnF,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,QAAM,aAAsC,CAAC;AAC7C,QAAM,WAAqB,CAAC;AAE5B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,KAAK,KAAM;AAChB,eAAW,KAAK,IAAI,IAAI,qBAAqB,IAAkD;AAC/F,aAAS,KAAK,KAAK,IAAI;AAAA,EACzB;AAEA,QAAM,QAAQ,MAAM,QAAQ,YAAY,YAAY,EAAE,QAAQ,UAAU,GAAG;AAE3E,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,sBAAsB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;;;ADxdO,IAAM,iBAAN,MAAyC;AAAA,EAC9C,MAAM,QAAQ,OAAgB,UAAuC;AACnE,eAAO,wBAAU,kBAAkB,OAAO,SAAS;AACjD,WAAK,aAAa,+CAA+C;AACjE,WAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjC,YAAM,SAAS,KAAK,cAAc,KAAK;AACvC,YAAM,aAAa,OAAO,aAAa,QAAQ;AAG/C,gBAAM,wBAAU,YAAY,OAAO,aAAa;AAC9C,iBAAS,aAAa,GAAG,UAAU,OAAO;AAC1C,cAAM,OAAO,MAAM,OAAO;AAC1B,YAAI,gBAAgB,iCAAqB;AACvC,mBAAS,UAAU,EAAE,QAAQ,aAAa,MAAM,KAAK,KAAK,CAAC;AAAA,QAC7D,OAAO;AACL,mBAAS,cAAU,4BAAc,QAAQ,KAAK,aAAa,KAAK,CAAC,CAAC;AAAA,QACpE;AACA,iBAAS,UAAU,UAAU;AAAA,MAC/B,CAAC;AAED,YAAM,UAAU,MAAM,OAAO,WAAW;AACxC,YAAM,SAAS,MAAM,KAAK,eAAe,QAAQ,YAAY,OAAO,UAAU,OAAO;AACrF,WAAK,UAAU,MAAM;AACrB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAc,eACZ,QACA,YACA,OACA,UACA,SACkB;AAClB,YAAQ,SAAS;AAAA,MACf,KAAK;AAAA,MACL,KAAK,SAAS;AACZ,cAAM,OAAO,cAAc,OAAO,QAAQ;AAC1C,cAAM,cAAc,CAAC,CAAC,KAAK;AAC3B,mBAAO,wBAAU,UAAU,OAAO,aAAa;AAC7C,mBAAS,aAAa,GAAG,UAAU,0BAA0B;AAC7D,mBAAS,cAAU,4BAAc,UAAU,IAAI,CAAC;AAChD,gBAAM,SAAS,MAAM,OAAO,KAAK,YAAY;AAAA,YAC3C;AAAA,UACF;AACA,cAAI,aAAa;AAGf,mBAAO,IAAI,0BAAc,GAAG,UAAU,YAAY,MAA2C;AAAA,UAC/F;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,OAAO,mBAAmB,OAAO,QAAQ;AAC/C,mBAAO,wBAAU,UAAU,OAAO,aAAa;AAC7C,mBAAS,aAAa,GAAG,UAAU,oBAAoB;AACvD,mBAAS,cAAU,4BAAc,UAAU,IAAI,CAAC;AAChD,gBAAM,SAAS,MAAM,OAAO,WAAW;AAAA,YACrC;AAAA,UACF;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,OAAO,eAAe,OAAO,QAAQ;AAC3C,mBAAO,wBAAU,YAAY,OAAO,aAAa;AAC/C,mBAAS,aAAa,GAAG,UAAU,kBAAkB;AACrD,mBAAS,cAAU,4BAAc,YAAY,IAAI,CAAC;AAClD,gBAAM,SAAS,MAAM,OAAO,OAAO;AAAA,YACjC;AAAA,UACF;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,OAAO,mBAAmB,OAAO,QAAQ;AAC/C,cAAM,cAAc,CAAC,CAAC,KAAK;AAC3B,mBAAO,wBAAU,UAAU,OAAO,aAAa;AAC7C,mBAAS,aAAa,GAAG,UAAU,mBAAmB;AACtD,mBAAS,cAAU,4BAAc,UAAU,IAAI,CAAC;AAChD,gBAAM,SAAS,MAAM,OAAO,UAAU;AAAA,YACpC;AAAA,UACF;AACA,cAAI,aAAa;AACf,mBAAO,IAAI,0BAAc,GAAG,UAAU,YAAY,MAA2C;AAAA,UAC/F;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA;AACE,cAAM,IAAI,MAAM,wBAAwB,OAAO,EAAE;AAAA,IACrD;AAAA,EACF;AAAA,EAEU,cAAc,OAAwB;AAC9C,UAAM,OAAO,MAAM,OAAO;AAE1B,QAAI,gBAAgB,iCAAqB;AACvC,iBAAO,4BAAc,KAAK,IAAI;AAAA,IAChC;AAEA,UAAM,SAAS,KAAK,aAAa,KAAK;AACtC,WAAO,IAAI,cAAAC,QAAO,MAAM;AAAA,EAC1B;AAAA,EAEU,aAAa,OAAyC;AAC9D,UAAM,SAAkC,CAAC;AACzC,UAAM,OAAO,MAAM,OAAO;AAE1B,QAAI,gBAAgB,8BAAkB;AACpC,UAAI,KAAK,OAAQ,QAAO,SAAS,KAAK;AACtC,UAAI,KAAK,SAAU,QAAO,UAAU,KAAK;AAAA,IAC3C;AAEA,WAAO;AAAA,EACT;AACF;;;AEjIA,IAAAC,eAA0B;AAEnB,IAAM,kBAAN,MAA2C;AAAA,EAChD,MAAM,QAAQ,OAAgB,UAAqC;AACjE,eAAO,wBAAU,mBAAmB,OAAO,SAAS;AAClD,WAAK,aAAa,iDAAiD;AACnE,WAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AACjC,YAAM,SAAS,gBAAgB,OAAO,QAAQ;AAE9C,UAAI,CAAC,gBAAgB,QAAQ,GAAG;AAC9B,aAAK,UAAU,MAAM;AAAA,MACvB;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAKO,SAAS,gBAAgB,OAAgB,UAA4B;AAC1E,MAAI,OAAO,aAAa,YAAY,aAAa,KAAM,QAAO;AAG9D,MAAI,gBAAgB,QAAQ,GAAG;AAC7B,WAAO,gBAAgB,QAAQ;AAAA,EACjC;AAEA,QAAM,IAAI;AAGV,MAAI,EAAE,WAAW,cAAc,MAAM,QAAQ,EAAE,MAAM,GAAG;AACtD,WAAO,oBAAoB,OAAO,CAAC;AAAA,EACrC;AAGA,MAAI,EAAE,SAAS;AACb,WAAO,sBAAsB,OAAO,CAAC;AAAA,EACvC;AAGA,MAAI,EAAE,QAAQ,EAAE,WAAW,QAAQ;AACjC,WAAO,iBAAiB,CAAC;AAAA,EAC3B;AAGA,MAAI,EAAE,QAAQ,MAAM,QAAQ,EAAE,IAAI,GAAG;AACnC,UAAM,OAAO,EAAE;AACf,QAAI,KAAK,SAAS,MAAM,SAAS,KAAK,CAAC,KAAK,cAAc,KAAK,CAAC,IAAI;AAClE,aAAO,aAAa,CAAC;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAOA,SAAS,gBAAgB,OAAiD;AACxE,SACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAO,iBAAiB;AAE5B;AAaA,gBAAgB,gBACd,UACmC;AACnC,QAAM,cAA4E,oBAAI,IAAI;AAE1F,mBAAiB,SAAS,UAAU;AAClC,UAAM,IAAI;AACV,UAAM,UAAU,EAAE;AAClB,QAAI,CAAC,WAAW,QAAQ,WAAW,EAAG;AAEtC,UAAM,QAAS,QAAQ,CAAC,EAA8B;AACtD,QAAI,CAAC,MAAO;AAGZ,QAAI,MAAM,WAAW,MAAM;AACzB,YAAM,MAAM;AAAA,IACd;AAGA,UAAM,WAAW,MAAM;AACvB,QAAI,UAAU;AACZ,iBAAW,WAAW,UAAU;AAC9B,cAAM,MAAM,QAAQ;AACpB,YAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AACzB,sBAAY,IAAI,KAAK,EAAE,IAAI,IAAI,MAAM,IAAI,WAAW,GAAG,CAAC;AAAA,QAC1D;AACA,cAAM,MAAM,YAAY,IAAI,GAAG;AAC/B,YAAI,QAAQ,GAAI,KAAI,KAAK,QAAQ;AACjC,cAAM,KAAK,QAAQ;AACnB,YAAI,IAAI;AACN,cAAI,GAAG,KAAM,KAAI,OAAO,GAAG;AAC3B,cAAI,GAAG,UAAW,KAAI,aAAa,GAAG;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAGA,QAAI,MAAM,WAAW,MAAM;AACzB,YAAM,IAAI,MAAM,kBAAkB,MAAM,OAAO,EAAE;AAAA,IACnD;AAAA,EACF;AAGA,QAAM,gBAAgB,CAAC,GAAG,YAAY,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAClE,aAAW,OAAO,eAAe;AAC/B,UAAM,KAAK,YAAY,IAAI,GAAG;AAC9B,UAAM,EAAE,IAAI,GAAG,IAAI,MAAM,GAAG,MAAM,WAAW,GAAG,UAAU;AAAA,EAC5D;AACF;AAcA,SAAS,oBACP,OACA,UACS;AACT,QAAM,SAAS,SAAS;AAGxB,QAAM,YAAwB,CAAC;AAC/B,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,SAAS,iBAAiB;AACjC,gBAAU,KAAK;AAAA,QACb,IAAK,KAAK,WAAW,KAAK,MAAM;AAAA,QAChC,MAAM,KAAK;AAAA,QACX,WAAW,KAAK;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,SAAS;AAC5B,MAAI,eAAe,QAAW;AAE5B,QAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,UAAI;AACF,eAAO,KAAK,MAAM,UAAU;AAAA,MAC9B,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,SAAS,WAAW;AAC3B,YAAM,UAAU,KAAK;AACrB,UAAI,SAAS;AACX,mBAAW,QAAQ,SAAS;AAC1B,cAAI,KAAK,SAAS,iBAAiB,KAAK,SAAS,QAAQ;AACvD,kBAAM,KAAK,KAAK,IAAc;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,OAAO,MAAM,KAAK,EAAE;AAC1B,QAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,UAAI;AACF,eAAO,KAAK,MAAM,IAAI;AAAA,MACxB,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAMA,SAAS,sBACP,OACA,UACS;AACT,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,QAAM,SAAS,QAAQ,CAAC;AACxB,QAAM,UAAU,OAAO;AACvB,MAAI,CAAC,QAAS,QAAO;AAGrB,QAAM,YAAY,QAAQ;AAC1B,MAAI,aAAa,UAAU,SAAS,GAAG;AACrC,WAAO,UAAU,IAAI,CAAC,OAAiB;AACrC,YAAM,KAAK,GAAG;AACd,aAAO;AAAA,QACL,IAAI,GAAG;AAAA,QACP,MAAM,GAAG;AAAA,QACT,WAAW,GAAG;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,UAAU,QAAQ;AACxB,MAAI,YAAY,KAAM,QAAO;AAG7B,MAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,QAAI;AACF,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,UAA4C;AACpE,QAAM,OAAO,SAAS;AACtB,MAAI,KAAK,WAAW,GAAG;AACrB,WAAQ,KAAK,CAAC,EAA8B;AAAA,EAC9C;AACA,SAAO,KAAK,IAAI,CAAC,MAAO,EAA8B,SAAS;AACjE;AAEA,SAAS,aAAa,UAA4C;AAChE,QAAM,OAAO,SAAS;AACtB,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC,EAAE;AAAA,EAChC;AACA,SAAO,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ;AAC5C;;;AHxQA,IAAAC,eAAoD;IAIpD,+BAAiB,UAAU,IAAI,eAAe,CAAC;AAAA,IAC/C,gCAAkB,UAAU,IAAI,gBAAgB,CAAC;","names":["import_core","OpenAI","import_core","import_core"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/executor.ts","../src/wire.ts","../src/processor.ts"],"sourcesContent":["/**\n * @prompty/openai — OpenAI provider for Prompty.\n *\n * Importing this package auto-registers the \"openai\" executor and processor.\n *\n * @module @prompty/openai\n */\n\nexport { OpenAIExecutor } from \"./executor.js\";\nexport { OpenAIProcessor, processResponse } from \"./processor.js\";\nexport { messageToWire, buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\n\n// Auto-register on import\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\nimport { OpenAIExecutor } from \"./executor.js\";\nimport { OpenAIProcessor } from \"./processor.js\";\n\nregisterExecutor(\"openai\", new OpenAIExecutor());\nregisterProcessor(\"openai\", new OpenAIProcessor());\n","/**\n * OpenAI executor — sends messages to OpenAI APIs.\n *\n * Dispatches on `agent.model.apiType`: chat, embedding, image.\n *\n * @module\n */\n\nimport OpenAI from \"openai\";\nimport type { Prompty } from \"@prompty/core\";\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\nimport type { Executor } from \"@prompty/core\";\nimport type { Message } from \"@prompty/core\";\nimport { getConnection } from \"@prompty/core\";\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\nimport { buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\n\nexport class OpenAIExecutor implements Executor {\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\n return traceSpan(\"OpenAIExecutor\", async (emit) => {\n emit(\"signature\", \"prompty.openai.executor.OpenAIExecutor.invoke\");\n emit(\"inputs\", { data: messages });\n\n const client = this.resolveClient(agent);\n const clientName = client.constructor?.name ?? \"OpenAI\";\n\n // Trace what client we resolved and how\n await traceSpan(clientName, async (ctorEmit) => {\n ctorEmit(\"signature\", `${clientName}.ctor`);\n const conn = agent.model?.connection;\n if (conn instanceof ReferenceConnection) {\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\n } else {\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\n }\n ctorEmit(\"result\", clientName);\n });\n\n const apiType = agent.model?.apiType ?? \"chat\";\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\n emit(\"result\", result);\n return result;\n });\n }\n\n /** Dispatch to the appropriate API and trace the call. */\n private async executeApiCall(\n client: OpenAI,\n clientName: string,\n agent: Prompty,\n messages: Message[],\n apiType: string,\n ): Promise<unknown> {\n switch (apiType) {\n case \"chat\": {\n const args = buildChatArgs(agent, messages);\n const isStreaming = !!args.stream;\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.chat.completions.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.chat.completions.create(\n args as unknown as Parameters<typeof client.chat.completions.create>[0],\n );\n if (isStreaming) {\n // Wrap streaming response for tracing — don't emit result yet,\n // PromptyStream will trace on exhaustion\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\n }\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"embedding\": {\n const args = buildEmbeddingArgs(agent, messages);\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.embeddings.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.embeddings.create(\n args as unknown as Parameters<typeof client.embeddings.create>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"image\": {\n const args = buildImageArgs(agent, messages);\n return traceSpan(\"generate\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.images.generate`);\n callEmit(\"inputs\", sanitizeValue(\"generate\", args));\n const result = await client.images.generate(\n args as unknown as Parameters<typeof client.images.generate>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"responses\": {\n const args = buildResponsesArgs(agent, messages);\n const isStreaming = !!args.stream;\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.responses.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.responses.create(\n args as unknown as Parameters<typeof client.responses.create>[0],\n );\n if (isStreaming) {\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\n }\n callEmit(\"result\", result);\n return result;\n });\n }\n default:\n throw new Error(`Unsupported apiType: ${apiType}`);\n }\n }\n\n protected resolveClient(agent: Prompty): OpenAI {\n const conn = agent.model?.connection;\n\n if (conn instanceof ReferenceConnection) {\n return getConnection(conn.name) as OpenAI;\n }\n\n const kwargs = this.clientKwargs(agent);\n return new OpenAI(kwargs);\n }\n\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\n const kwargs: Record<string, unknown> = {};\n const conn = agent.model?.connection;\n\n if (conn instanceof ApiKeyConnection) {\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\n }\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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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":";AAQA,OAAO,YAAY;AAEnB,SAAS,kBAAkB,qBAAqB,qBAAqB;AAGrE,SAAS,qBAAqB;AAC9B,SAAS,WAAW,qBAAqB;;;ACFlC,SAAS,cAAc,KAAuC;AACnE,QAAM,OAAgC,EAAE,MAAM,IAAI,KAAK;AAGvD,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,QAAQ,GAAG;AACjD,QAAI,MAAM,UAAU,MAAM,WAAW;AACnC,WAAK,CAAC,IAAI;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,cAAc;AAClC,MAAI,OAAO,YAAY,UAAU;AAC/B,SAAK,UAAU;AAAA,EACjB,OAAO;AAEL,SAAK,UAAU,IAAI,MAAM,IAAI,UAAU;AAAA,EACzC;AAEA,SAAO;AACT;AAKA,SAAS,WAAW,MAA4C;AAC9D,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,MAAM;AAAA,IAC1C,KAAK,SAAS;AACZ,YAAM,WAAoC,EAAE,KAAK,KAAK,OAAO;AAC7D,UAAI,KAAK,OAAQ,UAAS,SAAS,KAAK;AACxC,aAAO,EAAE,MAAM,aAAa,WAAW,SAAS;AAAA,IAClD;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,UACX,MAAM,KAAK;AAAA,UACX,GAAI,KAAK,aAAa,EAAE,QAAQ,KAAK,UAAU;AAAA,QACjD;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,MAAM,EAAE,KAAK,KAAK,OAAO,EAAE;AAAA,EACtD;AACF;AAKO,SAAS,cACd,OACA,UACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AACjC,QAAM,eAAe,SAAS,IAAI,aAAa;AAE/C,QAAM,OAAgC;AAAA,IACpC;AAAA,IACA,UAAU;AAAA,IACV,GAAG,aAAa,KAAK;AAAA,EACvB;AAGA,QAAM,QAAQ,YAAY,KAAK;AAC/B,MAAI,MAAM,SAAS,GAAG;AACpB,SAAK,QAAQ;AAAA,EACf;AAGA,QAAM,iBAAiB,mBAAmB,KAAK;AAC/C,MAAI,gBAAgB;AAClB,SAAK,kBAAkB;AAAA,EACzB;AAEA,SAAO;AACT;AAMO,SAAS,mBACd,OACA,MACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AACjC,QAAM,OAAgC;AAAA,IACpC,OAAO,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAAA,IACzC;AAAA,EACF;AACA,QAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,MAAI,OAAO;AACT,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,WAAK,CAAC,IAAI;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,eACd,OACA,MACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AAGjC,MAAI;AACJ,MAAI,OAAO,SAAS,UAAU;AAC5B,aAAS;AAAA,EACX,WAAW,MAAM,QAAQ,IAAI,GAAG;AAE9B,aAAS,KACN,IAAI,CAAC,MAAoE;AACxE,UAAI,OAAO,EAAE,SAAS,SAAU,QAAO,EAAE;AACzC,UAAI,MAAM,QAAQ,EAAE,KAAK,GAAG;AAC1B,eAAO,EAAE,MACN,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,IAAI,CAAC,MAAM,EAAE,KAAK,EAClB,KAAK,EAAE;AAAA,MACZ;AACA,aAAO,OAAO,CAAC;AAAA,IACjB,CAAC,EACA,KAAK,IAAI,EACT,KAAK;AAAA,EACV,OAAO;AACL,aAAS,OAAO,IAAI;AAAA,EACtB;AAEA,QAAM,OAAgC,EAAE,QAAQ,MAAM;AACtD,QAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,MAAI,OAAO;AACT,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,WAAK,CAAC,IAAI;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAOA,IAAM,oBAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,SAAS,aAAa,OAAyC;AAC7D,QAAM,OAAO,MAAM,OAAO;AAC1B,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,QAAM,SAAkC,CAAC;AAEzC,MAAI,KAAK,gBAAgB,OAAW,QAAO,cAAc,KAAK;AAC9D,MAAI,KAAK,oBAAoB,OAAW,QAAO,wBAAwB,KAAK;AAC5E,MAAI,KAAK,SAAS,OAAW,QAAO,QAAQ,KAAK;AACjD,MAAI,KAAK,qBAAqB,OAAW,QAAO,oBAAoB,KAAK;AACzE,MAAI,KAAK,oBAAoB,OAAW,QAAO,mBAAmB,KAAK;AACvE,MAAI,KAAK,kBAAkB,OAAW,QAAO,OAAO,KAAK;AACzD,MAAI,KAAK,SAAS,OAAW,QAAO,OAAO,KAAK;AAGhD,MAAI,KAAK,sBAAsB;AAC7B,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,oBAAoB,GAAG;AAC9D,UAAI,EAAE,KAAK,SAAS;AAClB,eAAO,CAAC,IAAI;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,aAAa,YAAgD;AACpE,QAAM,QAAiC,CAAC;AACxC,QAAM,WAAqB,CAAC;AAE5B,aAAW,KAAK,YAAyH;AACvI,QAAI,CAAC,EAAE,KAAM;AACb,UAAM,SAAkC;AAAA,MACtC,MAAM,kBAAkB,EAAE,QAAQ,QAAQ,KAAK;AAAA,IACjD;AACA,QAAI,EAAE,YAAa,QAAO,cAAc,EAAE;AAC1C,QAAI,EAAE,cAAc,EAAE,WAAW,SAAS,EAAG,QAAO,OAAO,EAAE;AAC7D,UAAM,EAAE,IAAI,IAAI;AAChB,QAAI,EAAE,SAAU,UAAS,KAAK,EAAE,IAAI;AAAA,EACtC;AAEA,QAAM,SAAkC,EAAE,MAAM,UAAU,YAAY,MAAM;AAC5E,MAAI,SAAS,SAAS,EAAG,QAAO,WAAW;AAC3C,SAAO;AACT;AAGA,SAAS,qBAAqB,MAMF;AAC1B,QAAM,SAAkC;AAAA,IACtC,MAAM,kBAAkB,KAAK,QAAQ,QAAQ,KAAK;AAAA,EACpD;AAEA,MAAI,KAAK,YAAa,QAAO,cAAc,KAAK;AAChD,MAAI,KAAK,cAAc,KAAK,WAAW,SAAS,EAAG,QAAO,OAAO,KAAK;AAGtE,MAAI,KAAK,SAAS,SAAS;AACzB,WAAO,QAAQ,KAAK,QAChB,qBAAqB,KAAK,KAAoB,IAC9C,EAAE,MAAM,SAAS;AAAA,EACvB;AAGA,MAAI,KAAK,SAAS,UAAU;AAC1B,QAAI,KAAK,YAAY;AACnB,YAAM,SAAkC,CAAC;AACzC,YAAM,MAAgB,CAAC;AACvB,iBAAW,KAAK,KAAK,YAAsD;AACzE,YAAI,CAAC,EAAE,KAAM;AACb,eAAO,EAAE,IAAI,IAAI,qBAAqB,CAAC;AACvC,YAAI,KAAK,EAAE,IAAI;AAAA,MACjB;AACA,aAAO,aAAa;AACpB,aAAO,WAAW;AAAA,IACpB,OAAO;AACL,aAAO,aAAa,CAAC;AACrB,aAAO,WAAW,CAAC;AAAA,IACrB;AACA,WAAO,uBAAuB;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,OAA2C;AAC9D,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO,CAAC;AAE1C,QAAM,SAAoC,CAAC;AAE3C,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,SAAS,WAAY;AAE3B,UAAM,UAAmC,EAAE,MAAM,EAAE,KAAK;AACxD,QAAI,EAAE,YAAa,SAAQ,cAAc,EAAE;AAG3C,UAAM,SAAU,EAAiC;AACjD,QAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACnC,cAAQ,aAAa,aAAa,MAAM;AAAA,IAC1C;AAGA,UAAM,SAAU,EAA2B;AAC3C,QAAI,QAAQ;AACV,cAAQ,SAAS;AACjB,UAAI,QAAQ,YAAY;AACtB,QAAC,QAAQ,WAAuC,uBAAuB;AAAA,MACzE;AAAA,IACF;AAEA,WAAO,KAAK,EAAE,MAAM,YAAY,UAAU,QAAQ,CAAC;AAAA,EACrD;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAgD;AAC1E,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,QAAM,aAAsC,CAAC;AAC7C,QAAM,WAAqB,CAAC;AAE5B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,KAAK,KAAM;AAChB,eAAW,KAAK,IAAI,IAAI,qBAAqB,IAAkD;AAC/F,aAAS,KAAK,KAAK,IAAI;AAAA,EACzB;AAEA,QAAM,QAAQ,MAAM,QAAQ,YAAY,YAAY,EAAE,QAAQ,UAAU,GAAG;AAE3E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,sBAAsB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;AAgBO,SAAS,mBACd,OACA,UACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,MAAM;AAGjC,QAAM,cAAwB,CAAC;AAC/B,QAAM,gBAA2C,CAAC;AAElD,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,SAAS,YAAY,IAAI,SAAS,aAAa;AACrD,kBAAY,KAAK,IAAI,IAAI;AAAA,IAC3B,OAAO;AACL,oBAAc,KAAK,wBAAwB,GAAG,CAAC;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,OAAgC;AAAA,IACpC;AAAA,IACA,OAAO;AAAA,EACT;AAGA,MAAI,YAAY,SAAS,GAAG;AAC1B,SAAK,eAAe,YAAY,KAAK,MAAM;AAAA,EAC7C;AAGA,QAAM,eAAe,sBAAsB,KAAK;AAChD,SAAO,OAAO,MAAM,YAAY;AAGhC,QAAM,QAAQ,qBAAqB,KAAK;AACxC,MAAI,MAAM,SAAS,GAAG;AACpB,SAAK,QAAQ;AAAA,EACf;AAGA,QAAM,aAAa,4BAA4B,KAAK;AACpD,MAAI,YAAY;AACd,SAAK,OAAO;AAAA,EACd;AAEA,SAAO;AACT;AAGA,SAAS,wBAAwB,KAAuC;AACtE,QAAM,UAAU,IAAI,cAAc;AAGlC,MAAI,IAAI,SAAS,cAAc;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,IAAI,SAAS;AAAA,MACtB,QAAQ,OAAO,YAAY,WAAW,UAAU,KAAK,UAAU,OAAO;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,OAAO,IAAI,SAAS,SAAS,SAAS,IAAI;AAChD,SAAO,EAAE,MAAM,QAAQ;AACzB;AAGA,SAAS,sBAAsB,OAAyC;AACtE,QAAM,OAAO,MAAM,OAAO;AAC1B,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,QAAM,SAAkC,CAAC;AAEzC,MAAI,KAAK,gBAAgB,OAAW,QAAO,cAAc,KAAK;AAC9D,MAAI,KAAK,oBAAoB,OAAW,QAAO,oBAAoB,KAAK;AACxE,MAAI,KAAK,SAAS,OAAW,QAAO,QAAQ,KAAK;AAGjD,MAAI,KAAK,sBAAsB;AAC7B,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,oBAAoB,GAAG;AAC9D,UAAI,EAAE,KAAK,SAAS;AAClB,eAAO,CAAC,IAAI;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,qBAAqB,OAA2C;AACvE,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO,CAAC;AAE1C,QAAM,SAAoC,CAAC;AAE3C,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,SAAS,WAAY;AAG3B,UAAM,OAAgC;AAAA,MACpC,MAAM;AAAA,MACN,MAAM,EAAE;AAAA,IACV;AACA,QAAI,EAAE,YAAa,MAAK,cAAc,EAAE;AAExC,UAAM,SAAU,EAAiC;AACjD,QAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACnC,WAAK,aAAa,aAAa,MAAM;AAAA,IACvC;AAEA,UAAM,SAAU,EAA2B;AAC3C,QAAI,QAAQ;AACV,WAAK,SAAS;AACd,UAAI,KAAK,YAAY;AACnB,QAAC,KAAK,WAAuC,uBAAuB;AAAA,MACtE;AAAA,IACF;AAEA,WAAO,KAAK,IAAI;AAAA,EAClB;AAEA,SAAO;AACT;AAGA,SAAS,4BAA4B,OAAgD;AACnF,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,QAAM,aAAsC,CAAC;AAC7C,QAAM,WAAqB,CAAC;AAE5B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,KAAK,KAAM;AAChB,eAAW,KAAK,IAAI,IAAI,qBAAqB,IAAkD;AAC/F,aAAS,KAAK,KAAK,IAAI;AAAA,EACzB;AAEA,QAAM,QAAQ,MAAM,QAAQ,YAAY,YAAY,EAAE,QAAQ,UAAU,GAAG;AAE3E,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,sBAAsB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;;;ADxdO,IAAM,iBAAN,MAAyC;AAAA,EAC9C,MAAM,QAAQ,OAAgB,UAAuC;AACnE,WAAO,UAAU,kBAAkB,OAAO,SAAS;AACjD,WAAK,aAAa,+CAA+C;AACjE,WAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjC,YAAM,SAAS,KAAK,cAAc,KAAK;AACvC,YAAM,aAAa,OAAO,aAAa,QAAQ;AAG/C,YAAM,UAAU,YAAY,OAAO,aAAa;AAC9C,iBAAS,aAAa,GAAG,UAAU,OAAO;AAC1C,cAAM,OAAO,MAAM,OAAO;AAC1B,YAAI,gBAAgB,qBAAqB;AACvC,mBAAS,UAAU,EAAE,QAAQ,aAAa,MAAM,KAAK,KAAK,CAAC;AAAA,QAC7D,OAAO;AACL,mBAAS,UAAU,cAAc,QAAQ,KAAK,aAAa,KAAK,CAAC,CAAC;AAAA,QACpE;AACA,iBAAS,UAAU,UAAU;AAAA,MAC/B,CAAC;AAED,YAAM,UAAU,MAAM,OAAO,WAAW;AACxC,YAAM,SAAS,MAAM,KAAK,eAAe,QAAQ,YAAY,OAAO,UAAU,OAAO;AACrF,WAAK,UAAU,MAAM;AACrB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAc,eACZ,QACA,YACA,OACA,UACA,SACkB;AAClB,YAAQ,SAAS;AAAA,MACf,KAAK;AAAA,MACL,KAAK,SAAS;AACZ,cAAM,OAAO,cAAc,OAAO,QAAQ;AAC1C,cAAM,cAAc,CAAC,CAAC,KAAK;AAC3B,eAAO,UAAU,UAAU,OAAO,aAAa;AAC7C,mBAAS,aAAa,GAAG,UAAU,0BAA0B;AAC7D,mBAAS,UAAU,cAAc,UAAU,IAAI,CAAC;AAChD,gBAAM,SAAS,MAAM,OAAO,KAAK,YAAY;AAAA,YAC3C;AAAA,UACF;AACA,cAAI,aAAa;AAGf,mBAAO,IAAI,cAAc,GAAG,UAAU,YAAY,MAA2C;AAAA,UAC/F;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,OAAO,mBAAmB,OAAO,QAAQ;AAC/C,eAAO,UAAU,UAAU,OAAO,aAAa;AAC7C,mBAAS,aAAa,GAAG,UAAU,oBAAoB;AACvD,mBAAS,UAAU,cAAc,UAAU,IAAI,CAAC;AAChD,gBAAM,SAAS,MAAM,OAAO,WAAW;AAAA,YACrC;AAAA,UACF;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,OAAO,eAAe,OAAO,QAAQ;AAC3C,eAAO,UAAU,YAAY,OAAO,aAAa;AAC/C,mBAAS,aAAa,GAAG,UAAU,kBAAkB;AACrD,mBAAS,UAAU,cAAc,YAAY,IAAI,CAAC;AAClD,gBAAM,SAAS,MAAM,OAAO,OAAO;AAAA,YACjC;AAAA,UACF;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,OAAO,mBAAmB,OAAO,QAAQ;AAC/C,cAAM,cAAc,CAAC,CAAC,KAAK;AAC3B,eAAO,UAAU,UAAU,OAAO,aAAa;AAC7C,mBAAS,aAAa,GAAG,UAAU,mBAAmB;AACtD,mBAAS,UAAU,cAAc,UAAU,IAAI,CAAC;AAChD,gBAAM,SAAS,MAAM,OAAO,UAAU;AAAA,YACpC;AAAA,UACF;AACA,cAAI,aAAa;AACf,mBAAO,IAAI,cAAc,GAAG,UAAU,YAAY,MAA2C;AAAA,UAC/F;AACA,mBAAS,UAAU,MAAM;AACzB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA;AACE,cAAM,IAAI,MAAM,wBAAwB,OAAO,EAAE;AAAA,IACrD;AAAA,EACF;AAAA,EAEU,cAAc,OAAwB;AAC9C,UAAM,OAAO,MAAM,OAAO;AAE1B,QAAI,gBAAgB,qBAAqB;AACvC,aAAO,cAAc,KAAK,IAAI;AAAA,IAChC;AAEA,UAAM,SAAS,KAAK,aAAa,KAAK;AACtC,WAAO,IAAI,OAAO,MAAM;AAAA,EAC1B;AAAA,EAEU,aAAa,OAAyC;AAC9D,UAAM,SAAkC,CAAC;AACzC,UAAM,OAAO,MAAM,OAAO;AAE1B,QAAI,gBAAgB,kBAAkB;AACpC,UAAI,KAAK,OAAQ,QAAO,SAAS,KAAK;AACtC,UAAI,KAAK,SAAU,QAAO,UAAU,KAAK;AAAA,IAC3C;AAEA,WAAO;AAAA,EACT;AACF;;;AEjIA,SAAS,aAAAA,kBAAiB;AAEnB,IAAM,kBAAN,MAA2C;AAAA,EAChD,MAAM,QAAQ,OAAgB,UAAqC;AACjE,WAAOA,WAAU,mBAAmB,OAAO,SAAS;AAClD,WAAK,aAAa,iDAAiD;AACnE,WAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AACjC,YAAM,SAAS,gBAAgB,OAAO,QAAQ;AAE9C,UAAI,CAAC,gBAAgB,QAAQ,GAAG;AAC9B,aAAK,UAAU,MAAM;AAAA,MACvB;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAKO,SAAS,gBAAgB,OAAgB,UAA4B;AAC1E,MAAI,OAAO,aAAa,YAAY,aAAa,KAAM,QAAO;AAG9D,MAAI,gBAAgB,QAAQ,GAAG;AAC7B,WAAO,gBAAgB,QAAQ;AAAA,EACjC;AAEA,QAAM,IAAI;AAGV,MAAI,EAAE,WAAW,cAAc,MAAM,QAAQ,EAAE,MAAM,GAAG;AACtD,WAAO,oBAAoB,OAAO,CAAC;AAAA,EACrC;AAGA,MAAI,EAAE,SAAS;AACb,WAAO,sBAAsB,OAAO,CAAC;AAAA,EACvC;AAGA,MAAI,EAAE,QAAQ,EAAE,WAAW,QAAQ;AACjC,WAAO,iBAAiB,CAAC;AAAA,EAC3B;AAGA,MAAI,EAAE,QAAQ,MAAM,QAAQ,EAAE,IAAI,GAAG;AACnC,UAAM,OAAO,EAAE;AACf,QAAI,KAAK,SAAS,MAAM,SAAS,KAAK,CAAC,KAAK,cAAc,KAAK,CAAC,IAAI;AAClE,aAAO,aAAa,CAAC;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAOA,SAAS,gBAAgB,OAAiD;AACxE,SACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAO,iBAAiB;AAE5B;AAaA,gBAAgB,gBACd,UACmC;AACnC,QAAM,cAA4E,oBAAI,IAAI;AAE1F,mBAAiB,SAAS,UAAU;AAClC,UAAM,IAAI;AACV,UAAM,UAAU,EAAE;AAClB,QAAI,CAAC,WAAW,QAAQ,WAAW,EAAG;AAEtC,UAAM,QAAS,QAAQ,CAAC,EAA8B;AACtD,QAAI,CAAC,MAAO;AAGZ,QAAI,MAAM,WAAW,MAAM;AACzB,YAAM,MAAM;AAAA,IACd;AAGA,UAAM,WAAW,MAAM;AACvB,QAAI,UAAU;AACZ,iBAAW,WAAW,UAAU;AAC9B,cAAM,MAAM,QAAQ;AACpB,YAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AACzB,sBAAY,IAAI,KAAK,EAAE,IAAI,IAAI,MAAM,IAAI,WAAW,GAAG,CAAC;AAAA,QAC1D;AACA,cAAM,MAAM,YAAY,IAAI,GAAG;AAC/B,YAAI,QAAQ,GAAI,KAAI,KAAK,QAAQ;AACjC,cAAM,KAAK,QAAQ;AACnB,YAAI,IAAI;AACN,cAAI,GAAG,KAAM,KAAI,OAAO,GAAG;AAC3B,cAAI,GAAG,UAAW,KAAI,aAAa,GAAG;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAGA,QAAI,MAAM,WAAW,MAAM;AACzB,YAAM,IAAI,MAAM,kBAAkB,MAAM,OAAO,EAAE;AAAA,IACnD;AAAA,EACF;AAGA,QAAM,gBAAgB,CAAC,GAAG,YAAY,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAClE,aAAW,OAAO,eAAe;AAC/B,UAAM,KAAK,YAAY,IAAI,GAAG;AAC9B,UAAM,EAAE,IAAI,GAAG,IAAI,MAAM,GAAG,MAAM,WAAW,GAAG,UAAU;AAAA,EAC5D;AACF;AAcA,SAAS,oBACP,OACA,UACS;AACT,QAAM,SAAS,SAAS;AAGxB,QAAM,YAAwB,CAAC;AAC/B,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,SAAS,iBAAiB;AACjC,gBAAU,KAAK;AAAA,QACb,IAAK,KAAK,WAAW,KAAK,MAAM;AAAA,QAChC,MAAM,KAAK;AAAA,QACX,WAAW,KAAK;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,SAAS;AAC5B,MAAI,eAAe,QAAW;AAE5B,QAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,UAAI;AACF,eAAO,KAAK,MAAM,UAAU;AAAA,MAC9B,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,SAAS,WAAW;AAC3B,YAAM,UAAU,KAAK;AACrB,UAAI,SAAS;AACX,mBAAW,QAAQ,SAAS;AAC1B,cAAI,KAAK,SAAS,iBAAiB,KAAK,SAAS,QAAQ;AACvD,kBAAM,KAAK,KAAK,IAAc;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,OAAO,MAAM,KAAK,EAAE;AAC1B,QAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,UAAI;AACF,eAAO,KAAK,MAAM,IAAI;AAAA,MACxB,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAMA,SAAS,sBACP,OACA,UACS;AACT,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAE7C,QAAM,SAAS,QAAQ,CAAC;AACxB,QAAM,UAAU,OAAO;AACvB,MAAI,CAAC,QAAS,QAAO;AAGrB,QAAM,YAAY,QAAQ;AAC1B,MAAI,aAAa,UAAU,SAAS,GAAG;AACrC,WAAO,UAAU,IAAI,CAAC,OAAiB;AACrC,YAAM,KAAK,GAAG;AACd,aAAO;AAAA,QACL,IAAI,GAAG;AAAA,QACP,MAAM,GAAG;AAAA,QACT,WAAW,GAAG;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,UAAU,QAAQ;AACxB,MAAI,YAAY,KAAM,QAAO;AAG7B,MAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,QAAI;AACF,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,UAA4C;AACpE,QAAM,OAAO,SAAS;AACtB,MAAI,KAAK,WAAW,GAAG;AACrB,WAAQ,KAAK,CAAC,EAA8B;AAAA,EAC9C;AACA,SAAO,KAAK,IAAI,CAAC,MAAO,EAA8B,SAAS;AACjE;AAEA,SAAS,aAAa,UAA4C;AAChE,QAAM,OAAO,SAAS;AACtB,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC,EAAE;AAAA,EAChC;AACA,SAAO,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ;AAC5C;;;ACxQA,SAAS,kBAAkB,yBAAyB;AAIpD,iBAAiB,UAAU,IAAI,eAAe,CAAC;AAC/C,kBAAkB,UAAU,IAAI,gBAAgB,CAAC;","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.
|
|
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.
|
|
48
|
-
},
|
|
49
|
-
"dependencies": {
|
|
50
|
-
"openai": "^4.80.0"
|
|
51
|
-
},
|
|
52
|
-
"devDependencies": {
|
|
53
|
-
"@prompty/core": "^2.0.0-alpha.
|
|
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
|
+
}
|