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
JavaScript
;
/**
* 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