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.

101 lines 8.89 kB
"use strict"; /** * Adapter Factory * * Creates unified LLM clients from provider-specific configurations. * Uses a registry pattern for extensibility. * * @module adapters/factory * @author Haiec * @license MIT */ Object.defineProperty(exports, "__esModule", { value: true }); exports.createAdapter = createAdapter; exports.registerAdapter = registerAdapter; exports.getRegisteredProviders = getRegisteredProviders; const types_1 = require("./types"); const openai_1 = require("./providers/openai"); const anthropic_1 = require("./providers/anthropic"); const groq_1 = require("./providers/groq"); const google_1 = require("./providers/google"); const deepseek_1 = require("./providers/deepseek"); const mistral_1 = require("./providers/mistral"); const cohere_1 = require("./providers/cohere"); const local_1 = require("./providers/local"); const custom_1 = require("./providers/custom"); /** * Registry of adapter builders by provider ID. */ const adapterRegistry = new Map([ ['openai', openai_1.buildOpenAIAdapter], ['anthropic', anthropic_1.buildAnthropicAdapter], ['groq', groq_1.buildGroqAdapter], ['google', google_1.buildGoogleAdapter], ['deepseek', deepseek_1.buildDeepSeekAdapter], ['mistral', mistral_1.buildMistralAdapter], ['cohere', cohere_1.buildCohereAdapter], ['local', local_1.buildLocalAdapter], ['custom', custom_1.buildCustomAdapter] ]); /** * Creates a unified LLM client from provider configuration. * * @param config - Adapter configuration * @returns Unified LLM client * @throws UnsupportedProviderError if provider is not registered * * @example * // With existing OpenAI client * import OpenAI from 'openai'; * const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); * const llm = createAdapter({ provider: 'openai', client: openai }); * * @example * // With API key only * const llm = createAdapter({ * provider: 'openai', * apiKey: process.env.OPENAI_API_KEY, * defaultModel: 'gpt-4o-mini' * }); * * @example * // Local model * const llm = createAdapter({ * provider: 'local', * client: async (prompt) => await myLocalModel(prompt) * }); */ function createAdapter(config) { const builder = adapterRegistry.get(config.provider); if (!builder) { throw new types_1.UnsupportedProviderError(config.provider); } return builder(config); } /** * Registers a custom adapter builder. * Use this to add support for providers not included by default. * * @param provider - Provider identifier * @param builder - Adapter builder function * * @example * registerAdapter('my-provider', (config) => ({ * provider: 'custom', * providerName: 'My Provider', * async generate(request) { * // Your implementation * return { text: '...', tokens: 0 }; * } * })); */ function registerAdapter(provider, builder) { adapterRegistry.set(provider, builder); } /** * Gets list of registered provider IDs. */ function getRegisteredProviders() { return Array.from(adapterRegistry.keys()); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7O0FBK0RILHNDQVFDO0FBbUJELDBDQUVDO0FBS0Qsd0RBRUM7QUFqR0QsbUNBTWlCO0FBRWpCLCtDQUF3RDtBQUN4RCxxREFBOEQ7QUFDOUQsMkNBQW9EO0FBQ3BELCtDQUF3RDtBQUN4RCxtREFBNEQ7QUFDNUQsaURBQTBEO0FBQzFELCtDQUF3RDtBQUN4RCw2Q0FBc0Q7QUFDdEQsK0NBQXdEO0FBRXhEOztHQUVHO0FBQ0gsTUFBTSxlQUFlLEdBQW9DLElBQUksR0FBRyxDQUFDO0lBQy9ELENBQUMsUUFBUSxFQUFFLDJCQUFrQixDQUFDO0lBQzlCLENBQUMsV0FBVyxFQUFFLGlDQUFxQixDQUFDO0lBQ3BDLENBQUMsTUFBTSxFQUFFLHVCQUFnQixDQUFDO0lBQzFCLENBQUMsUUFBUSxFQUFFLDJCQUFrQixDQUFDO0lBQzlCLENBQUMsVUFBVSxFQUFFLCtCQUFvQixDQUFDO0lBQ2xDLENBQUMsU0FBUyxFQUFFLDZCQUFtQixDQUFDO0lBQ2hDLENBQUMsUUFBUSxFQUFFLDJCQUFrQixDQUFDO0lBQzlCLENBQUMsT0FBTyxFQUFFLHlCQUFpQixDQUFDO0lBQzVCLENBQUMsUUFBUSxFQUFFLDJCQUFrQixDQUFDO0NBQy9CLENBQUMsQ0FBQztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFDSCxTQUFnQixhQUFhLENBQUMsTUFBcUI7SUFDakQsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFckQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLGdDQUF3QixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLFFBQTZCLEVBQUUsT0FBdUI7SUFDcEYsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFzQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLHNCQUFzQjtJQUNwQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWRhcHRlciBGYWN0b3J5XG4gKiBcbiAqIENyZWF0ZXMgdW5pZmllZCBMTE0gY2xpZW50cyBmcm9tIHByb3ZpZGVyLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25zLlxuICogVXNlcyBhIHJlZ2lzdHJ5IHBhdHRlcm4gZm9yIGV4dGVuc2liaWxpdHkuXG4gKiBcbiAqIEBtb2R1bGUgYWRhcHRlcnMvZmFjdG9yeVxuICogQGF1dGhvciBIYWllY1xuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgXG4gIFByb3ZpZGVySWQsIFxuICBMbG1DbGllbnQsIFxuICBBZGFwdGVyQ29uZmlnLCBcbiAgQWRhcHRlckJ1aWxkZXIsXG4gIFVuc3VwcG9ydGVkUHJvdmlkZXJFcnJvciBcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB7IGJ1aWxkT3BlbkFJQWRhcHRlciB9IGZyb20gJy4vcHJvdmlkZXJzL29wZW5haSc7XG5pbXBvcnQgeyBidWlsZEFudGhyb3BpY0FkYXB0ZXIgfSBmcm9tICcuL3Byb3ZpZGVycy9hbnRocm9waWMnO1xuaW1wb3J0IHsgYnVpbGRHcm9xQWRhcHRlciB9IGZyb20gJy4vcHJvdmlkZXJzL2dyb3EnO1xuaW1wb3J0IHsgYnVpbGRHb29nbGVBZGFwdGVyIH0gZnJvbSAnLi9wcm92aWRlcnMvZ29vZ2xlJztcbmltcG9ydCB7IGJ1aWxkRGVlcFNlZWtBZGFwdGVyIH0gZnJvbSAnLi9wcm92aWRlcnMvZGVlcHNlZWsnO1xuaW1wb3J0IHsgYnVpbGRNaXN0cmFsQWRhcHRlciB9IGZyb20gJy4vcHJvdmlkZXJzL21pc3RyYWwnO1xuaW1wb3J0IHsgYnVpbGRDb2hlcmVBZGFwdGVyIH0gZnJvbSAnLi9wcm92aWRlcnMvY29oZXJlJztcbmltcG9ydCB7IGJ1aWxkTG9jYWxBZGFwdGVyIH0gZnJvbSAnLi9wcm92aWRlcnMvbG9jYWwnO1xuaW1wb3J0IHsgYnVpbGRDdXN0b21BZGFwdGVyIH0gZnJvbSAnLi9wcm92aWRlcnMvY3VzdG9tJztcblxuLyoqXG4gKiBSZWdpc3RyeSBvZiBhZGFwdGVyIGJ1aWxkZXJzIGJ5IHByb3ZpZGVyIElELlxuICovXG5jb25zdCBhZGFwdGVyUmVnaXN0cnk6IE1hcDxQcm92aWRlcklkLCBBZGFwdGVyQnVpbGRlcj4gPSBuZXcgTWFwKFtcbiAgWydvcGVuYWknLCBidWlsZE9wZW5BSUFkYXB0ZXJdLFxuICBbJ2FudGhyb3BpYycsIGJ1aWxkQW50aHJvcGljQWRhcHRlcl0sXG4gIFsnZ3JvcScsIGJ1aWxkR3JvcUFkYXB0ZXJdLFxuICBbJ2dvb2dsZScsIGJ1aWxkR29vZ2xlQWRhcHRlcl0sXG4gIFsnZGVlcHNlZWsnLCBidWlsZERlZXBTZWVrQWRhcHRlcl0sXG4gIFsnbWlzdHJhbCcsIGJ1aWxkTWlzdHJhbEFkYXB0ZXJdLFxuICBbJ2NvaGVyZScsIGJ1aWxkQ29oZXJlQWRhcHRlcl0sXG4gIFsnbG9jYWwnLCBidWlsZExvY2FsQWRhcHRlcl0sXG4gIFsnY3VzdG9tJywgYnVpbGRDdXN0b21BZGFwdGVyXVxuXSk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHVuaWZpZWQgTExNIGNsaWVudCBmcm9tIHByb3ZpZGVyIGNvbmZpZ3VyYXRpb24uXG4gKiBcbiAqIEBwYXJhbSBjb25maWcgLSBBZGFwdGVyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIFVuaWZpZWQgTExNIGNsaWVudFxuICogQHRocm93cyBVbnN1cHBvcnRlZFByb3ZpZGVyRXJyb3IgaWYgcHJvdmlkZXIgaXMgbm90IHJlZ2lzdGVyZWRcbiAqIFxuICogQGV4YW1wbGVcbiAqIC8vIFdpdGggZXhpc3RpbmcgT3BlbkFJIGNsaWVudFxuICogaW1wb3J0IE9wZW5BSSBmcm9tICdvcGVuYWknO1xuICogY29uc3Qgb3BlbmFpID0gbmV3IE9wZW5BSSh7IGFwaUtleTogcHJvY2Vzcy5lbnYuT1BFTkFJX0FQSV9LRVkgfSk7XG4gKiBjb25zdCBsbG0gPSBjcmVhdGVBZGFwdGVyKHsgcHJvdmlkZXI6ICdvcGVuYWknLCBjbGllbnQ6IG9wZW5haSB9KTtcbiAqIFxuICogQGV4YW1wbGVcbiAqIC8vIFdpdGggQVBJIGtleSBvbmx5XG4gKiBjb25zdCBsbG0gPSBjcmVhdGVBZGFwdGVyKHsgXG4gKiAgIHByb3ZpZGVyOiAnb3BlbmFpJywgXG4gKiAgIGFwaUtleTogcHJvY2Vzcy5lbnYuT1BFTkFJX0FQSV9LRVksXG4gKiAgIGRlZmF1bHRNb2RlbDogJ2dwdC00by1taW5pJ1xuICogfSk7XG4gKiBcbiAqIEBleGFtcGxlXG4gKiAvLyBMb2NhbCBtb2RlbFxuICogY29uc3QgbGxtID0gY3JlYXRlQWRhcHRlcih7XG4gKiAgIHByb3ZpZGVyOiAnbG9jYWwnLFxuICogICBjbGllbnQ6IGFzeW5jIChwcm9tcHQpID0+IGF3YWl0IG15TG9jYWxNb2RlbChwcm9tcHQpXG4gKiB9KTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFkYXB0ZXIoY29uZmlnOiBBZGFwdGVyQ29uZmlnKTogTGxtQ2xpZW50IHtcbiAgY29uc3QgYnVpbGRlciA9IGFkYXB0ZXJSZWdpc3RyeS5nZXQoY29uZmlnLnByb3ZpZGVyKTtcbiAgXG4gIGlmICghYnVpbGRlcikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZFByb3ZpZGVyRXJyb3IoY29uZmlnLnByb3ZpZGVyKTtcbiAgfVxuICBcbiAgcmV0dXJuIGJ1aWxkZXIoY29uZmlnKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjdXN0b20gYWRhcHRlciBidWlsZGVyLlxuICogVXNlIHRoaXMgdG8gYWRkIHN1cHBvcnQgZm9yIHByb3ZpZGVycyBub3QgaW5jbHVkZWQgYnkgZGVmYXVsdC5cbiAqIFxuICogQHBhcmFtIHByb3ZpZGVyIC0gUHJvdmlkZXIgaWRlbnRpZmllclxuICogQHBhcmFtIGJ1aWxkZXIgLSBBZGFwdGVyIGJ1aWxkZXIgZnVuY3Rpb25cbiAqIFxuICogQGV4YW1wbGVcbiAqIHJlZ2lzdGVyQWRhcHRlcignbXktcHJvdmlkZXInLCAoY29uZmlnKSA9PiAoe1xuICogICBwcm92aWRlcjogJ2N1c3RvbScsXG4gKiAgIHByb3ZpZGVyTmFtZTogJ015IFByb3ZpZGVyJyxcbiAqICAgYXN5bmMgZ2VuZXJhdGUocmVxdWVzdCkge1xuICogICAgIC8vIFlvdXIgaW1wbGVtZW50YXRpb25cbiAqICAgICByZXR1cm4geyB0ZXh0OiAnLi4uJywgdG9rZW5zOiAwIH07XG4gKiAgIH1cbiAqIH0pKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQWRhcHRlcihwcm92aWRlcjogUHJvdmlkZXJJZCB8IHN0cmluZywgYnVpbGRlcjogQWRhcHRlckJ1aWxkZXIpOiB2b2lkIHtcbiAgYWRhcHRlclJlZ2lzdHJ5LnNldChwcm92aWRlciBhcyBQcm92aWRlcklkLCBidWlsZGVyKTtcbn1cblxuLyoqXG4gKiBHZXRzIGxpc3Qgb2YgcmVnaXN0ZXJlZCBwcm92aWRlciBJRHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWdpc3RlcmVkUHJvdmlkZXJzKCk6IFByb3ZpZGVySWRbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGFkYXB0ZXJSZWdpc3RyeS5rZXlzKCkpO1xufVxuIl19