@glueco/plugin-llm-openai 0.1.1 → 0.1.2

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.
@@ -8,7 +8,7 @@ import {
8
8
  PROVIDER,
9
9
  RESOURCE_TYPE,
10
10
  VERSION
11
- } from "./chunk-6FNYHOB5.mjs";
11
+ } from "./chunk-VWR4ADAV.mjs";
12
12
 
13
13
  // src/proxy.ts
14
14
  import { createPluginBase } from "@glueco/shared";
@@ -81,6 +81,7 @@ var openaiPlugin = {
81
81
  supports: {
82
82
  enforcement: [...ENFORCEMENT_SUPPORT]
83
83
  },
84
+ defaultModels: DEFAULT_OPENAI_MODELS,
84
85
  // Client contract metadata for SDK-compatible plugins
85
86
  client: {
86
87
  namespace: "openai",
@@ -228,4 +229,4 @@ export {
228
229
  openaiPlugin,
229
230
  proxy_default
230
231
  };
231
- //# sourceMappingURL=chunk-6GMCQHIR.mjs.map
232
+ //# sourceMappingURL=chunk-QKYD26TX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/proxy.ts"],"sourcesContent":["// ============================================\n// OPENAI PLUGIN PROXY\n// Server-side plugin implementation for the gateway\n// ============================================\n//\n// This module is imported by the proxy to handle OpenAI requests.\n// It should NOT be imported by target apps.\n//\n// Import path: @glueco/plugin-llm-openai/proxy\n// ============================================\n\nimport type {\n PluginContract,\n PluginResourceConstraints,\n PluginValidationResult,\n PluginExecuteContext,\n PluginExecuteOptions,\n PluginExecuteResult,\n PluginUsageMetrics,\n PluginMappedError,\n EnforcementFields,\n} from \"@glueco/shared\";\nimport { createPluginBase } from \"@glueco/shared\";\n\nimport {\n ChatCompletionRequestSchema,\n type ChatCompletionRequest,\n PLUGIN_ID,\n RESOURCE_TYPE,\n PROVIDER,\n VERSION,\n DEFAULT_OPENAI_MODELS,\n ACTIONS,\n ENFORCEMENT_SUPPORT,\n DEFAULT_API_URL,\n} from \"./contracts\";\n\n// ============================================\n// ERROR HANDLING\n// ============================================\n\nclass OpenAIApiError extends Error {\n constructor(\n public status: number,\n public body: string,\n ) {\n super(`OpenAI API error: ${status}`);\n this.name = \"OpenAIApiError\";\n }\n}\n\nfunction mapOpenAIError(error: OpenAIApiError): PluginMappedError {\n let parsed: { error?: { message?: string; type?: string; code?: string } } =\n {};\n try {\n parsed = JSON.parse(error.body);\n } catch {\n // Ignore parse errors\n }\n\n const message = parsed.error?.message || error.body;\n const code = parsed.error?.code;\n\n switch (error.status) {\n case 400:\n return { status: 400, code: \"BAD_REQUEST\", message, retryable: false };\n case 401:\n return {\n status: 401,\n code: \"UNAUTHORIZED\",\n message: \"Invalid API key\",\n retryable: false,\n };\n case 403:\n return { status: 403, code: \"FORBIDDEN\", message, retryable: false };\n case 404:\n return { status: 404, code: \"NOT_FOUND\", message, retryable: false };\n case 429:\n // OpenAI distinguishes between rate limits and quota exceeded\n if (code === \"insufficient_quota\") {\n return {\n status: 429,\n code: \"QUOTA_EXCEEDED\",\n message: \"API quota exceeded\",\n retryable: false,\n };\n }\n return { status: 429, code: \"RATE_LIMITED\", message, retryable: true };\n case 500:\n case 502:\n case 503:\n return {\n status: error.status,\n code: \"PROVIDER_ERROR\",\n message,\n retryable: true,\n };\n default:\n return {\n status: error.status,\n code: \"UNKNOWN\",\n message,\n retryable: false,\n };\n }\n}\n\n// ============================================\n// PLUGIN IMPLEMENTATION\n// ============================================\n\nconst openaiPlugin: PluginContract = {\n ...createPluginBase({\n id: PLUGIN_ID,\n resourceType: RESOURCE_TYPE,\n provider: PROVIDER,\n version: VERSION,\n name: \"OpenAI LLM\",\n actions: [...ACTIONS],\n supports: {\n enforcement: [...ENFORCEMENT_SUPPORT],\n },\n defaultModels: DEFAULT_OPENAI_MODELS,\n // Client contract metadata for SDK-compatible plugins\n client: {\n namespace: \"openai\",\n actions: {\n \"chat.completions\": {\n description: \"Generate chat completions using OpenAI GPT models\",\n },\n },\n },\n }),\n\n // Credential schema for UI\n credentialSchema: {\n fields: [\n {\n name: \"apiKey\",\n type: \"secret\",\n label: \"API Key\",\n description: \"Your OpenAI API key (starts with sk-)\",\n required: true,\n },\n {\n name: \"organization\",\n type: \"string\",\n label: \"Organization ID\",\n description: \"Optional OpenAI organization ID\",\n required: false,\n },\n {\n name: \"baseUrl\",\n type: \"url\",\n label: \"Base URL\",\n description:\n \"Custom API base URL (optional, for Azure OpenAI or proxies)\",\n required: false,\n default: DEFAULT_API_URL,\n },\n ],\n },\n\n validateAndShape(\n action: string,\n input: unknown,\n constraints: PluginResourceConstraints,\n ): PluginValidationResult {\n if (action !== \"chat.completions\") {\n return { valid: false, error: `Unsupported action: ${action}` };\n }\n\n // Parse input - this is the schema-first validation\n const parsed = ChatCompletionRequestSchema.safeParse(input);\n if (!parsed.success) {\n return {\n valid: false,\n error: `Invalid request: ${parsed.error.errors.map((e) => e.message).join(\", \")}`,\n };\n }\n\n const request = parsed.data;\n\n // Build enforcement fields from validated request\n // These are extracted DURING validation, not after\n const enforcement: EnforcementFields = {\n model: request.model,\n stream: request.stream ?? false,\n usesTools: Array.isArray(request.tools) && request.tools.length > 0,\n maxOutputTokens: request.max_tokens ?? request.max_completion_tokens,\n };\n\n // Check allowed models\n const allowedModels = constraints.allowedModels ?? [\n ...DEFAULT_OPENAI_MODELS,\n ];\n if (!allowedModels.includes(request.model)) {\n return {\n valid: false,\n error: `Model '${request.model}' not allowed. Allowed: ${allowedModels.join(\", \")}`,\n };\n }\n\n // Enforce max tokens\n const maxTokens = constraints.maxOutputTokens ?? 16384;\n const requestedTokens = request.max_tokens ?? request.max_completion_tokens;\n\n if (requestedTokens && requestedTokens > maxTokens) {\n return {\n valid: false,\n error: `max_tokens (${requestedTokens}) exceeds limit (${maxTokens})`,\n };\n }\n\n // Check streaming permission\n if (request.stream && constraints.allowStreaming === false) {\n return {\n valid: false,\n error: \"Streaming is not allowed for this app\",\n };\n }\n\n // Shape the request (apply defaults, caps)\n const shapedRequest: ChatCompletionRequest = {\n ...request,\n max_tokens: requestedTokens\n ? Math.min(requestedTokens, maxTokens)\n : undefined, // OpenAI doesn't require max_tokens\n };\n\n return { valid: true, shapedInput: shapedRequest, enforcement };\n },\n\n async execute(\n action: string,\n shapedInput: unknown,\n ctx: PluginExecuteContext,\n options: PluginExecuteOptions,\n ): Promise<PluginExecuteResult> {\n const request = shapedInput as ChatCompletionRequest;\n const baseUrl = (ctx.config?.baseUrl as string) || DEFAULT_API_URL;\n const organization = ctx.config?.organization as string | undefined;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${ctx.secret}`,\n };\n\n // Add organization header if provided\n if (organization) {\n headers[\"OpenAI-Organization\"] = organization;\n }\n\n const response = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new OpenAIApiError(response.status, errorBody);\n }\n\n if (request.stream) {\n // Return streaming response\n return {\n stream: response.body!,\n contentType: \"text/event-stream\",\n };\n } else {\n // Return JSON response\n const json = await response.json();\n return {\n response: json,\n contentType: \"application/json\",\n usage: this.extractUsage(json),\n };\n }\n },\n\n extractUsage(response: unknown): PluginUsageMetrics {\n const res = response as {\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n model?: string;\n };\n\n return {\n inputTokens: res.usage?.prompt_tokens,\n outputTokens: res.usage?.completion_tokens,\n totalTokens: res.usage?.total_tokens,\n model: res.model,\n };\n },\n\n mapError(error: unknown): PluginMappedError {\n if (error instanceof OpenAIApiError) {\n return mapOpenAIError(error);\n }\n\n return {\n status: 500,\n code: \"INTERNAL_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n retryable: false,\n };\n },\n};\n\nexport default openaiPlugin;\n\n// Also export named for flexibility\nexport { openaiPlugin };\n"],"mappings":"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","names":[]}
@@ -205,33 +205,22 @@ var RESOURCE_TYPE = "llm";
205
205
  var PROVIDER = "openai";
206
206
  var VERSION = "1.0.0";
207
207
  var DEFAULT_OPENAI_MODELS = [
208
+ // GPT-5 family
209
+ "gpt-5.2",
210
+ "gpt-5.2-pro",
211
+ "gpt-5-mini",
212
+ "gpt-5-nano",
213
+ // GPT-4.1 family
214
+ "gpt-4.1",
215
+ "gpt-4.1-mini",
216
+ "gpt-4.1-nano",
208
217
  // GPT-4o family
209
218
  "gpt-4o",
210
- "gpt-4o-2024-11-20",
211
- "gpt-4o-2024-08-06",
212
- "gpt-4o-2024-05-13",
213
219
  "gpt-4o-mini",
214
- "gpt-4o-mini-2024-07-18",
215
- // GPT-4 Turbo
216
- "gpt-4-turbo",
217
- "gpt-4-turbo-2024-04-09",
218
- "gpt-4-turbo-preview",
219
- "gpt-4-0125-preview",
220
- "gpt-4-1106-preview",
221
- // GPT-4
222
- "gpt-4",
223
- "gpt-4-0613",
224
- // GPT-3.5 Turbo
225
- "gpt-3.5-turbo",
226
- "gpt-3.5-turbo-0125",
227
- "gpt-3.5-turbo-1106",
228
- // o1 family (reasoning models)
229
- "o1",
230
- "o1-2024-12-17",
231
- "o1-preview",
232
- "o1-preview-2024-09-12",
233
- "o1-mini",
234
- "o1-mini-2024-09-12"
220
+ // o3/o4 reasoning models
221
+ "o3",
222
+ "o3-pro",
223
+ "o4-mini"
235
224
  ];
236
225
  var ACTIONS = ["chat.completions"];
237
226
  var ENFORCEMENT_SUPPORT = [
@@ -258,4 +247,4 @@ export {
258
247
  ENFORCEMENT_SUPPORT,
259
248
  DEFAULT_API_URL
260
249
  };
261
- //# sourceMappingURL=chunk-6FNYHOB5.mjs.map
250
+ //# sourceMappingURL=chunk-VWR4ADAV.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/contracts.ts"],"sourcesContent":["// ============================================\n// OPENAI PLUGIN CONTRACTS\n// Shared request/response schemas for proxy and client\n// ============================================\n\nimport { z } from \"zod\";\n\n// ============================================\n// REQUEST SCHEMAS (OpenAI Chat Completion API)\n// ============================================\n\nexport const ChatMessageSchema = z.object({\n role: z.enum([\"system\", \"user\", \"assistant\", \"tool\", \"function\"]),\n content: z\n .union([\n z.string(),\n z.array(\n z.object({\n type: z.enum([\"text\", \"image_url\"]),\n text: z.string().optional(),\n image_url: z\n .object({\n url: z.string(),\n detail: z.enum([\"auto\", \"low\", \"high\"]).optional(),\n })\n .optional(),\n }),\n ),\n ])\n .nullable(),\n name: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n tool_call_id: z.string().optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n});\n\nexport type ChatMessage = z.infer<typeof ChatMessageSchema>;\n\nexport const ToolSchema = z.object({\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n description: z.string().optional(),\n parameters: z.record(z.unknown()).optional(),\n strict: z.boolean().optional(),\n }),\n});\n\nexport type Tool = z.infer<typeof ToolSchema>;\n\nexport const ChatCompletionRequestSchema = z.object({\n model: z.string(),\n messages: z.array(ChatMessageSchema),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n n: z.number().int().min(1).max(10).optional(),\n stream: z.boolean().optional(),\n stream_options: z\n .object({\n include_usage: z.boolean().optional(),\n })\n .optional(),\n stop: z.union([z.string(), z.array(z.string())]).optional(),\n max_tokens: z.number().int().positive().optional(),\n max_completion_tokens: z.number().int().positive().optional(),\n presence_penalty: z.number().min(-2).max(2).optional(),\n frequency_penalty: z.number().min(-2).max(2).optional(),\n logit_bias: z.record(z.number()).optional(),\n logprobs: z.boolean().optional(),\n top_logprobs: z.number().int().min(0).max(20).optional(),\n user: z.string().optional(),\n tools: z.array(ToolSchema).optional(),\n tool_choice: z\n .union([\n z.literal(\"none\"),\n z.literal(\"auto\"),\n z.literal(\"required\"),\n z.object({\n type: z.literal(\"function\"),\n function: z.object({ name: z.string() }),\n }),\n ])\n .optional(),\n parallel_tool_calls: z.boolean().optional(),\n response_format: z\n .union([\n z.object({ type: z.literal(\"text\") }),\n z.object({ type: z.literal(\"json_object\") }),\n z.object({\n type: z.literal(\"json_schema\"),\n json_schema: z.object({\n name: z.string(),\n description: z.string().optional(),\n schema: z.record(z.unknown()),\n strict: z.boolean().optional(),\n }),\n }),\n ])\n .optional(),\n seed: z.number().int().optional(),\n service_tier: z.enum([\"auto\", \"default\"]).optional(),\n});\n\nexport type ChatCompletionRequest = z.infer<typeof ChatCompletionRequestSchema>;\n\n// ============================================\n// RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChoiceSchema = z.object({\n index: z.number(),\n message: z.object({\n role: z.literal(\"assistant\"),\n content: z.string().nullable(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\"stop\", \"length\", \"tool_calls\", \"content_filter\", \"function_call\"])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n});\n\nexport type ChatCompletionChoice = z.infer<typeof ChatCompletionChoiceSchema>;\n\nexport const UsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().optional(),\n })\n .optional(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type Usage = z.infer<typeof UsageSchema>;\n\nexport const ChatCompletionResponseSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion\"),\n created: z.number(),\n model: z.string(),\n choices: z.array(ChatCompletionChoiceSchema),\n usage: UsageSchema.optional(),\n system_fingerprint: z.string().optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionResponse = z.infer<\n typeof ChatCompletionResponseSchema\n>;\n\n// ============================================\n// STREAMING RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChunkSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion.chunk\"),\n created: z.number(),\n model: z.string(),\n system_fingerprint: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.string().optional(),\n content: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal(\"function\").optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n }),\n )\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\n \"stop\",\n \"length\",\n \"tool_calls\",\n \"content_filter\",\n \"function_call\",\n ])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n }),\n ),\n usage: UsageSchema.optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionChunk = z.infer<typeof ChatCompletionChunkSchema>;\n\n// ============================================\n// PLUGIN CONSTANTS\n// ============================================\n\nexport const PLUGIN_ID = \"llm:openai\" as const;\nexport const RESOURCE_TYPE = \"llm\" as const;\nexport const PROVIDER = \"openai\" as const;\nexport const VERSION = \"1.0.0\";\n\n/** Default allowed models */\nexport const DEFAULT_OPENAI_MODELS = [\n // GPT-4o family\n \"gpt-4o\",\n \"gpt-4o-2024-11-20\",\n \"gpt-4o-2024-08-06\",\n \"gpt-4o-2024-05-13\",\n \"gpt-4o-mini\",\n \"gpt-4o-mini-2024-07-18\",\n // GPT-4 Turbo\n \"gpt-4-turbo\",\n \"gpt-4-turbo-2024-04-09\",\n \"gpt-4-turbo-preview\",\n \"gpt-4-0125-preview\",\n \"gpt-4-1106-preview\",\n // GPT-4\n \"gpt-4\",\n \"gpt-4-0613\",\n // GPT-3.5 Turbo\n \"gpt-3.5-turbo\",\n \"gpt-3.5-turbo-0125\",\n \"gpt-3.5-turbo-1106\",\n // o1 family (reasoning models)\n \"o1\",\n \"o1-2024-12-17\",\n \"o1-preview\",\n \"o1-preview-2024-09-12\",\n \"o1-mini\",\n \"o1-mini-2024-09-12\",\n] as const;\n\n/** Supported actions */\nexport const ACTIONS = [\"chat.completions\"] as const;\nexport type OpenAIAction = (typeof ACTIONS)[number];\n\n/** Enforcement knobs */\nexport const ENFORCEMENT_SUPPORT = [\n \"model\",\n \"max_tokens\",\n \"streaming\",\n] as const;\n\n/** Default API URL */\nexport const DEFAULT_API_URL = \"https://api.openai.com/v1\";\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/contracts.ts"],"sourcesContent":["// ============================================\n// OPENAI PLUGIN CONTRACTS\n// Shared request/response schemas for proxy and client\n// ============================================\n\nimport { z } from \"zod\";\n\n// ============================================\n// REQUEST SCHEMAS (OpenAI Chat Completion API)\n// ============================================\n\nexport const ChatMessageSchema = z.object({\n role: z.enum([\"system\", \"user\", \"assistant\", \"tool\", \"function\"]),\n content: z\n .union([\n z.string(),\n z.array(\n z.object({\n type: z.enum([\"text\", \"image_url\"]),\n text: z.string().optional(),\n image_url: z\n .object({\n url: z.string(),\n detail: z.enum([\"auto\", \"low\", \"high\"]).optional(),\n })\n .optional(),\n }),\n ),\n ])\n .nullable(),\n name: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n tool_call_id: z.string().optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n});\n\nexport type ChatMessage = z.infer<typeof ChatMessageSchema>;\n\nexport const ToolSchema = z.object({\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n description: z.string().optional(),\n parameters: z.record(z.unknown()).optional(),\n strict: z.boolean().optional(),\n }),\n});\n\nexport type Tool = z.infer<typeof ToolSchema>;\n\nexport const ChatCompletionRequestSchema = z.object({\n model: z.string(),\n messages: z.array(ChatMessageSchema),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n n: z.number().int().min(1).max(10).optional(),\n stream: z.boolean().optional(),\n stream_options: z\n .object({\n include_usage: z.boolean().optional(),\n })\n .optional(),\n stop: z.union([z.string(), z.array(z.string())]).optional(),\n max_tokens: z.number().int().positive().optional(),\n max_completion_tokens: z.number().int().positive().optional(),\n presence_penalty: z.number().min(-2).max(2).optional(),\n frequency_penalty: z.number().min(-2).max(2).optional(),\n logit_bias: z.record(z.number()).optional(),\n logprobs: z.boolean().optional(),\n top_logprobs: z.number().int().min(0).max(20).optional(),\n user: z.string().optional(),\n tools: z.array(ToolSchema).optional(),\n tool_choice: z\n .union([\n z.literal(\"none\"),\n z.literal(\"auto\"),\n z.literal(\"required\"),\n z.object({\n type: z.literal(\"function\"),\n function: z.object({ name: z.string() }),\n }),\n ])\n .optional(),\n parallel_tool_calls: z.boolean().optional(),\n response_format: z\n .union([\n z.object({ type: z.literal(\"text\") }),\n z.object({ type: z.literal(\"json_object\") }),\n z.object({\n type: z.literal(\"json_schema\"),\n json_schema: z.object({\n name: z.string(),\n description: z.string().optional(),\n schema: z.record(z.unknown()),\n strict: z.boolean().optional(),\n }),\n }),\n ])\n .optional(),\n seed: z.number().int().optional(),\n service_tier: z.enum([\"auto\", \"default\"]).optional(),\n});\n\nexport type ChatCompletionRequest = z.infer<typeof ChatCompletionRequestSchema>;\n\n// ============================================\n// RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChoiceSchema = z.object({\n index: z.number(),\n message: z.object({\n role: z.literal(\"assistant\"),\n content: z.string().nullable(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\"stop\", \"length\", \"tool_calls\", \"content_filter\", \"function_call\"])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n});\n\nexport type ChatCompletionChoice = z.infer<typeof ChatCompletionChoiceSchema>;\n\nexport const UsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().optional(),\n })\n .optional(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type Usage = z.infer<typeof UsageSchema>;\n\nexport const ChatCompletionResponseSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion\"),\n created: z.number(),\n model: z.string(),\n choices: z.array(ChatCompletionChoiceSchema),\n usage: UsageSchema.optional(),\n system_fingerprint: z.string().optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionResponse = z.infer<\n typeof ChatCompletionResponseSchema\n>;\n\n// ============================================\n// STREAMING RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChunkSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion.chunk\"),\n created: z.number(),\n model: z.string(),\n system_fingerprint: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.string().optional(),\n content: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal(\"function\").optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n }),\n )\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\n \"stop\",\n \"length\",\n \"tool_calls\",\n \"content_filter\",\n \"function_call\",\n ])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n }),\n ),\n usage: UsageSchema.optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionChunk = z.infer<typeof ChatCompletionChunkSchema>;\n\n// ============================================\n// PLUGIN CONSTANTS\n// ============================================\n\nexport const PLUGIN_ID = \"llm:openai\" as const;\nexport const RESOURCE_TYPE = \"llm\" as const;\nexport const PROVIDER = \"openai\" as const;\nexport const VERSION = \"1.0.0\";\n\n/** Default allowed models */\nexport const DEFAULT_OPENAI_MODELS = [\n // GPT-5 family\n \"gpt-5.2\",\n \"gpt-5.2-pro\",\n \"gpt-5-mini\",\n \"gpt-5-nano\",\n // GPT-4.1 family\n \"gpt-4.1\",\n \"gpt-4.1-mini\",\n \"gpt-4.1-nano\",\n // GPT-4o family\n \"gpt-4o\",\n \"gpt-4o-mini\",\n // o3/o4 reasoning models\n \"o3\",\n \"o3-pro\",\n \"o4-mini\",\n] as const;\n\n/** Supported actions */\nexport const ACTIONS = [\"chat.completions\"] as const;\nexport type OpenAIAction = (typeof ACTIONS)[number];\n\n/** Enforcement knobs */\nexport const ENFORCEMENT_SUPPORT = [\n \"model\",\n \"max_tokens\",\n \"streaming\",\n] as const;\n\n/** Default API URL */\nexport const DEFAULT_API_URL = \"https://api.openai.com/v1\";\n"],"mappings":"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","names":[]}
package/dist/client.js CHANGED
@@ -247,33 +247,22 @@ var RESOURCE_TYPE = "llm";
247
247
  var PROVIDER = "openai";
248
248
  var VERSION = "1.0.0";
249
249
  var DEFAULT_OPENAI_MODELS = [
250
+ // GPT-5 family
251
+ "gpt-5.2",
252
+ "gpt-5.2-pro",
253
+ "gpt-5-mini",
254
+ "gpt-5-nano",
255
+ // GPT-4.1 family
256
+ "gpt-4.1",
257
+ "gpt-4.1-mini",
258
+ "gpt-4.1-nano",
250
259
  // GPT-4o family
251
260
  "gpt-4o",
252
- "gpt-4o-2024-11-20",
253
- "gpt-4o-2024-08-06",
254
- "gpt-4o-2024-05-13",
255
261
  "gpt-4o-mini",
256
- "gpt-4o-mini-2024-07-18",
257
- // GPT-4 Turbo
258
- "gpt-4-turbo",
259
- "gpt-4-turbo-2024-04-09",
260
- "gpt-4-turbo-preview",
261
- "gpt-4-0125-preview",
262
- "gpt-4-1106-preview",
263
- // GPT-4
264
- "gpt-4",
265
- "gpt-4-0613",
266
- // GPT-3.5 Turbo
267
- "gpt-3.5-turbo",
268
- "gpt-3.5-turbo-0125",
269
- "gpt-3.5-turbo-1106",
270
- // o1 family (reasoning models)
271
- "o1",
272
- "o1-2024-12-17",
273
- "o1-preview",
274
- "o1-preview-2024-09-12",
275
- "o1-mini",
276
- "o1-mini-2024-09-12"
262
+ // o3/o4 reasoning models
263
+ "o3",
264
+ "o3-pro",
265
+ "o4-mini"
277
266
  ];
278
267
  var ACTIONS = ["chat.completions"];
279
268
  var ENFORCEMENT_SUPPORT = [
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/contracts.ts"],"sourcesContent":["// ============================================\n// OPENAI PLUGIN CLIENT\n// Typed client wrapper for target apps\n// ============================================\n//\n// This module provides typed client wrappers for the OpenAI LLM plugin.\n// It depends only on the SDK transport interface and shared contracts.\n//\n// Usage:\n// ```ts\n// import { openai } from \"@glueco/plugin-llm-openai/client\";\n// import { GatewayClient } from \"@glueco/sdk\";\n//\n// const client = new GatewayClient({ ... });\n// const transport = await client.getTransport();\n// const openaiClient = openai(transport);\n//\n// const response = await openaiClient.chatCompletions({\n// model: \"gpt-4o\",\n// messages: [{ role: \"user\", content: \"Hello!\" }]\n// });\n// ```\n// ============================================\n\nimport type {\n GatewayTransport,\n GatewayResponse,\n GatewayStreamResponse,\n GatewayRequestOptions,\n} from \"@glueco/sdk\";\n\nimport {\n type ChatCompletionRequest,\n type ChatCompletionResponse,\n PLUGIN_ID,\n} from \"./contracts\";\n\n// Re-export contracts for consumer convenience\nexport * from \"./contracts\";\n\n// ============================================\n// CLIENT TYPES\n// ============================================\n\n/**\n * Options for chat completion requests.\n */\nexport interface ChatCompletionOptions extends Omit<\n GatewayRequestOptions,\n \"stream\" | \"method\"\n> {\n /**\n * Override for custom behavior (advanced usage).\n */\n raw?: boolean;\n}\n\n/**\n * OpenAI client interface.\n * Provides typed methods for all supported actions.\n */\nexport interface OpenAIClient {\n /**\n * Create a chat completion.\n *\n * @param request - Chat completion request (OpenAI format)\n * @param options - Optional request options\n * @returns Chat completion response\n *\n * @example\n * ```ts\n * const response = await openaiClient.chatCompletions({\n * model: \"gpt-4o\",\n * messages: [\n * { role: \"system\", content: \"You are a helpful assistant.\" },\n * { role: \"user\", content: \"What is the capital of France?\" }\n * ],\n * temperature: 0.7,\n * max_tokens: 1000\n * });\n *\n * console.log(response.data.choices[0].message.content);\n * ```\n */\n chatCompletions(\n request: ChatCompletionRequest,\n options?: ChatCompletionOptions,\n ): Promise<GatewayResponse<ChatCompletionResponse>>;\n\n /**\n * Create a streaming chat completion.\n *\n * @param request - Chat completion request (stream flag will be set automatically)\n * @param options - Optional request options\n * @returns Streaming response with SSE stream\n *\n * @example\n * ```ts\n * const response = await openaiClient.chatCompletionsStream({\n * model: \"gpt-4o\",\n * messages: [{ role: \"user\", content: \"Tell me a story\" }]\n * });\n *\n * const reader = response.stream.getReader();\n * const decoder = new TextDecoder();\n *\n * while (true) {\n * const { done, value } = await reader.read();\n * if (done) break;\n * const chunk = decoder.decode(value);\n * // Process SSE chunk\n * }\n * ```\n */\n chatCompletionsStream(\n request: Omit<ChatCompletionRequest, \"stream\">,\n options?: ChatCompletionOptions,\n ): Promise<GatewayStreamResponse>;\n\n /**\n * Get the underlying transport for advanced usage.\n * Useful when you need direct access to the gateway.\n */\n readonly transport: GatewayTransport;\n}\n\n// ============================================\n// CLIENT FACTORY\n// ============================================\n\n/**\n * Create a typed OpenAI client.\n *\n * @param transport - Gateway transport from SDK\n * @returns Typed OpenAI client\n *\n * @example\n * ```ts\n * import { openai } from \"@glueco/plugin-llm-openai/client\";\n * import { GatewayClient } from \"@glueco/sdk\";\n *\n * // Setup\n * const gatewayClient = new GatewayClient({\n * keyStorage: new FileKeyStorage('./.gateway/keys.json'),\n * configStorage: new FileConfigStorage('./.gateway/config.json'),\n * });\n *\n * // Get transport and create typed client\n * const transport = await gatewayClient.getTransport();\n * const openaiClient = openai(transport);\n *\n * // Use with full type safety\n * const response = await openaiClient.chatCompletions({\n * model: \"gpt-4o\",\n * messages: [{ role: \"user\", content: \"Hello!\" }]\n * });\n * ```\n */\nexport function openai(transport: GatewayTransport): OpenAIClient {\n return {\n transport,\n\n async chatCompletions(\n request: ChatCompletionRequest,\n options?: ChatCompletionOptions,\n ): Promise<GatewayResponse<ChatCompletionResponse>> {\n // Ensure stream is false for non-streaming requests\n const payload = { ...request, stream: false };\n\n return transport.request<ChatCompletionResponse, ChatCompletionRequest>(\n PLUGIN_ID,\n \"chat.completions\",\n payload,\n options,\n );\n },\n\n async chatCompletionsStream(\n request: Omit<ChatCompletionRequest, \"stream\">,\n options?: ChatCompletionOptions,\n ): Promise<GatewayStreamResponse> {\n return transport.requestStream(\n PLUGIN_ID,\n \"chat.completions\",\n request,\n options,\n );\n },\n };\n}\n\n// Default export for convenient importing\nexport default openai;\n","// ============================================\n// OPENAI PLUGIN CONTRACTS\n// Shared request/response schemas for proxy and client\n// ============================================\n\nimport { z } from \"zod\";\n\n// ============================================\n// REQUEST SCHEMAS (OpenAI Chat Completion API)\n// ============================================\n\nexport const ChatMessageSchema = z.object({\n role: z.enum([\"system\", \"user\", \"assistant\", \"tool\", \"function\"]),\n content: z\n .union([\n z.string(),\n z.array(\n z.object({\n type: z.enum([\"text\", \"image_url\"]),\n text: z.string().optional(),\n image_url: z\n .object({\n url: z.string(),\n detail: z.enum([\"auto\", \"low\", \"high\"]).optional(),\n })\n .optional(),\n }),\n ),\n ])\n .nullable(),\n name: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n tool_call_id: z.string().optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n});\n\nexport type ChatMessage = z.infer<typeof ChatMessageSchema>;\n\nexport const ToolSchema = z.object({\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n description: z.string().optional(),\n parameters: z.record(z.unknown()).optional(),\n strict: z.boolean().optional(),\n }),\n});\n\nexport type Tool = z.infer<typeof ToolSchema>;\n\nexport const ChatCompletionRequestSchema = z.object({\n model: z.string(),\n messages: z.array(ChatMessageSchema),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n n: z.number().int().min(1).max(10).optional(),\n stream: z.boolean().optional(),\n stream_options: z\n .object({\n include_usage: z.boolean().optional(),\n })\n .optional(),\n stop: z.union([z.string(), z.array(z.string())]).optional(),\n max_tokens: z.number().int().positive().optional(),\n max_completion_tokens: z.number().int().positive().optional(),\n presence_penalty: z.number().min(-2).max(2).optional(),\n frequency_penalty: z.number().min(-2).max(2).optional(),\n logit_bias: z.record(z.number()).optional(),\n logprobs: z.boolean().optional(),\n top_logprobs: z.number().int().min(0).max(20).optional(),\n user: z.string().optional(),\n tools: z.array(ToolSchema).optional(),\n tool_choice: z\n .union([\n z.literal(\"none\"),\n z.literal(\"auto\"),\n z.literal(\"required\"),\n z.object({\n type: z.literal(\"function\"),\n function: z.object({ name: z.string() }),\n }),\n ])\n .optional(),\n parallel_tool_calls: z.boolean().optional(),\n response_format: z\n .union([\n z.object({ type: z.literal(\"text\") }),\n z.object({ type: z.literal(\"json_object\") }),\n z.object({\n type: z.literal(\"json_schema\"),\n json_schema: z.object({\n name: z.string(),\n description: z.string().optional(),\n schema: z.record(z.unknown()),\n strict: z.boolean().optional(),\n }),\n }),\n ])\n .optional(),\n seed: z.number().int().optional(),\n service_tier: z.enum([\"auto\", \"default\"]).optional(),\n});\n\nexport type ChatCompletionRequest = z.infer<typeof ChatCompletionRequestSchema>;\n\n// ============================================\n// RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChoiceSchema = z.object({\n index: z.number(),\n message: z.object({\n role: z.literal(\"assistant\"),\n content: z.string().nullable(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\"stop\", \"length\", \"tool_calls\", \"content_filter\", \"function_call\"])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n});\n\nexport type ChatCompletionChoice = z.infer<typeof ChatCompletionChoiceSchema>;\n\nexport const UsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().optional(),\n })\n .optional(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type Usage = z.infer<typeof UsageSchema>;\n\nexport const ChatCompletionResponseSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion\"),\n created: z.number(),\n model: z.string(),\n choices: z.array(ChatCompletionChoiceSchema),\n usage: UsageSchema.optional(),\n system_fingerprint: z.string().optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionResponse = z.infer<\n typeof ChatCompletionResponseSchema\n>;\n\n// ============================================\n// STREAMING RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChunkSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion.chunk\"),\n created: z.number(),\n model: z.string(),\n system_fingerprint: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.string().optional(),\n content: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal(\"function\").optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n }),\n )\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\n \"stop\",\n \"length\",\n \"tool_calls\",\n \"content_filter\",\n \"function_call\",\n ])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n }),\n ),\n usage: UsageSchema.optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionChunk = z.infer<typeof ChatCompletionChunkSchema>;\n\n// ============================================\n// PLUGIN CONSTANTS\n// ============================================\n\nexport const PLUGIN_ID = \"llm:openai\" as const;\nexport const RESOURCE_TYPE = \"llm\" as const;\nexport const PROVIDER = \"openai\" as const;\nexport const VERSION = \"1.0.0\";\n\n/** Default allowed models */\nexport const DEFAULT_OPENAI_MODELS = [\n // GPT-4o family\n \"gpt-4o\",\n \"gpt-4o-2024-11-20\",\n \"gpt-4o-2024-08-06\",\n \"gpt-4o-2024-05-13\",\n \"gpt-4o-mini\",\n \"gpt-4o-mini-2024-07-18\",\n // GPT-4 Turbo\n \"gpt-4-turbo\",\n \"gpt-4-turbo-2024-04-09\",\n \"gpt-4-turbo-preview\",\n \"gpt-4-0125-preview\",\n \"gpt-4-1106-preview\",\n // GPT-4\n \"gpt-4\",\n \"gpt-4-0613\",\n // GPT-3.5 Turbo\n \"gpt-3.5-turbo\",\n \"gpt-3.5-turbo-0125\",\n \"gpt-3.5-turbo-1106\",\n // o1 family (reasoning models)\n \"o1\",\n \"o1-2024-12-17\",\n \"o1-preview\",\n \"o1-preview-2024-09-12\",\n \"o1-mini\",\n \"o1-mini-2024-09-12\",\n] as const;\n\n/** Supported actions */\nexport const ACTIONS = [\"chat.completions\"] as const;\nexport type OpenAIAction = (typeof ACTIONS)[number];\n\n/** Enforcement knobs */\nexport const ENFORCEMENT_SUPPORT = [\n \"model\",\n \"max_tokens\",\n \"streaming\",\n] as const;\n\n/** Default API URL */\nexport const DEFAULT_API_URL = \"https://api.openai.com/v1\";\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/client.ts","../src/contracts.ts"],"sourcesContent":["// ============================================\n// OPENAI PLUGIN CLIENT\n// Typed client wrapper for target apps\n// ============================================\n//\n// This module provides typed client wrappers for the OpenAI LLM plugin.\n// It depends only on the SDK transport interface and shared contracts.\n//\n// Usage:\n// ```ts\n// import { openai } from \"@glueco/plugin-llm-openai/client\";\n// import { GatewayClient } from \"@glueco/sdk\";\n//\n// const client = new GatewayClient({ ... });\n// const transport = await client.getTransport();\n// const openaiClient = openai(transport);\n//\n// const response = await openaiClient.chatCompletions({\n// model: \"gpt-4o\",\n// messages: [{ role: \"user\", content: \"Hello!\" }]\n// });\n// ```\n// ============================================\n\nimport type {\n GatewayTransport,\n GatewayResponse,\n GatewayStreamResponse,\n GatewayRequestOptions,\n} from \"@glueco/sdk\";\n\nimport {\n type ChatCompletionRequest,\n type ChatCompletionResponse,\n PLUGIN_ID,\n} from \"./contracts\";\n\n// Re-export contracts for consumer convenience\nexport * from \"./contracts\";\n\n// ============================================\n// CLIENT TYPES\n// ============================================\n\n/**\n * Options for chat completion requests.\n */\nexport interface ChatCompletionOptions extends Omit<\n GatewayRequestOptions,\n \"stream\" | \"method\"\n> {\n /**\n * Override for custom behavior (advanced usage).\n */\n raw?: boolean;\n}\n\n/**\n * OpenAI client interface.\n * Provides typed methods for all supported actions.\n */\nexport interface OpenAIClient {\n /**\n * Create a chat completion.\n *\n * @param request - Chat completion request (OpenAI format)\n * @param options - Optional request options\n * @returns Chat completion response\n *\n * @example\n * ```ts\n * const response = await openaiClient.chatCompletions({\n * model: \"gpt-4o\",\n * messages: [\n * { role: \"system\", content: \"You are a helpful assistant.\" },\n * { role: \"user\", content: \"What is the capital of France?\" }\n * ],\n * temperature: 0.7,\n * max_tokens: 1000\n * });\n *\n * console.log(response.data.choices[0].message.content);\n * ```\n */\n chatCompletions(\n request: ChatCompletionRequest,\n options?: ChatCompletionOptions,\n ): Promise<GatewayResponse<ChatCompletionResponse>>;\n\n /**\n * Create a streaming chat completion.\n *\n * @param request - Chat completion request (stream flag will be set automatically)\n * @param options - Optional request options\n * @returns Streaming response with SSE stream\n *\n * @example\n * ```ts\n * const response = await openaiClient.chatCompletionsStream({\n * model: \"gpt-4o\",\n * messages: [{ role: \"user\", content: \"Tell me a story\" }]\n * });\n *\n * const reader = response.stream.getReader();\n * const decoder = new TextDecoder();\n *\n * while (true) {\n * const { done, value } = await reader.read();\n * if (done) break;\n * const chunk = decoder.decode(value);\n * // Process SSE chunk\n * }\n * ```\n */\n chatCompletionsStream(\n request: Omit<ChatCompletionRequest, \"stream\">,\n options?: ChatCompletionOptions,\n ): Promise<GatewayStreamResponse>;\n\n /**\n * Get the underlying transport for advanced usage.\n * Useful when you need direct access to the gateway.\n */\n readonly transport: GatewayTransport;\n}\n\n// ============================================\n// CLIENT FACTORY\n// ============================================\n\n/**\n * Create a typed OpenAI client.\n *\n * @param transport - Gateway transport from SDK\n * @returns Typed OpenAI client\n *\n * @example\n * ```ts\n * import { openai } from \"@glueco/plugin-llm-openai/client\";\n * import { GatewayClient } from \"@glueco/sdk\";\n *\n * // Setup\n * const gatewayClient = new GatewayClient({\n * keyStorage: new FileKeyStorage('./.gateway/keys.json'),\n * configStorage: new FileConfigStorage('./.gateway/config.json'),\n * });\n *\n * // Get transport and create typed client\n * const transport = await gatewayClient.getTransport();\n * const openaiClient = openai(transport);\n *\n * // Use with full type safety\n * const response = await openaiClient.chatCompletions({\n * model: \"gpt-4o\",\n * messages: [{ role: \"user\", content: \"Hello!\" }]\n * });\n * ```\n */\nexport function openai(transport: GatewayTransport): OpenAIClient {\n return {\n transport,\n\n async chatCompletions(\n request: ChatCompletionRequest,\n options?: ChatCompletionOptions,\n ): Promise<GatewayResponse<ChatCompletionResponse>> {\n // Ensure stream is false for non-streaming requests\n const payload = { ...request, stream: false };\n\n return transport.request<ChatCompletionResponse, ChatCompletionRequest>(\n PLUGIN_ID,\n \"chat.completions\",\n payload,\n options,\n );\n },\n\n async chatCompletionsStream(\n request: Omit<ChatCompletionRequest, \"stream\">,\n options?: ChatCompletionOptions,\n ): Promise<GatewayStreamResponse> {\n return transport.requestStream(\n PLUGIN_ID,\n \"chat.completions\",\n request,\n options,\n );\n },\n };\n}\n\n// Default export for convenient importing\nexport default openai;\n","// ============================================\n// OPENAI PLUGIN CONTRACTS\n// Shared request/response schemas for proxy and client\n// ============================================\n\nimport { z } from \"zod\";\n\n// ============================================\n// REQUEST SCHEMAS (OpenAI Chat Completion API)\n// ============================================\n\nexport const ChatMessageSchema = z.object({\n role: z.enum([\"system\", \"user\", \"assistant\", \"tool\", \"function\"]),\n content: z\n .union([\n z.string(),\n z.array(\n z.object({\n type: z.enum([\"text\", \"image_url\"]),\n text: z.string().optional(),\n image_url: z\n .object({\n url: z.string(),\n detail: z.enum([\"auto\", \"low\", \"high\"]).optional(),\n })\n .optional(),\n }),\n ),\n ])\n .nullable(),\n name: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n tool_call_id: z.string().optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n});\n\nexport type ChatMessage = z.infer<typeof ChatMessageSchema>;\n\nexport const ToolSchema = z.object({\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n description: z.string().optional(),\n parameters: z.record(z.unknown()).optional(),\n strict: z.boolean().optional(),\n }),\n});\n\nexport type Tool = z.infer<typeof ToolSchema>;\n\nexport const ChatCompletionRequestSchema = z.object({\n model: z.string(),\n messages: z.array(ChatMessageSchema),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n n: z.number().int().min(1).max(10).optional(),\n stream: z.boolean().optional(),\n stream_options: z\n .object({\n include_usage: z.boolean().optional(),\n })\n .optional(),\n stop: z.union([z.string(), z.array(z.string())]).optional(),\n max_tokens: z.number().int().positive().optional(),\n max_completion_tokens: z.number().int().positive().optional(),\n presence_penalty: z.number().min(-2).max(2).optional(),\n frequency_penalty: z.number().min(-2).max(2).optional(),\n logit_bias: z.record(z.number()).optional(),\n logprobs: z.boolean().optional(),\n top_logprobs: z.number().int().min(0).max(20).optional(),\n user: z.string().optional(),\n tools: z.array(ToolSchema).optional(),\n tool_choice: z\n .union([\n z.literal(\"none\"),\n z.literal(\"auto\"),\n z.literal(\"required\"),\n z.object({\n type: z.literal(\"function\"),\n function: z.object({ name: z.string() }),\n }),\n ])\n .optional(),\n parallel_tool_calls: z.boolean().optional(),\n response_format: z\n .union([\n z.object({ type: z.literal(\"text\") }),\n z.object({ type: z.literal(\"json_object\") }),\n z.object({\n type: z.literal(\"json_schema\"),\n json_schema: z.object({\n name: z.string(),\n description: z.string().optional(),\n schema: z.record(z.unknown()),\n strict: z.boolean().optional(),\n }),\n }),\n ])\n .optional(),\n seed: z.number().int().optional(),\n service_tier: z.enum([\"auto\", \"default\"]).optional(),\n});\n\nexport type ChatCompletionRequest = z.infer<typeof ChatCompletionRequestSchema>;\n\n// ============================================\n// RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChoiceSchema = z.object({\n index: z.number(),\n message: z.object({\n role: z.literal(\"assistant\"),\n content: z.string().nullable(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\"stop\", \"length\", \"tool_calls\", \"content_filter\", \"function_call\"])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n});\n\nexport type ChatCompletionChoice = z.infer<typeof ChatCompletionChoiceSchema>;\n\nexport const UsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().optional(),\n })\n .optional(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type Usage = z.infer<typeof UsageSchema>;\n\nexport const ChatCompletionResponseSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion\"),\n created: z.number(),\n model: z.string(),\n choices: z.array(ChatCompletionChoiceSchema),\n usage: UsageSchema.optional(),\n system_fingerprint: z.string().optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionResponse = z.infer<\n typeof ChatCompletionResponseSchema\n>;\n\n// ============================================\n// STREAMING RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChunkSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion.chunk\"),\n created: z.number(),\n model: z.string(),\n system_fingerprint: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.string().optional(),\n content: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal(\"function\").optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n }),\n )\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\n \"stop\",\n \"length\",\n \"tool_calls\",\n \"content_filter\",\n \"function_call\",\n ])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n }),\n ),\n usage: UsageSchema.optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionChunk = z.infer<typeof ChatCompletionChunkSchema>;\n\n// ============================================\n// PLUGIN CONSTANTS\n// ============================================\n\nexport const PLUGIN_ID = \"llm:openai\" as const;\nexport const RESOURCE_TYPE = \"llm\" as const;\nexport const PROVIDER = \"openai\" as const;\nexport const VERSION = \"1.0.0\";\n\n/** Default allowed models */\nexport const DEFAULT_OPENAI_MODELS = [\n // GPT-5 family\n \"gpt-5.2\",\n \"gpt-5.2-pro\",\n \"gpt-5-mini\",\n \"gpt-5-nano\",\n // GPT-4.1 family\n \"gpt-4.1\",\n \"gpt-4.1-mini\",\n \"gpt-4.1-nano\",\n // GPT-4o family\n \"gpt-4o\",\n \"gpt-4o-mini\",\n // o3/o4 reasoning models\n \"o3\",\n \"o3-pro\",\n \"o4-mini\",\n] as const;\n\n/** Supported actions */\nexport const ACTIONS = [\"chat.completions\"] as const;\nexport type OpenAIAction = (typeof ACTIONS)[number];\n\n/** Enforcement knobs */\nexport const ENFORCEMENT_SUPPORT = [\n \"model\",\n \"max_tokens\",\n \"streaming\",\n] as const;\n\n/** Default API URL */\nexport const DEFAULT_API_URL = \"https://api.openai.com/v1\";\n"],"mappings":"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","names":[]}
package/dist/client.mjs CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  ToolSchema,
15
15
  UsageSchema,
16
16
  VERSION
17
- } from "./chunk-6FNYHOB5.mjs";
17
+ } from "./chunk-VWR4ADAV.mjs";
18
18
 
19
19
  // src/client.ts
20
20
  function openai(transport) {
@@ -1482,7 +1482,7 @@ declare const RESOURCE_TYPE: "llm";
1482
1482
  declare const PROVIDER: "openai";
1483
1483
  declare const VERSION = "1.0.0";
1484
1484
  /** Default allowed models */
1485
- declare const DEFAULT_OPENAI_MODELS: readonly ["gpt-4o", "gpt-4o-2024-11-20", "gpt-4o-2024-08-06", "gpt-4o-2024-05-13", "gpt-4o-mini", "gpt-4o-mini-2024-07-18", "gpt-4-turbo", "gpt-4-turbo-2024-04-09", "gpt-4-turbo-preview", "gpt-4-0125-preview", "gpt-4-1106-preview", "gpt-4", "gpt-4-0613", "gpt-3.5-turbo", "gpt-3.5-turbo-0125", "gpt-3.5-turbo-1106", "o1", "o1-2024-12-17", "o1-preview", "o1-preview-2024-09-12", "o1-mini", "o1-mini-2024-09-12"];
1485
+ declare const DEFAULT_OPENAI_MODELS: readonly ["gpt-5.2", "gpt-5.2-pro", "gpt-5-mini", "gpt-5-nano", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4o", "gpt-4o-mini", "o3", "o3-pro", "o4-mini"];
1486
1486
  /** Supported actions */
1487
1487
  declare const ACTIONS: readonly ["chat.completions"];
1488
1488
  type OpenAIAction = (typeof ACTIONS)[number];
@@ -1482,7 +1482,7 @@ declare const RESOURCE_TYPE: "llm";
1482
1482
  declare const PROVIDER: "openai";
1483
1483
  declare const VERSION = "1.0.0";
1484
1484
  /** Default allowed models */
1485
- declare const DEFAULT_OPENAI_MODELS: readonly ["gpt-4o", "gpt-4o-2024-11-20", "gpt-4o-2024-08-06", "gpt-4o-2024-05-13", "gpt-4o-mini", "gpt-4o-mini-2024-07-18", "gpt-4-turbo", "gpt-4-turbo-2024-04-09", "gpt-4-turbo-preview", "gpt-4-0125-preview", "gpt-4-1106-preview", "gpt-4", "gpt-4-0613", "gpt-3.5-turbo", "gpt-3.5-turbo-0125", "gpt-3.5-turbo-1106", "o1", "o1-2024-12-17", "o1-preview", "o1-preview-2024-09-12", "o1-mini", "o1-mini-2024-09-12"];
1485
+ declare const DEFAULT_OPENAI_MODELS: readonly ["gpt-5.2", "gpt-5.2-pro", "gpt-5-mini", "gpt-5-nano", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4o", "gpt-4o-mini", "o3", "o3-pro", "o4-mini"];
1486
1486
  /** Supported actions */
1487
1487
  declare const ACTIONS: readonly ["chat.completions"];
1488
1488
  type OpenAIAction = (typeof ACTIONS)[number];
package/dist/contracts.js CHANGED
@@ -243,33 +243,22 @@ var RESOURCE_TYPE = "llm";
243
243
  var PROVIDER = "openai";
244
244
  var VERSION = "1.0.0";
245
245
  var DEFAULT_OPENAI_MODELS = [
246
+ // GPT-5 family
247
+ "gpt-5.2",
248
+ "gpt-5.2-pro",
249
+ "gpt-5-mini",
250
+ "gpt-5-nano",
251
+ // GPT-4.1 family
252
+ "gpt-4.1",
253
+ "gpt-4.1-mini",
254
+ "gpt-4.1-nano",
246
255
  // GPT-4o family
247
256
  "gpt-4o",
248
- "gpt-4o-2024-11-20",
249
- "gpt-4o-2024-08-06",
250
- "gpt-4o-2024-05-13",
251
257
  "gpt-4o-mini",
252
- "gpt-4o-mini-2024-07-18",
253
- // GPT-4 Turbo
254
- "gpt-4-turbo",
255
- "gpt-4-turbo-2024-04-09",
256
- "gpt-4-turbo-preview",
257
- "gpt-4-0125-preview",
258
- "gpt-4-1106-preview",
259
- // GPT-4
260
- "gpt-4",
261
- "gpt-4-0613",
262
- // GPT-3.5 Turbo
263
- "gpt-3.5-turbo",
264
- "gpt-3.5-turbo-0125",
265
- "gpt-3.5-turbo-1106",
266
- // o1 family (reasoning models)
267
- "o1",
268
- "o1-2024-12-17",
269
- "o1-preview",
270
- "o1-preview-2024-09-12",
271
- "o1-mini",
272
- "o1-mini-2024-09-12"
258
+ // o3/o4 reasoning models
259
+ "o3",
260
+ "o3-pro",
261
+ "o4-mini"
273
262
  ];
274
263
  var ACTIONS = ["chat.completions"];
275
264
  var ENFORCEMENT_SUPPORT = [
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/contracts.ts"],"sourcesContent":["// ============================================\n// OPENAI PLUGIN CONTRACTS\n// Shared request/response schemas for proxy and client\n// ============================================\n\nimport { z } from \"zod\";\n\n// ============================================\n// REQUEST SCHEMAS (OpenAI Chat Completion API)\n// ============================================\n\nexport const ChatMessageSchema = z.object({\n role: z.enum([\"system\", \"user\", \"assistant\", \"tool\", \"function\"]),\n content: z\n .union([\n z.string(),\n z.array(\n z.object({\n type: z.enum([\"text\", \"image_url\"]),\n text: z.string().optional(),\n image_url: z\n .object({\n url: z.string(),\n detail: z.enum([\"auto\", \"low\", \"high\"]).optional(),\n })\n .optional(),\n }),\n ),\n ])\n .nullable(),\n name: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n tool_call_id: z.string().optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n});\n\nexport type ChatMessage = z.infer<typeof ChatMessageSchema>;\n\nexport const ToolSchema = z.object({\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n description: z.string().optional(),\n parameters: z.record(z.unknown()).optional(),\n strict: z.boolean().optional(),\n }),\n});\n\nexport type Tool = z.infer<typeof ToolSchema>;\n\nexport const ChatCompletionRequestSchema = z.object({\n model: z.string(),\n messages: z.array(ChatMessageSchema),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n n: z.number().int().min(1).max(10).optional(),\n stream: z.boolean().optional(),\n stream_options: z\n .object({\n include_usage: z.boolean().optional(),\n })\n .optional(),\n stop: z.union([z.string(), z.array(z.string())]).optional(),\n max_tokens: z.number().int().positive().optional(),\n max_completion_tokens: z.number().int().positive().optional(),\n presence_penalty: z.number().min(-2).max(2).optional(),\n frequency_penalty: z.number().min(-2).max(2).optional(),\n logit_bias: z.record(z.number()).optional(),\n logprobs: z.boolean().optional(),\n top_logprobs: z.number().int().min(0).max(20).optional(),\n user: z.string().optional(),\n tools: z.array(ToolSchema).optional(),\n tool_choice: z\n .union([\n z.literal(\"none\"),\n z.literal(\"auto\"),\n z.literal(\"required\"),\n z.object({\n type: z.literal(\"function\"),\n function: z.object({ name: z.string() }),\n }),\n ])\n .optional(),\n parallel_tool_calls: z.boolean().optional(),\n response_format: z\n .union([\n z.object({ type: z.literal(\"text\") }),\n z.object({ type: z.literal(\"json_object\") }),\n z.object({\n type: z.literal(\"json_schema\"),\n json_schema: z.object({\n name: z.string(),\n description: z.string().optional(),\n schema: z.record(z.unknown()),\n strict: z.boolean().optional(),\n }),\n }),\n ])\n .optional(),\n seed: z.number().int().optional(),\n service_tier: z.enum([\"auto\", \"default\"]).optional(),\n});\n\nexport type ChatCompletionRequest = z.infer<typeof ChatCompletionRequestSchema>;\n\n// ============================================\n// RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChoiceSchema = z.object({\n index: z.number(),\n message: z.object({\n role: z.literal(\"assistant\"),\n content: z.string().nullable(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\"stop\", \"length\", \"tool_calls\", \"content_filter\", \"function_call\"])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n});\n\nexport type ChatCompletionChoice = z.infer<typeof ChatCompletionChoiceSchema>;\n\nexport const UsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().optional(),\n })\n .optional(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type Usage = z.infer<typeof UsageSchema>;\n\nexport const ChatCompletionResponseSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion\"),\n created: z.number(),\n model: z.string(),\n choices: z.array(ChatCompletionChoiceSchema),\n usage: UsageSchema.optional(),\n system_fingerprint: z.string().optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionResponse = z.infer<\n typeof ChatCompletionResponseSchema\n>;\n\n// ============================================\n// STREAMING RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChunkSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion.chunk\"),\n created: z.number(),\n model: z.string(),\n system_fingerprint: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.string().optional(),\n content: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal(\"function\").optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n }),\n )\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\n \"stop\",\n \"length\",\n \"tool_calls\",\n \"content_filter\",\n \"function_call\",\n ])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n }),\n ),\n usage: UsageSchema.optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionChunk = z.infer<typeof ChatCompletionChunkSchema>;\n\n// ============================================\n// PLUGIN CONSTANTS\n// ============================================\n\nexport const PLUGIN_ID = \"llm:openai\" as const;\nexport const RESOURCE_TYPE = \"llm\" as const;\nexport const PROVIDER = \"openai\" as const;\nexport const VERSION = \"1.0.0\";\n\n/** Default allowed models */\nexport const DEFAULT_OPENAI_MODELS = [\n // GPT-4o family\n \"gpt-4o\",\n \"gpt-4o-2024-11-20\",\n \"gpt-4o-2024-08-06\",\n \"gpt-4o-2024-05-13\",\n \"gpt-4o-mini\",\n \"gpt-4o-mini-2024-07-18\",\n // GPT-4 Turbo\n \"gpt-4-turbo\",\n \"gpt-4-turbo-2024-04-09\",\n \"gpt-4-turbo-preview\",\n \"gpt-4-0125-preview\",\n \"gpt-4-1106-preview\",\n // GPT-4\n \"gpt-4\",\n \"gpt-4-0613\",\n // GPT-3.5 Turbo\n \"gpt-3.5-turbo\",\n \"gpt-3.5-turbo-0125\",\n \"gpt-3.5-turbo-1106\",\n // o1 family (reasoning models)\n \"o1\",\n \"o1-2024-12-17\",\n \"o1-preview\",\n \"o1-preview-2024-09-12\",\n \"o1-mini\",\n \"o1-mini-2024-09-12\",\n] as const;\n\n/** Supported actions */\nexport const ACTIONS = [\"chat.completions\"] as const;\nexport type OpenAIAction = (typeof ACTIONS)[number];\n\n/** Enforcement knobs */\nexport const ENFORCEMENT_SUPPORT = [\n \"model\",\n \"max_tokens\",\n \"streaming\",\n] as const;\n\n/** Default API URL */\nexport const DEFAULT_API_URL = \"https://api.openai.com/v1\";\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/contracts.ts"],"sourcesContent":["// ============================================\n// OPENAI PLUGIN CONTRACTS\n// Shared request/response schemas for proxy and client\n// ============================================\n\nimport { z } from \"zod\";\n\n// ============================================\n// REQUEST SCHEMAS (OpenAI Chat Completion API)\n// ============================================\n\nexport const ChatMessageSchema = z.object({\n role: z.enum([\"system\", \"user\", \"assistant\", \"tool\", \"function\"]),\n content: z\n .union([\n z.string(),\n z.array(\n z.object({\n type: z.enum([\"text\", \"image_url\"]),\n text: z.string().optional(),\n image_url: z\n .object({\n url: z.string(),\n detail: z.enum([\"auto\", \"low\", \"high\"]).optional(),\n })\n .optional(),\n }),\n ),\n ])\n .nullable(),\n name: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n tool_call_id: z.string().optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n});\n\nexport type ChatMessage = z.infer<typeof ChatMessageSchema>;\n\nexport const ToolSchema = z.object({\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n description: z.string().optional(),\n parameters: z.record(z.unknown()).optional(),\n strict: z.boolean().optional(),\n }),\n});\n\nexport type Tool = z.infer<typeof ToolSchema>;\n\nexport const ChatCompletionRequestSchema = z.object({\n model: z.string(),\n messages: z.array(ChatMessageSchema),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n n: z.number().int().min(1).max(10).optional(),\n stream: z.boolean().optional(),\n stream_options: z\n .object({\n include_usage: z.boolean().optional(),\n })\n .optional(),\n stop: z.union([z.string(), z.array(z.string())]).optional(),\n max_tokens: z.number().int().positive().optional(),\n max_completion_tokens: z.number().int().positive().optional(),\n presence_penalty: z.number().min(-2).max(2).optional(),\n frequency_penalty: z.number().min(-2).max(2).optional(),\n logit_bias: z.record(z.number()).optional(),\n logprobs: z.boolean().optional(),\n top_logprobs: z.number().int().min(0).max(20).optional(),\n user: z.string().optional(),\n tools: z.array(ToolSchema).optional(),\n tool_choice: z\n .union([\n z.literal(\"none\"),\n z.literal(\"auto\"),\n z.literal(\"required\"),\n z.object({\n type: z.literal(\"function\"),\n function: z.object({ name: z.string() }),\n }),\n ])\n .optional(),\n parallel_tool_calls: z.boolean().optional(),\n response_format: z\n .union([\n z.object({ type: z.literal(\"text\") }),\n z.object({ type: z.literal(\"json_object\") }),\n z.object({\n type: z.literal(\"json_schema\"),\n json_schema: z.object({\n name: z.string(),\n description: z.string().optional(),\n schema: z.record(z.unknown()),\n strict: z.boolean().optional(),\n }),\n }),\n ])\n .optional(),\n seed: z.number().int().optional(),\n service_tier: z.enum([\"auto\", \"default\"]).optional(),\n});\n\nexport type ChatCompletionRequest = z.infer<typeof ChatCompletionRequestSchema>;\n\n// ============================================\n// RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChoiceSchema = z.object({\n index: z.number(),\n message: z.object({\n role: z.literal(\"assistant\"),\n content: z.string().nullable(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\"stop\", \"length\", \"tool_calls\", \"content_filter\", \"function_call\"])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n});\n\nexport type ChatCompletionChoice = z.infer<typeof ChatCompletionChoiceSchema>;\n\nexport const UsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().optional(),\n })\n .optional(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type Usage = z.infer<typeof UsageSchema>;\n\nexport const ChatCompletionResponseSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion\"),\n created: z.number(),\n model: z.string(),\n choices: z.array(ChatCompletionChoiceSchema),\n usage: UsageSchema.optional(),\n system_fingerprint: z.string().optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionResponse = z.infer<\n typeof ChatCompletionResponseSchema\n>;\n\n// ============================================\n// STREAMING RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChunkSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion.chunk\"),\n created: z.number(),\n model: z.string(),\n system_fingerprint: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.string().optional(),\n content: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal(\"function\").optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n }),\n )\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\n \"stop\",\n \"length\",\n \"tool_calls\",\n \"content_filter\",\n \"function_call\",\n ])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n }),\n ),\n usage: UsageSchema.optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionChunk = z.infer<typeof ChatCompletionChunkSchema>;\n\n// ============================================\n// PLUGIN CONSTANTS\n// ============================================\n\nexport const PLUGIN_ID = \"llm:openai\" as const;\nexport const RESOURCE_TYPE = \"llm\" as const;\nexport const PROVIDER = \"openai\" as const;\nexport const VERSION = \"1.0.0\";\n\n/** Default allowed models */\nexport const DEFAULT_OPENAI_MODELS = [\n // GPT-5 family\n \"gpt-5.2\",\n \"gpt-5.2-pro\",\n \"gpt-5-mini\",\n \"gpt-5-nano\",\n // GPT-4.1 family\n \"gpt-4.1\",\n \"gpt-4.1-mini\",\n \"gpt-4.1-nano\",\n // GPT-4o family\n \"gpt-4o\",\n \"gpt-4o-mini\",\n // o3/o4 reasoning models\n \"o3\",\n \"o3-pro\",\n \"o4-mini\",\n] as const;\n\n/** Supported actions */\nexport const ACTIONS = [\"chat.completions\"] as const;\nexport type OpenAIAction = (typeof ACTIONS)[number];\n\n/** Enforcement knobs */\nexport const ENFORCEMENT_SUPPORT = [\n \"model\",\n \"max_tokens\",\n \"streaming\",\n] as const;\n\n/** Default API URL */\nexport const DEFAULT_API_URL = \"https://api.openai.com/v1\";\n"],"mappings":"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","names":[]}
@@ -14,7 +14,7 @@ import {
14
14
  ToolSchema,
15
15
  UsageSchema,
16
16
  VERSION
17
- } from "./chunk-6FNYHOB5.mjs";
17
+ } from "./chunk-VWR4ADAV.mjs";
18
18
  export {
19
19
  ACTIONS,
20
20
  ChatCompletionChoiceSchema,
package/dist/index.js CHANGED
@@ -250,33 +250,22 @@ var RESOURCE_TYPE = "llm";
250
250
  var PROVIDER = "openai";
251
251
  var VERSION = "1.0.0";
252
252
  var DEFAULT_OPENAI_MODELS = [
253
+ // GPT-5 family
254
+ "gpt-5.2",
255
+ "gpt-5.2-pro",
256
+ "gpt-5-mini",
257
+ "gpt-5-nano",
258
+ // GPT-4.1 family
259
+ "gpt-4.1",
260
+ "gpt-4.1-mini",
261
+ "gpt-4.1-nano",
253
262
  // GPT-4o family
254
263
  "gpt-4o",
255
- "gpt-4o-2024-11-20",
256
- "gpt-4o-2024-08-06",
257
- "gpt-4o-2024-05-13",
258
264
  "gpt-4o-mini",
259
- "gpt-4o-mini-2024-07-18",
260
- // GPT-4 Turbo
261
- "gpt-4-turbo",
262
- "gpt-4-turbo-2024-04-09",
263
- "gpt-4-turbo-preview",
264
- "gpt-4-0125-preview",
265
- "gpt-4-1106-preview",
266
- // GPT-4
267
- "gpt-4",
268
- "gpt-4-0613",
269
- // GPT-3.5 Turbo
270
- "gpt-3.5-turbo",
271
- "gpt-3.5-turbo-0125",
272
- "gpt-3.5-turbo-1106",
273
- // o1 family (reasoning models)
274
- "o1",
275
- "o1-2024-12-17",
276
- "o1-preview",
277
- "o1-preview-2024-09-12",
278
- "o1-mini",
279
- "o1-mini-2024-09-12"
265
+ // o3/o4 reasoning models
266
+ "o3",
267
+ "o3-pro",
268
+ "o4-mini"
280
269
  ];
281
270
  var ACTIONS = ["chat.completions"];
282
271
  var ENFORCEMENT_SUPPORT = [
@@ -356,6 +345,7 @@ var openaiPlugin = {
356
345
  supports: {
357
346
  enforcement: [...ENFORCEMENT_SUPPORT]
358
347
  },
348
+ defaultModels: DEFAULT_OPENAI_MODELS,
359
349
  // Client contract metadata for SDK-compatible plugins
360
350
  client: {
361
351
  namespace: "openai",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/proxy.ts","../src/contracts.ts"],"sourcesContent":["// ============================================\n// OPENAI PLUGIN - MAIN ENTRYPOINT\n// Re-exports for backward compatibility\n// ============================================\n\n// Re-export proxy plugin as default for backward compatibility\nexport { default } from \"./proxy\";\nexport { openaiPlugin } from \"./proxy\";\n\n// Re-export contracts\nexport * from \"./contracts\";\n","// ============================================\n// OPENAI PLUGIN PROXY\n// Server-side plugin implementation for the gateway\n// ============================================\n//\n// This module is imported by the proxy to handle OpenAI requests.\n// It should NOT be imported by target apps.\n//\n// Import path: @glueco/plugin-llm-openai/proxy\n// ============================================\n\nimport type {\n PluginContract,\n PluginResourceConstraints,\n PluginValidationResult,\n PluginExecuteContext,\n PluginExecuteOptions,\n PluginExecuteResult,\n PluginUsageMetrics,\n PluginMappedError,\n EnforcementFields,\n} from \"@glueco/shared\";\nimport { createPluginBase } from \"@glueco/shared\";\n\nimport {\n ChatCompletionRequestSchema,\n type ChatCompletionRequest,\n PLUGIN_ID,\n RESOURCE_TYPE,\n PROVIDER,\n VERSION,\n DEFAULT_OPENAI_MODELS,\n ACTIONS,\n ENFORCEMENT_SUPPORT,\n DEFAULT_API_URL,\n} from \"./contracts\";\n\n// ============================================\n// ERROR HANDLING\n// ============================================\n\nclass OpenAIApiError extends Error {\n constructor(\n public status: number,\n public body: string,\n ) {\n super(`OpenAI API error: ${status}`);\n this.name = \"OpenAIApiError\";\n }\n}\n\nfunction mapOpenAIError(error: OpenAIApiError): PluginMappedError {\n let parsed: { error?: { message?: string; type?: string; code?: string } } =\n {};\n try {\n parsed = JSON.parse(error.body);\n } catch {\n // Ignore parse errors\n }\n\n const message = parsed.error?.message || error.body;\n const code = parsed.error?.code;\n\n switch (error.status) {\n case 400:\n return { status: 400, code: \"BAD_REQUEST\", message, retryable: false };\n case 401:\n return {\n status: 401,\n code: \"UNAUTHORIZED\",\n message: \"Invalid API key\",\n retryable: false,\n };\n case 403:\n return { status: 403, code: \"FORBIDDEN\", message, retryable: false };\n case 404:\n return { status: 404, code: \"NOT_FOUND\", message, retryable: false };\n case 429:\n // OpenAI distinguishes between rate limits and quota exceeded\n if (code === \"insufficient_quota\") {\n return {\n status: 429,\n code: \"QUOTA_EXCEEDED\",\n message: \"API quota exceeded\",\n retryable: false,\n };\n }\n return { status: 429, code: \"RATE_LIMITED\", message, retryable: true };\n case 500:\n case 502:\n case 503:\n return {\n status: error.status,\n code: \"PROVIDER_ERROR\",\n message,\n retryable: true,\n };\n default:\n return {\n status: error.status,\n code: \"UNKNOWN\",\n message,\n retryable: false,\n };\n }\n}\n\n// ============================================\n// PLUGIN IMPLEMENTATION\n// ============================================\n\nconst openaiPlugin: PluginContract = {\n ...createPluginBase({\n id: PLUGIN_ID,\n resourceType: RESOURCE_TYPE,\n provider: PROVIDER,\n version: VERSION,\n name: \"OpenAI LLM\",\n actions: [...ACTIONS],\n supports: {\n enforcement: [...ENFORCEMENT_SUPPORT],\n },\n // Client contract metadata for SDK-compatible plugins\n client: {\n namespace: \"openai\",\n actions: {\n \"chat.completions\": {\n description: \"Generate chat completions using OpenAI GPT models\",\n },\n },\n },\n }),\n\n // Credential schema for UI\n credentialSchema: {\n fields: [\n {\n name: \"apiKey\",\n type: \"secret\",\n label: \"API Key\",\n description: \"Your OpenAI API key (starts with sk-)\",\n required: true,\n },\n {\n name: \"organization\",\n type: \"string\",\n label: \"Organization ID\",\n description: \"Optional OpenAI organization ID\",\n required: false,\n },\n {\n name: \"baseUrl\",\n type: \"url\",\n label: \"Base URL\",\n description:\n \"Custom API base URL (optional, for Azure OpenAI or proxies)\",\n required: false,\n default: DEFAULT_API_URL,\n },\n ],\n },\n\n validateAndShape(\n action: string,\n input: unknown,\n constraints: PluginResourceConstraints,\n ): PluginValidationResult {\n if (action !== \"chat.completions\") {\n return { valid: false, error: `Unsupported action: ${action}` };\n }\n\n // Parse input - this is the schema-first validation\n const parsed = ChatCompletionRequestSchema.safeParse(input);\n if (!parsed.success) {\n return {\n valid: false,\n error: `Invalid request: ${parsed.error.errors.map((e) => e.message).join(\", \")}`,\n };\n }\n\n const request = parsed.data;\n\n // Build enforcement fields from validated request\n // These are extracted DURING validation, not after\n const enforcement: EnforcementFields = {\n model: request.model,\n stream: request.stream ?? false,\n usesTools: Array.isArray(request.tools) && request.tools.length > 0,\n maxOutputTokens: request.max_tokens ?? request.max_completion_tokens,\n };\n\n // Check allowed models\n const allowedModels = constraints.allowedModels ?? [\n ...DEFAULT_OPENAI_MODELS,\n ];\n if (!allowedModels.includes(request.model)) {\n return {\n valid: false,\n error: `Model '${request.model}' not allowed. Allowed: ${allowedModels.join(\", \")}`,\n };\n }\n\n // Enforce max tokens\n const maxTokens = constraints.maxOutputTokens ?? 16384;\n const requestedTokens = request.max_tokens ?? request.max_completion_tokens;\n\n if (requestedTokens && requestedTokens > maxTokens) {\n return {\n valid: false,\n error: `max_tokens (${requestedTokens}) exceeds limit (${maxTokens})`,\n };\n }\n\n // Check streaming permission\n if (request.stream && constraints.allowStreaming === false) {\n return {\n valid: false,\n error: \"Streaming is not allowed for this app\",\n };\n }\n\n // Shape the request (apply defaults, caps)\n const shapedRequest: ChatCompletionRequest = {\n ...request,\n max_tokens: requestedTokens\n ? Math.min(requestedTokens, maxTokens)\n : undefined, // OpenAI doesn't require max_tokens\n };\n\n return { valid: true, shapedInput: shapedRequest, enforcement };\n },\n\n async execute(\n action: string,\n shapedInput: unknown,\n ctx: PluginExecuteContext,\n options: PluginExecuteOptions,\n ): Promise<PluginExecuteResult> {\n const request = shapedInput as ChatCompletionRequest;\n const baseUrl = (ctx.config?.baseUrl as string) || DEFAULT_API_URL;\n const organization = ctx.config?.organization as string | undefined;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${ctx.secret}`,\n };\n\n // Add organization header if provided\n if (organization) {\n headers[\"OpenAI-Organization\"] = organization;\n }\n\n const response = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new OpenAIApiError(response.status, errorBody);\n }\n\n if (request.stream) {\n // Return streaming response\n return {\n stream: response.body!,\n contentType: \"text/event-stream\",\n };\n } else {\n // Return JSON response\n const json = await response.json();\n return {\n response: json,\n contentType: \"application/json\",\n usage: this.extractUsage(json),\n };\n }\n },\n\n extractUsage(response: unknown): PluginUsageMetrics {\n const res = response as {\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n model?: string;\n };\n\n return {\n inputTokens: res.usage?.prompt_tokens,\n outputTokens: res.usage?.completion_tokens,\n totalTokens: res.usage?.total_tokens,\n model: res.model,\n };\n },\n\n mapError(error: unknown): PluginMappedError {\n if (error instanceof OpenAIApiError) {\n return mapOpenAIError(error);\n }\n\n return {\n status: 500,\n code: \"INTERNAL_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n retryable: false,\n };\n },\n};\n\nexport default openaiPlugin;\n\n// Also export named for flexibility\nexport { openaiPlugin };\n","// ============================================\n// OPENAI PLUGIN CONTRACTS\n// Shared request/response schemas for proxy and client\n// ============================================\n\nimport { z } from \"zod\";\n\n// ============================================\n// REQUEST SCHEMAS (OpenAI Chat Completion API)\n// ============================================\n\nexport const ChatMessageSchema = z.object({\n role: z.enum([\"system\", \"user\", \"assistant\", \"tool\", \"function\"]),\n content: z\n .union([\n z.string(),\n z.array(\n z.object({\n type: z.enum([\"text\", \"image_url\"]),\n text: z.string().optional(),\n image_url: z\n .object({\n url: z.string(),\n detail: z.enum([\"auto\", \"low\", \"high\"]).optional(),\n })\n .optional(),\n }),\n ),\n ])\n .nullable(),\n name: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n tool_call_id: z.string().optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n});\n\nexport type ChatMessage = z.infer<typeof ChatMessageSchema>;\n\nexport const ToolSchema = z.object({\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n description: z.string().optional(),\n parameters: z.record(z.unknown()).optional(),\n strict: z.boolean().optional(),\n }),\n});\n\nexport type Tool = z.infer<typeof ToolSchema>;\n\nexport const ChatCompletionRequestSchema = z.object({\n model: z.string(),\n messages: z.array(ChatMessageSchema),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n n: z.number().int().min(1).max(10).optional(),\n stream: z.boolean().optional(),\n stream_options: z\n .object({\n include_usage: z.boolean().optional(),\n })\n .optional(),\n stop: z.union([z.string(), z.array(z.string())]).optional(),\n max_tokens: z.number().int().positive().optional(),\n max_completion_tokens: z.number().int().positive().optional(),\n presence_penalty: z.number().min(-2).max(2).optional(),\n frequency_penalty: z.number().min(-2).max(2).optional(),\n logit_bias: z.record(z.number()).optional(),\n logprobs: z.boolean().optional(),\n top_logprobs: z.number().int().min(0).max(20).optional(),\n user: z.string().optional(),\n tools: z.array(ToolSchema).optional(),\n tool_choice: z\n .union([\n z.literal(\"none\"),\n z.literal(\"auto\"),\n z.literal(\"required\"),\n z.object({\n type: z.literal(\"function\"),\n function: z.object({ name: z.string() }),\n }),\n ])\n .optional(),\n parallel_tool_calls: z.boolean().optional(),\n response_format: z\n .union([\n z.object({ type: z.literal(\"text\") }),\n z.object({ type: z.literal(\"json_object\") }),\n z.object({\n type: z.literal(\"json_schema\"),\n json_schema: z.object({\n name: z.string(),\n description: z.string().optional(),\n schema: z.record(z.unknown()),\n strict: z.boolean().optional(),\n }),\n }),\n ])\n .optional(),\n seed: z.number().int().optional(),\n service_tier: z.enum([\"auto\", \"default\"]).optional(),\n});\n\nexport type ChatCompletionRequest = z.infer<typeof ChatCompletionRequestSchema>;\n\n// ============================================\n// RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChoiceSchema = z.object({\n index: z.number(),\n message: z.object({\n role: z.literal(\"assistant\"),\n content: z.string().nullable(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\"stop\", \"length\", \"tool_calls\", \"content_filter\", \"function_call\"])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n});\n\nexport type ChatCompletionChoice = z.infer<typeof ChatCompletionChoiceSchema>;\n\nexport const UsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().optional(),\n })\n .optional(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type Usage = z.infer<typeof UsageSchema>;\n\nexport const ChatCompletionResponseSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion\"),\n created: z.number(),\n model: z.string(),\n choices: z.array(ChatCompletionChoiceSchema),\n usage: UsageSchema.optional(),\n system_fingerprint: z.string().optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionResponse = z.infer<\n typeof ChatCompletionResponseSchema\n>;\n\n// ============================================\n// STREAMING RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChunkSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion.chunk\"),\n created: z.number(),\n model: z.string(),\n system_fingerprint: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.string().optional(),\n content: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal(\"function\").optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n }),\n )\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\n \"stop\",\n \"length\",\n \"tool_calls\",\n \"content_filter\",\n \"function_call\",\n ])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n }),\n ),\n usage: UsageSchema.optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionChunk = z.infer<typeof ChatCompletionChunkSchema>;\n\n// ============================================\n// PLUGIN CONSTANTS\n// ============================================\n\nexport const PLUGIN_ID = \"llm:openai\" as const;\nexport const RESOURCE_TYPE = \"llm\" as const;\nexport const PROVIDER = \"openai\" as const;\nexport const VERSION = \"1.0.0\";\n\n/** Default allowed models */\nexport const DEFAULT_OPENAI_MODELS = [\n // GPT-4o family\n \"gpt-4o\",\n \"gpt-4o-2024-11-20\",\n \"gpt-4o-2024-08-06\",\n \"gpt-4o-2024-05-13\",\n \"gpt-4o-mini\",\n \"gpt-4o-mini-2024-07-18\",\n // GPT-4 Turbo\n \"gpt-4-turbo\",\n \"gpt-4-turbo-2024-04-09\",\n \"gpt-4-turbo-preview\",\n \"gpt-4-0125-preview\",\n \"gpt-4-1106-preview\",\n // GPT-4\n \"gpt-4\",\n \"gpt-4-0613\",\n // GPT-3.5 Turbo\n \"gpt-3.5-turbo\",\n \"gpt-3.5-turbo-0125\",\n \"gpt-3.5-turbo-1106\",\n // o1 family (reasoning models)\n \"o1\",\n \"o1-2024-12-17\",\n \"o1-preview\",\n \"o1-preview-2024-09-12\",\n \"o1-mini\",\n \"o1-mini-2024-09-12\",\n] as const;\n\n/** Supported actions */\nexport const ACTIONS = [\"chat.completions\"] as const;\nexport type OpenAIAction = (typeof ACTIONS)[number];\n\n/** Enforcement knobs */\nexport const ENFORCEMENT_SUPPORT = [\n \"model\",\n \"max_tokens\",\n \"streaming\",\n] as const;\n\n/** Default API URL */\nexport const DEFAULT_API_URL = \"https://api.openai.com/v1\";\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/proxy.ts","../src/contracts.ts"],"sourcesContent":["// ============================================\n// OPENAI PLUGIN - MAIN ENTRYPOINT\n// Re-exports for backward compatibility\n// ============================================\n\n// Re-export proxy plugin as default for backward compatibility\nexport { default } from \"./proxy\";\nexport { openaiPlugin } from \"./proxy\";\n\n// Re-export contracts\nexport * from \"./contracts\";\n","// ============================================\n// OPENAI PLUGIN PROXY\n// Server-side plugin implementation for the gateway\n// ============================================\n//\n// This module is imported by the proxy to handle OpenAI requests.\n// It should NOT be imported by target apps.\n//\n// Import path: @glueco/plugin-llm-openai/proxy\n// ============================================\n\nimport type {\n PluginContract,\n PluginResourceConstraints,\n PluginValidationResult,\n PluginExecuteContext,\n PluginExecuteOptions,\n PluginExecuteResult,\n PluginUsageMetrics,\n PluginMappedError,\n EnforcementFields,\n} from \"@glueco/shared\";\nimport { createPluginBase } from \"@glueco/shared\";\n\nimport {\n ChatCompletionRequestSchema,\n type ChatCompletionRequest,\n PLUGIN_ID,\n RESOURCE_TYPE,\n PROVIDER,\n VERSION,\n DEFAULT_OPENAI_MODELS,\n ACTIONS,\n ENFORCEMENT_SUPPORT,\n DEFAULT_API_URL,\n} from \"./contracts\";\n\n// ============================================\n// ERROR HANDLING\n// ============================================\n\nclass OpenAIApiError extends Error {\n constructor(\n public status: number,\n public body: string,\n ) {\n super(`OpenAI API error: ${status}`);\n this.name = \"OpenAIApiError\";\n }\n}\n\nfunction mapOpenAIError(error: OpenAIApiError): PluginMappedError {\n let parsed: { error?: { message?: string; type?: string; code?: string } } =\n {};\n try {\n parsed = JSON.parse(error.body);\n } catch {\n // Ignore parse errors\n }\n\n const message = parsed.error?.message || error.body;\n const code = parsed.error?.code;\n\n switch (error.status) {\n case 400:\n return { status: 400, code: \"BAD_REQUEST\", message, retryable: false };\n case 401:\n return {\n status: 401,\n code: \"UNAUTHORIZED\",\n message: \"Invalid API key\",\n retryable: false,\n };\n case 403:\n return { status: 403, code: \"FORBIDDEN\", message, retryable: false };\n case 404:\n return { status: 404, code: \"NOT_FOUND\", message, retryable: false };\n case 429:\n // OpenAI distinguishes between rate limits and quota exceeded\n if (code === \"insufficient_quota\") {\n return {\n status: 429,\n code: \"QUOTA_EXCEEDED\",\n message: \"API quota exceeded\",\n retryable: false,\n };\n }\n return { status: 429, code: \"RATE_LIMITED\", message, retryable: true };\n case 500:\n case 502:\n case 503:\n return {\n status: error.status,\n code: \"PROVIDER_ERROR\",\n message,\n retryable: true,\n };\n default:\n return {\n status: error.status,\n code: \"UNKNOWN\",\n message,\n retryable: false,\n };\n }\n}\n\n// ============================================\n// PLUGIN IMPLEMENTATION\n// ============================================\n\nconst openaiPlugin: PluginContract = {\n ...createPluginBase({\n id: PLUGIN_ID,\n resourceType: RESOURCE_TYPE,\n provider: PROVIDER,\n version: VERSION,\n name: \"OpenAI LLM\",\n actions: [...ACTIONS],\n supports: {\n enforcement: [...ENFORCEMENT_SUPPORT],\n },\n defaultModels: DEFAULT_OPENAI_MODELS,\n // Client contract metadata for SDK-compatible plugins\n client: {\n namespace: \"openai\",\n actions: {\n \"chat.completions\": {\n description: \"Generate chat completions using OpenAI GPT models\",\n },\n },\n },\n }),\n\n // Credential schema for UI\n credentialSchema: {\n fields: [\n {\n name: \"apiKey\",\n type: \"secret\",\n label: \"API Key\",\n description: \"Your OpenAI API key (starts with sk-)\",\n required: true,\n },\n {\n name: \"organization\",\n type: \"string\",\n label: \"Organization ID\",\n description: \"Optional OpenAI organization ID\",\n required: false,\n },\n {\n name: \"baseUrl\",\n type: \"url\",\n label: \"Base URL\",\n description:\n \"Custom API base URL (optional, for Azure OpenAI or proxies)\",\n required: false,\n default: DEFAULT_API_URL,\n },\n ],\n },\n\n validateAndShape(\n action: string,\n input: unknown,\n constraints: PluginResourceConstraints,\n ): PluginValidationResult {\n if (action !== \"chat.completions\") {\n return { valid: false, error: `Unsupported action: ${action}` };\n }\n\n // Parse input - this is the schema-first validation\n const parsed = ChatCompletionRequestSchema.safeParse(input);\n if (!parsed.success) {\n return {\n valid: false,\n error: `Invalid request: ${parsed.error.errors.map((e) => e.message).join(\", \")}`,\n };\n }\n\n const request = parsed.data;\n\n // Build enforcement fields from validated request\n // These are extracted DURING validation, not after\n const enforcement: EnforcementFields = {\n model: request.model,\n stream: request.stream ?? false,\n usesTools: Array.isArray(request.tools) && request.tools.length > 0,\n maxOutputTokens: request.max_tokens ?? request.max_completion_tokens,\n };\n\n // Check allowed models\n const allowedModels = constraints.allowedModels ?? [\n ...DEFAULT_OPENAI_MODELS,\n ];\n if (!allowedModels.includes(request.model)) {\n return {\n valid: false,\n error: `Model '${request.model}' not allowed. Allowed: ${allowedModels.join(\", \")}`,\n };\n }\n\n // Enforce max tokens\n const maxTokens = constraints.maxOutputTokens ?? 16384;\n const requestedTokens = request.max_tokens ?? request.max_completion_tokens;\n\n if (requestedTokens && requestedTokens > maxTokens) {\n return {\n valid: false,\n error: `max_tokens (${requestedTokens}) exceeds limit (${maxTokens})`,\n };\n }\n\n // Check streaming permission\n if (request.stream && constraints.allowStreaming === false) {\n return {\n valid: false,\n error: \"Streaming is not allowed for this app\",\n };\n }\n\n // Shape the request (apply defaults, caps)\n const shapedRequest: ChatCompletionRequest = {\n ...request,\n max_tokens: requestedTokens\n ? Math.min(requestedTokens, maxTokens)\n : undefined, // OpenAI doesn't require max_tokens\n };\n\n return { valid: true, shapedInput: shapedRequest, enforcement };\n },\n\n async execute(\n action: string,\n shapedInput: unknown,\n ctx: PluginExecuteContext,\n options: PluginExecuteOptions,\n ): Promise<PluginExecuteResult> {\n const request = shapedInput as ChatCompletionRequest;\n const baseUrl = (ctx.config?.baseUrl as string) || DEFAULT_API_URL;\n const organization = ctx.config?.organization as string | undefined;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${ctx.secret}`,\n };\n\n // Add organization header if provided\n if (organization) {\n headers[\"OpenAI-Organization\"] = organization;\n }\n\n const response = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new OpenAIApiError(response.status, errorBody);\n }\n\n if (request.stream) {\n // Return streaming response\n return {\n stream: response.body!,\n contentType: \"text/event-stream\",\n };\n } else {\n // Return JSON response\n const json = await response.json();\n return {\n response: json,\n contentType: \"application/json\",\n usage: this.extractUsage(json),\n };\n }\n },\n\n extractUsage(response: unknown): PluginUsageMetrics {\n const res = response as {\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n model?: string;\n };\n\n return {\n inputTokens: res.usage?.prompt_tokens,\n outputTokens: res.usage?.completion_tokens,\n totalTokens: res.usage?.total_tokens,\n model: res.model,\n };\n },\n\n mapError(error: unknown): PluginMappedError {\n if (error instanceof OpenAIApiError) {\n return mapOpenAIError(error);\n }\n\n return {\n status: 500,\n code: \"INTERNAL_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n retryable: false,\n };\n },\n};\n\nexport default openaiPlugin;\n\n// Also export named for flexibility\nexport { openaiPlugin };\n","// ============================================\n// OPENAI PLUGIN CONTRACTS\n// Shared request/response schemas for proxy and client\n// ============================================\n\nimport { z } from \"zod\";\n\n// ============================================\n// REQUEST SCHEMAS (OpenAI Chat Completion API)\n// ============================================\n\nexport const ChatMessageSchema = z.object({\n role: z.enum([\"system\", \"user\", \"assistant\", \"tool\", \"function\"]),\n content: z\n .union([\n z.string(),\n z.array(\n z.object({\n type: z.enum([\"text\", \"image_url\"]),\n text: z.string().optional(),\n image_url: z\n .object({\n url: z.string(),\n detail: z.enum([\"auto\", \"low\", \"high\"]).optional(),\n })\n .optional(),\n }),\n ),\n ])\n .nullable(),\n name: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n tool_call_id: z.string().optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n});\n\nexport type ChatMessage = z.infer<typeof ChatMessageSchema>;\n\nexport const ToolSchema = z.object({\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n description: z.string().optional(),\n parameters: z.record(z.unknown()).optional(),\n strict: z.boolean().optional(),\n }),\n});\n\nexport type Tool = z.infer<typeof ToolSchema>;\n\nexport const ChatCompletionRequestSchema = z.object({\n model: z.string(),\n messages: z.array(ChatMessageSchema),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n n: z.number().int().min(1).max(10).optional(),\n stream: z.boolean().optional(),\n stream_options: z\n .object({\n include_usage: z.boolean().optional(),\n })\n .optional(),\n stop: z.union([z.string(), z.array(z.string())]).optional(),\n max_tokens: z.number().int().positive().optional(),\n max_completion_tokens: z.number().int().positive().optional(),\n presence_penalty: z.number().min(-2).max(2).optional(),\n frequency_penalty: z.number().min(-2).max(2).optional(),\n logit_bias: z.record(z.number()).optional(),\n logprobs: z.boolean().optional(),\n top_logprobs: z.number().int().min(0).max(20).optional(),\n user: z.string().optional(),\n tools: z.array(ToolSchema).optional(),\n tool_choice: z\n .union([\n z.literal(\"none\"),\n z.literal(\"auto\"),\n z.literal(\"required\"),\n z.object({\n type: z.literal(\"function\"),\n function: z.object({ name: z.string() }),\n }),\n ])\n .optional(),\n parallel_tool_calls: z.boolean().optional(),\n response_format: z\n .union([\n z.object({ type: z.literal(\"text\") }),\n z.object({ type: z.literal(\"json_object\") }),\n z.object({\n type: z.literal(\"json_schema\"),\n json_schema: z.object({\n name: z.string(),\n description: z.string().optional(),\n schema: z.record(z.unknown()),\n strict: z.boolean().optional(),\n }),\n }),\n ])\n .optional(),\n seed: z.number().int().optional(),\n service_tier: z.enum([\"auto\", \"default\"]).optional(),\n});\n\nexport type ChatCompletionRequest = z.infer<typeof ChatCompletionRequestSchema>;\n\n// ============================================\n// RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChoiceSchema = z.object({\n index: z.number(),\n message: z.object({\n role: z.literal(\"assistant\"),\n content: z.string().nullable(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\"stop\", \"length\", \"tool_calls\", \"content_filter\", \"function_call\"])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n});\n\nexport type ChatCompletionChoice = z.infer<typeof ChatCompletionChoiceSchema>;\n\nexport const UsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().optional(),\n })\n .optional(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type Usage = z.infer<typeof UsageSchema>;\n\nexport const ChatCompletionResponseSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion\"),\n created: z.number(),\n model: z.string(),\n choices: z.array(ChatCompletionChoiceSchema),\n usage: UsageSchema.optional(),\n system_fingerprint: z.string().optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionResponse = z.infer<\n typeof ChatCompletionResponseSchema\n>;\n\n// ============================================\n// STREAMING RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChunkSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion.chunk\"),\n created: z.number(),\n model: z.string(),\n system_fingerprint: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.string().optional(),\n content: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal(\"function\").optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n }),\n )\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\n \"stop\",\n \"length\",\n \"tool_calls\",\n \"content_filter\",\n \"function_call\",\n ])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n }),\n ),\n usage: UsageSchema.optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionChunk = z.infer<typeof ChatCompletionChunkSchema>;\n\n// ============================================\n// PLUGIN CONSTANTS\n// ============================================\n\nexport const PLUGIN_ID = \"llm:openai\" as const;\nexport const RESOURCE_TYPE = \"llm\" as const;\nexport const PROVIDER = \"openai\" as const;\nexport const VERSION = \"1.0.0\";\n\n/** Default allowed models */\nexport const DEFAULT_OPENAI_MODELS = [\n // GPT-5 family\n \"gpt-5.2\",\n \"gpt-5.2-pro\",\n \"gpt-5-mini\",\n \"gpt-5-nano\",\n // GPT-4.1 family\n \"gpt-4.1\",\n \"gpt-4.1-mini\",\n \"gpt-4.1-nano\",\n // GPT-4o family\n \"gpt-4o\",\n \"gpt-4o-mini\",\n // o3/o4 reasoning models\n \"o3\",\n \"o3-pro\",\n \"o4-mini\",\n] as const;\n\n/** Supported actions */\nexport const ACTIONS = [\"chat.completions\"] as const;\nexport type OpenAIAction = (typeof ACTIONS)[number];\n\n/** Enforcement knobs */\nexport const ENFORCEMENT_SUPPORT = [\n \"model\",\n \"max_tokens\",\n \"streaming\",\n] as const;\n\n/** Default API URL */\nexport const DEFAULT_API_URL = \"https://api.openai.com/v1\";\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  openaiPlugin,
3
3
  proxy_default
4
- } from "./chunk-6GMCQHIR.mjs";
4
+ } from "./chunk-QKYD26TX.mjs";
5
5
  import {
6
6
  ACTIONS,
7
7
  ChatCompletionChoiceSchema,
@@ -18,7 +18,7 @@ import {
18
18
  ToolSchema,
19
19
  UsageSchema,
20
20
  VERSION
21
- } from "./chunk-6FNYHOB5.mjs";
21
+ } from "./chunk-VWR4ADAV.mjs";
22
22
  export {
23
23
  ACTIONS,
24
24
  ChatCompletionChoiceSchema,
package/dist/proxy.js CHANGED
@@ -233,33 +233,22 @@ var RESOURCE_TYPE = "llm";
233
233
  var PROVIDER = "openai";
234
234
  var VERSION = "1.0.0";
235
235
  var DEFAULT_OPENAI_MODELS = [
236
+ // GPT-5 family
237
+ "gpt-5.2",
238
+ "gpt-5.2-pro",
239
+ "gpt-5-mini",
240
+ "gpt-5-nano",
241
+ // GPT-4.1 family
242
+ "gpt-4.1",
243
+ "gpt-4.1-mini",
244
+ "gpt-4.1-nano",
236
245
  // GPT-4o family
237
246
  "gpt-4o",
238
- "gpt-4o-2024-11-20",
239
- "gpt-4o-2024-08-06",
240
- "gpt-4o-2024-05-13",
241
247
  "gpt-4o-mini",
242
- "gpt-4o-mini-2024-07-18",
243
- // GPT-4 Turbo
244
- "gpt-4-turbo",
245
- "gpt-4-turbo-2024-04-09",
246
- "gpt-4-turbo-preview",
247
- "gpt-4-0125-preview",
248
- "gpt-4-1106-preview",
249
- // GPT-4
250
- "gpt-4",
251
- "gpt-4-0613",
252
- // GPT-3.5 Turbo
253
- "gpt-3.5-turbo",
254
- "gpt-3.5-turbo-0125",
255
- "gpt-3.5-turbo-1106",
256
- // o1 family (reasoning models)
257
- "o1",
258
- "o1-2024-12-17",
259
- "o1-preview",
260
- "o1-preview-2024-09-12",
261
- "o1-mini",
262
- "o1-mini-2024-09-12"
248
+ // o3/o4 reasoning models
249
+ "o3",
250
+ "o3-pro",
251
+ "o4-mini"
263
252
  ];
264
253
  var ACTIONS = ["chat.completions"];
265
254
  var ENFORCEMENT_SUPPORT = [
@@ -339,6 +328,7 @@ var openaiPlugin = {
339
328
  supports: {
340
329
  enforcement: [...ENFORCEMENT_SUPPORT]
341
330
  },
331
+ defaultModels: DEFAULT_OPENAI_MODELS,
342
332
  // Client contract metadata for SDK-compatible plugins
343
333
  client: {
344
334
  namespace: "openai",
package/dist/proxy.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/proxy.ts","../src/contracts.ts"],"sourcesContent":["// ============================================\n// OPENAI PLUGIN PROXY\n// Server-side plugin implementation for the gateway\n// ============================================\n//\n// This module is imported by the proxy to handle OpenAI requests.\n// It should NOT be imported by target apps.\n//\n// Import path: @glueco/plugin-llm-openai/proxy\n// ============================================\n\nimport type {\n PluginContract,\n PluginResourceConstraints,\n PluginValidationResult,\n PluginExecuteContext,\n PluginExecuteOptions,\n PluginExecuteResult,\n PluginUsageMetrics,\n PluginMappedError,\n EnforcementFields,\n} from \"@glueco/shared\";\nimport { createPluginBase } from \"@glueco/shared\";\n\nimport {\n ChatCompletionRequestSchema,\n type ChatCompletionRequest,\n PLUGIN_ID,\n RESOURCE_TYPE,\n PROVIDER,\n VERSION,\n DEFAULT_OPENAI_MODELS,\n ACTIONS,\n ENFORCEMENT_SUPPORT,\n DEFAULT_API_URL,\n} from \"./contracts\";\n\n// ============================================\n// ERROR HANDLING\n// ============================================\n\nclass OpenAIApiError extends Error {\n constructor(\n public status: number,\n public body: string,\n ) {\n super(`OpenAI API error: ${status}`);\n this.name = \"OpenAIApiError\";\n }\n}\n\nfunction mapOpenAIError(error: OpenAIApiError): PluginMappedError {\n let parsed: { error?: { message?: string; type?: string; code?: string } } =\n {};\n try {\n parsed = JSON.parse(error.body);\n } catch {\n // Ignore parse errors\n }\n\n const message = parsed.error?.message || error.body;\n const code = parsed.error?.code;\n\n switch (error.status) {\n case 400:\n return { status: 400, code: \"BAD_REQUEST\", message, retryable: false };\n case 401:\n return {\n status: 401,\n code: \"UNAUTHORIZED\",\n message: \"Invalid API key\",\n retryable: false,\n };\n case 403:\n return { status: 403, code: \"FORBIDDEN\", message, retryable: false };\n case 404:\n return { status: 404, code: \"NOT_FOUND\", message, retryable: false };\n case 429:\n // OpenAI distinguishes between rate limits and quota exceeded\n if (code === \"insufficient_quota\") {\n return {\n status: 429,\n code: \"QUOTA_EXCEEDED\",\n message: \"API quota exceeded\",\n retryable: false,\n };\n }\n return { status: 429, code: \"RATE_LIMITED\", message, retryable: true };\n case 500:\n case 502:\n case 503:\n return {\n status: error.status,\n code: \"PROVIDER_ERROR\",\n message,\n retryable: true,\n };\n default:\n return {\n status: error.status,\n code: \"UNKNOWN\",\n message,\n retryable: false,\n };\n }\n}\n\n// ============================================\n// PLUGIN IMPLEMENTATION\n// ============================================\n\nconst openaiPlugin: PluginContract = {\n ...createPluginBase({\n id: PLUGIN_ID,\n resourceType: RESOURCE_TYPE,\n provider: PROVIDER,\n version: VERSION,\n name: \"OpenAI LLM\",\n actions: [...ACTIONS],\n supports: {\n enforcement: [...ENFORCEMENT_SUPPORT],\n },\n // Client contract metadata for SDK-compatible plugins\n client: {\n namespace: \"openai\",\n actions: {\n \"chat.completions\": {\n description: \"Generate chat completions using OpenAI GPT models\",\n },\n },\n },\n }),\n\n // Credential schema for UI\n credentialSchema: {\n fields: [\n {\n name: \"apiKey\",\n type: \"secret\",\n label: \"API Key\",\n description: \"Your OpenAI API key (starts with sk-)\",\n required: true,\n },\n {\n name: \"organization\",\n type: \"string\",\n label: \"Organization ID\",\n description: \"Optional OpenAI organization ID\",\n required: false,\n },\n {\n name: \"baseUrl\",\n type: \"url\",\n label: \"Base URL\",\n description:\n \"Custom API base URL (optional, for Azure OpenAI or proxies)\",\n required: false,\n default: DEFAULT_API_URL,\n },\n ],\n },\n\n validateAndShape(\n action: string,\n input: unknown,\n constraints: PluginResourceConstraints,\n ): PluginValidationResult {\n if (action !== \"chat.completions\") {\n return { valid: false, error: `Unsupported action: ${action}` };\n }\n\n // Parse input - this is the schema-first validation\n const parsed = ChatCompletionRequestSchema.safeParse(input);\n if (!parsed.success) {\n return {\n valid: false,\n error: `Invalid request: ${parsed.error.errors.map((e) => e.message).join(\", \")}`,\n };\n }\n\n const request = parsed.data;\n\n // Build enforcement fields from validated request\n // These are extracted DURING validation, not after\n const enforcement: EnforcementFields = {\n model: request.model,\n stream: request.stream ?? false,\n usesTools: Array.isArray(request.tools) && request.tools.length > 0,\n maxOutputTokens: request.max_tokens ?? request.max_completion_tokens,\n };\n\n // Check allowed models\n const allowedModels = constraints.allowedModels ?? [\n ...DEFAULT_OPENAI_MODELS,\n ];\n if (!allowedModels.includes(request.model)) {\n return {\n valid: false,\n error: `Model '${request.model}' not allowed. Allowed: ${allowedModels.join(\", \")}`,\n };\n }\n\n // Enforce max tokens\n const maxTokens = constraints.maxOutputTokens ?? 16384;\n const requestedTokens = request.max_tokens ?? request.max_completion_tokens;\n\n if (requestedTokens && requestedTokens > maxTokens) {\n return {\n valid: false,\n error: `max_tokens (${requestedTokens}) exceeds limit (${maxTokens})`,\n };\n }\n\n // Check streaming permission\n if (request.stream && constraints.allowStreaming === false) {\n return {\n valid: false,\n error: \"Streaming is not allowed for this app\",\n };\n }\n\n // Shape the request (apply defaults, caps)\n const shapedRequest: ChatCompletionRequest = {\n ...request,\n max_tokens: requestedTokens\n ? Math.min(requestedTokens, maxTokens)\n : undefined, // OpenAI doesn't require max_tokens\n };\n\n return { valid: true, shapedInput: shapedRequest, enforcement };\n },\n\n async execute(\n action: string,\n shapedInput: unknown,\n ctx: PluginExecuteContext,\n options: PluginExecuteOptions,\n ): Promise<PluginExecuteResult> {\n const request = shapedInput as ChatCompletionRequest;\n const baseUrl = (ctx.config?.baseUrl as string) || DEFAULT_API_URL;\n const organization = ctx.config?.organization as string | undefined;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${ctx.secret}`,\n };\n\n // Add organization header if provided\n if (organization) {\n headers[\"OpenAI-Organization\"] = organization;\n }\n\n const response = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new OpenAIApiError(response.status, errorBody);\n }\n\n if (request.stream) {\n // Return streaming response\n return {\n stream: response.body!,\n contentType: \"text/event-stream\",\n };\n } else {\n // Return JSON response\n const json = await response.json();\n return {\n response: json,\n contentType: \"application/json\",\n usage: this.extractUsage(json),\n };\n }\n },\n\n extractUsage(response: unknown): PluginUsageMetrics {\n const res = response as {\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n model?: string;\n };\n\n return {\n inputTokens: res.usage?.prompt_tokens,\n outputTokens: res.usage?.completion_tokens,\n totalTokens: res.usage?.total_tokens,\n model: res.model,\n };\n },\n\n mapError(error: unknown): PluginMappedError {\n if (error instanceof OpenAIApiError) {\n return mapOpenAIError(error);\n }\n\n return {\n status: 500,\n code: \"INTERNAL_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n retryable: false,\n };\n },\n};\n\nexport default openaiPlugin;\n\n// Also export named for flexibility\nexport { openaiPlugin };\n","// ============================================\n// OPENAI PLUGIN CONTRACTS\n// Shared request/response schemas for proxy and client\n// ============================================\n\nimport { z } from \"zod\";\n\n// ============================================\n// REQUEST SCHEMAS (OpenAI Chat Completion API)\n// ============================================\n\nexport const ChatMessageSchema = z.object({\n role: z.enum([\"system\", \"user\", \"assistant\", \"tool\", \"function\"]),\n content: z\n .union([\n z.string(),\n z.array(\n z.object({\n type: z.enum([\"text\", \"image_url\"]),\n text: z.string().optional(),\n image_url: z\n .object({\n url: z.string(),\n detail: z.enum([\"auto\", \"low\", \"high\"]).optional(),\n })\n .optional(),\n }),\n ),\n ])\n .nullable(),\n name: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n tool_call_id: z.string().optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n});\n\nexport type ChatMessage = z.infer<typeof ChatMessageSchema>;\n\nexport const ToolSchema = z.object({\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n description: z.string().optional(),\n parameters: z.record(z.unknown()).optional(),\n strict: z.boolean().optional(),\n }),\n});\n\nexport type Tool = z.infer<typeof ToolSchema>;\n\nexport const ChatCompletionRequestSchema = z.object({\n model: z.string(),\n messages: z.array(ChatMessageSchema),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n n: z.number().int().min(1).max(10).optional(),\n stream: z.boolean().optional(),\n stream_options: z\n .object({\n include_usage: z.boolean().optional(),\n })\n .optional(),\n stop: z.union([z.string(), z.array(z.string())]).optional(),\n max_tokens: z.number().int().positive().optional(),\n max_completion_tokens: z.number().int().positive().optional(),\n presence_penalty: z.number().min(-2).max(2).optional(),\n frequency_penalty: z.number().min(-2).max(2).optional(),\n logit_bias: z.record(z.number()).optional(),\n logprobs: z.boolean().optional(),\n top_logprobs: z.number().int().min(0).max(20).optional(),\n user: z.string().optional(),\n tools: z.array(ToolSchema).optional(),\n tool_choice: z\n .union([\n z.literal(\"none\"),\n z.literal(\"auto\"),\n z.literal(\"required\"),\n z.object({\n type: z.literal(\"function\"),\n function: z.object({ name: z.string() }),\n }),\n ])\n .optional(),\n parallel_tool_calls: z.boolean().optional(),\n response_format: z\n .union([\n z.object({ type: z.literal(\"text\") }),\n z.object({ type: z.literal(\"json_object\") }),\n z.object({\n type: z.literal(\"json_schema\"),\n json_schema: z.object({\n name: z.string(),\n description: z.string().optional(),\n schema: z.record(z.unknown()),\n strict: z.boolean().optional(),\n }),\n }),\n ])\n .optional(),\n seed: z.number().int().optional(),\n service_tier: z.enum([\"auto\", \"default\"]).optional(),\n});\n\nexport type ChatCompletionRequest = z.infer<typeof ChatCompletionRequestSchema>;\n\n// ============================================\n// RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChoiceSchema = z.object({\n index: z.number(),\n message: z.object({\n role: z.literal(\"assistant\"),\n content: z.string().nullable(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\"stop\", \"length\", \"tool_calls\", \"content_filter\", \"function_call\"])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n});\n\nexport type ChatCompletionChoice = z.infer<typeof ChatCompletionChoiceSchema>;\n\nexport const UsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().optional(),\n })\n .optional(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type Usage = z.infer<typeof UsageSchema>;\n\nexport const ChatCompletionResponseSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion\"),\n created: z.number(),\n model: z.string(),\n choices: z.array(ChatCompletionChoiceSchema),\n usage: UsageSchema.optional(),\n system_fingerprint: z.string().optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionResponse = z.infer<\n typeof ChatCompletionResponseSchema\n>;\n\n// ============================================\n// STREAMING RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChunkSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion.chunk\"),\n created: z.number(),\n model: z.string(),\n system_fingerprint: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.string().optional(),\n content: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal(\"function\").optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n }),\n )\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\n \"stop\",\n \"length\",\n \"tool_calls\",\n \"content_filter\",\n \"function_call\",\n ])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n }),\n ),\n usage: UsageSchema.optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionChunk = z.infer<typeof ChatCompletionChunkSchema>;\n\n// ============================================\n// PLUGIN CONSTANTS\n// ============================================\n\nexport const PLUGIN_ID = \"llm:openai\" as const;\nexport const RESOURCE_TYPE = \"llm\" as const;\nexport const PROVIDER = \"openai\" as const;\nexport const VERSION = \"1.0.0\";\n\n/** Default allowed models */\nexport const DEFAULT_OPENAI_MODELS = [\n // GPT-4o family\n \"gpt-4o\",\n \"gpt-4o-2024-11-20\",\n \"gpt-4o-2024-08-06\",\n \"gpt-4o-2024-05-13\",\n \"gpt-4o-mini\",\n \"gpt-4o-mini-2024-07-18\",\n // GPT-4 Turbo\n \"gpt-4-turbo\",\n \"gpt-4-turbo-2024-04-09\",\n \"gpt-4-turbo-preview\",\n \"gpt-4-0125-preview\",\n \"gpt-4-1106-preview\",\n // GPT-4\n \"gpt-4\",\n \"gpt-4-0613\",\n // GPT-3.5 Turbo\n \"gpt-3.5-turbo\",\n \"gpt-3.5-turbo-0125\",\n \"gpt-3.5-turbo-1106\",\n // o1 family (reasoning models)\n \"o1\",\n \"o1-2024-12-17\",\n \"o1-preview\",\n \"o1-preview-2024-09-12\",\n \"o1-mini\",\n \"o1-mini-2024-09-12\",\n] as const;\n\n/** Supported actions */\nexport const ACTIONS = [\"chat.completions\"] as const;\nexport type OpenAIAction = (typeof ACTIONS)[number];\n\n/** Enforcement knobs */\nexport const ENFORCEMENT_SUPPORT = [\n \"model\",\n \"max_tokens\",\n \"streaming\",\n] as const;\n\n/** Default API URL */\nexport const DEFAULT_API_URL = \"https://api.openai.com/v1\";\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/proxy.ts","../src/contracts.ts"],"sourcesContent":["// ============================================\n// OPENAI PLUGIN PROXY\n// Server-side plugin implementation for the gateway\n// ============================================\n//\n// This module is imported by the proxy to handle OpenAI requests.\n// It should NOT be imported by target apps.\n//\n// Import path: @glueco/plugin-llm-openai/proxy\n// ============================================\n\nimport type {\n PluginContract,\n PluginResourceConstraints,\n PluginValidationResult,\n PluginExecuteContext,\n PluginExecuteOptions,\n PluginExecuteResult,\n PluginUsageMetrics,\n PluginMappedError,\n EnforcementFields,\n} from \"@glueco/shared\";\nimport { createPluginBase } from \"@glueco/shared\";\n\nimport {\n ChatCompletionRequestSchema,\n type ChatCompletionRequest,\n PLUGIN_ID,\n RESOURCE_TYPE,\n PROVIDER,\n VERSION,\n DEFAULT_OPENAI_MODELS,\n ACTIONS,\n ENFORCEMENT_SUPPORT,\n DEFAULT_API_URL,\n} from \"./contracts\";\n\n// ============================================\n// ERROR HANDLING\n// ============================================\n\nclass OpenAIApiError extends Error {\n constructor(\n public status: number,\n public body: string,\n ) {\n super(`OpenAI API error: ${status}`);\n this.name = \"OpenAIApiError\";\n }\n}\n\nfunction mapOpenAIError(error: OpenAIApiError): PluginMappedError {\n let parsed: { error?: { message?: string; type?: string; code?: string } } =\n {};\n try {\n parsed = JSON.parse(error.body);\n } catch {\n // Ignore parse errors\n }\n\n const message = parsed.error?.message || error.body;\n const code = parsed.error?.code;\n\n switch (error.status) {\n case 400:\n return { status: 400, code: \"BAD_REQUEST\", message, retryable: false };\n case 401:\n return {\n status: 401,\n code: \"UNAUTHORIZED\",\n message: \"Invalid API key\",\n retryable: false,\n };\n case 403:\n return { status: 403, code: \"FORBIDDEN\", message, retryable: false };\n case 404:\n return { status: 404, code: \"NOT_FOUND\", message, retryable: false };\n case 429:\n // OpenAI distinguishes between rate limits and quota exceeded\n if (code === \"insufficient_quota\") {\n return {\n status: 429,\n code: \"QUOTA_EXCEEDED\",\n message: \"API quota exceeded\",\n retryable: false,\n };\n }\n return { status: 429, code: \"RATE_LIMITED\", message, retryable: true };\n case 500:\n case 502:\n case 503:\n return {\n status: error.status,\n code: \"PROVIDER_ERROR\",\n message,\n retryable: true,\n };\n default:\n return {\n status: error.status,\n code: \"UNKNOWN\",\n message,\n retryable: false,\n };\n }\n}\n\n// ============================================\n// PLUGIN IMPLEMENTATION\n// ============================================\n\nconst openaiPlugin: PluginContract = {\n ...createPluginBase({\n id: PLUGIN_ID,\n resourceType: RESOURCE_TYPE,\n provider: PROVIDER,\n version: VERSION,\n name: \"OpenAI LLM\",\n actions: [...ACTIONS],\n supports: {\n enforcement: [...ENFORCEMENT_SUPPORT],\n },\n defaultModels: DEFAULT_OPENAI_MODELS,\n // Client contract metadata for SDK-compatible plugins\n client: {\n namespace: \"openai\",\n actions: {\n \"chat.completions\": {\n description: \"Generate chat completions using OpenAI GPT models\",\n },\n },\n },\n }),\n\n // Credential schema for UI\n credentialSchema: {\n fields: [\n {\n name: \"apiKey\",\n type: \"secret\",\n label: \"API Key\",\n description: \"Your OpenAI API key (starts with sk-)\",\n required: true,\n },\n {\n name: \"organization\",\n type: \"string\",\n label: \"Organization ID\",\n description: \"Optional OpenAI organization ID\",\n required: false,\n },\n {\n name: \"baseUrl\",\n type: \"url\",\n label: \"Base URL\",\n description:\n \"Custom API base URL (optional, for Azure OpenAI or proxies)\",\n required: false,\n default: DEFAULT_API_URL,\n },\n ],\n },\n\n validateAndShape(\n action: string,\n input: unknown,\n constraints: PluginResourceConstraints,\n ): PluginValidationResult {\n if (action !== \"chat.completions\") {\n return { valid: false, error: `Unsupported action: ${action}` };\n }\n\n // Parse input - this is the schema-first validation\n const parsed = ChatCompletionRequestSchema.safeParse(input);\n if (!parsed.success) {\n return {\n valid: false,\n error: `Invalid request: ${parsed.error.errors.map((e) => e.message).join(\", \")}`,\n };\n }\n\n const request = parsed.data;\n\n // Build enforcement fields from validated request\n // These are extracted DURING validation, not after\n const enforcement: EnforcementFields = {\n model: request.model,\n stream: request.stream ?? false,\n usesTools: Array.isArray(request.tools) && request.tools.length > 0,\n maxOutputTokens: request.max_tokens ?? request.max_completion_tokens,\n };\n\n // Check allowed models\n const allowedModels = constraints.allowedModels ?? [\n ...DEFAULT_OPENAI_MODELS,\n ];\n if (!allowedModels.includes(request.model)) {\n return {\n valid: false,\n error: `Model '${request.model}' not allowed. Allowed: ${allowedModels.join(\", \")}`,\n };\n }\n\n // Enforce max tokens\n const maxTokens = constraints.maxOutputTokens ?? 16384;\n const requestedTokens = request.max_tokens ?? request.max_completion_tokens;\n\n if (requestedTokens && requestedTokens > maxTokens) {\n return {\n valid: false,\n error: `max_tokens (${requestedTokens}) exceeds limit (${maxTokens})`,\n };\n }\n\n // Check streaming permission\n if (request.stream && constraints.allowStreaming === false) {\n return {\n valid: false,\n error: \"Streaming is not allowed for this app\",\n };\n }\n\n // Shape the request (apply defaults, caps)\n const shapedRequest: ChatCompletionRequest = {\n ...request,\n max_tokens: requestedTokens\n ? Math.min(requestedTokens, maxTokens)\n : undefined, // OpenAI doesn't require max_tokens\n };\n\n return { valid: true, shapedInput: shapedRequest, enforcement };\n },\n\n async execute(\n action: string,\n shapedInput: unknown,\n ctx: PluginExecuteContext,\n options: PluginExecuteOptions,\n ): Promise<PluginExecuteResult> {\n const request = shapedInput as ChatCompletionRequest;\n const baseUrl = (ctx.config?.baseUrl as string) || DEFAULT_API_URL;\n const organization = ctx.config?.organization as string | undefined;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${ctx.secret}`,\n };\n\n // Add organization header if provided\n if (organization) {\n headers[\"OpenAI-Organization\"] = organization;\n }\n\n const response = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new OpenAIApiError(response.status, errorBody);\n }\n\n if (request.stream) {\n // Return streaming response\n return {\n stream: response.body!,\n contentType: \"text/event-stream\",\n };\n } else {\n // Return JSON response\n const json = await response.json();\n return {\n response: json,\n contentType: \"application/json\",\n usage: this.extractUsage(json),\n };\n }\n },\n\n extractUsage(response: unknown): PluginUsageMetrics {\n const res = response as {\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n model?: string;\n };\n\n return {\n inputTokens: res.usage?.prompt_tokens,\n outputTokens: res.usage?.completion_tokens,\n totalTokens: res.usage?.total_tokens,\n model: res.model,\n };\n },\n\n mapError(error: unknown): PluginMappedError {\n if (error instanceof OpenAIApiError) {\n return mapOpenAIError(error);\n }\n\n return {\n status: 500,\n code: \"INTERNAL_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n retryable: false,\n };\n },\n};\n\nexport default openaiPlugin;\n\n// Also export named for flexibility\nexport { openaiPlugin };\n","// ============================================\n// OPENAI PLUGIN CONTRACTS\n// Shared request/response schemas for proxy and client\n// ============================================\n\nimport { z } from \"zod\";\n\n// ============================================\n// REQUEST SCHEMAS (OpenAI Chat Completion API)\n// ============================================\n\nexport const ChatMessageSchema = z.object({\n role: z.enum([\"system\", \"user\", \"assistant\", \"tool\", \"function\"]),\n content: z\n .union([\n z.string(),\n z.array(\n z.object({\n type: z.enum([\"text\", \"image_url\"]),\n text: z.string().optional(),\n image_url: z\n .object({\n url: z.string(),\n detail: z.enum([\"auto\", \"low\", \"high\"]).optional(),\n })\n .optional(),\n }),\n ),\n ])\n .nullable(),\n name: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n tool_call_id: z.string().optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n});\n\nexport type ChatMessage = z.infer<typeof ChatMessageSchema>;\n\nexport const ToolSchema = z.object({\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n description: z.string().optional(),\n parameters: z.record(z.unknown()).optional(),\n strict: z.boolean().optional(),\n }),\n});\n\nexport type Tool = z.infer<typeof ToolSchema>;\n\nexport const ChatCompletionRequestSchema = z.object({\n model: z.string(),\n messages: z.array(ChatMessageSchema),\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n n: z.number().int().min(1).max(10).optional(),\n stream: z.boolean().optional(),\n stream_options: z\n .object({\n include_usage: z.boolean().optional(),\n })\n .optional(),\n stop: z.union([z.string(), z.array(z.string())]).optional(),\n max_tokens: z.number().int().positive().optional(),\n max_completion_tokens: z.number().int().positive().optional(),\n presence_penalty: z.number().min(-2).max(2).optional(),\n frequency_penalty: z.number().min(-2).max(2).optional(),\n logit_bias: z.record(z.number()).optional(),\n logprobs: z.boolean().optional(),\n top_logprobs: z.number().int().min(0).max(20).optional(),\n user: z.string().optional(),\n tools: z.array(ToolSchema).optional(),\n tool_choice: z\n .union([\n z.literal(\"none\"),\n z.literal(\"auto\"),\n z.literal(\"required\"),\n z.object({\n type: z.literal(\"function\"),\n function: z.object({ name: z.string() }),\n }),\n ])\n .optional(),\n parallel_tool_calls: z.boolean().optional(),\n response_format: z\n .union([\n z.object({ type: z.literal(\"text\") }),\n z.object({ type: z.literal(\"json_object\") }),\n z.object({\n type: z.literal(\"json_schema\"),\n json_schema: z.object({\n name: z.string(),\n description: z.string().optional(),\n schema: z.record(z.unknown()),\n strict: z.boolean().optional(),\n }),\n }),\n ])\n .optional(),\n seed: z.number().int().optional(),\n service_tier: z.enum([\"auto\", \"default\"]).optional(),\n});\n\nexport type ChatCompletionRequest = z.infer<typeof ChatCompletionRequestSchema>;\n\n// ============================================\n// RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChoiceSchema = z.object({\n index: z.number(),\n message: z.object({\n role: z.literal(\"assistant\"),\n content: z.string().nullable(),\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal(\"function\"),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .optional(),\n function_call: z\n .object({\n name: z.string(),\n arguments: z.string(),\n })\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\"stop\", \"length\", \"tool_calls\", \"content_filter\", \"function_call\"])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n});\n\nexport type ChatCompletionChoice = z.infer<typeof ChatCompletionChoiceSchema>;\n\nexport const UsageSchema = z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().optional(),\n })\n .optional(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().optional(),\n })\n .optional(),\n});\n\nexport type Usage = z.infer<typeof UsageSchema>;\n\nexport const ChatCompletionResponseSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion\"),\n created: z.number(),\n model: z.string(),\n choices: z.array(ChatCompletionChoiceSchema),\n usage: UsageSchema.optional(),\n system_fingerprint: z.string().optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionResponse = z.infer<\n typeof ChatCompletionResponseSchema\n>;\n\n// ============================================\n// STREAMING RESPONSE SCHEMAS\n// ============================================\n\nexport const ChatCompletionChunkSchema = z.object({\n id: z.string(),\n object: z.literal(\"chat.completion.chunk\"),\n created: z.number(),\n model: z.string(),\n system_fingerprint: z.string().optional(),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.string().optional(),\n content: z.string().optional(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().optional(),\n type: z.literal(\"function\").optional(),\n function: z\n .object({\n name: z.string().optional(),\n arguments: z.string().optional(),\n })\n .optional(),\n }),\n )\n .optional(),\n refusal: z.string().nullable().optional(),\n }),\n finish_reason: z\n .enum([\n \"stop\",\n \"length\",\n \"tool_calls\",\n \"content_filter\",\n \"function_call\",\n ])\n .nullable(),\n logprobs: z\n .object({\n content: z\n .array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n }),\n )\n .nullable(),\n })\n .nullable()\n .optional(),\n }),\n ),\n usage: UsageSchema.optional(),\n service_tier: z.string().optional(),\n});\n\nexport type ChatCompletionChunk = z.infer<typeof ChatCompletionChunkSchema>;\n\n// ============================================\n// PLUGIN CONSTANTS\n// ============================================\n\nexport const PLUGIN_ID = \"llm:openai\" as const;\nexport const RESOURCE_TYPE = \"llm\" as const;\nexport const PROVIDER = \"openai\" as const;\nexport const VERSION = \"1.0.0\";\n\n/** Default allowed models */\nexport const DEFAULT_OPENAI_MODELS = [\n // GPT-5 family\n \"gpt-5.2\",\n \"gpt-5.2-pro\",\n \"gpt-5-mini\",\n \"gpt-5-nano\",\n // GPT-4.1 family\n \"gpt-4.1\",\n \"gpt-4.1-mini\",\n \"gpt-4.1-nano\",\n // GPT-4o family\n \"gpt-4o\",\n \"gpt-4o-mini\",\n // o3/o4 reasoning models\n \"o3\",\n \"o3-pro\",\n \"o4-mini\",\n] as const;\n\n/** Supported actions */\nexport const ACTIONS = [\"chat.completions\"] as const;\nexport type OpenAIAction = (typeof ACTIONS)[number];\n\n/** Enforcement knobs */\nexport const ENFORCEMENT_SUPPORT = [\n \"model\",\n \"max_tokens\",\n \"streaming\",\n] as const;\n\n/** Default API URL */\nexport const DEFAULT_API_URL = \"https://api.openai.com/v1\";\n"],"mappings":"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","names":[]}
package/dist/proxy.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  openaiPlugin,
3
3
  proxy_default
4
- } from "./chunk-6GMCQHIR.mjs";
5
- import "./chunk-6FNYHOB5.mjs";
4
+ } from "./chunk-QKYD26TX.mjs";
5
+ import "./chunk-VWR4ADAV.mjs";
6
6
  export {
7
7
  proxy_default as default,
8
8
  openaiPlugin
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glueco/plugin-llm-openai",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "OpenAI LLM plugin for Personal Resource Gateway",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -37,7 +37,7 @@
37
37
  "typecheck": "tsc --noEmit"
38
38
  },
39
39
  "dependencies": {
40
- "@glueco/shared": "^0.3.0",
40
+ "@glueco/shared": "^0.3.1",
41
41
  "zod": "^3.22.4"
42
42
  },
43
43
  "devDependencies": {
@@ -46,7 +46,7 @@
46
46
  "typescript": "^5.3.3"
47
47
  },
48
48
  "peerDependencies": {
49
- "@glueco/shared": "^0.3.0",
49
+ "@glueco/shared": "^0.3.1",
50
50
  "@glueco/sdk": "^0.3.0"
51
51
  },
52
52
  "peerDependenciesMeta": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/proxy.ts"],"sourcesContent":["// ============================================\n// OPENAI PLUGIN PROXY\n// Server-side plugin implementation for the gateway\n// ============================================\n//\n// This module is imported by the proxy to handle OpenAI requests.\n// It should NOT be imported by target apps.\n//\n// Import path: @glueco/plugin-llm-openai/proxy\n// ============================================\n\nimport type {\n PluginContract,\n PluginResourceConstraints,\n PluginValidationResult,\n PluginExecuteContext,\n PluginExecuteOptions,\n PluginExecuteResult,\n PluginUsageMetrics,\n PluginMappedError,\n EnforcementFields,\n} from \"@glueco/shared\";\nimport { createPluginBase } from \"@glueco/shared\";\n\nimport {\n ChatCompletionRequestSchema,\n type ChatCompletionRequest,\n PLUGIN_ID,\n RESOURCE_TYPE,\n PROVIDER,\n VERSION,\n DEFAULT_OPENAI_MODELS,\n ACTIONS,\n ENFORCEMENT_SUPPORT,\n DEFAULT_API_URL,\n} from \"./contracts\";\n\n// ============================================\n// ERROR HANDLING\n// ============================================\n\nclass OpenAIApiError extends Error {\n constructor(\n public status: number,\n public body: string,\n ) {\n super(`OpenAI API error: ${status}`);\n this.name = \"OpenAIApiError\";\n }\n}\n\nfunction mapOpenAIError(error: OpenAIApiError): PluginMappedError {\n let parsed: { error?: { message?: string; type?: string; code?: string } } =\n {};\n try {\n parsed = JSON.parse(error.body);\n } catch {\n // Ignore parse errors\n }\n\n const message = parsed.error?.message || error.body;\n const code = parsed.error?.code;\n\n switch (error.status) {\n case 400:\n return { status: 400, code: \"BAD_REQUEST\", message, retryable: false };\n case 401:\n return {\n status: 401,\n code: \"UNAUTHORIZED\",\n message: \"Invalid API key\",\n retryable: false,\n };\n case 403:\n return { status: 403, code: \"FORBIDDEN\", message, retryable: false };\n case 404:\n return { status: 404, code: \"NOT_FOUND\", message, retryable: false };\n case 429:\n // OpenAI distinguishes between rate limits and quota exceeded\n if (code === \"insufficient_quota\") {\n return {\n status: 429,\n code: \"QUOTA_EXCEEDED\",\n message: \"API quota exceeded\",\n retryable: false,\n };\n }\n return { status: 429, code: \"RATE_LIMITED\", message, retryable: true };\n case 500:\n case 502:\n case 503:\n return {\n status: error.status,\n code: \"PROVIDER_ERROR\",\n message,\n retryable: true,\n };\n default:\n return {\n status: error.status,\n code: \"UNKNOWN\",\n message,\n retryable: false,\n };\n }\n}\n\n// ============================================\n// PLUGIN IMPLEMENTATION\n// ============================================\n\nconst openaiPlugin: PluginContract = {\n ...createPluginBase({\n id: PLUGIN_ID,\n resourceType: RESOURCE_TYPE,\n provider: PROVIDER,\n version: VERSION,\n name: \"OpenAI LLM\",\n actions: [...ACTIONS],\n supports: {\n enforcement: [...ENFORCEMENT_SUPPORT],\n },\n // Client contract metadata for SDK-compatible plugins\n client: {\n namespace: \"openai\",\n actions: {\n \"chat.completions\": {\n description: \"Generate chat completions using OpenAI GPT models\",\n },\n },\n },\n }),\n\n // Credential schema for UI\n credentialSchema: {\n fields: [\n {\n name: \"apiKey\",\n type: \"secret\",\n label: \"API Key\",\n description: \"Your OpenAI API key (starts with sk-)\",\n required: true,\n },\n {\n name: \"organization\",\n type: \"string\",\n label: \"Organization ID\",\n description: \"Optional OpenAI organization ID\",\n required: false,\n },\n {\n name: \"baseUrl\",\n type: \"url\",\n label: \"Base URL\",\n description:\n \"Custom API base URL (optional, for Azure OpenAI or proxies)\",\n required: false,\n default: DEFAULT_API_URL,\n },\n ],\n },\n\n validateAndShape(\n action: string,\n input: unknown,\n constraints: PluginResourceConstraints,\n ): PluginValidationResult {\n if (action !== \"chat.completions\") {\n return { valid: false, error: `Unsupported action: ${action}` };\n }\n\n // Parse input - this is the schema-first validation\n const parsed = ChatCompletionRequestSchema.safeParse(input);\n if (!parsed.success) {\n return {\n valid: false,\n error: `Invalid request: ${parsed.error.errors.map((e) => e.message).join(\", \")}`,\n };\n }\n\n const request = parsed.data;\n\n // Build enforcement fields from validated request\n // These are extracted DURING validation, not after\n const enforcement: EnforcementFields = {\n model: request.model,\n stream: request.stream ?? false,\n usesTools: Array.isArray(request.tools) && request.tools.length > 0,\n maxOutputTokens: request.max_tokens ?? request.max_completion_tokens,\n };\n\n // Check allowed models\n const allowedModels = constraints.allowedModels ?? [\n ...DEFAULT_OPENAI_MODELS,\n ];\n if (!allowedModels.includes(request.model)) {\n return {\n valid: false,\n error: `Model '${request.model}' not allowed. Allowed: ${allowedModels.join(\", \")}`,\n };\n }\n\n // Enforce max tokens\n const maxTokens = constraints.maxOutputTokens ?? 16384;\n const requestedTokens = request.max_tokens ?? request.max_completion_tokens;\n\n if (requestedTokens && requestedTokens > maxTokens) {\n return {\n valid: false,\n error: `max_tokens (${requestedTokens}) exceeds limit (${maxTokens})`,\n };\n }\n\n // Check streaming permission\n if (request.stream && constraints.allowStreaming === false) {\n return {\n valid: false,\n error: \"Streaming is not allowed for this app\",\n };\n }\n\n // Shape the request (apply defaults, caps)\n const shapedRequest: ChatCompletionRequest = {\n ...request,\n max_tokens: requestedTokens\n ? Math.min(requestedTokens, maxTokens)\n : undefined, // OpenAI doesn't require max_tokens\n };\n\n return { valid: true, shapedInput: shapedRequest, enforcement };\n },\n\n async execute(\n action: string,\n shapedInput: unknown,\n ctx: PluginExecuteContext,\n options: PluginExecuteOptions,\n ): Promise<PluginExecuteResult> {\n const request = shapedInput as ChatCompletionRequest;\n const baseUrl = (ctx.config?.baseUrl as string) || DEFAULT_API_URL;\n const organization = ctx.config?.organization as string | undefined;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${ctx.secret}`,\n };\n\n // Add organization header if provided\n if (organization) {\n headers[\"OpenAI-Organization\"] = organization;\n }\n\n const response = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new OpenAIApiError(response.status, errorBody);\n }\n\n if (request.stream) {\n // Return streaming response\n return {\n stream: response.body!,\n contentType: \"text/event-stream\",\n };\n } else {\n // Return JSON response\n const json = await response.json();\n return {\n response: json,\n contentType: \"application/json\",\n usage: this.extractUsage(json),\n };\n }\n },\n\n extractUsage(response: unknown): PluginUsageMetrics {\n const res = response as {\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n model?: string;\n };\n\n return {\n inputTokens: res.usage?.prompt_tokens,\n outputTokens: res.usage?.completion_tokens,\n totalTokens: res.usage?.total_tokens,\n model: res.model,\n };\n },\n\n mapError(error: unknown): PluginMappedError {\n if (error instanceof OpenAIApiError) {\n return mapOpenAIError(error);\n }\n\n return {\n status: 500,\n code: \"INTERNAL_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n retryable: false,\n };\n },\n};\n\nexport default openaiPlugin;\n\n// Also export named for flexibility\nexport { openaiPlugin };\n"],"mappings":"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","names":[]}