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.
78 lines • 9.73 kB
JavaScript
;
/**
* DeepSeek Adapter
*
* Adapter for DeepSeek API (OpenAI-compatible)
*
* @module adapters/providers/deepseek
* @author Haiec
* @license MIT
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildDeepSeekAdapter = buildDeepSeekAdapter;
const types_1 = require("../types");
/**
* Builds a DeepSeek adapter.
*
* @param config - Adapter configuration
* @returns LLM client for DeepSeek
*
* @example
* // DeepSeek uses OpenAI SDK with custom base URL
* import OpenAI from 'openai';
* const deepseek = new OpenAI({
* apiKey: process.env.DEEPSEEK_API_KEY,
* baseURL: 'https://api.deepseek.com/v1'
* });
* const llm = buildDeepSeekAdapter({ provider: 'deepseek', client: deepseek });
*/
function buildDeepSeekAdapter(config) {
if (!config.client && !config.apiKey) {
throw new types_1.AdapterConfigError('deepseek', 'DeepSeek adapter requires either a client instance or apiKey. ' +
'Use OpenAI SDK with baseURL: https://api.deepseek.com/v1');
}
const client = config.client;
const defaultModel = config.defaultModel ?? 'deepseek-chat';
return {
provider: 'deepseek',
providerName: 'DeepSeek',
async generate(request) {
if (!client) {
throw new types_1.AdapterConfigError('deepseek', 'Client not initialized');
}
const model = request.model || defaultModel;
const messages = [];
if (request.system) {
messages.push({ role: 'system', content: request.system });
}
messages.push({ role: 'user', content: request.prompt });
const response = await client.chat.completions.create({
model,
messages,
temperature: request.temperature,
max_tokens: request.maxTokens,
stop: request.stop
});
const choice = response.choices[0];
const text = choice?.message?.content?.toString() ?? '';
const tokens = response.usage?.completion_tokens ?? estimateTokens(text);
return {
text,
tokens,
totalTokens: response.usage?.total_tokens,
model: response.model ?? model,
finishReason: normalizeFinishReason(choice?.finish_reason),
raw: response
};
}
};
}
function estimateTokens(text) {
return Math.ceil(text.split(/\s+/).length * 1.3);
}
function normalizeFinishReason(reason) {
if (!reason)
return undefined;
return reason === 'stop' ? 'stop' : reason === 'length' ? 'length' : reason;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcHNlZWsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvcHJvdmlkZXJzL2RlZXBzZWVrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7R0FRRzs7QUE4Q0gsb0RBbURDO0FBL0ZELG9DQUFpRztBQTZCakc7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxNQUFxQjtJQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksMEJBQWtCLENBQzFCLFVBQVUsRUFDVixnRUFBZ0U7WUFDaEUsMERBQTBELENBQzNELENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQXdCLENBQUM7SUFDL0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSxlQUFlLENBQUM7SUFFNUQsT0FBTztRQUNMLFFBQVEsRUFBRSxVQUFVO1FBQ3BCLFlBQVksRUFBRSxVQUFVO1FBRXhCLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBbUI7WUFDaEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE1BQU0sSUFBSSwwQkFBa0IsQ0FBQyxVQUFVLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUM7WUFFNUMsTUFBTSxRQUFRLEdBQTZDLEVBQUUsQ0FBQztZQUM5RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkIsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzdELENBQUM7WUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFekQsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7Z0JBQ3BELEtBQUs7Z0JBQ0wsUUFBUTtnQkFDUixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7Z0JBQ2hDLFVBQVUsRUFBRSxPQUFPLENBQUMsU0FBUztnQkFDN0IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO2FBQ25CLENBQUMsQ0FBQztZQUVILE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ3hELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXpFLE9BQU87Z0JBQ0wsSUFBSTtnQkFDSixNQUFNO2dCQUNOLFdBQVcsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLFlBQVk7Z0JBQ3pDLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxJQUFJLEtBQUs7Z0JBQzlCLFlBQVksRUFBRSxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDO2dCQUMxRCxHQUFHLEVBQUUsUUFBUTthQUNkLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxJQUFZO0lBQ2xDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxNQUFlO0lBQzVDLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUIsT0FBTyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlZXBTZWVrIEFkYXB0ZXJcbiAqIFxuICogQWRhcHRlciBmb3IgRGVlcFNlZWsgQVBJIChPcGVuQUktY29tcGF0aWJsZSlcbiAqIFxuICogQG1vZHVsZSBhZGFwdGVycy9wcm92aWRlcnMvZGVlcHNlZWtcbiAqIEBhdXRob3IgSGFpZWNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IExsbUNsaWVudCwgTGxtUmVxdWVzdCwgTGxtUmVzcG9uc2UsIEFkYXB0ZXJDb25maWcsIEFkYXB0ZXJDb25maWdFcnJvciB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBEZWVwU2VlayB1c2VzIE9wZW5BSS1jb21wYXRpYmxlIEFQSS5cbiAqL1xuaW50ZXJmYWNlIERlZXBTZWVrQ2xpZW50IHtcbiAgY2hhdDoge1xuICAgIGNvbXBsZXRpb25zOiB7XG4gICAgICBjcmVhdGUocGFyYW1zOiB7XG4gICAgICAgIG1vZGVsOiBzdHJpbmc7XG4gICAgICAgIG1lc3NhZ2VzOiBBcnJheTx7IHJvbGU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0+O1xuICAgICAgICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcbiAgICAgICAgbWF4X3Rva2Vucz86IG51bWJlcjtcbiAgICAgICAgc3RvcD86IHN0cmluZ1tdO1xuICAgICAgfSk6IFByb21pc2U8e1xuICAgICAgICBjaG9pY2VzOiBBcnJheTx7XG4gICAgICAgICAgbWVzc2FnZT86IHsgY29udGVudD86IHN0cmluZyB8IG51bGwgfTtcbiAgICAgICAgICBmaW5pc2hfcmVhc29uPzogc3RyaW5nO1xuICAgICAgICB9PjtcbiAgICAgICAgdXNhZ2U/OiB7XG4gICAgICAgICAgY29tcGxldGlvbl90b2tlbnM/OiBudW1iZXI7XG4gICAgICAgICAgdG90YWxfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgICBtb2RlbD86IHN0cmluZztcbiAgICAgIH0+O1xuICAgIH07XG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRGVlcFNlZWsgYWRhcHRlci5cbiAqIFxuICogQHBhcmFtIGNvbmZpZyAtIEFkYXB0ZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgTExNIGNsaWVudCBmb3IgRGVlcFNlZWtcbiAqIFxuICogQGV4YW1wbGVcbiAqIC8vIERlZXBTZWVrIHVzZXMgT3BlbkFJIFNESyB3aXRoIGN1c3RvbSBiYXNlIFVSTFxuICogaW1wb3J0IE9wZW5BSSBmcm9tICdvcGVuYWknO1xuICogY29uc3QgZGVlcHNlZWsgPSBuZXcgT3BlbkFJKHsgXG4gKiAgIGFwaUtleTogcHJvY2Vzcy5lbnYuREVFUFNFRUtfQVBJX0tFWSxcbiAqICAgYmFzZVVSTDogJ2h0dHBzOi8vYXBpLmRlZXBzZWVrLmNvbS92MSdcbiAqIH0pO1xuICogY29uc3QgbGxtID0gYnVpbGREZWVwU2Vla0FkYXB0ZXIoeyBwcm92aWRlcjogJ2RlZXBzZWVrJywgY2xpZW50OiBkZWVwc2VlayB9KTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGVlcFNlZWtBZGFwdGVyKGNvbmZpZzogQWRhcHRlckNvbmZpZyk6IExsbUNsaWVudCB7XG4gIGlmICghY29uZmlnLmNsaWVudCAmJiAhY29uZmlnLmFwaUtleSkge1xuICAgIHRocm93IG5ldyBBZGFwdGVyQ29uZmlnRXJyb3IoXG4gICAgICAnZGVlcHNlZWsnLFxuICAgICAgJ0RlZXBTZWVrIGFkYXB0ZXIgcmVxdWlyZXMgZWl0aGVyIGEgY2xpZW50IGluc3RhbmNlIG9yIGFwaUtleS4gJyArXG4gICAgICAnVXNlIE9wZW5BSSBTREsgd2l0aCBiYXNlVVJMOiBodHRwczovL2FwaS5kZWVwc2Vlay5jb20vdjEnXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGNsaWVudCA9IGNvbmZpZy5jbGllbnQgYXMgRGVlcFNlZWtDbGllbnQ7XG4gIGNvbnN0IGRlZmF1bHRNb2RlbCA9IGNvbmZpZy5kZWZhdWx0TW9kZWwgPz8gJ2RlZXBzZWVrLWNoYXQnO1xuXG4gIHJldHVybiB7XG4gICAgcHJvdmlkZXI6ICdkZWVwc2VlaycsXG4gICAgcHJvdmlkZXJOYW1lOiAnRGVlcFNlZWsnLFxuXG4gICAgYXN5bmMgZ2VuZXJhdGUocmVxdWVzdDogTGxtUmVxdWVzdCk6IFByb21pc2U8TGxtUmVzcG9uc2U+IHtcbiAgICAgIGlmICghY2xpZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBBZGFwdGVyQ29uZmlnRXJyb3IoJ2RlZXBzZWVrJywgJ0NsaWVudCBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9kZWwgPSByZXF1ZXN0Lm1vZGVsIHx8IGRlZmF1bHRNb2RlbDtcbiAgICAgIFxuICAgICAgY29uc3QgbWVzc2FnZXM6IEFycmF5PHsgcm9sZTogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfT4gPSBbXTtcbiAgICAgIGlmIChyZXF1ZXN0LnN5c3RlbSkge1xuICAgICAgICBtZXNzYWdlcy5wdXNoKHsgcm9sZTogJ3N5c3RlbScsIGNvbnRlbnQ6IHJlcXVlc3Quc3lzdGVtIH0pO1xuICAgICAgfVxuICAgICAgbWVzc2FnZXMucHVzaCh7IHJvbGU6ICd1c2VyJywgY29udGVudDogcmVxdWVzdC5wcm9tcHQgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmNoYXQuY29tcGxldGlvbnMuY3JlYXRlKHtcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIG1lc3NhZ2VzLFxuICAgICAgICB0ZW1wZXJhdHVyZTogcmVxdWVzdC50ZW1wZXJhdHVyZSxcbiAgICAgICAgbWF4X3Rva2VuczogcmVxdWVzdC5tYXhUb2tlbnMsXG4gICAgICAgIHN0b3A6IHJlcXVlc3Quc3RvcFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNob2ljZSA9IHJlc3BvbnNlLmNob2ljZXNbMF07XG4gICAgICBjb25zdCB0ZXh0ID0gY2hvaWNlPy5tZXNzYWdlPy5jb250ZW50Py50b1N0cmluZygpID8/ICcnO1xuICAgICAgY29uc3QgdG9rZW5zID0gcmVzcG9uc2UudXNhZ2U/LmNvbXBsZXRpb25fdG9rZW5zID8/IGVzdGltYXRlVG9rZW5zKHRleHQpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0LFxuICAgICAgICB0b2tlbnMsXG4gICAgICAgIHRvdGFsVG9rZW5zOiByZXNwb25zZS51c2FnZT8udG90YWxfdG9rZW5zLFxuICAgICAgICBtb2RlbDogcmVzcG9uc2UubW9kZWwgPz8gbW9kZWwsXG4gICAgICAgIGZpbmlzaFJlYXNvbjogbm9ybWFsaXplRmluaXNoUmVhc29uKGNob2ljZT8uZmluaXNoX3JlYXNvbiksXG4gICAgICAgIHJhdzogcmVzcG9uc2VcbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBlc3RpbWF0ZVRva2Vucyh0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5jZWlsKHRleHQuc3BsaXQoL1xccysvKS5sZW5ndGggKiAxLjMpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVGaW5pc2hSZWFzb24ocmVhc29uPzogc3RyaW5nKTogTGxtUmVzcG9uc2VbJ2ZpbmlzaFJlYXNvbiddIHtcbiAgaWYgKCFyZWFzb24pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiByZWFzb24gPT09ICdzdG9wJyA/ICdzdG9wJyA6IHJlYXNvbiA9PT0gJ2xlbmd0aCcgPyAnbGVuZ3RoJyA6IHJlYXNvbjtcbn1cbiJdfQ==