@glueco/plugin-llm-openai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,520 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ ACTIONS: () => ACTIONS,
24
+ ChatCompletionChoiceSchema: () => ChatCompletionChoiceSchema,
25
+ ChatCompletionChunkSchema: () => ChatCompletionChunkSchema,
26
+ ChatCompletionRequestSchema: () => ChatCompletionRequestSchema,
27
+ ChatCompletionResponseSchema: () => ChatCompletionResponseSchema,
28
+ ChatMessageSchema: () => ChatMessageSchema,
29
+ DEFAULT_API_URL: () => DEFAULT_API_URL,
30
+ DEFAULT_OPENAI_MODELS: () => DEFAULT_OPENAI_MODELS,
31
+ ENFORCEMENT_SUPPORT: () => ENFORCEMENT_SUPPORT,
32
+ PLUGIN_ID: () => PLUGIN_ID,
33
+ PROVIDER: () => PROVIDER,
34
+ RESOURCE_TYPE: () => RESOURCE_TYPE,
35
+ ToolSchema: () => ToolSchema,
36
+ UsageSchema: () => UsageSchema,
37
+ VERSION: () => VERSION,
38
+ default: () => proxy_default,
39
+ openaiPlugin: () => openaiPlugin
40
+ });
41
+ module.exports = __toCommonJS(src_exports);
42
+
43
+ // src/proxy.ts
44
+ var import_shared = require("@glueco/shared");
45
+
46
+ // src/contracts.ts
47
+ var import_zod = require("zod");
48
+ var ChatMessageSchema = import_zod.z.object({
49
+ role: import_zod.z.enum(["system", "user", "assistant", "tool", "function"]),
50
+ content: import_zod.z.union([
51
+ import_zod.z.string(),
52
+ import_zod.z.array(
53
+ import_zod.z.object({
54
+ type: import_zod.z.enum(["text", "image_url"]),
55
+ text: import_zod.z.string().optional(),
56
+ image_url: import_zod.z.object({
57
+ url: import_zod.z.string(),
58
+ detail: import_zod.z.enum(["auto", "low", "high"]).optional()
59
+ }).optional()
60
+ })
61
+ )
62
+ ]).nullable(),
63
+ name: import_zod.z.string().optional(),
64
+ tool_calls: import_zod.z.array(
65
+ import_zod.z.object({
66
+ id: import_zod.z.string(),
67
+ type: import_zod.z.literal("function"),
68
+ function: import_zod.z.object({
69
+ name: import_zod.z.string(),
70
+ arguments: import_zod.z.string()
71
+ })
72
+ })
73
+ ).optional(),
74
+ tool_call_id: import_zod.z.string().optional(),
75
+ function_call: import_zod.z.object({
76
+ name: import_zod.z.string(),
77
+ arguments: import_zod.z.string()
78
+ }).optional()
79
+ });
80
+ var ToolSchema = import_zod.z.object({
81
+ type: import_zod.z.literal("function"),
82
+ function: import_zod.z.object({
83
+ name: import_zod.z.string(),
84
+ description: import_zod.z.string().optional(),
85
+ parameters: import_zod.z.record(import_zod.z.unknown()).optional(),
86
+ strict: import_zod.z.boolean().optional()
87
+ })
88
+ });
89
+ var ChatCompletionRequestSchema = import_zod.z.object({
90
+ model: import_zod.z.string(),
91
+ messages: import_zod.z.array(ChatMessageSchema),
92
+ temperature: import_zod.z.number().min(0).max(2).optional(),
93
+ top_p: import_zod.z.number().min(0).max(1).optional(),
94
+ n: import_zod.z.number().int().min(1).max(10).optional(),
95
+ stream: import_zod.z.boolean().optional(),
96
+ stream_options: import_zod.z.object({
97
+ include_usage: import_zod.z.boolean().optional()
98
+ }).optional(),
99
+ stop: import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.string())]).optional(),
100
+ max_tokens: import_zod.z.number().int().positive().optional(),
101
+ max_completion_tokens: import_zod.z.number().int().positive().optional(),
102
+ presence_penalty: import_zod.z.number().min(-2).max(2).optional(),
103
+ frequency_penalty: import_zod.z.number().min(-2).max(2).optional(),
104
+ logit_bias: import_zod.z.record(import_zod.z.number()).optional(),
105
+ logprobs: import_zod.z.boolean().optional(),
106
+ top_logprobs: import_zod.z.number().int().min(0).max(20).optional(),
107
+ user: import_zod.z.string().optional(),
108
+ tools: import_zod.z.array(ToolSchema).optional(),
109
+ tool_choice: import_zod.z.union([
110
+ import_zod.z.literal("none"),
111
+ import_zod.z.literal("auto"),
112
+ import_zod.z.literal("required"),
113
+ import_zod.z.object({
114
+ type: import_zod.z.literal("function"),
115
+ function: import_zod.z.object({ name: import_zod.z.string() })
116
+ })
117
+ ]).optional(),
118
+ parallel_tool_calls: import_zod.z.boolean().optional(),
119
+ response_format: import_zod.z.union([
120
+ import_zod.z.object({ type: import_zod.z.literal("text") }),
121
+ import_zod.z.object({ type: import_zod.z.literal("json_object") }),
122
+ import_zod.z.object({
123
+ type: import_zod.z.literal("json_schema"),
124
+ json_schema: import_zod.z.object({
125
+ name: import_zod.z.string(),
126
+ description: import_zod.z.string().optional(),
127
+ schema: import_zod.z.record(import_zod.z.unknown()),
128
+ strict: import_zod.z.boolean().optional()
129
+ })
130
+ })
131
+ ]).optional(),
132
+ seed: import_zod.z.number().int().optional(),
133
+ service_tier: import_zod.z.enum(["auto", "default"]).optional()
134
+ });
135
+ var ChatCompletionChoiceSchema = import_zod.z.object({
136
+ index: import_zod.z.number(),
137
+ message: import_zod.z.object({
138
+ role: import_zod.z.literal("assistant"),
139
+ content: import_zod.z.string().nullable(),
140
+ tool_calls: import_zod.z.array(
141
+ import_zod.z.object({
142
+ id: import_zod.z.string(),
143
+ type: import_zod.z.literal("function"),
144
+ function: import_zod.z.object({
145
+ name: import_zod.z.string(),
146
+ arguments: import_zod.z.string()
147
+ })
148
+ })
149
+ ).optional(),
150
+ function_call: import_zod.z.object({
151
+ name: import_zod.z.string(),
152
+ arguments: import_zod.z.string()
153
+ }).optional(),
154
+ refusal: import_zod.z.string().nullable().optional()
155
+ }),
156
+ finish_reason: import_zod.z.enum(["stop", "length", "tool_calls", "content_filter", "function_call"]).nullable(),
157
+ logprobs: import_zod.z.object({
158
+ content: import_zod.z.array(
159
+ import_zod.z.object({
160
+ token: import_zod.z.string(),
161
+ logprob: import_zod.z.number(),
162
+ bytes: import_zod.z.array(import_zod.z.number()).nullable(),
163
+ top_logprobs: import_zod.z.array(
164
+ import_zod.z.object({
165
+ token: import_zod.z.string(),
166
+ logprob: import_zod.z.number(),
167
+ bytes: import_zod.z.array(import_zod.z.number()).nullable()
168
+ })
169
+ )
170
+ })
171
+ ).nullable()
172
+ }).nullable().optional()
173
+ });
174
+ var UsageSchema = import_zod.z.object({
175
+ prompt_tokens: import_zod.z.number(),
176
+ completion_tokens: import_zod.z.number(),
177
+ total_tokens: import_zod.z.number(),
178
+ prompt_tokens_details: import_zod.z.object({
179
+ cached_tokens: import_zod.z.number().optional()
180
+ }).optional(),
181
+ completion_tokens_details: import_zod.z.object({
182
+ reasoning_tokens: import_zod.z.number().optional()
183
+ }).optional()
184
+ });
185
+ var ChatCompletionResponseSchema = import_zod.z.object({
186
+ id: import_zod.z.string(),
187
+ object: import_zod.z.literal("chat.completion"),
188
+ created: import_zod.z.number(),
189
+ model: import_zod.z.string(),
190
+ choices: import_zod.z.array(ChatCompletionChoiceSchema),
191
+ usage: UsageSchema.optional(),
192
+ system_fingerprint: import_zod.z.string().optional(),
193
+ service_tier: import_zod.z.string().optional()
194
+ });
195
+ var ChatCompletionChunkSchema = import_zod.z.object({
196
+ id: import_zod.z.string(),
197
+ object: import_zod.z.literal("chat.completion.chunk"),
198
+ created: import_zod.z.number(),
199
+ model: import_zod.z.string(),
200
+ system_fingerprint: import_zod.z.string().optional(),
201
+ choices: import_zod.z.array(
202
+ import_zod.z.object({
203
+ index: import_zod.z.number(),
204
+ delta: import_zod.z.object({
205
+ role: import_zod.z.string().optional(),
206
+ content: import_zod.z.string().optional(),
207
+ tool_calls: import_zod.z.array(
208
+ import_zod.z.object({
209
+ index: import_zod.z.number(),
210
+ id: import_zod.z.string().optional(),
211
+ type: import_zod.z.literal("function").optional(),
212
+ function: import_zod.z.object({
213
+ name: import_zod.z.string().optional(),
214
+ arguments: import_zod.z.string().optional()
215
+ }).optional()
216
+ })
217
+ ).optional(),
218
+ refusal: import_zod.z.string().nullable().optional()
219
+ }),
220
+ finish_reason: import_zod.z.enum([
221
+ "stop",
222
+ "length",
223
+ "tool_calls",
224
+ "content_filter",
225
+ "function_call"
226
+ ]).nullable(),
227
+ logprobs: import_zod.z.object({
228
+ content: import_zod.z.array(
229
+ import_zod.z.object({
230
+ token: import_zod.z.string(),
231
+ logprob: import_zod.z.number(),
232
+ bytes: import_zod.z.array(import_zod.z.number()).nullable(),
233
+ top_logprobs: import_zod.z.array(
234
+ import_zod.z.object({
235
+ token: import_zod.z.string(),
236
+ logprob: import_zod.z.number(),
237
+ bytes: import_zod.z.array(import_zod.z.number()).nullable()
238
+ })
239
+ )
240
+ })
241
+ ).nullable()
242
+ }).nullable().optional()
243
+ })
244
+ ),
245
+ usage: UsageSchema.optional(),
246
+ service_tier: import_zod.z.string().optional()
247
+ });
248
+ var PLUGIN_ID = "llm:openai";
249
+ var RESOURCE_TYPE = "llm";
250
+ var PROVIDER = "openai";
251
+ var VERSION = "1.0.0";
252
+ var DEFAULT_OPENAI_MODELS = [
253
+ // GPT-4o family
254
+ "gpt-4o",
255
+ "gpt-4o-2024-11-20",
256
+ "gpt-4o-2024-08-06",
257
+ "gpt-4o-2024-05-13",
258
+ "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"
280
+ ];
281
+ var ACTIONS = ["chat.completions"];
282
+ var ENFORCEMENT_SUPPORT = [
283
+ "model",
284
+ "max_tokens",
285
+ "streaming"
286
+ ];
287
+ var DEFAULT_API_URL = "https://api.openai.com/v1";
288
+
289
+ // src/proxy.ts
290
+ var OpenAIApiError = class extends Error {
291
+ constructor(status, body) {
292
+ super(`OpenAI API error: ${status}`);
293
+ this.status = status;
294
+ this.body = body;
295
+ this.name = "OpenAIApiError";
296
+ }
297
+ };
298
+ function mapOpenAIError(error) {
299
+ let parsed = {};
300
+ try {
301
+ parsed = JSON.parse(error.body);
302
+ } catch {
303
+ }
304
+ const message = parsed.error?.message || error.body;
305
+ const code = parsed.error?.code;
306
+ switch (error.status) {
307
+ case 400:
308
+ return { status: 400, code: "BAD_REQUEST", message, retryable: false };
309
+ case 401:
310
+ return {
311
+ status: 401,
312
+ code: "UNAUTHORIZED",
313
+ message: "Invalid API key",
314
+ retryable: false
315
+ };
316
+ case 403:
317
+ return { status: 403, code: "FORBIDDEN", message, retryable: false };
318
+ case 404:
319
+ return { status: 404, code: "NOT_FOUND", message, retryable: false };
320
+ case 429:
321
+ if (code === "insufficient_quota") {
322
+ return {
323
+ status: 429,
324
+ code: "QUOTA_EXCEEDED",
325
+ message: "API quota exceeded",
326
+ retryable: false
327
+ };
328
+ }
329
+ return { status: 429, code: "RATE_LIMITED", message, retryable: true };
330
+ case 500:
331
+ case 502:
332
+ case 503:
333
+ return {
334
+ status: error.status,
335
+ code: "PROVIDER_ERROR",
336
+ message,
337
+ retryable: true
338
+ };
339
+ default:
340
+ return {
341
+ status: error.status,
342
+ code: "UNKNOWN",
343
+ message,
344
+ retryable: false
345
+ };
346
+ }
347
+ }
348
+ var openaiPlugin = {
349
+ ...(0, import_shared.createPluginBase)({
350
+ id: PLUGIN_ID,
351
+ resourceType: RESOURCE_TYPE,
352
+ provider: PROVIDER,
353
+ version: VERSION,
354
+ name: "OpenAI LLM",
355
+ actions: [...ACTIONS],
356
+ supports: {
357
+ enforcement: [...ENFORCEMENT_SUPPORT]
358
+ },
359
+ // Client contract metadata for SDK-compatible plugins
360
+ client: {
361
+ namespace: "openai",
362
+ actions: {
363
+ "chat.completions": {
364
+ description: "Generate chat completions using OpenAI GPT models"
365
+ }
366
+ }
367
+ }
368
+ }),
369
+ // Credential schema for UI
370
+ credentialSchema: {
371
+ fields: [
372
+ {
373
+ name: "apiKey",
374
+ type: "secret",
375
+ label: "API Key",
376
+ description: "Your OpenAI API key (starts with sk-)",
377
+ required: true
378
+ },
379
+ {
380
+ name: "organization",
381
+ type: "string",
382
+ label: "Organization ID",
383
+ description: "Optional OpenAI organization ID",
384
+ required: false
385
+ },
386
+ {
387
+ name: "baseUrl",
388
+ type: "url",
389
+ label: "Base URL",
390
+ description: "Custom API base URL (optional, for Azure OpenAI or proxies)",
391
+ required: false,
392
+ default: DEFAULT_API_URL
393
+ }
394
+ ]
395
+ },
396
+ validateAndShape(action, input, constraints) {
397
+ if (action !== "chat.completions") {
398
+ return { valid: false, error: `Unsupported action: ${action}` };
399
+ }
400
+ const parsed = ChatCompletionRequestSchema.safeParse(input);
401
+ if (!parsed.success) {
402
+ return {
403
+ valid: false,
404
+ error: `Invalid request: ${parsed.error.errors.map((e) => e.message).join(", ")}`
405
+ };
406
+ }
407
+ const request = parsed.data;
408
+ const enforcement = {
409
+ model: request.model,
410
+ stream: request.stream ?? false,
411
+ usesTools: Array.isArray(request.tools) && request.tools.length > 0,
412
+ maxOutputTokens: request.max_tokens ?? request.max_completion_tokens
413
+ };
414
+ const allowedModels = constraints.allowedModels ?? [
415
+ ...DEFAULT_OPENAI_MODELS
416
+ ];
417
+ if (!allowedModels.includes(request.model)) {
418
+ return {
419
+ valid: false,
420
+ error: `Model '${request.model}' not allowed. Allowed: ${allowedModels.join(", ")}`
421
+ };
422
+ }
423
+ const maxTokens = constraints.maxOutputTokens ?? 16384;
424
+ const requestedTokens = request.max_tokens ?? request.max_completion_tokens;
425
+ if (requestedTokens && requestedTokens > maxTokens) {
426
+ return {
427
+ valid: false,
428
+ error: `max_tokens (${requestedTokens}) exceeds limit (${maxTokens})`
429
+ };
430
+ }
431
+ if (request.stream && constraints.allowStreaming === false) {
432
+ return {
433
+ valid: false,
434
+ error: "Streaming is not allowed for this app"
435
+ };
436
+ }
437
+ const shapedRequest = {
438
+ ...request,
439
+ max_tokens: requestedTokens ? Math.min(requestedTokens, maxTokens) : void 0
440
+ // OpenAI doesn't require max_tokens
441
+ };
442
+ return { valid: true, shapedInput: shapedRequest, enforcement };
443
+ },
444
+ async execute(action, shapedInput, ctx, options) {
445
+ const request = shapedInput;
446
+ const baseUrl = ctx.config?.baseUrl || DEFAULT_API_URL;
447
+ const organization = ctx.config?.organization;
448
+ const headers = {
449
+ "Content-Type": "application/json",
450
+ Authorization: `Bearer ${ctx.secret}`
451
+ };
452
+ if (organization) {
453
+ headers["OpenAI-Organization"] = organization;
454
+ }
455
+ const response = await fetch(`${baseUrl}/chat/completions`, {
456
+ method: "POST",
457
+ headers,
458
+ body: JSON.stringify(request),
459
+ signal: options.signal
460
+ });
461
+ if (!response.ok) {
462
+ const errorBody = await response.text();
463
+ throw new OpenAIApiError(response.status, errorBody);
464
+ }
465
+ if (request.stream) {
466
+ return {
467
+ stream: response.body,
468
+ contentType: "text/event-stream"
469
+ };
470
+ } else {
471
+ const json = await response.json();
472
+ return {
473
+ response: json,
474
+ contentType: "application/json",
475
+ usage: this.extractUsage(json)
476
+ };
477
+ }
478
+ },
479
+ extractUsage(response) {
480
+ const res = response;
481
+ return {
482
+ inputTokens: res.usage?.prompt_tokens,
483
+ outputTokens: res.usage?.completion_tokens,
484
+ totalTokens: res.usage?.total_tokens,
485
+ model: res.model
486
+ };
487
+ },
488
+ mapError(error) {
489
+ if (error instanceof OpenAIApiError) {
490
+ return mapOpenAIError(error);
491
+ }
492
+ return {
493
+ status: 500,
494
+ code: "INTERNAL_ERROR",
495
+ message: error instanceof Error ? error.message : "Unknown error",
496
+ retryable: false
497
+ };
498
+ }
499
+ };
500
+ var proxy_default = openaiPlugin;
501
+ // Annotate the CommonJS export names for ESM import in node:
502
+ 0 && (module.exports = {
503
+ ACTIONS,
504
+ ChatCompletionChoiceSchema,
505
+ ChatCompletionChunkSchema,
506
+ ChatCompletionRequestSchema,
507
+ ChatCompletionResponseSchema,
508
+ ChatMessageSchema,
509
+ DEFAULT_API_URL,
510
+ DEFAULT_OPENAI_MODELS,
511
+ ENFORCEMENT_SUPPORT,
512
+ PLUGIN_ID,
513
+ PROVIDER,
514
+ RESOURCE_TYPE,
515
+ ToolSchema,
516
+ UsageSchema,
517
+ VERSION,
518
+ openaiPlugin
519
+ });
520
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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":[]}
package/dist/index.mjs ADDED
@@ -0,0 +1,41 @@
1
+ import {
2
+ openaiPlugin,
3
+ proxy_default
4
+ } from "./chunk-6GMCQHIR.mjs";
5
+ import {
6
+ ACTIONS,
7
+ ChatCompletionChoiceSchema,
8
+ ChatCompletionChunkSchema,
9
+ ChatCompletionRequestSchema,
10
+ ChatCompletionResponseSchema,
11
+ ChatMessageSchema,
12
+ DEFAULT_API_URL,
13
+ DEFAULT_OPENAI_MODELS,
14
+ ENFORCEMENT_SUPPORT,
15
+ PLUGIN_ID,
16
+ PROVIDER,
17
+ RESOURCE_TYPE,
18
+ ToolSchema,
19
+ UsageSchema,
20
+ VERSION
21
+ } from "./chunk-6FNYHOB5.mjs";
22
+ export {
23
+ ACTIONS,
24
+ ChatCompletionChoiceSchema,
25
+ ChatCompletionChunkSchema,
26
+ ChatCompletionRequestSchema,
27
+ ChatCompletionResponseSchema,
28
+ ChatMessageSchema,
29
+ DEFAULT_API_URL,
30
+ DEFAULT_OPENAI_MODELS,
31
+ ENFORCEMENT_SUPPORT,
32
+ PLUGIN_ID,
33
+ PROVIDER,
34
+ RESOURCE_TYPE,
35
+ ToolSchema,
36
+ UsageSchema,
37
+ VERSION,
38
+ proxy_default as default,
39
+ openaiPlugin
40
+ };
41
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,5 @@
1
+ import { PluginContract } from '@glueco/shared';
2
+
3
+ declare const openaiPlugin: PluginContract;
4
+
5
+ export { openaiPlugin as default, openaiPlugin };
@@ -0,0 +1,5 @@
1
+ import { PluginContract } from '@glueco/shared';
2
+
3
+ declare const openaiPlugin: PluginContract;
4
+
5
+ export { openaiPlugin as default, openaiPlugin };