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.

80 lines 10.1 kB
"use strict"; /** * Cohere Adapter * * Adapter for Cohere API (Command models) * * @module adapters/providers/cohere * @author Haiec * @license MIT */ Object.defineProperty(exports, "__esModule", { value: true }); exports.buildCohereAdapter = buildCohereAdapter; const types_1 = require("../types"); /** * Builds a Cohere adapter. * * @param config - Adapter configuration * @returns LLM client for Cohere * * @example * import { CohereClient } from 'cohere-ai'; * const cohere = new CohereClient({ token: process.env.COHERE_API_KEY }); * const llm = buildCohereAdapter({ provider: 'cohere', client: cohere }); */ function buildCohereAdapter(config) { if (!config.client && !config.apiKey) { throw new types_1.AdapterConfigError('cohere', 'Cohere adapter requires either a client instance or apiKey. ' + 'Install cohere-ai: npm install cohere-ai'); } const client = config.client; const defaultModel = config.defaultModel ?? 'command-r-plus'; return { provider: 'cohere', providerName: 'Cohere', async generate(request) { if (!client) { throw new types_1.AdapterConfigError('cohere', 'Client not initialized'); } const model = request.model || defaultModel; const response = await client.chat({ model, message: request.prompt, preamble: request.system, temperature: request.temperature, maxTokens: request.maxTokens, stopSequences: request.stop }); const text = response.text ?? ''; const tokens = response.meta?.tokens?.outputTokens ?? estimateTokens(text); const totalTokens = response.meta?.tokens ? (response.meta.tokens.inputTokens ?? 0) + (response.meta.tokens.outputTokens ?? 0) : undefined; return { text, tokens, totalTokens, model, finishReason: normalizeFinishReason(response.finishReason), raw: response }; }, async embed(input) { if (!client?.embed) { throw new types_1.AdapterConfigError('cohere', 'Embeddings not available'); } const texts = Array.isArray(input) ? input : [input]; const response = await client.embed({ texts, model: 'embed-english-v3.0' }); return response.embeddings; } }; } function estimateTokens(text) { return Math.ceil(text.split(/\s+/).length * 1.3); } function normalizeFinishReason(reason) { if (!reason) return undefined; return reason === 'COMPLETE' ? 'stop' : reason === 'MAX_TOKENS' ? 'length' : reason; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29oZXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL3Byb3ZpZGVycy9jb2hlcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOztBQXlDSCxnREEwREM7QUFqR0Qsb0NBQWlHO0FBNEJqRzs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsTUFBcUI7SUFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLDBCQUFrQixDQUMxQixRQUFRLEVBQ1IsOERBQThEO1lBQzlELDBDQUEwQyxDQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFzQixDQUFDO0lBQzdDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksZ0JBQWdCLENBQUM7SUFFN0QsT0FBTztRQUNMLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLFlBQVksRUFBRSxRQUFRO1FBRXRCLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBbUI7WUFDaEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE1BQU0sSUFBSSwwQkFBa0IsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztZQUNuRSxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUM7WUFFNUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNqQyxLQUFLO2dCQUNMLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTTtnQkFDdkIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dCQUN4QixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7Z0JBQ2hDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztnQkFDNUIsYUFBYSxFQUFFLE9BQU8sQ0FBQyxJQUFJO2FBQzVCLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0UsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNO2dCQUN2QyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDO2dCQUNwRixDQUFDLENBQUMsU0FBUyxDQUFDO1lBRWQsT0FBTztnQkFDTCxJQUFJO2dCQUNKLE1BQU07Z0JBQ04sV0FBVztnQkFDWCxLQUFLO2dCQUNMLFlBQVksRUFBRSxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO2dCQUMxRCxHQUFHLEVBQUUsUUFBUTthQUNkLENBQUM7UUFDSixDQUFDO1FBRUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUF3QjtZQUNsQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUNuQixNQUFNLElBQUksMEJBQWtCLENBQUMsUUFBUSxFQUFFLDBCQUEwQixDQUFDLENBQUM7WUFDckUsQ0FBQztZQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQztZQUM1RSxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDN0IsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsSUFBWTtJQUNsQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsTUFBZTtJQUM1QyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzlCLE9BQU8sTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUN0RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb2hlcmUgQWRhcHRlclxuICogXG4gKiBBZGFwdGVyIGZvciBDb2hlcmUgQVBJIChDb21tYW5kIG1vZGVscylcbiAqIFxuICogQG1vZHVsZSBhZGFwdGVycy9wcm92aWRlcnMvY29oZXJlXG4gKiBAYXV0aG9yIEhhaWVjXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBMbG1DbGllbnQsIExsbVJlcXVlc3QsIExsbVJlc3BvbnNlLCBBZGFwdGVyQ29uZmlnLCBBZGFwdGVyQ29uZmlnRXJyb3IgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogQ29oZXJlIGNsaWVudCBpbnRlcmZhY2UuXG4gKi9cbmludGVyZmFjZSBDb2hlcmVDbGllbnQge1xuICBjaGF0KHBhcmFtczoge1xuICAgIG1vZGVsOiBzdHJpbmc7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHByZWFtYmxlPzogc3RyaW5nO1xuICAgIHRlbXBlcmF0dXJlPzogbnVtYmVyO1xuICAgIG1heFRva2Vucz86IG51bWJlcjtcbiAgICBzdG9wU2VxdWVuY2VzPzogc3RyaW5nW107XG4gIH0pOiBQcm9taXNlPHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgbWV0YT86IHtcbiAgICAgIHRva2Vucz86IHtcbiAgICAgICAgb3V0cHV0VG9rZW5zPzogbnVtYmVyO1xuICAgICAgICBpbnB1dFRva2Vucz86IG51bWJlcjtcbiAgICAgIH07XG4gICAgfTtcbiAgICBmaW5pc2hSZWFzb24/OiBzdHJpbmc7XG4gIH0+O1xuICBlbWJlZD8ocGFyYW1zOiB7IHRleHRzOiBzdHJpbmdbXTsgbW9kZWw/OiBzdHJpbmcgfSk6IFByb21pc2U8e1xuICAgIGVtYmVkZGluZ3M6IG51bWJlcltdW107XG4gIH0+O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIENvaGVyZSBhZGFwdGVyLlxuICogXG4gKiBAcGFyYW0gY29uZmlnIC0gQWRhcHRlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBMTE0gY2xpZW50IGZvciBDb2hlcmVcbiAqIFxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IENvaGVyZUNsaWVudCB9IGZyb20gJ2NvaGVyZS1haSc7XG4gKiBjb25zdCBjb2hlcmUgPSBuZXcgQ29oZXJlQ2xpZW50KHsgdG9rZW46IHByb2Nlc3MuZW52LkNPSEVSRV9BUElfS0VZIH0pO1xuICogY29uc3QgbGxtID0gYnVpbGRDb2hlcmVBZGFwdGVyKHsgcHJvdmlkZXI6ICdjb2hlcmUnLCBjbGllbnQ6IGNvaGVyZSB9KTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29oZXJlQWRhcHRlcihjb25maWc6IEFkYXB0ZXJDb25maWcpOiBMbG1DbGllbnQge1xuICBpZiAoIWNvbmZpZy5jbGllbnQgJiYgIWNvbmZpZy5hcGlLZXkpIHtcbiAgICB0aHJvdyBuZXcgQWRhcHRlckNvbmZpZ0Vycm9yKFxuICAgICAgJ2NvaGVyZScsXG4gICAgICAnQ29oZXJlIGFkYXB0ZXIgcmVxdWlyZXMgZWl0aGVyIGEgY2xpZW50IGluc3RhbmNlIG9yIGFwaUtleS4gJyArXG4gICAgICAnSW5zdGFsbCBjb2hlcmUtYWk6IG5wbSBpbnN0YWxsIGNvaGVyZS1haSdcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY2xpZW50ID0gY29uZmlnLmNsaWVudCBhcyBDb2hlcmVDbGllbnQ7XG4gIGNvbnN0IGRlZmF1bHRNb2RlbCA9IGNvbmZpZy5kZWZhdWx0TW9kZWwgPz8gJ2NvbW1hbmQtci1wbHVzJztcblxuICByZXR1cm4ge1xuICAgIHByb3ZpZGVyOiAnY29oZXJlJyxcbiAgICBwcm92aWRlck5hbWU6ICdDb2hlcmUnLFxuXG4gICAgYXN5bmMgZ2VuZXJhdGUocmVxdWVzdDogTGxtUmVxdWVzdCk6IFByb21pc2U8TGxtUmVzcG9uc2U+IHtcbiAgICAgIGlmICghY2xpZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBBZGFwdGVyQ29uZmlnRXJyb3IoJ2NvaGVyZScsICdDbGllbnQgbm90IGluaXRpYWxpemVkJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vZGVsID0gcmVxdWVzdC5tb2RlbCB8fCBkZWZhdWx0TW9kZWw7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmNoYXQoe1xuICAgICAgICBtb2RlbCxcbiAgICAgICAgbWVzc2FnZTogcmVxdWVzdC5wcm9tcHQsXG4gICAgICAgIHByZWFtYmxlOiByZXF1ZXN0LnN5c3RlbSxcbiAgICAgICAgdGVtcGVyYXR1cmU6IHJlcXVlc3QudGVtcGVyYXR1cmUsXG4gICAgICAgIG1heFRva2VuczogcmVxdWVzdC5tYXhUb2tlbnMsXG4gICAgICAgIHN0b3BTZXF1ZW5jZXM6IHJlcXVlc3Quc3RvcFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRleHQgPSByZXNwb25zZS50ZXh0ID8/ICcnO1xuICAgICAgY29uc3QgdG9rZW5zID0gcmVzcG9uc2UubWV0YT8udG9rZW5zPy5vdXRwdXRUb2tlbnMgPz8gZXN0aW1hdGVUb2tlbnModGV4dCk7XG4gICAgICBjb25zdCB0b3RhbFRva2VucyA9IHJlc3BvbnNlLm1ldGE/LnRva2VucyBcbiAgICAgICAgPyAocmVzcG9uc2UubWV0YS50b2tlbnMuaW5wdXRUb2tlbnMgPz8gMCkgKyAocmVzcG9uc2UubWV0YS50b2tlbnMub3V0cHV0VG9rZW5zID8/IDApXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0LFxuICAgICAgICB0b2tlbnMsXG4gICAgICAgIHRvdGFsVG9rZW5zLFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgZmluaXNoUmVhc29uOiBub3JtYWxpemVGaW5pc2hSZWFzb24ocmVzcG9uc2UuZmluaXNoUmVhc29uKSxcbiAgICAgICAgcmF3OiByZXNwb25zZVxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZW1iZWQoaW5wdXQ6IHN0cmluZyB8IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXJbXVtdPiB7XG4gICAgICBpZiAoIWNsaWVudD8uZW1iZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFkYXB0ZXJDb25maWdFcnJvcignY29oZXJlJywgJ0VtYmVkZGluZ3Mgbm90IGF2YWlsYWJsZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0ZXh0cyA9IEFycmF5LmlzQXJyYXkoaW5wdXQpID8gaW5wdXQgOiBbaW5wdXRdO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZW1iZWQoeyB0ZXh0cywgbW9kZWw6ICdlbWJlZC1lbmdsaXNoLXYzLjAnIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmVtYmVkZGluZ3M7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBlc3RpbWF0ZVRva2Vucyh0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5jZWlsKHRleHQuc3BsaXQoL1xccysvKS5sZW5ndGggKiAxLjMpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVGaW5pc2hSZWFzb24ocmVhc29uPzogc3RyaW5nKTogTGxtUmVzcG9uc2VbJ2ZpbmlzaFJlYXNvbiddIHtcbiAgaWYgKCFyZWFzb24pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiByZWFzb24gPT09ICdDT01QTEVURScgPyAnc3RvcCcgOiByZWFzb24gPT09ICdNQVhfVE9LRU5TJyA/ICdsZW5ndGgnIDogcmVhc29uO1xufVxuIl19