@kdump/code-cli-any-llm
Version:
> A unified gateway for the Gemini, opencode, crush, and Qwen Code AI CLIs
245 lines • 14 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var ConfigModule_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConfigModule = void 0;
const common_1 = require("@nestjs/common");
const config_1 = require("@nestjs/config");
const os_1 = __importDefault(require("os"));
const path_1 = __importDefault(require("path"));
const global_config_service_1 = require("./global-config.service");
const DEFAULT_GATEWAY_LOG_DIR = path_1.default.join(os_1.default.homedir(), '.code-cli-any-llm', 'logs');
const resolveLogDir = (value) => {
if (!value || !value.trim()) {
return DEFAULT_GATEWAY_LOG_DIR;
}
const trimmed = value.trim();
if (trimmed === '~') {
return os_1.default.homedir();
}
if (trimmed.startsWith('~/') || trimmed.startsWith('~\\')) {
const relative = trimmed.slice(2);
return path_1.default.join(os_1.default.homedir(), relative);
}
if (trimmed.startsWith('~')) {
const relative = trimmed.slice(1).replace(/^[\\/]/, '');
return path_1.default.join(os_1.default.homedir(), relative);
}
return path_1.default.isAbsolute(trimmed) ? trimmed : path_1.default.resolve(trimmed);
};
const normalizeBoolean = (value, defaultValue = true) => {
if (value === undefined) {
return defaultValue;
}
const normalized = value.trim().toLowerCase();
if (!normalized) {
return defaultValue;
}
if (['false', '0', 'no', 'off'].includes(normalized)) {
return false;
}
if (['true', '1', 'yes', 'on'].includes(normalized)) {
return true;
}
return defaultValue;
};
const parseBetaEnv = (value) => {
if (!value) {
return undefined;
}
const normalized = value.trim();
if (!normalized) {
return undefined;
}
return normalized
.split(',')
.map((item) => item.trim())
.filter((item) => item.length > 0);
};
let ConfigModule = ConfigModule_1 = class ConfigModule {
static forRoot() {
return {
module: ConfigModule_1,
imports: [
config_1.ConfigModule.forRoot({
isGlobal: true,
load: [
() => {
const globalConfigService = new global_config_service_1.GlobalConfigService();
const globalConfigResult = globalConfigService.loadGlobalConfig();
if (globalConfigResult.isValid && globalConfigResult.config) {
const config = globalConfigResult.config;
return {
openai: {
apiKey: config.openai.apiKey,
baseURL: config.openai.baseURL,
model: config.openai.model,
timeout: config.openai.timeout,
extraBody: config.openai.extraBody,
},
codex: config.codex
? {
apiKey: config.codex.apiKey,
baseURL: config.codex.baseURL,
model: config.codex.model,
timeout: config.codex.timeout,
reasoning: config.codex.reasoning,
textVerbosity: config.codex.textVerbosity,
authMode: config.codex.authMode || 'ApiKey',
}
: undefined,
claudeCode: config.claudeCode
? {
apiKey: config.claudeCode.apiKey,
baseURL: config.claudeCode.baseURL,
model: config.claudeCode.model,
timeout: config.claudeCode.timeout,
anthropicVersion: config.claudeCode.anthropicVersion,
beta: config.claudeCode.beta,
userAgent: config.claudeCode.userAgent,
xApp: config.claudeCode.xApp,
dangerousDirectBrowserAccess: config.claudeCode.dangerousDirectBrowserAccess,
maxOutputTokens: config.claudeCode.maxOutputTokens,
extraHeaders: config.claudeCode.extraHeaders,
}
: undefined,
gateway: {
port: config.gateway.port,
host: config.gateway.host,
logLevel: config.gateway.logLevel,
logDir: resolveLogDir(config.gateway.logDir),
requestTimeout: config.gateway.requestTimeout ?? 3600000,
apiMode: config.gateway.apiMode ?? 'gemini',
cliMode: config.gateway.cliMode ?? 'gemini',
apiKey: config.gateway.apiKey,
},
aiProvider: config.aiProvider,
};
}
return {
openai: {
apiKey: process.env.CAL_OPENAI_API_KEY,
baseURL: process.env.CAL_OPENAI_BASE_URL ||
'https://api.openai.com/v1',
model: process.env.CAL_OPENAI_MODEL || 'gpt-3.5-turbo',
organization: process.env.CAL_OPENAI_ORGANIZATION,
timeout: Number(process.env.CAL_OPENAI_TIMEOUT) || 1800000,
extraBody: undefined,
},
codex: (() => {
const authModeRaw = (process.env.CAL_CODEX_AUTH_MODE || 'ApiKey')
.trim()
.toLowerCase();
const authMode = authModeRaw === 'chatgpt' ? 'ChatGPT' : 'ApiKey';
const hasApiKey = !!(process.env.CAL_CODEX_API_KEY || '').trim();
if (!hasApiKey && authMode !== 'ChatGPT') {
return undefined;
}
return {
apiKey: hasApiKey
? process.env.CAL_CODEX_API_KEY
: undefined,
baseURL: process.env.CAL_CODEX_BASE_URL ||
'https://chatgpt.com/backend-api/codex',
model: process.env.CAL_CODEX_MODEL || 'gpt-5-codex',
timeout: Number(process.env.CAL_CODEX_TIMEOUT) || 1800000,
reasoning: (() => {
const raw = process.env.CAL_CODEX_REASONING;
if (!raw)
return undefined;
try {
return JSON.parse(raw);
}
catch {
return undefined;
}
})(),
textVerbosity: (() => {
const raw = (process.env.CAL_CODEX_TEXT_VERBOSITY || '').toLowerCase();
return ['low', 'medium', 'high'].includes(raw)
? raw
: undefined;
})(),
authMode,
};
})(),
claudeCode: (() => {
const apiKey = process.env.CAL_CLAUDE_CODE_API_KEY ||
process.env.CAL_ANTHROPIC_API_KEY ||
'';
if (!apiKey.trim()) {
return undefined;
}
return {
apiKey: apiKey.trim(),
baseURL: process.env.CAL_CLAUDE_CODE_BASE_URL ||
'https://open.bigmodel.cn/api/anthropic',
model: process.env.CAL_CLAUDE_CODE_MODEL ||
'claude-sonnet-4-5-20250929',
timeout: Number(process.env.CAL_CLAUDE_CODE_TIMEOUT) || 1800000,
anthropicVersion: process.env.CAL_CLAUDE_CODE_VERSION || '2023-06-01',
beta: parseBetaEnv(process.env.CAL_CLAUDE_CODE_BETA),
userAgent: process.env.CAL_CLAUDE_CODE_USER_AGENT ||
'claude-cli/1.0.119 (external, cli)',
xApp: process.env.CAL_CLAUDE_CODE_X_APP || 'cli',
dangerousDirectBrowserAccess: normalizeBoolean(process.env.CAL_CLAUDE_CODE_DANGEROUS_DIRECT, true),
maxOutputTokens: process.env.CAL_CLAUDE_CODE_MAX_OUTPUT
? Number(process.env.CAL_CLAUDE_CODE_MAX_OUTPUT)
: undefined,
extraHeaders: undefined,
};
})(),
gateway: {
port: Number(process.env.CAL_PORT) || 23062,
host: process.env.CAL_HOST || '0.0.0.0',
logLevel: process.env.CAL_LOG_LEVEL || 'info',
logDir: resolveLogDir(process.env.CAL_GATEWAY_LOG_DIR),
requestTimeout: Number(process.env.CAL_REQUEST_TIMEOUT) || 3600000,
apiMode: (process.env.CAL_GATEWAY_API_MODE || 'gemini')
.toString()
.trim()
.toLowerCase() === 'openai'
? 'openai'
: 'gemini',
cliMode: (() => {
const raw = (process.env.CAL_GATEWAY_CLI_MODE || 'gemini')
.toString()
.trim()
.toLowerCase();
if (raw === 'opencode') {
return 'opencode';
}
if (raw === 'crush') {
return 'crush';
}
if (raw === 'qwencode') {
return 'qwencode';
}
return 'gemini';
})(),
apiKey: process.env.CAL_GATEWAY_API_KEY,
},
aiProvider: (process.env.CAL_AI_PROVIDER || 'openai').toLowerCase(),
};
},
],
}),
],
exports: [config_1.ConfigModule],
global: true,
};
}
};
exports.ConfigModule = ConfigModule;
exports.ConfigModule = ConfigModule = ConfigModule_1 = __decorate([
(0, common_1.Module)({})
], ConfigModule);
//# sourceMappingURL=config.module.js.map
;