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