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.
68 lines • 8.05 kB
JavaScript
;
/**
* Google Adapter
*
* Adapter for Google AI (Gemini models)
*
* @module adapters/providers/google
* @author Haiec
* @license MIT
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildGoogleAdapter = buildGoogleAdapter;
const types_1 = require("../types");
/**
* Builds a Google AI adapter.
*
* @param config - Adapter configuration
* @returns LLM client for Google AI
*
* @example
* import { GoogleGenerativeAI } from '@google/generative-ai';
* const genAI = new GoogleGenerativeAI(process.env.GOOGLE_API_KEY);
* const llm = buildGoogleAdapter({ provider: 'google', client: genAI });
*/
function buildGoogleAdapter(config) {
if (!config.client && !config.apiKey) {
throw new types_1.AdapterConfigError('google', 'Google adapter requires either a client instance or apiKey. ' +
'Install @google/generative-ai: npm install @google/generative-ai');
}
const client = config.client;
const defaultModel = config.defaultModel ?? 'gemini-1.5-flash';
return {
provider: 'google',
providerName: 'Google AI',
async generate(request) {
if (!client) {
throw new types_1.AdapterConfigError('google', 'Client not initialized');
}
const modelName = request.model || defaultModel;
const model = client.getGenerativeModel({ model: modelName });
// Build prompt with system instruction if provided
let prompt;
if (request.system) {
prompt = `${request.system}\n\n${request.prompt}`;
}
else {
prompt = request.prompt;
}
const result = await model.generateContent(prompt);
const response = result.response;
const text = response.text();
const tokens = response.usageMetadata?.candidatesTokenCount ?? estimateTokens(text);
const totalTokens = response.usageMetadata?.totalTokenCount;
return {
text,
tokens,
totalTokens,
model: modelName,
finishReason: 'stop',
raw: result
};
}
};
}
function estimateTokens(text) {
return Math.ceil(text.split(/\s+/).length * 1.3);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL3Byb3ZpZGVycy9nb29nbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOztBQWdDSCxnREFpREM7QUEvRUQsb0NBQWlHO0FBbUJqRzs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsTUFBcUI7SUFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLDBCQUFrQixDQUMxQixRQUFRLEVBQ1IsOERBQThEO1lBQzlELGtFQUFrRSxDQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFzQixDQUFDO0lBQzdDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksa0JBQWtCLENBQUM7SUFFL0QsT0FBTztRQUNMLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLFlBQVksRUFBRSxXQUFXO1FBRXpCLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBbUI7WUFDaEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE1BQU0sSUFBSSwwQkFBa0IsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztZQUNuRSxDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUM7WUFDaEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFFOUQsbURBQW1EO1lBQ25ELElBQUksTUFBYyxDQUFDO1lBQ25CLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuQixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDMUIsQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUU3QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLG9CQUFvQixJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQztZQUU1RCxPQUFPO2dCQUNMLElBQUk7Z0JBQ0osTUFBTTtnQkFDTixXQUFXO2dCQUNYLEtBQUssRUFBRSxTQUFTO2dCQUNoQixZQUFZLEVBQUUsTUFBTTtnQkFDcEIsR0FBRyxFQUFFLE1BQU07YUFDWixDQUFDO1FBQ0osQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsSUFBWTtJQUNsQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDbkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR29vZ2xlIEFkYXB0ZXJcbiAqIFxuICogQWRhcHRlciBmb3IgR29vZ2xlIEFJIChHZW1pbmkgbW9kZWxzKVxuICogXG4gKiBAbW9kdWxlIGFkYXB0ZXJzL3Byb3ZpZGVycy9nb29nbGVcbiAqIEBhdXRob3IgSGFpZWNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IExsbUNsaWVudCwgTGxtUmVxdWVzdCwgTGxtUmVzcG9uc2UsIEFkYXB0ZXJDb25maWcsIEFkYXB0ZXJDb25maWdFcnJvciB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBHb29nbGUgR2VuZXJhdGl2ZSBBSSBjbGllbnQgaW50ZXJmYWNlLlxuICovXG5pbnRlcmZhY2UgR29vZ2xlQ2xpZW50IHtcbiAgZ2V0R2VuZXJhdGl2ZU1vZGVsKHBhcmFtczogeyBtb2RlbDogc3RyaW5nIH0pOiB7XG4gICAgZ2VuZXJhdGVDb250ZW50KHByb21wdDogc3RyaW5nIHwgeyBjb250ZW50czogQXJyYXk8eyByb2xlOiBzdHJpbmc7IHBhcnRzOiBBcnJheTx7IHRleHQ6IHN0cmluZyB9PiB9PiB9KTogUHJvbWlzZTx7XG4gICAgICByZXNwb25zZToge1xuICAgICAgICB0ZXh0KCk6IHN0cmluZztcbiAgICAgICAgdXNhZ2VNZXRhZGF0YT86IHtcbiAgICAgICAgICBjYW5kaWRhdGVzVG9rZW5Db3VudD86IG51bWJlcjtcbiAgICAgICAgICB0b3RhbFRva2VuQ291bnQ/OiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0+O1xuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEdvb2dsZSBBSSBhZGFwdGVyLlxuICogXG4gKiBAcGFyYW0gY29uZmlnIC0gQWRhcHRlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBMTE0gY2xpZW50IGZvciBHb29nbGUgQUlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IEdvb2dsZUdlbmVyYXRpdmVBSSB9IGZyb20gJ0Bnb29nbGUvZ2VuZXJhdGl2ZS1haSc7XG4gKiBjb25zdCBnZW5BSSA9IG5ldyBHb29nbGVHZW5lcmF0aXZlQUkocHJvY2Vzcy5lbnYuR09PR0xFX0FQSV9LRVkpO1xuICogY29uc3QgbGxtID0gYnVpbGRHb29nbGVBZGFwdGVyKHsgcHJvdmlkZXI6ICdnb29nbGUnLCBjbGllbnQ6IGdlbkFJIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHb29nbGVBZGFwdGVyKGNvbmZpZzogQWRhcHRlckNvbmZpZyk6IExsbUNsaWVudCB7XG4gIGlmICghY29uZmlnLmNsaWVudCAmJiAhY29uZmlnLmFwaUtleSkge1xuICAgIHRocm93IG5ldyBBZGFwdGVyQ29uZmlnRXJyb3IoXG4gICAgICAnZ29vZ2xlJyxcbiAgICAgICdHb29nbGUgYWRhcHRlciByZXF1aXJlcyBlaXRoZXIgYSBjbGllbnQgaW5zdGFuY2Ugb3IgYXBpS2V5LiAnICtcbiAgICAgICdJbnN0YWxsIEBnb29nbGUvZ2VuZXJhdGl2ZS1haTogbnBtIGluc3RhbGwgQGdvb2dsZS9nZW5lcmF0aXZlLWFpJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBjbGllbnQgPSBjb25maWcuY2xpZW50IGFzIEdvb2dsZUNsaWVudDtcbiAgY29uc3QgZGVmYXVsdE1vZGVsID0gY29uZmlnLmRlZmF1bHRNb2RlbCA/PyAnZ2VtaW5pLTEuNS1mbGFzaCc7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcjogJ2dvb2dsZScsXG4gICAgcHJvdmlkZXJOYW1lOiAnR29vZ2xlIEFJJyxcblxuICAgIGFzeW5jIGdlbmVyYXRlKHJlcXVlc3Q6IExsbVJlcXVlc3QpOiBQcm9taXNlPExsbVJlc3BvbnNlPiB7XG4gICAgICBpZiAoIWNsaWVudCkge1xuICAgICAgICB0aHJvdyBuZXcgQWRhcHRlckNvbmZpZ0Vycm9yKCdnb29nbGUnLCAnQ2xpZW50IG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtb2RlbE5hbWUgPSByZXF1ZXN0Lm1vZGVsIHx8IGRlZmF1bHRNb2RlbDtcbiAgICAgIGNvbnN0IG1vZGVsID0gY2xpZW50LmdldEdlbmVyYXRpdmVNb2RlbCh7IG1vZGVsOiBtb2RlbE5hbWUgfSk7XG5cbiAgICAgIC8vIEJ1aWxkIHByb21wdCB3aXRoIHN5c3RlbSBpbnN0cnVjdGlvbiBpZiBwcm92aWRlZFxuICAgICAgbGV0IHByb21wdDogc3RyaW5nO1xuICAgICAgaWYgKHJlcXVlc3Quc3lzdGVtKSB7XG4gICAgICAgIHByb21wdCA9IGAke3JlcXVlc3Quc3lzdGVtfVxcblxcbiR7cmVxdWVzdC5wcm9tcHR9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb21wdCA9IHJlcXVlc3QucHJvbXB0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbC5nZW5lcmF0ZUNvbnRlbnQocHJvbXB0KTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnJlc3BvbnNlO1xuICAgICAgY29uc3QgdGV4dCA9IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIFxuICAgICAgY29uc3QgdG9rZW5zID0gcmVzcG9uc2UudXNhZ2VNZXRhZGF0YT8uY2FuZGlkYXRlc1Rva2VuQ291bnQgPz8gZXN0aW1hdGVUb2tlbnModGV4dCk7XG4gICAgICBjb25zdCB0b3RhbFRva2VucyA9IHJlc3BvbnNlLnVzYWdlTWV0YWRhdGE/LnRvdGFsVG9rZW5Db3VudDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dCxcbiAgICAgICAgdG9rZW5zLFxuICAgICAgICB0b3RhbFRva2VucyxcbiAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgZmluaXNoUmVhc29uOiAnc3RvcCcsXG4gICAgICAgIHJhdzogcmVzdWx0XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZXN0aW1hdGVUb2tlbnModGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguY2VpbCh0ZXh0LnNwbGl0KC9cXHMrLykubGVuZ3RoICogMS4zKTtcbn1cbiJdfQ==