UNPKG

buroventures-harald-code-core

Version:

Harald Code Core - Core functionality for AI-powered coding assistant

107 lines 5.17 kB
/** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import { GoogleGenAI, } from '@google/genai'; import { createCodeAssistContentGenerator } from '../code_assist/codeAssist.js'; import { DEFAULT_GEMINI_MODEL } from '../config/models.js'; import { getEffectiveModel } from './modelCheck.js'; export var AuthType; (function (AuthType) { AuthType["LOGIN_WITH_GOOGLE"] = "oauth-personal"; AuthType["USE_GEMINI"] = "gemini-api-key"; AuthType["USE_VERTEX_AI"] = "vertex-ai"; AuthType["CLOUD_SHELL"] = "cloud-shell"; AuthType["USE_OPENAI"] = "openai"; })(AuthType || (AuthType = {})); export function createContentGeneratorConfig(config, authType) { const geminiApiKey = process.env.GEMINI_API_KEY || undefined; const googleApiKey = process.env.GOOGLE_API_KEY || undefined; const googleCloudProject = process.env.GOOGLE_CLOUD_PROJECT || undefined; const googleCloudLocation = process.env.GOOGLE_CLOUD_LOCATION || undefined; const openaiApiKey = process.env.CEREBRAS_API_KEY || process.env.OPENAI_API_KEY; // Use runtime model from config if available; otherwise, fall back to parameter or default const effectiveModel = config.getModel() || DEFAULT_GEMINI_MODEL; const contentGeneratorConfig = { model: effectiveModel, authType, proxy: config?.getProxy(), enableOpenAILogging: config.getEnableOpenAILogging(), timeout: config.getContentGeneratorTimeout(), maxRetries: config.getContentGeneratorMaxRetries(), samplingParams: config.getSamplingParams(), }; // If we are using Google auth or we are in Cloud Shell, there is nothing else to validate for now if (authType === AuthType.LOGIN_WITH_GOOGLE || authType === AuthType.CLOUD_SHELL) { return contentGeneratorConfig; } if (authType === AuthType.USE_GEMINI && geminiApiKey) { contentGeneratorConfig.apiKey = geminiApiKey; contentGeneratorConfig.vertexai = false; getEffectiveModel(contentGeneratorConfig.apiKey, contentGeneratorConfig.model, contentGeneratorConfig.proxy); return contentGeneratorConfig; } if (authType === AuthType.USE_VERTEX_AI && (googleApiKey || (googleCloudProject && googleCloudLocation))) { contentGeneratorConfig.apiKey = googleApiKey; contentGeneratorConfig.vertexai = true; return contentGeneratorConfig; } if (authType === AuthType.USE_OPENAI && openaiApiKey) { contentGeneratorConfig.apiKey = openaiApiKey; contentGeneratorConfig.model = process.env.CEREBRAS_MODEL || process.env.OPENAI_MODEL || DEFAULT_GEMINI_MODEL; return contentGeneratorConfig; } return contentGeneratorConfig; } export async function createContentGenerator(config, gcConfig, sessionId, settings) { const version = process.env.CLI_VERSION || process.version; const httpOptions = { headers: { 'User-Agent': `GeminiCLI/${version} (${process.platform}; ${process.arch})`, }, }; if (config.authType === AuthType.LOGIN_WITH_GOOGLE || config.authType === AuthType.CLOUD_SHELL) { return createCodeAssistContentGenerator(httpOptions, config.authType, gcConfig, sessionId); } if (config.authType === AuthType.USE_GEMINI || config.authType === AuthType.USE_VERTEX_AI) { const googleGenAI = new GoogleGenAI({ apiKey: config.apiKey === '' ? undefined : config.apiKey, vertexai: config.vertexai, httpOptions, }); return googleGenAI.models; } if (config.authType === AuthType.USE_OPENAI) { if (!config.apiKey) { throw new Error('Cerebras API key is required (set CEREBRAS_API_KEY or OPENAI_API_KEY)'); } // Import OpenAIContentGenerator dynamically to avoid circular dependencies const { OpenAIContentGenerator } = await import('./openaiContentGenerator.js'); // Create API key rotation manager if multiple keys are configured let rotationManager; if (settings?.apiKeyRotation?.apiKeys && settings.apiKeyRotation.apiKeys.length > 0) { const { ApiKeyRotationManager } = await import('./apiKeyRotationManager.js'); rotationManager = new ApiKeyRotationManager({ settings: settings.apiKeyRotation, onSettingsUpdate: async (newSettings) => { // Update settings when rotation manager changes state if (settings) { settings.apiKeyRotation = newSettings; console.log('API key rotation settings updated'); } } }, config.apiKey // Use the original API key as fallback ); } // Always use OpenAIContentGenerator, logging is controlled by enableOpenAILogging flag return new OpenAIContentGenerator(config.apiKey, config.model, gcConfig, rotationManager); } throw new Error(`Error creating contentGenerator: Unsupported authType: ${config.authType}`); } //# sourceMappingURL=contentGenerator.js.map