@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/client.js ADDED
@@ -0,0 +1,329 @@
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/client.ts
21
+ var client_exports = {};
22
+ __export(client_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: () => client_default,
39
+ openai: () => openai
40
+ });
41
+ module.exports = __toCommonJS(client_exports);
42
+
43
+ // src/contracts.ts
44
+ var import_zod = require("zod");
45
+ var ChatMessageSchema = import_zod.z.object({
46
+ role: import_zod.z.enum(["system", "user", "assistant", "tool", "function"]),
47
+ content: import_zod.z.union([
48
+ import_zod.z.string(),
49
+ import_zod.z.array(
50
+ import_zod.z.object({
51
+ type: import_zod.z.enum(["text", "image_url"]),
52
+ text: import_zod.z.string().optional(),
53
+ image_url: import_zod.z.object({
54
+ url: import_zod.z.string(),
55
+ detail: import_zod.z.enum(["auto", "low", "high"]).optional()
56
+ }).optional()
57
+ })
58
+ )
59
+ ]).nullable(),
60
+ name: import_zod.z.string().optional(),
61
+ tool_calls: import_zod.z.array(
62
+ import_zod.z.object({
63
+ id: import_zod.z.string(),
64
+ type: import_zod.z.literal("function"),
65
+ function: import_zod.z.object({
66
+ name: import_zod.z.string(),
67
+ arguments: import_zod.z.string()
68
+ })
69
+ })
70
+ ).optional(),
71
+ tool_call_id: import_zod.z.string().optional(),
72
+ function_call: import_zod.z.object({
73
+ name: import_zod.z.string(),
74
+ arguments: import_zod.z.string()
75
+ }).optional()
76
+ });
77
+ var ToolSchema = import_zod.z.object({
78
+ type: import_zod.z.literal("function"),
79
+ function: import_zod.z.object({
80
+ name: import_zod.z.string(),
81
+ description: import_zod.z.string().optional(),
82
+ parameters: import_zod.z.record(import_zod.z.unknown()).optional(),
83
+ strict: import_zod.z.boolean().optional()
84
+ })
85
+ });
86
+ var ChatCompletionRequestSchema = import_zod.z.object({
87
+ model: import_zod.z.string(),
88
+ messages: import_zod.z.array(ChatMessageSchema),
89
+ temperature: import_zod.z.number().min(0).max(2).optional(),
90
+ top_p: import_zod.z.number().min(0).max(1).optional(),
91
+ n: import_zod.z.number().int().min(1).max(10).optional(),
92
+ stream: import_zod.z.boolean().optional(),
93
+ stream_options: import_zod.z.object({
94
+ include_usage: import_zod.z.boolean().optional()
95
+ }).optional(),
96
+ stop: import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.string())]).optional(),
97
+ max_tokens: import_zod.z.number().int().positive().optional(),
98
+ max_completion_tokens: import_zod.z.number().int().positive().optional(),
99
+ presence_penalty: import_zod.z.number().min(-2).max(2).optional(),
100
+ frequency_penalty: import_zod.z.number().min(-2).max(2).optional(),
101
+ logit_bias: import_zod.z.record(import_zod.z.number()).optional(),
102
+ logprobs: import_zod.z.boolean().optional(),
103
+ top_logprobs: import_zod.z.number().int().min(0).max(20).optional(),
104
+ user: import_zod.z.string().optional(),
105
+ tools: import_zod.z.array(ToolSchema).optional(),
106
+ tool_choice: import_zod.z.union([
107
+ import_zod.z.literal("none"),
108
+ import_zod.z.literal("auto"),
109
+ import_zod.z.literal("required"),
110
+ import_zod.z.object({
111
+ type: import_zod.z.literal("function"),
112
+ function: import_zod.z.object({ name: import_zod.z.string() })
113
+ })
114
+ ]).optional(),
115
+ parallel_tool_calls: import_zod.z.boolean().optional(),
116
+ response_format: import_zod.z.union([
117
+ import_zod.z.object({ type: import_zod.z.literal("text") }),
118
+ import_zod.z.object({ type: import_zod.z.literal("json_object") }),
119
+ import_zod.z.object({
120
+ type: import_zod.z.literal("json_schema"),
121
+ json_schema: import_zod.z.object({
122
+ name: import_zod.z.string(),
123
+ description: import_zod.z.string().optional(),
124
+ schema: import_zod.z.record(import_zod.z.unknown()),
125
+ strict: import_zod.z.boolean().optional()
126
+ })
127
+ })
128
+ ]).optional(),
129
+ seed: import_zod.z.number().int().optional(),
130
+ service_tier: import_zod.z.enum(["auto", "default"]).optional()
131
+ });
132
+ var ChatCompletionChoiceSchema = import_zod.z.object({
133
+ index: import_zod.z.number(),
134
+ message: import_zod.z.object({
135
+ role: import_zod.z.literal("assistant"),
136
+ content: import_zod.z.string().nullable(),
137
+ tool_calls: import_zod.z.array(
138
+ import_zod.z.object({
139
+ id: import_zod.z.string(),
140
+ type: import_zod.z.literal("function"),
141
+ function: import_zod.z.object({
142
+ name: import_zod.z.string(),
143
+ arguments: import_zod.z.string()
144
+ })
145
+ })
146
+ ).optional(),
147
+ function_call: import_zod.z.object({
148
+ name: import_zod.z.string(),
149
+ arguments: import_zod.z.string()
150
+ }).optional(),
151
+ refusal: import_zod.z.string().nullable().optional()
152
+ }),
153
+ finish_reason: import_zod.z.enum(["stop", "length", "tool_calls", "content_filter", "function_call"]).nullable(),
154
+ logprobs: import_zod.z.object({
155
+ content: import_zod.z.array(
156
+ import_zod.z.object({
157
+ token: import_zod.z.string(),
158
+ logprob: import_zod.z.number(),
159
+ bytes: import_zod.z.array(import_zod.z.number()).nullable(),
160
+ top_logprobs: import_zod.z.array(
161
+ import_zod.z.object({
162
+ token: import_zod.z.string(),
163
+ logprob: import_zod.z.number(),
164
+ bytes: import_zod.z.array(import_zod.z.number()).nullable()
165
+ })
166
+ )
167
+ })
168
+ ).nullable()
169
+ }).nullable().optional()
170
+ });
171
+ var UsageSchema = import_zod.z.object({
172
+ prompt_tokens: import_zod.z.number(),
173
+ completion_tokens: import_zod.z.number(),
174
+ total_tokens: import_zod.z.number(),
175
+ prompt_tokens_details: import_zod.z.object({
176
+ cached_tokens: import_zod.z.number().optional()
177
+ }).optional(),
178
+ completion_tokens_details: import_zod.z.object({
179
+ reasoning_tokens: import_zod.z.number().optional()
180
+ }).optional()
181
+ });
182
+ var ChatCompletionResponseSchema = import_zod.z.object({
183
+ id: import_zod.z.string(),
184
+ object: import_zod.z.literal("chat.completion"),
185
+ created: import_zod.z.number(),
186
+ model: import_zod.z.string(),
187
+ choices: import_zod.z.array(ChatCompletionChoiceSchema),
188
+ usage: UsageSchema.optional(),
189
+ system_fingerprint: import_zod.z.string().optional(),
190
+ service_tier: import_zod.z.string().optional()
191
+ });
192
+ var ChatCompletionChunkSchema = import_zod.z.object({
193
+ id: import_zod.z.string(),
194
+ object: import_zod.z.literal("chat.completion.chunk"),
195
+ created: import_zod.z.number(),
196
+ model: import_zod.z.string(),
197
+ system_fingerprint: import_zod.z.string().optional(),
198
+ choices: import_zod.z.array(
199
+ import_zod.z.object({
200
+ index: import_zod.z.number(),
201
+ delta: import_zod.z.object({
202
+ role: import_zod.z.string().optional(),
203
+ content: import_zod.z.string().optional(),
204
+ tool_calls: import_zod.z.array(
205
+ import_zod.z.object({
206
+ index: import_zod.z.number(),
207
+ id: import_zod.z.string().optional(),
208
+ type: import_zod.z.literal("function").optional(),
209
+ function: import_zod.z.object({
210
+ name: import_zod.z.string().optional(),
211
+ arguments: import_zod.z.string().optional()
212
+ }).optional()
213
+ })
214
+ ).optional(),
215
+ refusal: import_zod.z.string().nullable().optional()
216
+ }),
217
+ finish_reason: import_zod.z.enum([
218
+ "stop",
219
+ "length",
220
+ "tool_calls",
221
+ "content_filter",
222
+ "function_call"
223
+ ]).nullable(),
224
+ logprobs: import_zod.z.object({
225
+ content: import_zod.z.array(
226
+ import_zod.z.object({
227
+ token: import_zod.z.string(),
228
+ logprob: import_zod.z.number(),
229
+ bytes: import_zod.z.array(import_zod.z.number()).nullable(),
230
+ top_logprobs: import_zod.z.array(
231
+ import_zod.z.object({
232
+ token: import_zod.z.string(),
233
+ logprob: import_zod.z.number(),
234
+ bytes: import_zod.z.array(import_zod.z.number()).nullable()
235
+ })
236
+ )
237
+ })
238
+ ).nullable()
239
+ }).nullable().optional()
240
+ })
241
+ ),
242
+ usage: UsageSchema.optional(),
243
+ service_tier: import_zod.z.string().optional()
244
+ });
245
+ var PLUGIN_ID = "llm:openai";
246
+ var RESOURCE_TYPE = "llm";
247
+ var PROVIDER = "openai";
248
+ var VERSION = "1.0.0";
249
+ var DEFAULT_OPENAI_MODELS = [
250
+ // GPT-4o family
251
+ "gpt-4o",
252
+ "gpt-4o-2024-11-20",
253
+ "gpt-4o-2024-08-06",
254
+ "gpt-4o-2024-05-13",
255
+ "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"
277
+ ];
278
+ var ACTIONS = ["chat.completions"];
279
+ var ENFORCEMENT_SUPPORT = [
280
+ "model",
281
+ "max_tokens",
282
+ "streaming"
283
+ ];
284
+ var DEFAULT_API_URL = "https://api.openai.com/v1";
285
+
286
+ // src/client.ts
287
+ function openai(transport) {
288
+ return {
289
+ transport,
290
+ async chatCompletions(request, options) {
291
+ const payload = { ...request, stream: false };
292
+ return transport.request(
293
+ PLUGIN_ID,
294
+ "chat.completions",
295
+ payload,
296
+ options
297
+ );
298
+ },
299
+ async chatCompletionsStream(request, options) {
300
+ return transport.requestStream(
301
+ PLUGIN_ID,
302
+ "chat.completions",
303
+ request,
304
+ options
305
+ );
306
+ }
307
+ };
308
+ }
309
+ var client_default = openai;
310
+ // Annotate the CommonJS export names for ESM import in node:
311
+ 0 && (module.exports = {
312
+ ACTIONS,
313
+ ChatCompletionChoiceSchema,
314
+ ChatCompletionChunkSchema,
315
+ ChatCompletionRequestSchema,
316
+ ChatCompletionResponseSchema,
317
+ ChatMessageSchema,
318
+ DEFAULT_API_URL,
319
+ DEFAULT_OPENAI_MODELS,
320
+ ENFORCEMENT_SUPPORT,
321
+ PLUGIN_ID,
322
+ PROVIDER,
323
+ RESOURCE_TYPE,
324
+ ToolSchema,
325
+ UsageSchema,
326
+ VERSION,
327
+ openai
328
+ });
329
+ //# sourceMappingURL=client.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,62 @@
1
+ import {
2
+ ACTIONS,
3
+ ChatCompletionChoiceSchema,
4
+ ChatCompletionChunkSchema,
5
+ ChatCompletionRequestSchema,
6
+ ChatCompletionResponseSchema,
7
+ ChatMessageSchema,
8
+ DEFAULT_API_URL,
9
+ DEFAULT_OPENAI_MODELS,
10
+ ENFORCEMENT_SUPPORT,
11
+ PLUGIN_ID,
12
+ PROVIDER,
13
+ RESOURCE_TYPE,
14
+ ToolSchema,
15
+ UsageSchema,
16
+ VERSION
17
+ } from "./chunk-6FNYHOB5.mjs";
18
+
19
+ // src/client.ts
20
+ function openai(transport) {
21
+ return {
22
+ transport,
23
+ async chatCompletions(request, options) {
24
+ const payload = { ...request, stream: false };
25
+ return transport.request(
26
+ PLUGIN_ID,
27
+ "chat.completions",
28
+ payload,
29
+ options
30
+ );
31
+ },
32
+ async chatCompletionsStream(request, options) {
33
+ return transport.requestStream(
34
+ PLUGIN_ID,
35
+ "chat.completions",
36
+ request,
37
+ options
38
+ );
39
+ }
40
+ };
41
+ }
42
+ var client_default = openai;
43
+ export {
44
+ ACTIONS,
45
+ ChatCompletionChoiceSchema,
46
+ ChatCompletionChunkSchema,
47
+ ChatCompletionRequestSchema,
48
+ ChatCompletionResponseSchema,
49
+ ChatMessageSchema,
50
+ DEFAULT_API_URL,
51
+ DEFAULT_OPENAI_MODELS,
52
+ ENFORCEMENT_SUPPORT,
53
+ PLUGIN_ID,
54
+ PROVIDER,
55
+ RESOURCE_TYPE,
56
+ ToolSchema,
57
+ UsageSchema,
58
+ VERSION,
59
+ client_default as default,
60
+ openai
61
+ };
62
+ //# sourceMappingURL=client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.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"],"mappings":";;;;;;;;;;;;;;;;;;;AA8JO,SAAS,OAAO,WAA2C;AAChE,SAAO;AAAA,IACL;AAAA,IAEA,MAAM,gBACJ,SACA,SACkD;AAElD,YAAM,UAAU,EAAE,GAAG,SAAS,QAAQ,MAAM;AAE5C,aAAO,UAAU;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,sBACJ,SACA,SACgC;AAChC,aAAO,UAAU;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAGA,IAAO,iBAAQ;","names":[]}