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

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/executor.ts","../src/wire.ts","../src/processor.ts"],"sourcesContent":["/**\r\n * @prompty/openai — OpenAI provider for Prompty.\r\n *\r\n * Importing this package auto-registers the \"openai\" executor and processor.\r\n *\r\n * @module @prompty/openai\r\n */\r\n\r\nexport { OpenAIExecutor } from \"./executor.js\";\r\nexport { OpenAIProcessor, processResponse } from \"./processor.js\";\r\nexport { messageToWire, buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\r\n\r\n// Auto-register on import\r\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\r\nimport { OpenAIExecutor } from \"./executor.js\";\r\nimport { OpenAIProcessor } from \"./processor.js\";\r\n\r\nregisterExecutor(\"openai\", new OpenAIExecutor());\r\nregisterProcessor(\"openai\", new OpenAIProcessor());\r\n","/**\r\n * OpenAI executor — sends messages to OpenAI APIs.\r\n *\r\n * Dispatches on `agent.model.apiType`: chat, embedding, image.\r\n *\r\n * @module\r\n */\r\n\r\nimport OpenAI from \"openai\";\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\r\nimport type { Executor } from \"@prompty/core\";\r\nimport type { Message } from \"@prompty/core\";\r\nimport { getConnection } from \"@prompty/core\";\r\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\r\nimport { buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\r\n\r\nexport class OpenAIExecutor implements Executor {\r\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\r\n return traceSpan(\"OpenAIExecutor\", async (emit) => {\r\n emit(\"signature\", \"prompty.openai.executor.OpenAIExecutor.invoke\");\r\n emit(\"inputs\", { data: messages });\r\n\r\n const client = this.resolveClient(agent);\r\n const clientName = client.constructor?.name ?? \"OpenAI\";\r\n\r\n // Trace what client we resolved and how\r\n await traceSpan(clientName, async (ctorEmit) => {\r\n ctorEmit(\"signature\", `${clientName}.ctor`);\r\n const conn = agent.model?.connection;\r\n if (conn instanceof ReferenceConnection) {\r\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\r\n } else {\r\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\r\n }\r\n ctorEmit(\"result\", clientName);\r\n });\r\n\r\n const apiType = agent.model?.apiType ?? \"chat\";\r\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\r\n emit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n\r\n /** Dispatch to the appropriate API and trace the call. */\r\n private async executeApiCall(\r\n client: OpenAI,\r\n clientName: string,\r\n agent: Prompty,\r\n messages: Message[],\r\n apiType: string,\r\n ): Promise<unknown> {\r\n switch (apiType) {\r\n case \"chat\":\r\n case \"agent\": {\r\n const args = buildChatArgs(agent, messages);\r\n const isStreaming = !!args.stream;\r\n return traceSpan(\"create\", async (callEmit) => {\r\n callEmit(\"signature\", `${clientName}.chat.completions.create`);\r\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\r\n const result = await client.chat.completions.create(\r\n args as unknown as Parameters<typeof client.chat.completions.create>[0],\r\n );\r\n if (isStreaming) {\r\n // Wrap streaming response for tracing — don't emit result yet,\r\n // PromptyStream will trace on exhaustion\r\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\r\n }\r\n callEmit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n case \"embedding\": {\r\n const args = buildEmbeddingArgs(agent, messages);\r\n return traceSpan(\"create\", async (callEmit) => {\r\n callEmit(\"signature\", `${clientName}.embeddings.create`);\r\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\r\n const result = await client.embeddings.create(\r\n args as unknown as Parameters<typeof client.embeddings.create>[0],\r\n );\r\n callEmit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n case \"image\": {\r\n const args = buildImageArgs(agent, messages);\r\n return traceSpan(\"generate\", async (callEmit) => {\r\n callEmit(\"signature\", `${clientName}.images.generate`);\r\n callEmit(\"inputs\", sanitizeValue(\"generate\", args));\r\n const result = await client.images.generate(\r\n args as unknown as Parameters<typeof client.images.generate>[0],\r\n );\r\n callEmit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n case \"responses\": {\r\n const args = buildResponsesArgs(agent, messages);\r\n const isStreaming = !!args.stream;\r\n return traceSpan(\"create\", async (callEmit) => {\r\n callEmit(\"signature\", `${clientName}.responses.create`);\r\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\r\n const result = await client.responses.create(\r\n args as unknown as Parameters<typeof client.responses.create>[0],\r\n );\r\n if (isStreaming) {\r\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\r\n }\r\n callEmit(\"result\", result);\r\n return result;\r\n });\r\n }\r\n default:\r\n throw new Error(`Unsupported apiType: ${apiType}`);\r\n }\r\n }\r\n\r\n protected resolveClient(agent: Prompty): OpenAI {\r\n const conn = agent.model?.connection;\r\n\r\n if (conn instanceof ReferenceConnection) {\r\n return getConnection(conn.name) as OpenAI;\r\n }\r\n\r\n const kwargs = this.clientKwargs(agent);\r\n return new OpenAI(kwargs);\r\n }\r\n\r\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\r\n const kwargs: Record<string, unknown> = {};\r\n const conn = agent.model?.connection;\r\n\r\n if (conn instanceof ApiKeyConnection) {\r\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\r\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\r\n }\r\n\r\n return kwargs;\r\n }\r\n}\r\n","/**\r\n * Wire format conversion: Message → OpenAI API JSON.\r\n *\r\n * @module\r\n */\r\n\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport type { ContentPart, Message } from \"@prompty/core\";\r\n\r\n/**\r\n * Convert an abstract Message to OpenAI wire format.\r\n */\r\nexport function messageToWire(msg: Message): Record<string, unknown> {\r\n const wire: Record<string, unknown> = { role: msg.role };\r\n\r\n // Include metadata fields (e.g., name, tool_call_id, tool_calls)\r\n for (const [k, v] of Object.entries(msg.metadata)) {\r\n if (k !== \"role\" && k !== \"content\") {\r\n wire[k] = v;\r\n }\r\n }\r\n\r\n const content = msg.toTextContent();\r\n if (typeof content === \"string\") {\r\n wire.content = content;\r\n } else {\r\n // Multimodal — convert parts to OpenAI format\r\n wire.content = msg.parts.map(partToWire);\r\n }\r\n\r\n return wire;\r\n}\r\n\r\n/**\r\n * Convert a ContentPart to OpenAI wire format.\r\n */\r\nfunction partToWire(part: ContentPart): Record<string, unknown> {\r\n switch (part.kind) {\r\n case \"text\":\r\n return { type: \"text\", text: part.value };\r\n case \"image\": {\r\n const imageUrl: Record<string, unknown> = { url: part.source };\r\n if (part.detail) imageUrl.detail = part.detail;\r\n return { type: \"image_url\", image_url: imageUrl };\r\n }\r\n case \"audio\":\r\n return {\r\n type: \"input_audio\",\r\n input_audio: {\r\n data: part.source,\r\n ...(part.mediaType && { format: part.mediaType }),\r\n },\r\n };\r\n case \"file\":\r\n return { type: \"file\", file: { url: part.source } };\r\n }\r\n}\r\n\r\n/**\r\n * Build chat completion arguments from agent config and messages.\r\n */\r\nexport function buildChatArgs(\r\n agent: Prompty,\r\n messages: Message[],\r\n): Record<string, unknown> {\r\n const model = agent.model?.id || \"gpt-4\";\r\n const wireMessages = messages.map(messageToWire);\r\n\r\n const args: Record<string, unknown> = {\r\n model,\r\n messages: wireMessages,\r\n ...buildOptions(agent),\r\n };\r\n\r\n // Tools\r\n const tools = toolsToWire(agent);\r\n if (tools.length > 0) {\r\n args.tools = tools;\r\n }\r\n\r\n // Structured output\r\n const responseFormat = outputSchemaToWire(agent);\r\n if (responseFormat) {\r\n args.response_format = responseFormat;\r\n }\r\n\r\n return args;\r\n}\r\n\r\n/**\r\n * Build embedding arguments.\r\n * Only additionalProperties are passed — chat options are not valid here.\r\n */\r\nexport function buildEmbeddingArgs(\r\n agent: Prompty,\r\n data: unknown,\r\n): Record<string, unknown> {\r\n const model = agent.model?.id || \"text-embedding-ada-002\";\r\n const args: Record<string, unknown> = {\r\n input: Array.isArray(data) ? data : [data],\r\n model,\r\n };\r\n const extra = agent.model?.options?.additionalProperties;\r\n if (extra) {\r\n for (const [k, v] of Object.entries(extra)) {\r\n args[k] = v;\r\n }\r\n }\r\n return args;\r\n}\r\n\r\n/**\r\n * Build image generation arguments.\r\n * Only additionalProperties are passed — chat options are not valid here.\r\n */\r\nexport function buildImageArgs(\r\n agent: Prompty,\r\n data: unknown,\r\n): Record<string, unknown> {\r\n const model = agent.model?.id || \"dall-e-3\";\r\n\r\n // Extract prompt text: data may be a string, or a Message[] from the parser\r\n let prompt: string;\r\n if (typeof data === \"string\") {\r\n prompt = data;\r\n } else if (Array.isArray(data)) {\r\n // Messages have .parts[].value for text content, or a .text getter\r\n prompt = data\r\n .map((m: { text?: string; parts?: { kind: string; value: string }[] }) => {\r\n if (typeof m.text === \"string\") return m.text;\r\n if (Array.isArray(m.parts)) {\r\n return m.parts\r\n .filter((p) => p.kind === \"text\")\r\n .map((p) => p.value)\r\n .join(\"\");\r\n }\r\n return String(m);\r\n })\r\n .join(\"\\n\")\r\n .trim();\r\n } else {\r\n prompt = String(data);\r\n }\r\n\r\n const args: Record<string, unknown> = { prompt, model };\r\n const extra = agent.model?.options?.additionalProperties;\r\n if (extra) {\r\n for (const [k, v] of Object.entries(extra)) {\r\n args[k] = v;\r\n }\r\n }\r\n return args;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Map AgentSchema kind strings to JSON Schema type strings. */\r\nconst KIND_TO_JSON_TYPE: Record<string, string> = {\r\n string: \"string\",\r\n integer: \"integer\",\r\n float: \"number\",\r\n number: \"number\",\r\n boolean: \"boolean\",\r\n array: \"array\",\r\n object: \"object\",\r\n};\r\n\r\nfunction buildOptions(agent: Prompty): Record<string, unknown> {\r\n const opts = agent.model?.options;\r\n if (!opts) return {};\r\n\r\n const result: Record<string, unknown> = {};\r\n\r\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\r\n if (opts.maxOutputTokens !== undefined) result.max_completion_tokens = opts.maxOutputTokens;\r\n if (opts.topP !== undefined) result.top_p = opts.topP;\r\n if (opts.frequencyPenalty !== undefined) result.frequency_penalty = opts.frequencyPenalty;\r\n if (opts.presencePenalty !== undefined) result.presence_penalty = opts.presencePenalty;\r\n if (opts.stopSequences !== undefined) result.stop = opts.stopSequences;\r\n if (opts.seed !== undefined) result.seed = opts.seed;\r\n\r\n // Pass through additionalProperties — but don't overwrite mapped keys\r\n if (opts.additionalProperties) {\r\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\r\n if (!(k in result)) {\r\n result[k] = v;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** Convert a Property list to a JSON Schema `{type: \"object\", properties: ...}`. */\r\nfunction schemaToWire(properties: unknown[]): Record<string, unknown> {\r\n const props: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n\r\n for (const p of properties as Array<{ name?: string; kind?: string; description?: string; required?: boolean; enumValues?: unknown[] }>) {\r\n if (!p.name) continue;\r\n const schema: Record<string, unknown> = {\r\n type: KIND_TO_JSON_TYPE[p.kind ?? \"string\"] ?? \"string\",\r\n };\r\n if (p.description) schema.description = p.description;\r\n if (p.enumValues && p.enumValues.length > 0) schema.enum = p.enumValues;\r\n props[p.name] = schema;\r\n if (p.required) required.push(p.name);\r\n }\r\n\r\n const result: Record<string, unknown> = { type: \"object\", properties: props };\r\n if (required.length > 0) result.required = required;\r\n return result;\r\n}\r\n\r\n/** Convert a single Property to a JSON Schema definition (recursive for structured output). */\r\nfunction propertyToJsonSchema(prop: {\r\n kind?: string;\r\n description?: string;\r\n enumValues?: unknown[];\r\n items?: unknown;\r\n properties?: unknown[];\r\n}): Record<string, unknown> {\r\n const schema: Record<string, unknown> = {\r\n type: KIND_TO_JSON_TYPE[prop.kind ?? \"string\"] ?? \"string\",\r\n };\r\n\r\n if (prop.description) schema.description = prop.description;\r\n if (prop.enumValues && prop.enumValues.length > 0) schema.enum = prop.enumValues;\r\n\r\n // Array items\r\n if (prop.kind === \"array\") {\r\n schema.items = prop.items\r\n ? propertyToJsonSchema(prop.items as typeof prop)\r\n : { type: \"string\" };\r\n }\r\n\r\n // Nested object\r\n if (prop.kind === \"object\") {\r\n if (prop.properties) {\r\n const nested: Record<string, unknown> = {};\r\n const req: string[] = [];\r\n for (const p of prop.properties as Array<{ name?: string } & typeof prop>) {\r\n if (!p.name) continue;\r\n nested[p.name] = propertyToJsonSchema(p);\r\n req.push(p.name);\r\n }\r\n schema.properties = nested;\r\n schema.required = req;\r\n } else {\r\n schema.properties = {};\r\n schema.required = [];\r\n }\r\n schema.additionalProperties = false;\r\n }\r\n\r\n return schema;\r\n}\r\n\r\nfunction toolsToWire(agent: Prompty): Record<string, unknown>[] {\r\n const tools = agent.tools;\r\n if (!tools || tools.length === 0) return [];\r\n\r\n const result: Record<string, unknown>[] = [];\r\n\r\n for (const t of tools) {\r\n if (t.kind !== \"function\") continue;\r\n\r\n const funcDef: Record<string, unknown> = { name: t.name };\r\n if (t.description) funcDef.description = t.description;\r\n\r\n // Serialize parameters via schemaToWire\r\n const params = (t as { parameters?: unknown[] }).parameters;\r\n if (params && Array.isArray(params)) {\r\n funcDef.parameters = schemaToWire(params);\r\n }\r\n\r\n // Strict mode\r\n const strict = (t as { strict?: boolean }).strict;\r\n if (strict) {\r\n funcDef.strict = true;\r\n if (funcDef.parameters) {\r\n (funcDef.parameters as Record<string, unknown>).additionalProperties = false;\r\n }\r\n }\r\n\r\n result.push({ type: \"function\", function: funcDef });\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction outputSchemaToWire(agent: Prompty): Record<string, unknown> | null {\r\n const outputs = agent.outputs;\r\n if (!outputs || outputs.length === 0) return null;\r\n\r\n const properties: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n\r\n for (const prop of outputs) {\r\n if (!prop.name) continue;\r\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\r\n required.push(prop.name);\r\n }\r\n\r\n const name = (agent.name || \"response\").toLowerCase().replace(/[\\s-]/g, \"_\");\r\n\r\n return {\r\n type: \"json_schema\",\r\n json_schema: {\r\n name,\r\n strict: true,\r\n schema: {\r\n type: \"object\",\r\n properties,\r\n required,\r\n additionalProperties: false,\r\n },\r\n },\r\n };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Responses API wire format\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Build Responses API arguments from agent config and messages.\r\n *\r\n * Key differences from Chat Completions:\r\n * - System messages → `instructions` parameter\r\n * - Other messages → `input` as EasyInputMessage[]\r\n * - `maxOutputTokens` → `max_output_tokens`\r\n * - Structured output → `text.format` (not `response_format`)\r\n * - Tools use flat `{ type: \"function\", name, parameters }` (not nested `function:`)\r\n */\r\nexport function buildResponsesArgs(\r\n agent: Prompty,\r\n messages: Message[],\r\n): Record<string, unknown> {\r\n const model = agent.model?.id || \"gpt-4o\";\r\n\r\n // Separate system messages as instructions, rest as input\r\n const systemParts: string[] = [];\r\n const inputMessages: Record<string, unknown>[] = [];\r\n\r\n for (const msg of messages) {\r\n if (msg.role === \"system\" || msg.role === \"developer\") {\r\n systemParts.push(msg.text);\r\n } else {\r\n inputMessages.push(messageToResponsesInput(msg));\r\n }\r\n }\r\n\r\n const args: Record<string, unknown> = {\r\n model,\r\n input: inputMessages,\r\n };\r\n\r\n // Set instructions from system messages\r\n if (systemParts.length > 0) {\r\n args.instructions = systemParts.join(\"\\n\\n\");\r\n }\r\n\r\n // Map model options\r\n const responseOpts = buildResponsesOptions(agent);\r\n Object.assign(args, responseOpts);\r\n\r\n // Tools\r\n const tools = responsesToolsToWire(agent);\r\n if (tools.length > 0) {\r\n args.tools = tools;\r\n }\r\n\r\n // Structured output via text.format\r\n const textConfig = outputSchemaToResponsesWire(agent);\r\n if (textConfig) {\r\n args.text = textConfig;\r\n }\r\n\r\n return args;\r\n}\r\n\r\n/** Convert a Message to Responses API EasyInputMessage format. */\r\nfunction messageToResponsesInput(msg: Message): Record<string, unknown> {\r\n const content = msg.toTextContent();\r\n\r\n // Tool result messages → function_call_output\r\n if (msg.metadata.tool_call_id) {\r\n return {\r\n type: \"function_call_output\",\r\n call_id: msg.metadata.tool_call_id,\r\n output: typeof content === \"string\" ? content : JSON.stringify(content),\r\n };\r\n }\r\n\r\n const role = msg.role === \"tool\" ? \"user\" : msg.role;\r\n return { role, content };\r\n}\r\n\r\n/** Build Responses-specific model options. */\r\nfunction buildResponsesOptions(agent: Prompty): Record<string, unknown> {\r\n const opts = agent.model?.options;\r\n if (!opts) return {};\r\n\r\n const result: Record<string, unknown> = {};\r\n\r\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\r\n if (opts.maxOutputTokens !== undefined) result.max_output_tokens = opts.maxOutputTokens;\r\n if (opts.topP !== undefined) result.top_p = opts.topP;\r\n\r\n // Pass through additionalProperties — but don't overwrite mapped keys\r\n if (opts.additionalProperties) {\r\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\r\n if (!(k in result)) {\r\n result[k] = v;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** Convert agent tools to Responses API tool format. */\r\nfunction responsesToolsToWire(agent: Prompty): Record<string, unknown>[] {\r\n const tools = agent.tools;\r\n if (!tools || tools.length === 0) return [];\r\n\r\n const result: Record<string, unknown>[] = [];\r\n\r\n for (const t of tools) {\r\n if (t.kind !== \"function\") continue;\r\n\r\n // Responses API uses flat tool format (not nested under \"function:\")\r\n const tool: Record<string, unknown> = {\r\n type: \"function\",\r\n name: t.name,\r\n };\r\n if (t.description) tool.description = t.description;\r\n\r\n const params = (t as { parameters?: unknown[] }).parameters;\r\n if (params && Array.isArray(params)) {\r\n tool.parameters = schemaToWire(params);\r\n }\r\n\r\n const strict = (t as { strict?: boolean }).strict;\r\n if (strict) {\r\n tool.strict = true;\r\n if (tool.parameters) {\r\n (tool.parameters as Record<string, unknown>).additionalProperties = false;\r\n }\r\n }\r\n\r\n result.push(tool);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** Convert outputSchema to Responses API text.format config. */\r\nfunction outputSchemaToResponsesWire(agent: Prompty): Record<string, unknown> | null {\r\n const outputs = agent.outputs;\r\n if (!outputs || outputs.length === 0) return null;\r\n\r\n const properties: Record<string, unknown> = {};\r\n const required: string[] = [];\r\n\r\n for (const prop of outputs) {\r\n if (!prop.name) continue;\r\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\r\n required.push(prop.name);\r\n }\r\n\r\n const name = (agent.name || \"response\").toLowerCase().replace(/[\\s-]/g, \"_\");\r\n\r\n return {\r\n format: {\r\n type: \"json_schema\",\r\n name,\r\n strict: true,\r\n schema: {\r\n type: \"object\",\r\n properties,\r\n required,\r\n additionalProperties: false,\r\n },\r\n },\r\n };\r\n}\r\n","/**\r\n * OpenAI processor — extracts clean results from raw OpenAI responses.\r\n *\r\n * Handles ChatCompletion, Embedding, Image, and streaming responses.\r\n *\r\n * @module\r\n */\r\n\r\nimport type { Prompty } from \"@prompty/core\";\r\nimport type { Processor } from \"@prompty/core\";\r\nimport type { ToolCall } from \"@prompty/core\";\r\nimport { traceSpan } from \"@prompty/core\";\r\n\r\nexport class OpenAIProcessor implements Processor {\r\n async process(agent: Prompty, response: unknown): Promise<unknown> {\r\n return traceSpan(\"OpenAIProcessor\", async (emit) => {\r\n emit(\"signature\", \"prompty.openai.processor.OpenAIProcessor.invoke\");\r\n emit(\"inputs\", { data: response });\r\n const result = processResponse(agent, response);\r\n // Don't emit result for streaming — it's a generator, not a value\r\n if (!isAsyncIterable(response)) {\r\n emit(\"result\", result);\r\n }\r\n return result;\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Extract clean content from an OpenAI response.\r\n */\r\nexport function processResponse(agent: Prompty, response: unknown): unknown {\r\n if (typeof response !== \"object\" || response === null) return response;\r\n\r\n // Streaming response — return content-extracting async generator\r\n if (isAsyncIterable(response)) {\r\n return streamGenerator(response);\r\n }\r\n\r\n const r = response as Record<string, unknown>;\r\n\r\n // Responses API — has output[] and object === \"response\"\r\n if (r.object === \"response\" && Array.isArray(r.output)) {\r\n return processResponsesApi(agent, r);\r\n }\r\n\r\n // ChatCompletion\r\n if (r.choices) {\r\n return processChatCompletion(agent, r);\r\n }\r\n\r\n // Embedding response\r\n if (r.data && r.object === \"list\") {\r\n return processEmbedding(r);\r\n }\r\n\r\n // Image response\r\n if (r.data && Array.isArray(r.data)) {\r\n const data = r.data as Record<string, unknown>[];\r\n if (data.length > 0 && (\"url\" in data[0] || \"b64_json\" in data[0])) {\r\n return processImage(r);\r\n }\r\n }\r\n\r\n return response;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Streaming\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Type guard for async iterables (PromptyStream or raw SDK stream). */\r\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n Symbol.asyncIterator in value\r\n );\r\n}\r\n\r\n/**\r\n * Yield content chunks, tool calls, or refusals from a streaming response.\r\n *\r\n * Handles three types of streaming deltas:\r\n * - `delta.content` — yields content strings\r\n * - `delta.tool_calls` — accumulates partial tool call chunks,\r\n * yields ToolCall objects when the stream ends\r\n * - `delta.refusal` — throws Error with the refusal message\r\n *\r\n * Matches the Python `_stream_generator` / `_async_stream_generator`.\r\n */\r\nasync function* streamGenerator(\r\n response: AsyncIterable<unknown>,\r\n): AsyncGenerator<string | ToolCall> {\r\n const toolCallAcc: Map<number, { id: string; name: string; arguments: string }> = new Map();\r\n\r\n for await (const chunk of response) {\r\n const c = chunk as Record<string, unknown>;\r\n const choices = c.choices as Record<string, unknown>[] | undefined;\r\n if (!choices || choices.length === 0) continue;\r\n\r\n const delta = (choices[0] as Record<string, unknown>).delta as Record<string, unknown> | undefined;\r\n if (!delta) continue;\r\n\r\n // Content\r\n if (delta.content != null) {\r\n yield delta.content as string;\r\n }\r\n\r\n // Tool call deltas — accumulate index-keyed partial chunks\r\n const tcDeltas = delta.tool_calls as Record<string, unknown>[] | undefined;\r\n if (tcDeltas) {\r\n for (const tcDelta of tcDeltas) {\r\n const idx = tcDelta.index as number;\r\n if (!toolCallAcc.has(idx)) {\r\n toolCallAcc.set(idx, { id: \"\", name: \"\", arguments: \"\" });\r\n }\r\n const acc = toolCallAcc.get(idx)!;\r\n if (tcDelta.id) acc.id = tcDelta.id as string;\r\n const fn = tcDelta.function as Record<string, unknown> | undefined;\r\n if (fn) {\r\n if (fn.name) acc.name = fn.name as string;\r\n if (fn.arguments) acc.arguments += fn.arguments as string;\r\n }\r\n }\r\n }\r\n\r\n // Refusal\r\n if (delta.refusal != null) {\r\n throw new Error(`Model refused: ${delta.refusal}`);\r\n }\r\n }\r\n\r\n // Yield accumulated tool calls at the end of the stream\r\n const sortedIndices = [...toolCallAcc.keys()].sort((a, b) => a - b);\r\n for (const idx of sortedIndices) {\r\n const tc = toolCallAcc.get(idx)!;\r\n yield { id: tc.id, name: tc.name, arguments: tc.arguments } as ToolCall;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Responses API processing\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Process a Responses API response.\r\n *\r\n * Extracts:\r\n * - Text content from `output_text` or output message items\r\n * - Function tool calls from `function_call` output items\r\n * - JSON-parsed content when outputSchema is present\r\n */\r\nfunction processResponsesApi(\r\n agent: Prompty,\r\n response: Record<string, unknown>,\r\n): unknown {\r\n const output = response.output as Record<string, unknown>[];\r\n\r\n // Collect function calls\r\n const funcCalls: ToolCall[] = [];\r\n for (const item of output) {\r\n if (item.type === \"function_call\") {\r\n funcCalls.push({\r\n id: (item.call_id ?? item.id ?? \"\") as string,\r\n name: item.name as string,\r\n arguments: item.arguments as string,\r\n });\r\n }\r\n }\r\n\r\n if (funcCalls.length > 0) {\r\n return funcCalls;\r\n }\r\n\r\n // Text content — use output_text convenience field\r\n const outputText = response.output_text as string | undefined;\r\n if (outputText !== undefined) {\r\n // Structured output — JSON parse when outputs schema exists\r\n if (agent.outputs && agent.outputs.length > 0) {\r\n try {\r\n return JSON.parse(outputText);\r\n } catch {\r\n return outputText;\r\n }\r\n }\r\n return outputText;\r\n }\r\n\r\n // Fallback: extract from output message items\r\n const texts: string[] = [];\r\n for (const item of output) {\r\n if (item.type === \"message\") {\r\n const content = item.content as Record<string, unknown>[] | undefined;\r\n if (content) {\r\n for (const part of content) {\r\n if (part.type === \"output_text\" || part.type === \"text\") {\r\n texts.push(part.text as string);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (texts.length > 0) {\r\n const text = texts.join(\"\");\r\n if (agent.outputs && agent.outputs.length > 0) {\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return text;\r\n }\r\n }\r\n return text;\r\n }\r\n\r\n return response;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Non-streaming response processing\r\n// ---------------------------------------------------------------------------\r\n\r\nfunction processChatCompletion(\r\n agent: Prompty,\r\n response: Record<string, unknown>,\r\n): unknown {\r\n const choices = response.choices as Record<string, unknown>[];\r\n if (!choices || choices.length === 0) return null;\r\n\r\n const choice = choices[0];\r\n const message = choice.message as Record<string, unknown>;\r\n if (!message) return null;\r\n\r\n // Tool calls\r\n const toolCalls = message.tool_calls as Record<string, unknown>[] | undefined;\r\n if (toolCalls && toolCalls.length > 0) {\r\n return toolCalls.map((tc): ToolCall => {\r\n const fn = tc.function as Record<string, unknown>;\r\n return {\r\n id: tc.id as string,\r\n name: fn.name as string,\r\n arguments: fn.arguments as string,\r\n };\r\n });\r\n }\r\n\r\n // Content\r\n const content = message.content as string | null;\r\n if (content === null) return null;\r\n\r\n // Structured output — JSON parse when outputs schema exists\r\n if (agent.outputs && agent.outputs.length > 0) {\r\n try {\r\n return JSON.parse(content);\r\n } catch {\r\n return content;\r\n }\r\n }\r\n\r\n return content;\r\n}\r\n\r\nfunction processEmbedding(response: Record<string, unknown>): unknown {\r\n const data = response.data as Record<string, unknown>[];\r\n if (data.length === 1) {\r\n return (data[0] as Record<string, unknown>).embedding;\r\n }\r\n return data.map((d) => (d as Record<string, unknown>).embedding);\r\n}\r\n\r\nfunction processImage(response: Record<string, unknown>): unknown {\r\n const data = response.data as Record<string, unknown>[];\r\n if (data.length === 1) {\r\n return data[0].url ?? data[0].b64_json;\r\n }\r\n return data.map((d) => d.url ?? d.b64_json);\r\n}\r\n"],"mappings":"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","names":["import_core","OpenAI","import_core","import_core"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/executor.ts","../src/wire.ts","../src/processor.ts"],"sourcesContent":["/**\n * @prompty/openai — OpenAI provider for Prompty.\n *\n * Importing this package auto-registers the \"openai\" executor and processor.\n *\n * @module @prompty/openai\n */\n\nexport { OpenAIExecutor } from \"./executor.js\";\nexport { OpenAIProcessor, processResponse } from \"./processor.js\";\nexport { messageToWire, buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\n\n// Auto-register on import\nimport { registerExecutor, registerProcessor } from \"@prompty/core\";\nimport { OpenAIExecutor } from \"./executor.js\";\nimport { OpenAIProcessor } from \"./processor.js\";\n\nregisterExecutor(\"openai\", new OpenAIExecutor());\nregisterProcessor(\"openai\", new OpenAIProcessor());\n","/**\n * OpenAI executor — sends messages to OpenAI APIs.\n *\n * Dispatches on `agent.model.apiType`: chat, embedding, image.\n *\n * @module\n */\n\nimport OpenAI from \"openai\";\nimport type { Prompty } from \"@prompty/core\";\nimport { ApiKeyConnection, ReferenceConnection, PromptyStream } from \"@prompty/core\";\nimport type { Executor } from \"@prompty/core\";\nimport type { Message } from \"@prompty/core\";\nimport { getConnection } from \"@prompty/core\";\nimport { traceSpan, sanitizeValue } from \"@prompty/core\";\nimport { buildChatArgs, buildEmbeddingArgs, buildImageArgs, buildResponsesArgs } from \"./wire.js\";\n\nexport class OpenAIExecutor implements Executor {\n async execute(agent: Prompty, messages: Message[]): Promise<unknown> {\n return traceSpan(\"OpenAIExecutor\", async (emit) => {\n emit(\"signature\", \"prompty.openai.executor.OpenAIExecutor.invoke\");\n emit(\"inputs\", { data: messages });\n\n const client = this.resolveClient(agent);\n const clientName = client.constructor?.name ?? \"OpenAI\";\n\n // Trace what client we resolved and how\n await traceSpan(clientName, async (ctorEmit) => {\n ctorEmit(\"signature\", `${clientName}.ctor`);\n const conn = agent.model?.connection;\n if (conn instanceof ReferenceConnection) {\n ctorEmit(\"inputs\", { source: \"reference\", name: conn.name });\n } else {\n ctorEmit(\"inputs\", sanitizeValue(\"ctor\", this.clientKwargs(agent)));\n }\n ctorEmit(\"result\", clientName);\n });\n\n const apiType = agent.model?.apiType ?? \"chat\";\n const result = await this.executeApiCall(client, clientName, agent, messages, apiType);\n emit(\"result\", result);\n return result;\n });\n }\n\n /** Dispatch to the appropriate API and trace the call. */\n private async executeApiCall(\n client: OpenAI,\n clientName: string,\n agent: Prompty,\n messages: Message[],\n apiType: string,\n ): Promise<unknown> {\n switch (apiType) {\n case \"chat\": {\n const args = buildChatArgs(agent, messages);\n const isStreaming = !!args.stream;\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.chat.completions.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.chat.completions.create(\n args as unknown as Parameters<typeof client.chat.completions.create>[0],\n );\n if (isStreaming) {\n // Wrap streaming response for tracing — don't emit result yet,\n // PromptyStream will trace on exhaustion\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\n }\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"embedding\": {\n const args = buildEmbeddingArgs(agent, messages);\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.embeddings.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.embeddings.create(\n args as unknown as Parameters<typeof client.embeddings.create>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"image\": {\n const args = buildImageArgs(agent, messages);\n return traceSpan(\"generate\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.images.generate`);\n callEmit(\"inputs\", sanitizeValue(\"generate\", args));\n const result = await client.images.generate(\n args as unknown as Parameters<typeof client.images.generate>[0],\n );\n callEmit(\"result\", result);\n return result;\n });\n }\n case \"responses\": {\n const args = buildResponsesArgs(agent, messages);\n const isStreaming = !!args.stream;\n return traceSpan(\"create\", async (callEmit) => {\n callEmit(\"signature\", `${clientName}.responses.create`);\n callEmit(\"inputs\", sanitizeValue(\"create\", args));\n const result = await client.responses.create(\n args as unknown as Parameters<typeof client.responses.create>[0],\n );\n if (isStreaming) {\n return new PromptyStream(`${clientName}Executor`, result as unknown as AsyncIterable<unknown>);\n }\n callEmit(\"result\", result);\n return result;\n });\n }\n default:\n throw new Error(`Unsupported apiType: ${apiType}`);\n }\n }\n\n protected resolveClient(agent: Prompty): OpenAI {\n const conn = agent.model?.connection;\n\n if (conn instanceof ReferenceConnection) {\n return getConnection(conn.name) as OpenAI;\n }\n\n const kwargs = this.clientKwargs(agent);\n return new OpenAI(kwargs);\n }\n\n protected clientKwargs(agent: Prompty): Record<string, unknown> {\n const kwargs: Record<string, unknown> = {};\n const conn = agent.model?.connection;\n\n if (conn instanceof ApiKeyConnection) {\n if (conn.apiKey) kwargs.apiKey = conn.apiKey;\n if (conn.endpoint) kwargs.baseURL = conn.endpoint;\n } else if (conn) {\n throw new Error(\n `Connection kind '${conn.kind}' is not supported by the OpenAI executor. ` +\n `Use 'key' for API key auth or 'reference' with registerConnection() for pre-configured clients.`,\n );\n }\n\n return kwargs;\n }\n}\n","/**\n * Wire format conversion: Message → OpenAI API JSON.\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { ContentPart, Message } from \"@prompty/core\";\nimport { load as loadPrompty } from \"@prompty/core\";\nimport { dirname, resolve } from \"node:path\";\n\n/**\n * Convert an abstract Message to OpenAI wire format.\n */\nexport function messageToWire(msg: Message): Record<string, unknown> {\n const wire: Record<string, unknown> = { role: msg.role };\n\n // Include metadata fields (e.g., name, tool_call_id, tool_calls)\n for (const [k, v] of Object.entries(msg.metadata)) {\n if (k !== \"role\" && k !== \"content\") {\n wire[k] = v;\n }\n }\n\n const content = msg.toTextContent();\n if (typeof content === \"string\") {\n wire.content = content;\n } else {\n // Multimodal — convert parts to OpenAI format\n wire.content = msg.parts.map(partToWire);\n }\n\n return wire;\n}\n\n/**\n * Convert a ContentPart to OpenAI wire format.\n */\nfunction partToWire(part: ContentPart): Record<string, unknown> {\n switch (part.kind) {\n case \"text\":\n return { type: \"text\", text: part.value };\n case \"image\": {\n const imageUrl: Record<string, unknown> = { url: part.source };\n if (part.detail) imageUrl.detail = part.detail;\n return { type: \"image_url\", image_url: imageUrl };\n }\n case \"audio\":\n return {\n type: \"input_audio\",\n input_audio: {\n data: part.source,\n ...(part.mediaType && { format: mimeToAudioFormat(part.mediaType) }),\n },\n };\n case \"file\":\n return { type: \"file\", file: { url: part.source } };\n }\n}\n\n/** Map audio MIME types to OpenAI short format names. */\nconst AUDIO_MIME_MAP: Record<string, string> = {\n \"audio/wav\": \"wav\",\n \"audio/mpeg\": \"mp3\",\n \"audio/mp3\": \"mp3\",\n \"audio/mp4\": \"mp4\",\n \"audio/ogg\": \"ogg\",\n \"audio/flac\": \"flac\",\n \"audio/webm\": \"webm\",\n \"audio/pcm\": \"pcm\",\n};\n\nfunction mimeToAudioFormat(mediaType: string): string {\n return AUDIO_MIME_MAP[mediaType.toLowerCase()] ?? mediaType;\n}\n\n/**\n * Build chat completion arguments from agent config and messages.\n */\nexport function buildChatArgs(\n agent: Prompty,\n messages: Message[],\n): Record<string, unknown> {\n const model = agent.model?.id || \"gpt-4\";\n const wireMessages = messages.map(messageToWire);\n\n const args: Record<string, unknown> = {\n model,\n messages: wireMessages,\n ...buildOptions(agent),\n };\n\n // Tools\n const tools = toolsToWire(agent);\n if (tools.length > 0) {\n args.tools = tools;\n }\n\n // Structured output\n const responseFormat = outputSchemaToWire(agent);\n if (responseFormat) {\n args.response_format = responseFormat;\n }\n\n return args;\n}\n\n/**\n * Build embedding arguments.\n * Only additionalProperties are passed — chat options are not valid here.\n */\nexport function buildEmbeddingArgs(\n agent: Prompty,\n data: unknown,\n): Record<string, unknown> {\n const model = agent.model?.id || \"text-embedding-ada-002\";\n\n // Extract text content from Message objects if needed\n let input: unknown;\n if (Array.isArray(data)) {\n const texts = data.map((item: unknown) => {\n if (typeof item === \"string\") return item;\n if (item && typeof item === \"object\" && \"text\" in item) return (item as { text: string }).text;\n if (item && typeof item === \"object\" && \"toTextContent\" in item) {\n const content = (item as { toTextContent: () => unknown }).toTextContent();\n return typeof content === \"string\" ? content : String(content);\n }\n return String(item);\n });\n // Single input → string, multiple → array\n input = texts.length === 1 ? texts[0] : texts;\n } else if (typeof data === \"string\") {\n input = data;\n } else {\n input = String(data);\n }\n\n const args: Record<string, unknown> = { input, model };\n const extra = agent.model?.options?.additionalProperties;\n if (extra) {\n for (const [k, v] of Object.entries(extra)) {\n args[k] = v;\n }\n }\n return args;\n}\n\n/**\n * Build image generation arguments.\n * Only additionalProperties are passed — chat options are not valid here.\n */\nexport function buildImageArgs(\n agent: Prompty,\n data: unknown,\n): Record<string, unknown> {\n const model = agent.model?.id || \"dall-e-3\";\n\n // Extract prompt text: data may be a string, or a Message[] from the parser\n let prompt: string;\n if (typeof data === \"string\") {\n prompt = data;\n } else if (Array.isArray(data)) {\n // Messages have .parts[].value for text content, or a .text getter\n prompt = data\n .map((m: { text?: string; parts?: { kind: string; value: string }[] }) => {\n if (typeof m.text === \"string\") return m.text;\n if (Array.isArray(m.parts)) {\n return m.parts\n .filter((p) => p.kind === \"text\")\n .map((p) => p.value)\n .join(\"\");\n }\n return String(m);\n })\n .join(\"\\n\")\n .trim();\n } else {\n prompt = String(data);\n }\n\n const args: Record<string, unknown> = { prompt, model };\n const extra = agent.model?.options?.additionalProperties;\n if (extra) {\n for (const [k, v] of Object.entries(extra)) {\n args[k] = v;\n }\n }\n return args;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Map AgentSchema kind strings to JSON Schema type strings. */\nconst KIND_TO_JSON_TYPE: Record<string, string> = {\n string: \"string\",\n integer: \"integer\",\n float: \"number\",\n number: \"number\",\n boolean: \"boolean\",\n array: \"array\",\n object: \"object\",\n};\n\nfunction buildOptions(agent: Prompty): Record<string, unknown> {\n const opts = agent.model?.options;\n if (!opts) return {};\n\n const result: Record<string, unknown> = {};\n\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\n if (opts.maxOutputTokens !== undefined) result.max_completion_tokens = opts.maxOutputTokens;\n if (opts.topP !== undefined) result.top_p = opts.topP;\n if (opts.frequencyPenalty !== undefined) result.frequency_penalty = opts.frequencyPenalty;\n if (opts.presencePenalty !== undefined) result.presence_penalty = opts.presencePenalty;\n if (opts.stopSequences !== undefined && opts.stopSequences.length > 0) result.stop = opts.stopSequences;\n if (opts.seed !== undefined) result.seed = opts.seed;\n\n // Pass through additionalProperties — but don't overwrite mapped keys\n if (opts.additionalProperties) {\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\n if (!(k in result)) {\n result[k] = v;\n }\n }\n }\n\n return result;\n}\n\n/** Convert a Property list to a JSON Schema `{type: \"object\", properties: ...}`. */\nfunction schemaToWire(properties: unknown[]): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const p of properties as Array<{ name?: string; kind?: string; description?: string; required?: boolean; enumValues?: unknown[] }>) {\n if (!p.name) continue;\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[p.kind ?? \"string\"] ?? \"string\",\n };\n if (p.description) schema.description = p.description;\n if (p.enumValues && p.enumValues.length > 0) schema.enum = p.enumValues;\n props[p.name] = schema;\n if (p.required) required.push(p.name);\n }\n\n const result: Record<string, unknown> = { type: \"object\", properties: props };\n if (required.length > 0) result.required = required;\n return result;\n}\n\n/** Convert a single Property to a JSON Schema definition (recursive for structured output). */\nfunction propertyToJsonSchema(prop: {\n kind?: string;\n description?: string;\n enumValues?: unknown[];\n items?: unknown;\n properties?: unknown[];\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: KIND_TO_JSON_TYPE[prop.kind ?? \"string\"] ?? \"string\",\n };\n\n if (prop.description) schema.description = prop.description;\n if (prop.enumValues && prop.enumValues.length > 0) schema.enum = prop.enumValues;\n\n // Array items\n if (prop.kind === \"array\") {\n schema.items = prop.items\n ? propertyToJsonSchema(prop.items as typeof prop)\n : { type: \"string\" };\n }\n\n // Nested object\n if (prop.kind === \"object\") {\n if (prop.properties) {\n const nested: Record<string, unknown> = {};\n const req: string[] = [];\n for (const p of prop.properties as Array<{ name?: string } & typeof prop>) {\n if (!p.name) continue;\n nested[p.name] = propertyToJsonSchema(p);\n req.push(p.name);\n }\n schema.properties = nested;\n schema.required = req;\n } else {\n schema.properties = {};\n schema.required = [];\n }\n schema.additionalProperties = false;\n }\n\n return schema;\n}\n\nfunction toolsToWire(agent: Prompty): Record<string, unknown>[] {\n const tools = agent.tools;\n if (!tools || tools.length === 0) return [];\n\n const result: Record<string, unknown>[] = [];\n\n for (const t of tools) {\n if (t.kind === \"function\") {\n const funcDef: Record<string, unknown> = { name: t.name };\n if (t.description) funcDef.description = t.description;\n\n // Collect bound parameter names to strip from wire format\n const boundNames = new Set((t.bindings ?? []).map((b) => b.name));\n\n // Serialize parameters via schemaToWire, filtering out bound params\n let params = (t as { parameters?: unknown[] }).parameters;\n if (params && Array.isArray(params)) {\n if (boundNames.size > 0) {\n params = params.filter((p) => !boundNames.has((p as Record<string, unknown>).name as string));\n }\n funcDef.parameters = schemaToWire(params);\n }\n\n // Strict mode\n const strict = (t as { strict?: boolean }).strict;\n if (strict) {\n funcDef.strict = true;\n if (funcDef.parameters) {\n (funcDef.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n result.push({ type: \"function\", function: funcDef });\n } else if (t.kind === \"prompty\") {\n const funcDef = projectPromptyTool(t as unknown as Record<string, unknown>, agent);\n result.push({ type: \"function\", function: funcDef });\n }\n }\n\n return result;\n}\n\n/**\n * Project a PromptyTool as an OpenAI function definition.\n *\n * Loads the child `.prompty` file, uses its `inputs` as the\n * function parameters, and applies binding/strict stripping.\n */\nfunction projectPromptyTool(tool: Record<string, unknown>, parent: Prompty): Record<string, unknown> {\n const toolPath = tool.path as string | undefined;\n if (!toolPath) {\n throw new Error(`PromptyTool '${tool.name}' has no path`);\n }\n\n // Resolve child path relative to the parent .prompty file\n const parentPath = (parent.metadata ?? {}).__source_path as string | undefined;\n if (!parentPath) {\n throw new Error(\n `Cannot resolve PromptyTool '${tool.name}': parent agent has no __source_path in metadata`,\n );\n }\n const childPath = resolve(dirname(parentPath), toolPath);\n const child = loadPrompty(childPath);\n\n const funcDef: Record<string, unknown> = { name: tool.name };\n funcDef.description = (tool.description as string) || child.description || \"\";\n\n // Use child's inputs as parameters, stripping bound params\n const bindings = (tool as { bindings?: { name: string }[] }).bindings;\n const boundNames = new Set((bindings ?? []).map((b) => b.name));\n\n const childInputs = child.inputs ?? [];\n let params: unknown[] = childInputs;\n if (boundNames.size > 0) {\n params = params.filter((p) => !boundNames.has((p as Record<string, unknown>).name as string));\n }\n funcDef.parameters = schemaToWire(params);\n\n const strict = (tool as { strict?: boolean }).strict;\n if (strict) {\n funcDef.strict = true;\n if (funcDef.parameters) {\n (funcDef.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n return funcDef;\n}\n\nfunction outputSchemaToWire(agent: Prompty): Record<string, unknown> | null {\n const outputs = agent.outputs;\n if (!outputs || outputs.length === 0) return null;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const prop of outputs) {\n if (!prop.name) continue;\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\n required.push(prop.name);\n }\n\n const name = \"structured_output\";\n\n return {\n type: \"json_schema\",\n json_schema: {\n name,\n strict: true,\n schema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Responses API wire format\n// ---------------------------------------------------------------------------\n\n/**\n * Build Responses API arguments from agent config and messages.\n *\n * Key differences from Chat Completions:\n * - System messages → `instructions` parameter\n * - Other messages → `input` as EasyInputMessage[]\n * - `maxOutputTokens` → `max_output_tokens`\n * - Structured output → `text.format` (not `response_format`)\n * - Tools use flat `{ type: \"function\", name, parameters }` (not nested `function:`)\n */\nexport function buildResponsesArgs(\n agent: Prompty,\n messages: Message[],\n): Record<string, unknown> {\n const model = agent.model?.id || \"gpt-4o\";\n\n // Separate system messages as instructions, rest as input\n const systemParts: string[] = [];\n const inputMessages: Record<string, unknown>[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\" || msg.role === \"developer\") {\n systemParts.push(msg.text);\n } else {\n inputMessages.push(messageToResponsesInput(msg));\n }\n }\n\n const args: Record<string, unknown> = {\n model,\n input: inputMessages,\n };\n\n // Set instructions from system messages\n if (systemParts.length > 0) {\n args.instructions = systemParts.join(\"\\n\\n\");\n }\n\n // Map model options\n const responseOpts = buildResponsesOptions(agent);\n Object.assign(args, responseOpts);\n\n // Tools\n const tools = responsesToolsToWire(agent);\n if (tools.length > 0) {\n args.tools = tools;\n }\n\n // Structured output via text.format\n const textConfig = outputSchemaToResponsesWire(agent);\n if (textConfig) {\n args.text = textConfig;\n }\n\n return args;\n}\n\n/** Convert a Message to Responses API EasyInputMessage format. */\nfunction messageToResponsesInput(msg: Message): Record<string, unknown> {\n const content = msg.toTextContent();\n\n // Pass-through original function_call items from the agent loop\n if (msg.metadata.responses_function_call) {\n return msg.metadata.responses_function_call as Record<string, unknown>;\n }\n\n // Tool result messages → function_call_output\n if (msg.metadata.tool_call_id) {\n return {\n type: \"function_call_output\",\n call_id: msg.metadata.tool_call_id,\n output: typeof content === \"string\" ? content : JSON.stringify(content),\n };\n }\n\n const role = msg.role === \"tool\" ? \"user\" : msg.role;\n return { role, content };\n}\n\n/** Build Responses-specific model options. */\nfunction buildResponsesOptions(agent: Prompty): Record<string, unknown> {\n const opts = agent.model?.options;\n if (!opts) return {};\n\n const result: Record<string, unknown> = {};\n\n if (opts.temperature !== undefined) result.temperature = opts.temperature;\n if (opts.maxOutputTokens !== undefined) result.max_output_tokens = opts.maxOutputTokens;\n if (opts.topP !== undefined) result.top_p = opts.topP;\n\n // Pass through additionalProperties — but don't overwrite mapped keys\n if (opts.additionalProperties) {\n for (const [k, v] of Object.entries(opts.additionalProperties)) {\n if (!(k in result)) {\n result[k] = v;\n }\n }\n }\n\n return result;\n}\n\n/** Convert agent tools to Responses API tool format. */\nfunction responsesToolsToWire(agent: Prompty): Record<string, unknown>[] {\n const tools = agent.tools;\n if (!tools || tools.length === 0) return [];\n\n const result: Record<string, unknown>[] = [];\n\n for (const t of tools) {\n if (t.kind === \"function\") {\n // Responses API uses flat tool format (not nested under \"function:\")\n const tool: Record<string, unknown> = {\n type: \"function\",\n name: t.name,\n };\n if (t.description) tool.description = t.description;\n\n const params = (t as { parameters?: unknown[] }).parameters;\n if (params && Array.isArray(params)) {\n tool.parameters = schemaToWire(params);\n }\n\n const strict = (t as { strict?: boolean }).strict;\n if (strict) {\n tool.strict = true;\n if (tool.parameters) {\n (tool.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n result.push(tool);\n } else if (t.kind === \"prompty\") {\n // Project prompty tool as a flat function definition (Responses API format)\n const projected = projectPromptyTool(t as unknown as Record<string, unknown>, agent);\n const tool: Record<string, unknown> = {\n type: \"function\",\n name: projected.name,\n };\n if (projected.description) tool.description = projected.description;\n if (projected.parameters) tool.parameters = projected.parameters;\n\n const strict = (projected as Record<string, unknown>).strict;\n if (strict) {\n tool.strict = true;\n if (tool.parameters) {\n (tool.parameters as Record<string, unknown>).additionalProperties = false;\n }\n }\n\n result.push(tool);\n }\n }\n\n return result;\n}\n\n/** Convert outputSchema to Responses API text.format config. */\nfunction outputSchemaToResponsesWire(agent: Prompty): Record<string, unknown> | null {\n const outputs = agent.outputs;\n if (!outputs || outputs.length === 0) return null;\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const prop of outputs) {\n if (!prop.name) continue;\n properties[prop.name] = propertyToJsonSchema(prop as Parameters<typeof propertyToJsonSchema>[0]);\n required.push(prop.name);\n }\n\n const name = \"structured_output\";\n\n return {\n format: {\n type: \"json_schema\",\n name,\n strict: true,\n schema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n },\n };\n}\n","/**\n * OpenAI processor — extracts clean results from raw OpenAI responses.\n *\n * Handles ChatCompletion, Embedding, Image, and streaming responses.\n *\n * @module\n */\n\nimport type { Prompty } from \"@prompty/core\";\nimport type { Processor } from \"@prompty/core\";\nimport type { ToolCall } from \"@prompty/core\";\nimport { traceSpan } from \"@prompty/core\";\n\nexport class OpenAIProcessor implements Processor {\n async process(agent: Prompty, response: unknown): Promise<unknown> {\n return traceSpan(\"OpenAIProcessor\", async (emit) => {\n emit(\"signature\", \"prompty.openai.processor.OpenAIProcessor.invoke\");\n emit(\"inputs\", { data: response });\n const result = processResponse(agent, response);\n // Don't emit result for streaming — it's a generator, not a value\n if (!isAsyncIterable(response)) {\n emit(\"result\", result);\n }\n return result;\n });\n }\n}\n\n/**\n * Extract clean content from an OpenAI response.\n */\nexport function processResponse(agent: Prompty, response: unknown): unknown {\n if (typeof response !== \"object\" || response === null) return response;\n\n // Streaming response — return content-extracting async generator\n if (isAsyncIterable(response)) {\n return streamGenerator(response);\n }\n\n const r = response as Record<string, unknown>;\n\n // Responses API — has output[] and object === \"response\"\n if (r.object === \"response\" && Array.isArray(r.output)) {\n return processResponsesApi(agent, r);\n }\n\n // ChatCompletion\n if (r.choices) {\n return processChatCompletion(agent, r);\n }\n\n // Embedding response\n if (r.data && r.object === \"list\") {\n return processEmbedding(r);\n }\n\n // Image response\n if (r.data && Array.isArray(r.data)) {\n const data = r.data as Record<string, unknown>[];\n if (data.length > 0 && (\"url\" in data[0] || \"b64_json\" in data[0])) {\n return processImage(r);\n }\n }\n\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Streaming\n// ---------------------------------------------------------------------------\n\n/** Type guard for async iterables (PromptyStream or raw SDK stream). */\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value\n );\n}\n\n/**\n * Yield content chunks, tool calls, or refusals from a streaming response.\n *\n * Handles three types of streaming deltas:\n * - `delta.content` — yields content strings\n * - `delta.tool_calls` — accumulates partial tool call chunks,\n * yields ToolCall objects when the stream ends\n * - `delta.refusal` — throws Error with the refusal message\n *\n * Matches the Python `_stream_generator` / `_async_stream_generator`.\n */\nasync function* streamGenerator(\n response: AsyncIterable<unknown>,\n): AsyncGenerator<string | ToolCall> {\n const toolCallAcc: Map<number, { id: string; name: string; arguments: string }> = new Map();\n\n for await (const chunk of response) {\n const c = chunk as Record<string, unknown>;\n const choices = c.choices as Record<string, unknown>[] | undefined;\n if (!choices || choices.length === 0) continue;\n\n const delta = (choices[0] as Record<string, unknown>).delta as Record<string, unknown> | undefined;\n if (!delta) continue;\n\n // Content\n if (delta.content != null) {\n yield delta.content as string;\n }\n\n // Tool call deltas — accumulate index-keyed partial chunks\n const tcDeltas = delta.tool_calls as Record<string, unknown>[] | undefined;\n if (tcDeltas) {\n for (const tcDelta of tcDeltas) {\n const idx = tcDelta.index as number;\n if (!toolCallAcc.has(idx)) {\n toolCallAcc.set(idx, { id: \"\", name: \"\", arguments: \"\" });\n }\n const acc = toolCallAcc.get(idx)!;\n if (tcDelta.id) acc.id = tcDelta.id as string;\n const fn = tcDelta.function as Record<string, unknown> | undefined;\n if (fn) {\n if (fn.name) acc.name = fn.name as string;\n if (fn.arguments) acc.arguments += fn.arguments as string;\n }\n }\n }\n\n // Refusal\n if (delta.refusal != null) {\n throw new Error(`Model refused: ${delta.refusal}`);\n }\n }\n\n // Yield accumulated tool calls at the end of the stream\n const sortedIndices = [...toolCallAcc.keys()].sort((a, b) => a - b);\n for (const idx of sortedIndices) {\n const tc = toolCallAcc.get(idx)!;\n yield { id: tc.id, name: tc.name, arguments: tc.arguments } as ToolCall;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Responses API processing\n// ---------------------------------------------------------------------------\n\n/**\n * Process a Responses API response.\n *\n * Extracts:\n * - Text content from `output_text` or output message items\n * - Function tool calls from `function_call` output items\n * - JSON-parsed content when outputSchema is present\n */\nfunction processResponsesApi(\n agent: Prompty,\n response: Record<string, unknown>,\n): unknown {\n const output = response.output as Record<string, unknown>[];\n\n // Collect function calls\n const funcCalls: ToolCall[] = [];\n for (const item of output) {\n if (item.type === \"function_call\") {\n funcCalls.push({\n id: (item.call_id ?? item.id ?? \"\") as string,\n name: item.name as string,\n arguments: item.arguments as string,\n });\n }\n }\n\n if (funcCalls.length > 0) {\n return funcCalls;\n }\n\n // Text content — use output_text convenience field\n const outputText = response.output_text as string | undefined;\n if (outputText !== undefined) {\n // Structured output — JSON parse when outputs schema exists\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(outputText);\n } catch {\n return outputText;\n }\n }\n return outputText;\n }\n\n // Fallback: extract from output message items\n const texts: string[] = [];\n for (const item of output) {\n if (item.type === \"message\") {\n const content = item.content as Record<string, unknown>[] | undefined;\n if (content) {\n for (const part of content) {\n if (part.type === \"output_text\" || part.type === \"text\") {\n texts.push(part.text as string);\n }\n }\n }\n }\n }\n\n if (texts.length > 0) {\n const text = texts.join(\"\");\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n }\n\n return response;\n}\n\n// ---------------------------------------------------------------------------\n// Non-streaming response processing\n// ---------------------------------------------------------------------------\n\nfunction processChatCompletion(\n agent: Prompty,\n response: Record<string, unknown>,\n): unknown {\n const choices = response.choices as Record<string, unknown>[];\n if (!choices || choices.length === 0) return null;\n\n const choice = choices[0];\n const message = choice.message as Record<string, unknown>;\n if (!message) return null;\n\n // Tool calls\n const toolCalls = message.tool_calls as Record<string, unknown>[] | undefined;\n if (toolCalls && toolCalls.length > 0) {\n return toolCalls.map((tc): ToolCall => {\n const fn = tc.function as Record<string, unknown>;\n return {\n id: tc.id as string,\n name: fn.name as string,\n arguments: fn.arguments as string,\n };\n });\n }\n\n // Content\n const content = message.content as string | null;\n\n // Refusal — when content is null but refusal is present, return the refusal\n if (content === null) {\n const refusal = message.refusal as string | undefined;\n if (typeof refusal === \"string\") return refusal;\n return null;\n }\n\n // Structured output — JSON parse when outputs schema exists\n if (agent.outputs && agent.outputs.length > 0) {\n try {\n return JSON.parse(content);\n } catch {\n return content;\n }\n }\n\n return content;\n}\n\nfunction processEmbedding(response: Record<string, unknown>): unknown {\n const data = response.data as Record<string, unknown>[];\n if (data.length === 1) {\n return (data[0] as Record<string, unknown>).embedding;\n }\n return data.map((d) => (d as Record<string, unknown>).embedding);\n}\n\nfunction processImage(response: Record<string, unknown>): unknown {\n const data = response.data as Record<string, unknown>[];\n if (data.length === 1) {\n return data[0].url ?? data[0].b64_json;\n }\n return data.map((d) => d.url ?? d.b64_json);\n}\n"],"mappings":"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","names":["import_core","loadPrompty","OpenAI","import_core","import_core"]}
package/dist/index.js CHANGED
@@ -5,6 +5,8 @@ import { getConnection } from "@prompty/core";
5
5
  import { traceSpan, sanitizeValue } from "@prompty/core";
6
6
 
7
7
  // src/wire.ts
8
+ import { load as loadPrompty } from "@prompty/core";
9
+ import { dirname, resolve } from "path";
8
10
  function messageToWire(msg) {
9
11
  const wire = { role: msg.role };
10
12
  for (const [k, v] of Object.entries(msg.metadata)) {
@@ -34,13 +36,26 @@ function partToWire(part) {
34
36
  type: "input_audio",
35
37
  input_audio: {
36
38
  data: part.source,
37
- ...part.mediaType && { format: part.mediaType }
39
+ ...part.mediaType && { format: mimeToAudioFormat(part.mediaType) }
38
40
  }
39
41
  };
40
42
  case "file":
41
43
  return { type: "file", file: { url: part.source } };
42
44
  }
43
45
  }
46
+ var AUDIO_MIME_MAP = {
47
+ "audio/wav": "wav",
48
+ "audio/mpeg": "mp3",
49
+ "audio/mp3": "mp3",
50
+ "audio/mp4": "mp4",
51
+ "audio/ogg": "ogg",
52
+ "audio/flac": "flac",
53
+ "audio/webm": "webm",
54
+ "audio/pcm": "pcm"
55
+ };
56
+ function mimeToAudioFormat(mediaType) {
57
+ return AUDIO_MIME_MAP[mediaType.toLowerCase()] ?? mediaType;
58
+ }
44
59
  function buildChatArgs(agent, messages) {
45
60
  const model = agent.model?.id || "gpt-4";
46
61
  const wireMessages = messages.map(messageToWire);
@@ -61,10 +76,24 @@ function buildChatArgs(agent, messages) {
61
76
  }
62
77
  function buildEmbeddingArgs(agent, data) {
63
78
  const model = agent.model?.id || "text-embedding-ada-002";
64
- const args = {
65
- input: Array.isArray(data) ? data : [data],
66
- model
67
- };
79
+ let input;
80
+ if (Array.isArray(data)) {
81
+ const texts = data.map((item) => {
82
+ if (typeof item === "string") return item;
83
+ if (item && typeof item === "object" && "text" in item) return item.text;
84
+ if (item && typeof item === "object" && "toTextContent" in item) {
85
+ const content = item.toTextContent();
86
+ return typeof content === "string" ? content : String(content);
87
+ }
88
+ return String(item);
89
+ });
90
+ input = texts.length === 1 ? texts[0] : texts;
91
+ } else if (typeof data === "string") {
92
+ input = data;
93
+ } else {
94
+ input = String(data);
95
+ }
96
+ const args = { input, model };
68
97
  const extra = agent.model?.options?.additionalProperties;
69
98
  if (extra) {
70
99
  for (const [k, v] of Object.entries(extra)) {
@@ -116,7 +145,7 @@ function buildOptions(agent) {
116
145
  if (opts.topP !== void 0) result.top_p = opts.topP;
117
146
  if (opts.frequencyPenalty !== void 0) result.frequency_penalty = opts.frequencyPenalty;
118
147
  if (opts.presencePenalty !== void 0) result.presence_penalty = opts.presencePenalty;
119
- if (opts.stopSequences !== void 0) result.stop = opts.stopSequences;
148
+ if (opts.stopSequences !== void 0 && opts.stopSequences.length > 0) result.stop = opts.stopSequences;
120
149
  if (opts.seed !== void 0) result.seed = opts.seed;
121
150
  if (opts.additionalProperties) {
122
151
  for (const [k, v] of Object.entries(opts.additionalProperties)) {
@@ -177,24 +206,64 @@ function toolsToWire(agent) {
177
206
  if (!tools || tools.length === 0) return [];
178
207
  const result = [];
179
208
  for (const t of tools) {
180
- if (t.kind !== "function") continue;
181
- const funcDef = { name: t.name };
182
- if (t.description) funcDef.description = t.description;
183
- const params = t.parameters;
184
- if (params && Array.isArray(params)) {
185
- funcDef.parameters = schemaToWire(params);
186
- }
187
- const strict = t.strict;
188
- if (strict) {
189
- funcDef.strict = true;
190
- if (funcDef.parameters) {
191
- funcDef.parameters.additionalProperties = false;
209
+ if (t.kind === "function") {
210
+ const funcDef = { name: t.name };
211
+ if (t.description) funcDef.description = t.description;
212
+ const boundNames = new Set((t.bindings ?? []).map((b) => b.name));
213
+ let params = t.parameters;
214
+ if (params && Array.isArray(params)) {
215
+ if (boundNames.size > 0) {
216
+ params = params.filter((p) => !boundNames.has(p.name));
217
+ }
218
+ funcDef.parameters = schemaToWire(params);
192
219
  }
220
+ const strict = t.strict;
221
+ if (strict) {
222
+ funcDef.strict = true;
223
+ if (funcDef.parameters) {
224
+ funcDef.parameters.additionalProperties = false;
225
+ }
226
+ }
227
+ result.push({ type: "function", function: funcDef });
228
+ } else if (t.kind === "prompty") {
229
+ const funcDef = projectPromptyTool(t, agent);
230
+ result.push({ type: "function", function: funcDef });
193
231
  }
194
- result.push({ type: "function", function: funcDef });
195
232
  }
196
233
  return result;
197
234
  }
235
+ function projectPromptyTool(tool, parent) {
236
+ const toolPath = tool.path;
237
+ if (!toolPath) {
238
+ throw new Error(`PromptyTool '${tool.name}' has no path`);
239
+ }
240
+ const parentPath = (parent.metadata ?? {}).__source_path;
241
+ if (!parentPath) {
242
+ throw new Error(
243
+ `Cannot resolve PromptyTool '${tool.name}': parent agent has no __source_path in metadata`
244
+ );
245
+ }
246
+ const childPath = resolve(dirname(parentPath), toolPath);
247
+ const child = loadPrompty(childPath);
248
+ const funcDef = { name: tool.name };
249
+ funcDef.description = tool.description || child.description || "";
250
+ const bindings = tool.bindings;
251
+ const boundNames = new Set((bindings ?? []).map((b) => b.name));
252
+ const childInputs = child.inputs ?? [];
253
+ let params = childInputs;
254
+ if (boundNames.size > 0) {
255
+ params = params.filter((p) => !boundNames.has(p.name));
256
+ }
257
+ funcDef.parameters = schemaToWire(params);
258
+ const strict = tool.strict;
259
+ if (strict) {
260
+ funcDef.strict = true;
261
+ if (funcDef.parameters) {
262
+ funcDef.parameters.additionalProperties = false;
263
+ }
264
+ }
265
+ return funcDef;
266
+ }
198
267
  function outputSchemaToWire(agent) {
199
268
  const outputs = agent.outputs;
200
269
  if (!outputs || outputs.length === 0) return null;
@@ -205,7 +274,7 @@ function outputSchemaToWire(agent) {
205
274
  properties[prop.name] = propertyToJsonSchema(prop);
206
275
  required.push(prop.name);
207
276
  }
208
- const name = (agent.name || "response").toLowerCase().replace(/[\s-]/g, "_");
277
+ const name = "structured_output";
209
278
  return {
210
279
  type: "json_schema",
211
280
  json_schema: {
@@ -252,6 +321,9 @@ function buildResponsesArgs(agent, messages) {
252
321
  }
253
322
  function messageToResponsesInput(msg) {
254
323
  const content = msg.toTextContent();
324
+ if (msg.metadata.responses_function_call) {
325
+ return msg.metadata.responses_function_call;
326
+ }
255
327
  if (msg.metadata.tool_call_id) {
256
328
  return {
257
329
  type: "function_call_output",
@@ -283,24 +355,41 @@ function responsesToolsToWire(agent) {
283
355
  if (!tools || tools.length === 0) return [];
284
356
  const result = [];
285
357
  for (const t of tools) {
286
- if (t.kind !== "function") continue;
287
- const tool = {
288
- type: "function",
289
- name: t.name
290
- };
291
- if (t.description) tool.description = t.description;
292
- const params = t.parameters;
293
- if (params && Array.isArray(params)) {
294
- tool.parameters = schemaToWire(params);
295
- }
296
- const strict = t.strict;
297
- if (strict) {
298
- tool.strict = true;
299
- if (tool.parameters) {
300
- tool.parameters.additionalProperties = false;
358
+ if (t.kind === "function") {
359
+ const tool = {
360
+ type: "function",
361
+ name: t.name
362
+ };
363
+ if (t.description) tool.description = t.description;
364
+ const params = t.parameters;
365
+ if (params && Array.isArray(params)) {
366
+ tool.parameters = schemaToWire(params);
301
367
  }
368
+ const strict = t.strict;
369
+ if (strict) {
370
+ tool.strict = true;
371
+ if (tool.parameters) {
372
+ tool.parameters.additionalProperties = false;
373
+ }
374
+ }
375
+ result.push(tool);
376
+ } else if (t.kind === "prompty") {
377
+ const projected = projectPromptyTool(t, agent);
378
+ const tool = {
379
+ type: "function",
380
+ name: projected.name
381
+ };
382
+ if (projected.description) tool.description = projected.description;
383
+ if (projected.parameters) tool.parameters = projected.parameters;
384
+ const strict = projected.strict;
385
+ if (strict) {
386
+ tool.strict = true;
387
+ if (tool.parameters) {
388
+ tool.parameters.additionalProperties = false;
389
+ }
390
+ }
391
+ result.push(tool);
302
392
  }
303
- result.push(tool);
304
393
  }
305
394
  return result;
306
395
  }
@@ -314,7 +403,7 @@ function outputSchemaToResponsesWire(agent) {
314
403
  properties[prop.name] = propertyToJsonSchema(prop);
315
404
  required.push(prop.name);
316
405
  }
317
- const name = (agent.name || "response").toLowerCase().replace(/[\s-]/g, "_");
406
+ const name = "structured_output";
318
407
  return {
319
408
  format: {
320
409
  type: "json_schema",
@@ -357,8 +446,7 @@ var OpenAIExecutor = class {
357
446
  /** Dispatch to the appropriate API and trace the call. */
358
447
  async executeApiCall(client, clientName, agent, messages, apiType) {
359
448
  switch (apiType) {
360
- case "chat":
361
- case "agent": {
449
+ case "chat": {
362
450
  const args = buildChatArgs(agent, messages);
363
451
  const isStreaming = !!args.stream;
364
452
  return traceSpan("create", async (callEmit) => {
@@ -432,6 +520,10 @@ var OpenAIExecutor = class {
432
520
  if (conn instanceof ApiKeyConnection) {
433
521
  if (conn.apiKey) kwargs.apiKey = conn.apiKey;
434
522
  if (conn.endpoint) kwargs.baseURL = conn.endpoint;
523
+ } else if (conn) {
524
+ throw new Error(
525
+ `Connection kind '${conn.kind}' is not supported by the OpenAI executor. Use 'key' for API key auth or 'reference' with registerConnection() for pre-configured clients.`
526
+ );
435
527
  }
436
528
  return kwargs;
437
529
  }
@@ -585,7 +677,11 @@ function processChatCompletion(agent, response) {
585
677
  });
586
678
  }
587
679
  const content = message.content;
588
- if (content === null) return null;
680
+ if (content === null) {
681
+ const refusal = message.refusal;
682
+ if (typeof refusal === "string") return refusal;
683
+ return null;
684
+ }
589
685
  if (agent.outputs && agent.outputs.length > 0) {
590
686
  try {
591
687
  return JSON.parse(content);