@glueco/plugin-llm-groq 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/proxy.ts","../src/contracts.ts"],"sourcesContent":["// ============================================\n// GROQ PLUGIN - MAIN ENTRYPOINT\n// ============================================\n//\n// This file provides backward compatibility for existing imports.\n// For new code, prefer using the specific entrypoints:\n//\n// Proxy (server-side):\n// import groqPlugin from \"@glueco/plugin-llm-groq/proxy\"\n//\n// Client (target apps):\n// import { groq } from \"@glueco/plugin-llm-groq/client\"\n//\n// ============================================\n\n// Re-export proxy plugin as default for backward compatibility\nexport { default } from \"./proxy\";\nexport { groqPlugin } from \"./proxy\";\n\n// Re-export contracts\nexport * from \"./contracts\";\n","// ============================================\n// GROQ PLUGIN PROXY\n// Server-side plugin implementation for the gateway\n// ============================================\n//\n// This module is imported by the proxy to handle Groq requests.\n// It should NOT be imported by target apps.\n//\n// Import path: @glueco/plugin-llm-groq/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_GROQ_MODELS,\n ACTIONS,\n ENFORCEMENT_SUPPORT,\n} from \"./contracts\";\n\n// ============================================\n// CONFIGURATION\n// ============================================\n\nconst GROQ_API_URL = \"https://api.groq.com/openai/v1\";\n\n// ============================================\n// ERROR HANDLING\n// ============================================\n\nclass GroqApiError extends Error {\n constructor(\n public status: number,\n public body: string,\n ) {\n super(`Groq API error: ${status}`);\n this.name = \"GroqApiError\";\n }\n}\n\nfunction mapGroqError(error: GroqApiError): 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\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 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 groqPlugin: PluginContract = {\n ...createPluginBase({\n id: PLUGIN_ID,\n resourceType: RESOURCE_TYPE,\n provider: PROVIDER,\n version: VERSION,\n name: \"Groq LLM\",\n actions: [...ACTIONS],\n supports: {\n enforcement: [...ENFORCEMENT_SUPPORT],\n },\n // Client contract metadata for SDK-compatible plugins\n client: {\n namespace: \"groq\",\n actions: {\n \"chat.completions\": {\n description:\n \"Generate chat completions using Groq's fast LLM inference\",\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 Groq API key\",\n required: true,\n },\n {\n name: \"baseUrl\",\n type: \"url\",\n label: \"Base URL\",\n description: \"Custom API base URL (optional)\",\n required: false,\n default: GROQ_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 ?? [...DEFAULT_GROQ_MODELS];\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 ?? 4096;\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 : maxTokens,\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) || GROQ_API_URL;\n\n const response = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${ctx.secret}`,\n },\n body: JSON.stringify(request),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new GroqApiError(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 GroqApiError) {\n return mapGroqError(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 groqPlugin;\n\n// Also export named for flexibility\nexport { groqPlugin };\n","// ============================================\n// GROQ PLUGIN CONTRACTS\n// Shared request/response schemas for proxy and client\n// ============================================\n\nimport { z } from \"zod\";\n\n// ============================================\n// REQUEST SCHEMAS (OpenAI-compatible)\n// ============================================\n\nexport const ChatMessageSchema = z.object({\n role: z.enum([\"system\", \"user\", \"assistant\", \"tool\"]),\n content: z\n .union([\n z.string(),\n z.array(\n z.object({\n type: z.string(),\n text: z.string().optional(),\n image_url: z\n .object({\n url: z.string(),\n detail: z.string().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});\n\nexport type ChatMessage = z.infer<typeof ChatMessageSchema>;\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 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 user: z.string().optional(),\n tools: z\n .array(\n 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 }),\n }),\n )\n .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 response_format: z\n .object({\n type: z.enum([\"text\", \"json_object\"]),\n })\n .optional(),\n seed: z.number().int().optional(),\n});\n\nexport type ChatCompletionRequest = z.infer<typeof ChatCompletionRequestSchema>;\n\n// ============================================\n// RESPONSE SCHEMAS (OpenAI-compatible)\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 }),\n finish_reason: z.string().nullable(),\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});\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});\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 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 }),\n finish_reason: z.string().nullable(),\n }),\n ),\n});\n\nexport type ChatCompletionChunk = z.infer<typeof ChatCompletionChunkSchema>;\n\n// ============================================\n// PLUGIN CONSTANTS\n// ============================================\n\nexport const PLUGIN_ID = \"llm:groq\" as const;\nexport const RESOURCE_TYPE = \"llm\" as const;\nexport const PROVIDER = \"groq\" as const;\nexport const VERSION = \"1.0.0\";\n\n/** Default allowed models */\nexport const DEFAULT_GROQ_MODELS = [\n \"llama-3.3-70b-versatile\",\n \"llama-3.1-70b-versatile\",\n \"llama-3.1-8b-instant\",\n \"llama3-70b-8192\",\n \"llama3-8b-8192\",\n \"mixtral-8x7b-32768\",\n \"gemma2-9b-it\",\n] as const;\n\n/** Supported actions */\nexport const ACTIONS = [\"chat.completions\"] as const;\nexport type GroqAction = (typeof ACTIONS)[number];\n\n/** Enforcement knobs */\nexport const ENFORCEMENT_SUPPORT = [\n \"model\",\n \"max_tokens\",\n \"streaming\",\n] as const;\n"],"mappings":"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","names":[]}
package/dist/index.mjs ADDED
@@ -0,0 +1,37 @@
1
+ import {
2
+ groqPlugin,
3
+ proxy_default
4
+ } from "./chunk-CNIQDSXF.mjs";
5
+ import {
6
+ ACTIONS,
7
+ ChatCompletionChoiceSchema,
8
+ ChatCompletionChunkSchema,
9
+ ChatCompletionRequestSchema,
10
+ ChatCompletionResponseSchema,
11
+ ChatMessageSchema,
12
+ DEFAULT_GROQ_MODELS,
13
+ ENFORCEMENT_SUPPORT,
14
+ PLUGIN_ID,
15
+ PROVIDER,
16
+ RESOURCE_TYPE,
17
+ UsageSchema,
18
+ VERSION
19
+ } from "./chunk-MRDVVFUV.mjs";
20
+ export {
21
+ ACTIONS,
22
+ ChatCompletionChoiceSchema,
23
+ ChatCompletionChunkSchema,
24
+ ChatCompletionRequestSchema,
25
+ ChatCompletionResponseSchema,
26
+ ChatMessageSchema,
27
+ DEFAULT_GROQ_MODELS,
28
+ ENFORCEMENT_SUPPORT,
29
+ PLUGIN_ID,
30
+ PROVIDER,
31
+ RESOURCE_TYPE,
32
+ UsageSchema,
33
+ VERSION,
34
+ proxy_default as default,
35
+ groqPlugin
36
+ };
37
+ //# 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 groqPlugin: PluginContract;
4
+
5
+ export { groqPlugin as default, groqPlugin };
@@ -0,0 +1,5 @@
1
+ import { PluginContract } from '@glueco/shared';
2
+
3
+ declare const groqPlugin: PluginContract;
4
+
5
+ export { groqPlugin as default, groqPlugin };
package/dist/proxy.js ADDED
@@ -0,0 +1,368 @@
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/proxy.ts
21
+ var proxy_exports = {};
22
+ __export(proxy_exports, {
23
+ default: () => proxy_default,
24
+ groqPlugin: () => groqPlugin
25
+ });
26
+ module.exports = __toCommonJS(proxy_exports);
27
+ var import_shared = require("@glueco/shared");
28
+
29
+ // src/contracts.ts
30
+ var import_zod = require("zod");
31
+ var ChatMessageSchema = import_zod.z.object({
32
+ role: import_zod.z.enum(["system", "user", "assistant", "tool"]),
33
+ content: import_zod.z.union([
34
+ import_zod.z.string(),
35
+ import_zod.z.array(
36
+ import_zod.z.object({
37
+ type: import_zod.z.string(),
38
+ text: import_zod.z.string().optional(),
39
+ image_url: import_zod.z.object({
40
+ url: import_zod.z.string(),
41
+ detail: import_zod.z.string().optional()
42
+ }).optional()
43
+ })
44
+ )
45
+ ]).nullable(),
46
+ name: import_zod.z.string().optional(),
47
+ tool_calls: import_zod.z.array(
48
+ import_zod.z.object({
49
+ id: import_zod.z.string(),
50
+ type: import_zod.z.literal("function"),
51
+ function: import_zod.z.object({
52
+ name: import_zod.z.string(),
53
+ arguments: import_zod.z.string()
54
+ })
55
+ })
56
+ ).optional(),
57
+ tool_call_id: import_zod.z.string().optional()
58
+ });
59
+ var ChatCompletionRequestSchema = import_zod.z.object({
60
+ model: import_zod.z.string(),
61
+ messages: import_zod.z.array(ChatMessageSchema),
62
+ temperature: import_zod.z.number().min(0).max(2).optional(),
63
+ top_p: import_zod.z.number().min(0).max(1).optional(),
64
+ n: import_zod.z.number().int().min(1).max(10).optional(),
65
+ stream: import_zod.z.boolean().optional(),
66
+ stop: import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.string())]).optional(),
67
+ max_tokens: import_zod.z.number().int().positive().optional(),
68
+ max_completion_tokens: import_zod.z.number().int().positive().optional(),
69
+ presence_penalty: import_zod.z.number().min(-2).max(2).optional(),
70
+ frequency_penalty: import_zod.z.number().min(-2).max(2).optional(),
71
+ logit_bias: import_zod.z.record(import_zod.z.number()).optional(),
72
+ user: import_zod.z.string().optional(),
73
+ tools: import_zod.z.array(
74
+ import_zod.z.object({
75
+ type: import_zod.z.literal("function"),
76
+ function: import_zod.z.object({
77
+ name: import_zod.z.string(),
78
+ description: import_zod.z.string().optional(),
79
+ parameters: import_zod.z.record(import_zod.z.unknown()).optional()
80
+ })
81
+ })
82
+ ).optional(),
83
+ tool_choice: import_zod.z.union([
84
+ import_zod.z.literal("none"),
85
+ import_zod.z.literal("auto"),
86
+ import_zod.z.literal("required"),
87
+ import_zod.z.object({
88
+ type: import_zod.z.literal("function"),
89
+ function: import_zod.z.object({ name: import_zod.z.string() })
90
+ })
91
+ ]).optional(),
92
+ response_format: import_zod.z.object({
93
+ type: import_zod.z.enum(["text", "json_object"])
94
+ }).optional(),
95
+ seed: import_zod.z.number().int().optional()
96
+ });
97
+ var ChatCompletionChoiceSchema = import_zod.z.object({
98
+ index: import_zod.z.number(),
99
+ message: import_zod.z.object({
100
+ role: import_zod.z.literal("assistant"),
101
+ content: import_zod.z.string().nullable(),
102
+ tool_calls: import_zod.z.array(
103
+ import_zod.z.object({
104
+ id: import_zod.z.string(),
105
+ type: import_zod.z.literal("function"),
106
+ function: import_zod.z.object({
107
+ name: import_zod.z.string(),
108
+ arguments: import_zod.z.string()
109
+ })
110
+ })
111
+ ).optional()
112
+ }),
113
+ finish_reason: import_zod.z.string().nullable()
114
+ });
115
+ var UsageSchema = import_zod.z.object({
116
+ prompt_tokens: import_zod.z.number(),
117
+ completion_tokens: import_zod.z.number(),
118
+ total_tokens: import_zod.z.number()
119
+ });
120
+ var ChatCompletionResponseSchema = import_zod.z.object({
121
+ id: import_zod.z.string(),
122
+ object: import_zod.z.literal("chat.completion"),
123
+ created: import_zod.z.number(),
124
+ model: import_zod.z.string(),
125
+ choices: import_zod.z.array(ChatCompletionChoiceSchema),
126
+ usage: UsageSchema.optional()
127
+ });
128
+ var ChatCompletionChunkSchema = import_zod.z.object({
129
+ id: import_zod.z.string(),
130
+ object: import_zod.z.literal("chat.completion.chunk"),
131
+ created: import_zod.z.number(),
132
+ model: import_zod.z.string(),
133
+ choices: import_zod.z.array(
134
+ import_zod.z.object({
135
+ index: import_zod.z.number(),
136
+ delta: import_zod.z.object({
137
+ role: import_zod.z.string().optional(),
138
+ content: import_zod.z.string().optional(),
139
+ tool_calls: import_zod.z.array(
140
+ import_zod.z.object({
141
+ index: import_zod.z.number(),
142
+ id: import_zod.z.string().optional(),
143
+ type: import_zod.z.literal("function").optional(),
144
+ function: import_zod.z.object({
145
+ name: import_zod.z.string().optional(),
146
+ arguments: import_zod.z.string().optional()
147
+ }).optional()
148
+ })
149
+ ).optional()
150
+ }),
151
+ finish_reason: import_zod.z.string().nullable()
152
+ })
153
+ )
154
+ });
155
+ var PLUGIN_ID = "llm:groq";
156
+ var RESOURCE_TYPE = "llm";
157
+ var PROVIDER = "groq";
158
+ var VERSION = "1.0.0";
159
+ var DEFAULT_GROQ_MODELS = [
160
+ "llama-3.3-70b-versatile",
161
+ "llama-3.1-70b-versatile",
162
+ "llama-3.1-8b-instant",
163
+ "llama3-70b-8192",
164
+ "llama3-8b-8192",
165
+ "mixtral-8x7b-32768",
166
+ "gemma2-9b-it"
167
+ ];
168
+ var ACTIONS = ["chat.completions"];
169
+ var ENFORCEMENT_SUPPORT = [
170
+ "model",
171
+ "max_tokens",
172
+ "streaming"
173
+ ];
174
+
175
+ // src/proxy.ts
176
+ var GROQ_API_URL = "https://api.groq.com/openai/v1";
177
+ var GroqApiError = class extends Error {
178
+ constructor(status, body) {
179
+ super(`Groq API error: ${status}`);
180
+ this.status = status;
181
+ this.body = body;
182
+ this.name = "GroqApiError";
183
+ }
184
+ };
185
+ function mapGroqError(error) {
186
+ let parsed = {};
187
+ try {
188
+ parsed = JSON.parse(error.body);
189
+ } catch {
190
+ }
191
+ const message = parsed.error?.message || error.body;
192
+ switch (error.status) {
193
+ case 400:
194
+ return { status: 400, code: "BAD_REQUEST", message, retryable: false };
195
+ case 401:
196
+ return {
197
+ status: 401,
198
+ code: "UNAUTHORIZED",
199
+ message: "Invalid API key",
200
+ retryable: false
201
+ };
202
+ case 403:
203
+ return { status: 403, code: "FORBIDDEN", message, retryable: false };
204
+ case 404:
205
+ return { status: 404, code: "NOT_FOUND", message, retryable: false };
206
+ case 429:
207
+ return { status: 429, code: "RATE_LIMITED", message, retryable: true };
208
+ case 500:
209
+ case 502:
210
+ case 503:
211
+ return {
212
+ status: error.status,
213
+ code: "PROVIDER_ERROR",
214
+ message,
215
+ retryable: true
216
+ };
217
+ default:
218
+ return {
219
+ status: error.status,
220
+ code: "UNKNOWN",
221
+ message,
222
+ retryable: false
223
+ };
224
+ }
225
+ }
226
+ var groqPlugin = {
227
+ ...(0, import_shared.createPluginBase)({
228
+ id: PLUGIN_ID,
229
+ resourceType: RESOURCE_TYPE,
230
+ provider: PROVIDER,
231
+ version: VERSION,
232
+ name: "Groq LLM",
233
+ actions: [...ACTIONS],
234
+ supports: {
235
+ enforcement: [...ENFORCEMENT_SUPPORT]
236
+ },
237
+ // Client contract metadata for SDK-compatible plugins
238
+ client: {
239
+ namespace: "groq",
240
+ actions: {
241
+ "chat.completions": {
242
+ description: "Generate chat completions using Groq's fast LLM inference"
243
+ }
244
+ }
245
+ }
246
+ }),
247
+ // Credential schema for UI
248
+ credentialSchema: {
249
+ fields: [
250
+ {
251
+ name: "apiKey",
252
+ type: "secret",
253
+ label: "API Key",
254
+ description: "Your Groq API key",
255
+ required: true
256
+ },
257
+ {
258
+ name: "baseUrl",
259
+ type: "url",
260
+ label: "Base URL",
261
+ description: "Custom API base URL (optional)",
262
+ required: false,
263
+ default: GROQ_API_URL
264
+ }
265
+ ]
266
+ },
267
+ validateAndShape(action, input, constraints) {
268
+ if (action !== "chat.completions") {
269
+ return { valid: false, error: `Unsupported action: ${action}` };
270
+ }
271
+ const parsed = ChatCompletionRequestSchema.safeParse(input);
272
+ if (!parsed.success) {
273
+ return {
274
+ valid: false,
275
+ error: `Invalid request: ${parsed.error.errors.map((e) => e.message).join(", ")}`
276
+ };
277
+ }
278
+ const request = parsed.data;
279
+ const enforcement = {
280
+ model: request.model,
281
+ stream: request.stream ?? false,
282
+ usesTools: Array.isArray(request.tools) && request.tools.length > 0,
283
+ maxOutputTokens: request.max_tokens ?? request.max_completion_tokens
284
+ };
285
+ const allowedModels = constraints.allowedModels ?? [...DEFAULT_GROQ_MODELS];
286
+ if (!allowedModels.includes(request.model)) {
287
+ return {
288
+ valid: false,
289
+ error: `Model '${request.model}' not allowed. Allowed: ${allowedModels.join(", ")}`
290
+ };
291
+ }
292
+ const maxTokens = constraints.maxOutputTokens ?? 4096;
293
+ const requestedTokens = request.max_tokens ?? request.max_completion_tokens;
294
+ if (requestedTokens && requestedTokens > maxTokens) {
295
+ return {
296
+ valid: false,
297
+ error: `max_tokens (${requestedTokens}) exceeds limit (${maxTokens})`
298
+ };
299
+ }
300
+ if (request.stream && constraints.allowStreaming === false) {
301
+ return {
302
+ valid: false,
303
+ error: "Streaming is not allowed for this app"
304
+ };
305
+ }
306
+ const shapedRequest = {
307
+ ...request,
308
+ max_tokens: requestedTokens ? Math.min(requestedTokens, maxTokens) : maxTokens
309
+ };
310
+ return { valid: true, shapedInput: shapedRequest, enforcement };
311
+ },
312
+ async execute(action, shapedInput, ctx, options) {
313
+ const request = shapedInput;
314
+ const baseUrl = ctx.config?.baseUrl || GROQ_API_URL;
315
+ const response = await fetch(`${baseUrl}/chat/completions`, {
316
+ method: "POST",
317
+ headers: {
318
+ "Content-Type": "application/json",
319
+ Authorization: `Bearer ${ctx.secret}`
320
+ },
321
+ body: JSON.stringify(request),
322
+ signal: options.signal
323
+ });
324
+ if (!response.ok) {
325
+ const errorBody = await response.text();
326
+ throw new GroqApiError(response.status, errorBody);
327
+ }
328
+ if (request.stream) {
329
+ return {
330
+ stream: response.body,
331
+ contentType: "text/event-stream"
332
+ };
333
+ } else {
334
+ const json = await response.json();
335
+ return {
336
+ response: json,
337
+ contentType: "application/json",
338
+ usage: this.extractUsage(json)
339
+ };
340
+ }
341
+ },
342
+ extractUsage(response) {
343
+ const res = response;
344
+ return {
345
+ inputTokens: res.usage?.prompt_tokens,
346
+ outputTokens: res.usage?.completion_tokens,
347
+ totalTokens: res.usage?.total_tokens,
348
+ model: res.model
349
+ };
350
+ },
351
+ mapError(error) {
352
+ if (error instanceof GroqApiError) {
353
+ return mapGroqError(error);
354
+ }
355
+ return {
356
+ status: 500,
357
+ code: "INTERNAL_ERROR",
358
+ message: error instanceof Error ? error.message : "Unknown error",
359
+ retryable: false
360
+ };
361
+ }
362
+ };
363
+ var proxy_default = groqPlugin;
364
+ // Annotate the CommonJS export names for ESM import in node:
365
+ 0 && (module.exports = {
366
+ groqPlugin
367
+ });
368
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/proxy.ts","../src/contracts.ts"],"sourcesContent":["// ============================================\n// GROQ PLUGIN PROXY\n// Server-side plugin implementation for the gateway\n// ============================================\n//\n// This module is imported by the proxy to handle Groq requests.\n// It should NOT be imported by target apps.\n//\n// Import path: @glueco/plugin-llm-groq/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_GROQ_MODELS,\n ACTIONS,\n ENFORCEMENT_SUPPORT,\n} from \"./contracts\";\n\n// ============================================\n// CONFIGURATION\n// ============================================\n\nconst GROQ_API_URL = \"https://api.groq.com/openai/v1\";\n\n// ============================================\n// ERROR HANDLING\n// ============================================\n\nclass GroqApiError extends Error {\n constructor(\n public status: number,\n public body: string,\n ) {\n super(`Groq API error: ${status}`);\n this.name = \"GroqApiError\";\n }\n}\n\nfunction mapGroqError(error: GroqApiError): 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\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 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 groqPlugin: PluginContract = {\n ...createPluginBase({\n id: PLUGIN_ID,\n resourceType: RESOURCE_TYPE,\n provider: PROVIDER,\n version: VERSION,\n name: \"Groq LLM\",\n actions: [...ACTIONS],\n supports: {\n enforcement: [...ENFORCEMENT_SUPPORT],\n },\n // Client contract metadata for SDK-compatible plugins\n client: {\n namespace: \"groq\",\n actions: {\n \"chat.completions\": {\n description:\n \"Generate chat completions using Groq's fast LLM inference\",\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 Groq API key\",\n required: true,\n },\n {\n name: \"baseUrl\",\n type: \"url\",\n label: \"Base URL\",\n description: \"Custom API base URL (optional)\",\n required: false,\n default: GROQ_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 ?? [...DEFAULT_GROQ_MODELS];\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 ?? 4096;\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 : maxTokens,\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) || GROQ_API_URL;\n\n const response = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${ctx.secret}`,\n },\n body: JSON.stringify(request),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new GroqApiError(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 GroqApiError) {\n return mapGroqError(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 groqPlugin;\n\n// Also export named for flexibility\nexport { groqPlugin };\n","// ============================================\n// GROQ PLUGIN CONTRACTS\n// Shared request/response schemas for proxy and client\n// ============================================\n\nimport { z } from \"zod\";\n\n// ============================================\n// REQUEST SCHEMAS (OpenAI-compatible)\n// ============================================\n\nexport const ChatMessageSchema = z.object({\n role: z.enum([\"system\", \"user\", \"assistant\", \"tool\"]),\n content: z\n .union([\n z.string(),\n z.array(\n z.object({\n type: z.string(),\n text: z.string().optional(),\n image_url: z\n .object({\n url: z.string(),\n detail: z.string().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});\n\nexport type ChatMessage = z.infer<typeof ChatMessageSchema>;\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 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 user: z.string().optional(),\n tools: z\n .array(\n 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 }),\n }),\n )\n .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 response_format: z\n .object({\n type: z.enum([\"text\", \"json_object\"]),\n })\n .optional(),\n seed: z.number().int().optional(),\n});\n\nexport type ChatCompletionRequest = z.infer<typeof ChatCompletionRequestSchema>;\n\n// ============================================\n// RESPONSE SCHEMAS (OpenAI-compatible)\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 }),\n finish_reason: z.string().nullable(),\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});\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});\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 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 }),\n finish_reason: z.string().nullable(),\n }),\n ),\n});\n\nexport type ChatCompletionChunk = z.infer<typeof ChatCompletionChunkSchema>;\n\n// ============================================\n// PLUGIN CONSTANTS\n// ============================================\n\nexport const PLUGIN_ID = \"llm:groq\" as const;\nexport const RESOURCE_TYPE = \"llm\" as const;\nexport const PROVIDER = \"groq\" as const;\nexport const VERSION = \"1.0.0\";\n\n/** Default allowed models */\nexport const DEFAULT_GROQ_MODELS = [\n \"llama-3.3-70b-versatile\",\n \"llama-3.1-70b-versatile\",\n \"llama-3.1-8b-instant\",\n \"llama3-70b-8192\",\n \"llama3-8b-8192\",\n \"mixtral-8x7b-32768\",\n \"gemma2-9b-it\",\n] as const;\n\n/** Supported actions */\nexport const ACTIONS = [\"chat.completions\"] as const;\nexport type GroqAction = (typeof ACTIONS)[number];\n\n/** Enforcement knobs */\nexport const ENFORCEMENT_SUPPORT = [\n \"model\",\n \"max_tokens\",\n \"streaming\",\n] as const;\n"],"mappings":"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","names":[]}
package/dist/proxy.mjs ADDED
@@ -0,0 +1,10 @@
1
+ import {
2
+ groqPlugin,
3
+ proxy_default
4
+ } from "./chunk-CNIQDSXF.mjs";
5
+ import "./chunk-MRDVVFUV.mjs";
6
+ export {
7
+ proxy_default as default,
8
+ groqPlugin
9
+ };
10
+ //# sourceMappingURL=proxy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@glueco/plugin-llm-groq",
3
+ "version": "0.1.0",
4
+ "description": "Groq LLM plugin for Personal Resource Gateway",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ },
14
+ "./proxy": {
15
+ "types": "./dist/proxy.d.ts",
16
+ "import": "./dist/proxy.mjs",
17
+ "require": "./dist/proxy.js"
18
+ },
19
+ "./client": {
20
+ "types": "./dist/client.d.ts",
21
+ "import": "./dist/client.mjs",
22
+ "require": "./dist/client.js"
23
+ },
24
+ "./contracts": {
25
+ "types": "./dist/contracts.d.ts",
26
+ "import": "./dist/contracts.mjs",
27
+ "require": "./dist/contracts.js"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "sideEffects": false,
34
+ "scripts": {
35
+ "build": "tsup",
36
+ "dev": "tsup --watch",
37
+ "typecheck": "tsc --noEmit"
38
+ },
39
+ "dependencies": {
40
+ "@glueco/shared": "^0.1.0",
41
+ "zod": "^3.22.4"
42
+ },
43
+ "devDependencies": {
44
+ "@glueco/sdk": "^0.1.0",
45
+ "tsup": "^8.0.1",
46
+ "typescript": "^5.3.3"
47
+ },
48
+ "peerDependencies": {
49
+ "@glueco/shared": "^0.1.0",
50
+ "@glueco/sdk": "^0.1.0"
51
+ },
52
+ "peerDependenciesMeta": {
53
+ "@glueco/sdk": {
54
+ "optional": true
55
+ }
56
+ },
57
+ "publishConfig": {
58
+ "access": "public"
59
+ },
60
+ "keywords": [
61
+ "prg",
62
+ "plugin",
63
+ "groq",
64
+ "llm"
65
+ ],
66
+ "repository": {
67
+ "type": "git",
68
+ "url": "git+https://github.com/glueco/gateway.git",
69
+ "directory": "packages/plugin-llm-groq"
70
+ },
71
+ "bugs": {
72
+ "url": "https://github.com/glueco/gateway/issues"
73
+ },
74
+ "homepage": "https://github.com/glueco/gateway#readme",
75
+ "license": "MIT"
76
+ }