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.

88 lines 10.4 kB
"use strict"; /** * Anthropic Adapter * * Adapter for Anthropic API (Claude models) * * @module adapters/providers/anthropic * @author Haiec * @license MIT */ Object.defineProperty(exports, "__esModule", { value: true }); exports.buildAnthropicAdapter = buildAnthropicAdapter; const types_1 = require("../types"); /** * Builds an Anthropic adapter. * * @param config - Adapter configuration * @returns LLM client for Anthropic * * @example * import Anthropic from '@anthropic-ai/sdk'; * const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }); * const llm = buildAnthropicAdapter({ provider: 'anthropic', client: anthropic }); */ function buildAnthropicAdapter(config) { if (!config.client && !config.apiKey) { throw new types_1.AdapterConfigError('anthropic', 'Anthropic adapter requires either a client instance or apiKey. ' + 'Install @anthropic-ai/sdk: npm install @anthropic-ai/sdk'); } const client = config.client; const defaultModel = config.defaultModel ?? 'claude-3-5-sonnet-20241022'; return { provider: 'anthropic', providerName: 'Anthropic', async generate(request) { if (!client) { throw new types_1.AdapterConfigError('anthropic', 'Client not initialized'); } const model = request.model || defaultModel; const response = await client.messages.create({ model, max_tokens: request.maxTokens ?? 4096, messages: [{ role: 'user', content: request.prompt }], system: request.system, temperature: request.temperature, stop_sequences: request.stop }); // Extract text from content blocks const text = response.content .filter(block => block.type === 'text') .map(block => block.text ?? '') .join(''); const tokens = response.usage?.output_tokens ?? estimateTokens(text); const totalTokens = response.usage ? (response.usage.input_tokens ?? 0) + (response.usage.output_tokens ?? 0) : undefined; return { text, tokens, totalTokens, model: response.model ?? model, finishReason: normalizeFinishReason(response.stop_reason), raw: response }; } }; } /** * Estimates token count from text. */ function estimateTokens(text) { return Math.ceil(text.split(/\s+/).length * 1.3); } /** * Normalizes Anthropic finish reason. */ function normalizeFinishReason(reason) { if (!reason) return undefined; const map = { 'end_turn': 'stop', 'stop_sequence': 'stop', 'max_tokens': 'length', 'tool_use': 'tool_calls' }; return map[reason] ?? reason; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL3Byb3ZpZGVycy9hbnRocm9waWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOztBQXVDSCxzREFxREM7QUExRkQsb0NBQWlHO0FBMEJqRzs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsTUFBcUI7SUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLDBCQUFrQixDQUMxQixXQUFXLEVBQ1gsaUVBQWlFO1lBQ2pFLDBEQUEwRCxDQUMzRCxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUF5QixDQUFDO0lBQ2hELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksNEJBQTRCLENBQUM7SUFFekUsT0FBTztRQUNMLFFBQVEsRUFBRSxXQUFXO1FBQ3JCLFlBQVksRUFBRSxXQUFXO1FBRXpCLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBbUI7WUFDaEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE1BQU0sSUFBSSwwQkFBa0IsQ0FBQyxXQUFXLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztZQUN0RSxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUM7WUFFNUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDNUMsS0FBSztnQkFDTCxVQUFVLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxJQUFJO2dCQUNyQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDckQsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dCQUN0QixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7Z0JBQ2hDLGNBQWMsRUFBRSxPQUFPLENBQUMsSUFBSTthQUM3QixDQUFDLENBQUM7WUFFSCxtQ0FBbUM7WUFDbkMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU87aUJBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDO2lCQUN0QyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztpQkFDOUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRVosTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxhQUFhLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxLQUFLO2dCQUNoQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQztnQkFDMUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUVkLE9BQU87Z0JBQ0wsSUFBSTtnQkFDSixNQUFNO2dCQUNOLFdBQVc7Z0JBQ1gsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLElBQUksS0FBSztnQkFDOUIsWUFBWSxFQUFFLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7Z0JBQ3pELEdBQUcsRUFBRSxRQUFRO2FBQ2QsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxjQUFjLENBQUMsSUFBWTtJQUNsQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxNQUFlO0lBQzVDLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUIsTUFBTSxHQUFHLEdBQWdEO1FBQ3ZELFVBQVUsRUFBRSxNQUFNO1FBQ2xCLGVBQWUsRUFBRSxNQUFNO1FBQ3ZCLFlBQVksRUFBRSxRQUFRO1FBQ3RCLFVBQVUsRUFBRSxZQUFZO0tBQ3pCLENBQUM7SUFDRixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQW50aHJvcGljIEFkYXB0ZXJcbiAqIFxuICogQWRhcHRlciBmb3IgQW50aHJvcGljIEFQSSAoQ2xhdWRlIG1vZGVscylcbiAqIFxuICogQG1vZHVsZSBhZGFwdGVycy9wcm92aWRlcnMvYW50aHJvcGljXG4gKiBAYXV0aG9yIEhhaWVjXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBMbG1DbGllbnQsIExsbVJlcXVlc3QsIExsbVJlc3BvbnNlLCBBZGFwdGVyQ29uZmlnLCBBZGFwdGVyQ29uZmlnRXJyb3IgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogQW50aHJvcGljIFNESyBjbGllbnQgaW50ZXJmYWNlIChtaW5pbWFsIHR5cGluZyBmb3IgY29tcGF0aWJpbGl0eSkuXG4gKi9cbmludGVyZmFjZSBBbnRocm9waWNDbGllbnQge1xuICBtZXNzYWdlczoge1xuICAgIGNyZWF0ZShwYXJhbXM6IHtcbiAgICAgIG1vZGVsOiBzdHJpbmc7XG4gICAgICBtYXhfdG9rZW5zOiBudW1iZXI7XG4gICAgICBtZXNzYWdlczogQXJyYXk8eyByb2xlOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9PjtcbiAgICAgIHN5c3RlbT86IHN0cmluZztcbiAgICAgIHRlbXBlcmF0dXJlPzogbnVtYmVyO1xuICAgICAgc3RvcF9zZXF1ZW5jZXM/OiBzdHJpbmdbXTtcbiAgICB9KTogUHJvbWlzZTx7XG4gICAgICBjb250ZW50OiBBcnJheTx7IHR5cGU6IHN0cmluZzsgdGV4dD86IHN0cmluZyB9PjtcbiAgICAgIHN0b3BfcmVhc29uPzogc3RyaW5nO1xuICAgICAgbW9kZWw/OiBzdHJpbmc7XG4gICAgICB1c2FnZT86IHtcbiAgICAgICAgaW5wdXRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgICBvdXRwdXRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgfTtcbiAgICB9PjtcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYW4gQW50aHJvcGljIGFkYXB0ZXIuXG4gKiBcbiAqIEBwYXJhbSBjb25maWcgLSBBZGFwdGVyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIExMTSBjbGllbnQgZm9yIEFudGhyb3BpY1xuICogXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IEFudGhyb3BpYyBmcm9tICdAYW50aHJvcGljLWFpL3Nkayc7XG4gKiBjb25zdCBhbnRocm9waWMgPSBuZXcgQW50aHJvcGljKHsgYXBpS2V5OiBwcm9jZXNzLmVudi5BTlRIUk9QSUNfQVBJX0tFWSB9KTtcbiAqIGNvbnN0IGxsbSA9IGJ1aWxkQW50aHJvcGljQWRhcHRlcih7IHByb3ZpZGVyOiAnYW50aHJvcGljJywgY2xpZW50OiBhbnRocm9waWMgfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFudGhyb3BpY0FkYXB0ZXIoY29uZmlnOiBBZGFwdGVyQ29uZmlnKTogTGxtQ2xpZW50IHtcbiAgaWYgKCFjb25maWcuY2xpZW50ICYmICFjb25maWcuYXBpS2V5KSB7XG4gICAgdGhyb3cgbmV3IEFkYXB0ZXJDb25maWdFcnJvcihcbiAgICAgICdhbnRocm9waWMnLFxuICAgICAgJ0FudGhyb3BpYyBhZGFwdGVyIHJlcXVpcmVzIGVpdGhlciBhIGNsaWVudCBpbnN0YW5jZSBvciBhcGlLZXkuICcgK1xuICAgICAgJ0luc3RhbGwgQGFudGhyb3BpYy1haS9zZGs6IG5wbSBpbnN0YWxsIEBhbnRocm9waWMtYWkvc2RrJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBjbGllbnQgPSBjb25maWcuY2xpZW50IGFzIEFudGhyb3BpY0NsaWVudDtcbiAgY29uc3QgZGVmYXVsdE1vZGVsID0gY29uZmlnLmRlZmF1bHRNb2RlbCA/PyAnY2xhdWRlLTMtNS1zb25uZXQtMjAyNDEwMjInO1xuXG4gIHJldHVybiB7XG4gICAgcHJvdmlkZXI6ICdhbnRocm9waWMnLFxuICAgIHByb3ZpZGVyTmFtZTogJ0FudGhyb3BpYycsXG5cbiAgICBhc3luYyBnZW5lcmF0ZShyZXF1ZXN0OiBMbG1SZXF1ZXN0KTogUHJvbWlzZTxMbG1SZXNwb25zZT4ge1xuICAgICAgaWYgKCFjbGllbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFkYXB0ZXJDb25maWdFcnJvcignYW50aHJvcGljJywgJ0NsaWVudCBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9kZWwgPSByZXF1ZXN0Lm1vZGVsIHx8IGRlZmF1bHRNb2RlbDtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQubWVzc2FnZXMuY3JlYXRlKHtcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIG1heF90b2tlbnM6IHJlcXVlc3QubWF4VG9rZW5zID8/IDQwOTYsXG4gICAgICAgIG1lc3NhZ2VzOiBbeyByb2xlOiAndXNlcicsIGNvbnRlbnQ6IHJlcXVlc3QucHJvbXB0IH1dLFxuICAgICAgICBzeXN0ZW06IHJlcXVlc3Quc3lzdGVtLFxuICAgICAgICB0ZW1wZXJhdHVyZTogcmVxdWVzdC50ZW1wZXJhdHVyZSxcbiAgICAgICAgc3RvcF9zZXF1ZW5jZXM6IHJlcXVlc3Quc3RvcFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEV4dHJhY3QgdGV4dCBmcm9tIGNvbnRlbnQgYmxvY2tzXG4gICAgICBjb25zdCB0ZXh0ID0gcmVzcG9uc2UuY29udGVudFxuICAgICAgICAuZmlsdGVyKGJsb2NrID0+IGJsb2NrLnR5cGUgPT09ICd0ZXh0JylcbiAgICAgICAgLm1hcChibG9jayA9PiBibG9jay50ZXh0ID8/ICcnKVxuICAgICAgICAuam9pbignJyk7XG5cbiAgICAgIGNvbnN0IHRva2VucyA9IHJlc3BvbnNlLnVzYWdlPy5vdXRwdXRfdG9rZW5zID8/IGVzdGltYXRlVG9rZW5zKHRleHQpO1xuICAgICAgY29uc3QgdG90YWxUb2tlbnMgPSByZXNwb25zZS51c2FnZSBcbiAgICAgICAgPyAocmVzcG9uc2UudXNhZ2UuaW5wdXRfdG9rZW5zID8/IDApICsgKHJlc3BvbnNlLnVzYWdlLm91dHB1dF90b2tlbnMgPz8gMClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHQsXG4gICAgICAgIHRva2VucyxcbiAgICAgICAgdG90YWxUb2tlbnMsXG4gICAgICAgIG1vZGVsOiByZXNwb25zZS5tb2RlbCA/PyBtb2RlbCxcbiAgICAgICAgZmluaXNoUmVhc29uOiBub3JtYWxpemVGaW5pc2hSZWFzb24ocmVzcG9uc2Uuc3RvcF9yZWFzb24pLFxuICAgICAgICByYXc6IHJlc3BvbnNlXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBFc3RpbWF0ZXMgdG9rZW4gY291bnQgZnJvbSB0ZXh0LlxuICovXG5mdW5jdGlvbiBlc3RpbWF0ZVRva2Vucyh0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5jZWlsKHRleHQuc3BsaXQoL1xccysvKS5sZW5ndGggKiAxLjMpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgQW50aHJvcGljIGZpbmlzaCByZWFzb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZpbmlzaFJlYXNvbihyZWFzb24/OiBzdHJpbmcpOiBMbG1SZXNwb25zZVsnZmluaXNoUmVhc29uJ10ge1xuICBpZiAoIXJlYXNvbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBMbG1SZXNwb25zZVsnZmluaXNoUmVhc29uJ10+ID0ge1xuICAgICdlbmRfdHVybic6ICdzdG9wJyxcbiAgICAnc3RvcF9zZXF1ZW5jZSc6ICdzdG9wJyxcbiAgICAnbWF4X3Rva2Vucyc6ICdsZW5ndGgnLFxuICAgICd0b29sX3VzZSc6ICd0b29sX2NhbGxzJ1xuICB9O1xuICByZXR1cm4gbWFwW3JlYXNvbl0gPz8gcmVhc29uO1xufVxuIl19