UNPKG

llmverify

Version:

AI Output Verification Toolkit — Local-first LLM safety, hallucination detection, PII redaction, prompt injection defense, and runtime monitoring. Zero telemetry. OWASP LLM Top 10 aligned.

78 lines 9.46 kB
"use strict"; /** * Groq Adapter * * Adapter for Groq API (fast inference for Llama, Mixtral, etc.) * * @module adapters/providers/groq * @author Haiec * @license MIT */ Object.defineProperty(exports, "__esModule", { value: true }); exports.buildGroqAdapter = buildGroqAdapter; const types_1 = require("../types"); /** * Builds a Groq adapter. * * @param config - Adapter configuration * @returns LLM client for Groq * * @example * import Groq from 'groq-sdk'; * const groq = new Groq({ apiKey: process.env.GROQ_API_KEY }); * const llm = buildGroqAdapter({ provider: 'groq', client: groq }); */ function buildGroqAdapter(config) { if (!config.client && !config.apiKey) { throw new types_1.AdapterConfigError('groq', 'Groq adapter requires either a client instance or apiKey. ' + 'Install groq-sdk: npm install groq-sdk'); } const client = config.client; const defaultModel = config.defaultModel ?? 'llama-3.1-70b-versatile'; return { provider: 'groq', providerName: 'Groq', async generate(request) { if (!client) { throw new types_1.AdapterConfigError('groq', 'Client not initialized'); } const model = request.model || defaultModel; const messages = []; if (request.system) { messages.push({ role: 'system', content: request.system }); } messages.push({ role: 'user', content: request.prompt }); const response = await client.chat.completions.create({ model, messages, temperature: request.temperature, max_tokens: request.maxTokens, stop: request.stop }); const choice = response.choices[0]; const text = choice?.message?.content?.toString() ?? ''; const tokens = response.usage?.completion_tokens ?? estimateTokens(text); return { text, tokens, totalTokens: response.usage?.total_tokens, model: response.model ?? model, finishReason: normalizeFinishReason(choice?.finish_reason), raw: response }; } }; } function estimateTokens(text) { return Math.ceil(text.split(/\s+/).length * 1.3); } function normalizeFinishReason(reason) { if (!reason) return undefined; const map = { 'stop': 'stop', 'length': 'length' }; return map[reason] ?? reason; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvcS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGVycy9wcm92aWRlcnMvZ3JvcS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7O0FBMENILDRDQW1EQztBQTNGRCxvQ0FBaUc7QUE2QmpHOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFxQjtJQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksMEJBQWtCLENBQzFCLE1BQU0sRUFDTiw0REFBNEQ7WUFDNUQsd0NBQXdDLENBQ3pDLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQW9CLENBQUM7SUFDM0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSx5QkFBeUIsQ0FBQztJQUV0RSxPQUFPO1FBQ0wsUUFBUSxFQUFFLE1BQU07UUFDaEIsWUFBWSxFQUFFLE1BQU07UUFFcEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFtQjtZQUNoQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osTUFBTSxJQUFJLDBCQUFrQixDQUFDLE1BQU0sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7WUFFRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLFlBQVksQ0FBQztZQUU1QyxNQUFNLFFBQVEsR0FBNkMsRUFBRSxDQUFDO1lBQzlELElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuQixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUV6RCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztnQkFDcEQsS0FBSztnQkFDTCxRQUFRO2dCQUNSLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztnQkFDaEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxTQUFTO2dCQUM3QixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7YUFDbkIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDeEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFekUsT0FBTztnQkFDTCxJQUFJO2dCQUNKLE1BQU07Z0JBQ04sV0FBVyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsWUFBWTtnQkFDekMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLElBQUksS0FBSztnQkFDOUIsWUFBWSxFQUFFLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUM7Z0JBQzFELEdBQUcsRUFBRSxRQUFRO2FBQ2QsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLElBQVk7SUFDbEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLE1BQWU7SUFDNUMsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5QixNQUFNLEdBQUcsR0FBZ0Q7UUFDdkQsTUFBTSxFQUFFLE1BQU07UUFDZCxRQUFRLEVBQUUsUUFBUTtLQUNuQixDQUFDO0lBQ0YsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDO0FBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdyb3EgQWRhcHRlclxuICogXG4gKiBBZGFwdGVyIGZvciBHcm9xIEFQSSAoZmFzdCBpbmZlcmVuY2UgZm9yIExsYW1hLCBNaXh0cmFsLCBldGMuKVxuICogXG4gKiBAbW9kdWxlIGFkYXB0ZXJzL3Byb3ZpZGVycy9ncm9xXG4gKiBAYXV0aG9yIEhhaWVjXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBMbG1DbGllbnQsIExsbVJlcXVlc3QsIExsbVJlc3BvbnNlLCBBZGFwdGVyQ29uZmlnLCBBZGFwdGVyQ29uZmlnRXJyb3IgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogR3JvcSBTREsgY2xpZW50IGludGVyZmFjZSAoT3BlbkFJLWNvbXBhdGlibGUpLlxuICovXG5pbnRlcmZhY2UgR3JvcUNsaWVudCB7XG4gIGNoYXQ6IHtcbiAgICBjb21wbGV0aW9uczoge1xuICAgICAgY3JlYXRlKHBhcmFtczoge1xuICAgICAgICBtb2RlbDogc3RyaW5nO1xuICAgICAgICBtZXNzYWdlczogQXJyYXk8eyByb2xlOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9PjtcbiAgICAgICAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG4gICAgICAgIG1heF90b2tlbnM/OiBudW1iZXI7XG4gICAgICAgIHN0b3A/OiBzdHJpbmdbXTtcbiAgICAgIH0pOiBQcm9taXNlPHtcbiAgICAgICAgY2hvaWNlczogQXJyYXk8e1xuICAgICAgICAgIG1lc3NhZ2U/OiB7IGNvbnRlbnQ/OiBzdHJpbmcgfCBudWxsIH07XG4gICAgICAgICAgZmluaXNoX3JlYXNvbj86IHN0cmluZztcbiAgICAgICAgfT47XG4gICAgICAgIHVzYWdlPzoge1xuICAgICAgICAgIGNvbXBsZXRpb25fdG9rZW5zPzogbnVtYmVyO1xuICAgICAgICAgIHRvdGFsX3Rva2Vucz86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgICAgbW9kZWw/OiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICB9O1xuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEdyb3EgYWRhcHRlci5cbiAqIFxuICogQHBhcmFtIGNvbmZpZyAtIEFkYXB0ZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgTExNIGNsaWVudCBmb3IgR3JvcVxuICogXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IEdyb3EgZnJvbSAnZ3JvcS1zZGsnO1xuICogY29uc3QgZ3JvcSA9IG5ldyBHcm9xKHsgYXBpS2V5OiBwcm9jZXNzLmVudi5HUk9RX0FQSV9LRVkgfSk7XG4gKiBjb25zdCBsbG0gPSBidWlsZEdyb3FBZGFwdGVyKHsgcHJvdmlkZXI6ICdncm9xJywgY2xpZW50OiBncm9xIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHcm9xQWRhcHRlcihjb25maWc6IEFkYXB0ZXJDb25maWcpOiBMbG1DbGllbnQge1xuICBpZiAoIWNvbmZpZy5jbGllbnQgJiYgIWNvbmZpZy5hcGlLZXkpIHtcbiAgICB0aHJvdyBuZXcgQWRhcHRlckNvbmZpZ0Vycm9yKFxuICAgICAgJ2dyb3EnLFxuICAgICAgJ0dyb3EgYWRhcHRlciByZXF1aXJlcyBlaXRoZXIgYSBjbGllbnQgaW5zdGFuY2Ugb3IgYXBpS2V5LiAnICtcbiAgICAgICdJbnN0YWxsIGdyb3Etc2RrOiBucG0gaW5zdGFsbCBncm9xLXNkaydcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY2xpZW50ID0gY29uZmlnLmNsaWVudCBhcyBHcm9xQ2xpZW50O1xuICBjb25zdCBkZWZhdWx0TW9kZWwgPSBjb25maWcuZGVmYXVsdE1vZGVsID8/ICdsbGFtYS0zLjEtNzBiLXZlcnNhdGlsZSc7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcjogJ2dyb3EnLFxuICAgIHByb3ZpZGVyTmFtZTogJ0dyb3EnLFxuXG4gICAgYXN5bmMgZ2VuZXJhdGUocmVxdWVzdDogTGxtUmVxdWVzdCk6IFByb21pc2U8TGxtUmVzcG9uc2U+IHtcbiAgICAgIGlmICghY2xpZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBBZGFwdGVyQ29uZmlnRXJyb3IoJ2dyb3EnLCAnQ2xpZW50IG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtb2RlbCA9IHJlcXVlc3QubW9kZWwgfHwgZGVmYXVsdE1vZGVsO1xuICAgICAgXG4gICAgICBjb25zdCBtZXNzYWdlczogQXJyYXk8eyByb2xlOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9PiA9IFtdO1xuICAgICAgaWYgKHJlcXVlc3Quc3lzdGVtKSB7XG4gICAgICAgIG1lc3NhZ2VzLnB1c2goeyByb2xlOiAnc3lzdGVtJywgY29udGVudDogcmVxdWVzdC5zeXN0ZW0gfSk7XG4gICAgICB9XG4gICAgICBtZXNzYWdlcy5wdXNoKHsgcm9sZTogJ3VzZXInLCBjb250ZW50OiByZXF1ZXN0LnByb21wdCB9KTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuY2hhdC5jb21wbGV0aW9ucy5jcmVhdGUoe1xuICAgICAgICBtb2RlbCxcbiAgICAgICAgbWVzc2FnZXMsXG4gICAgICAgIHRlbXBlcmF0dXJlOiByZXF1ZXN0LnRlbXBlcmF0dXJlLFxuICAgICAgICBtYXhfdG9rZW5zOiByZXF1ZXN0Lm1heFRva2VucyxcbiAgICAgICAgc3RvcDogcmVxdWVzdC5zdG9wXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY2hvaWNlID0gcmVzcG9uc2UuY2hvaWNlc1swXTtcbiAgICAgIGNvbnN0IHRleHQgPSBjaG9pY2U/Lm1lc3NhZ2U/LmNvbnRlbnQ/LnRvU3RyaW5nKCkgPz8gJyc7XG4gICAgICBjb25zdCB0b2tlbnMgPSByZXNwb25zZS51c2FnZT8uY29tcGxldGlvbl90b2tlbnMgPz8gZXN0aW1hdGVUb2tlbnModGV4dCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHQsXG4gICAgICAgIHRva2VucyxcbiAgICAgICAgdG90YWxUb2tlbnM6IHJlc3BvbnNlLnVzYWdlPy50b3RhbF90b2tlbnMsXG4gICAgICAgIG1vZGVsOiByZXNwb25zZS5tb2RlbCA/PyBtb2RlbCxcbiAgICAgICAgZmluaXNoUmVhc29uOiBub3JtYWxpemVGaW5pc2hSZWFzb24oY2hvaWNlPy5maW5pc2hfcmVhc29uKSxcbiAgICAgICAgcmF3OiByZXNwb25zZVxuICAgICAgfTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVzdGltYXRlVG9rZW5zKHRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLmNlaWwodGV4dC5zcGxpdCgvXFxzKy8pLmxlbmd0aCAqIDEuMyk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZpbmlzaFJlYXNvbihyZWFzb24/OiBzdHJpbmcpOiBMbG1SZXNwb25zZVsnZmluaXNoUmVhc29uJ10ge1xuICBpZiAoIXJlYXNvbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBMbG1SZXNwb25zZVsnZmluaXNoUmVhc29uJ10+ID0ge1xuICAgICdzdG9wJzogJ3N0b3AnLFxuICAgICdsZW5ndGgnOiAnbGVuZ3RoJ1xuICB9O1xuICByZXR1cm4gbWFwW3JlYXNvbl0gPz8gcmVhc29uO1xufVxuIl19