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