byok-llm 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +242 -0
- package/dist/index.cjs +879 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +279 -0
- package/dist/index.d.ts +279 -0
- package/dist/index.js +848 -0
- package/dist/index.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/anthropic.ts","../src/providers/openai.ts","../src/providers/openrouter.ts","../src/providers/google.ts","../src/providers/groq.ts","../src/providers/xai.ts","../src/providers/mistral.ts","../src/providers/deepseek.ts","../src/providers/registry.ts","../src/index.ts","../src/config/resolver.ts","../src/config/loader.ts","../src/storage/file.ts","../src/config/helpers.ts","../src/validation/validator.ts","../src/storage/env.ts","../src/ui/setup-wizard.ts","../src/ui/status.ts"],"names":["DEFAULT_FALLBACK_ORDER","join","homedir","readFileSync","existsSync","dirname","mkdirSync","writeFileSync","chmodSync","listProviders","createInterface","maskKey"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ProviderDefinition } from \"../types.js\";\n\nexport const anthropic: ProviderDefinition = {\n id: \"anthropic\",\n name: \"Anthropic\",\n envKeys: [\"ANTHROPIC_API_KEY\"],\n keyPrefix: \"sk-ant-\",\n baseUrl: \"https://api.anthropic.com\",\n docsUrl: \"https://console.anthropic.com/settings/keys\",\n authStyle: \"x-api-key\",\n authHeader: \"x-api-key\",\n defaultHeaders: {\n \"anthropic-version\": \"2023-06-01\",\n },\n validateEndpoint: \"/v1/models\",\n openaiCompatible: false,\n};\n","import type { ProviderDefinition } from \"../types.js\";\n\nexport const openai: ProviderDefinition = {\n id: \"openai\",\n name: \"OpenAI\",\n envKeys: [\"OPENAI_API_KEY\"],\n keyPrefix: \"sk-\",\n baseUrl: \"https://api.openai.com\",\n docsUrl: \"https://platform.openai.com/api-keys\",\n authStyle: \"bearer\",\n validateEndpoint: \"/v1/models\",\n openaiCompatible: true,\n};\n","import type { ProviderDefinition } from \"../types.js\";\n\nexport const openrouter: ProviderDefinition = {\n id: \"openrouter\",\n name: \"OpenRouter\",\n envKeys: [\"OPENROUTER_API_KEY\"],\n keyPrefix: \"sk-or-\",\n baseUrl: \"https://openrouter.ai/api\",\n docsUrl: \"https://openrouter.ai/keys\",\n authStyle: \"bearer\",\n validateEndpoint: \"/v1/auth/key\",\n openaiCompatible: true,\n};\n","import type { ProviderDefinition } from \"../types.js\";\n\nexport const google: ProviderDefinition = {\n id: \"google\",\n name: \"Google Gemini\",\n envKeys: [\"GEMINI_API_KEY\", \"GOOGLE_API_KEY\"],\n baseUrl: \"https://generativelanguage.googleapis.com\",\n docsUrl: \"https://aistudio.google.com/app/apikey\",\n authStyle: \"query-param\",\n validateEndpoint: \"/v1beta/models\",\n openaiCompatible: false,\n};\n","import type { ProviderDefinition } from \"../types.js\";\n\nexport const groq: ProviderDefinition = {\n id: \"groq\",\n name: \"Groq\",\n envKeys: [\"GROQ_API_KEY\"],\n keyPrefix: \"gsk_\",\n baseUrl: \"https://api.groq.com/openai\",\n docsUrl: \"https://console.groq.com/keys\",\n authStyle: \"bearer\",\n validateEndpoint: \"/v1/models\",\n openaiCompatible: true,\n};\n","import type { ProviderDefinition } from \"../types.js\";\n\nexport const xai: ProviderDefinition = {\n id: \"xai\",\n name: \"xAI (Grok)\",\n envKeys: [\"XAI_API_KEY\"],\n keyPrefix: \"xai-\",\n baseUrl: \"https://api.x.ai\",\n docsUrl: \"https://console.x.ai/\",\n authStyle: \"bearer\",\n validateEndpoint: \"/v1/models\",\n openaiCompatible: true,\n};\n","import type { ProviderDefinition } from \"../types.js\";\n\nexport const mistral: ProviderDefinition = {\n id: \"mistral\",\n name: \"Mistral AI\",\n envKeys: [\"MISTRAL_API_KEY\"],\n baseUrl: \"https://api.mistral.ai\",\n docsUrl: \"https://console.mistral.ai/api-keys\",\n authStyle: \"bearer\",\n validateEndpoint: \"/v1/models\",\n openaiCompatible: true,\n};\n","import type { ProviderDefinition } from \"../types.js\";\n\nexport const deepseek: ProviderDefinition = {\n id: \"deepseek\",\n name: \"DeepSeek\",\n envKeys: [\"DEEPSEEK_API_KEY\"],\n keyPrefix: \"sk-\",\n baseUrl: \"https://api.deepseek.com\",\n docsUrl: \"https://platform.deepseek.com/api_keys\",\n authStyle: \"bearer\",\n validateEndpoint: \"/models\",\n openaiCompatible: true,\n};\n","// ============================================================\n// byok-ai — Provider Registry\n// ============================================================\n\nimport type { ProviderDefinition, ProviderId } from \"../types.js\";\nimport { anthropic } from \"./anthropic.js\";\nimport { openai } from \"./openai.js\";\nimport { openrouter } from \"./openrouter.js\";\nimport { google } from \"./google.js\";\nimport { groq } from \"./groq.js\";\nimport { xai } from \"./xai.js\";\nimport { mistral } from \"./mistral.js\";\nimport { deepseek } from \"./deepseek.js\";\n\n/** Internal registry map */\nconst registry = new Map<string, ProviderDefinition>();\n\n/** Register all built-in providers */\nfunction registerBuiltins(): void {\n for (const provider of [anthropic, openai, openrouter, google, groq, xai, mistral, deepseek]) {\n registry.set(provider.id, provider);\n }\n}\n\n// Auto-register on import\nregisterBuiltins();\n\n/**\n * Register a custom provider (or override a built-in one).\n */\nexport function registerProvider(definition: ProviderDefinition): void {\n registry.set(definition.id, definition);\n}\n\n/**\n * Get a provider definition by ID.\n */\nexport function getProvider(id: ProviderId): ProviderDefinition | undefined {\n return registry.get(id);\n}\n\n/**\n * List all registered providers.\n */\nexport function listProviders(): ProviderDefinition[] {\n return Array.from(registry.values());\n}\n\n/**\n * Check if a provider is registered.\n */\nexport function hasProvider(id: ProviderId): boolean {\n return registry.has(id);\n}\n\n/**\n * Default fallback order (most common providers first).\n */\nexport const DEFAULT_FALLBACK_ORDER: ProviderId[] = [\n \"anthropic\",\n \"openai\",\n \"openrouter\",\n \"google\",\n \"groq\",\n \"xai\",\n \"mistral\",\n \"deepseek\",\n];\n","// ============================================================\n// byok-ai — Bring Your Own Key for AI-Powered Apps\n// ============================================================\n//\n// A lightweight, zero-dependency module for managing API keys\n// across multiple AI providers. Built for CLI tools and agentic apps.\n//\n// Usage:\n// import { resolveKey, setupWizard } from 'byok-ai';\n//\n// // First run: walk the user through key setup\n// await setupWizard({ providers: ['anthropic', 'openrouter'], appName: 'my-app' });\n//\n// // Every run: resolve keys automatically\n// const key = await resolveKey('anthropic');\n//\n// ============================================================\n\n// --- Types ---\nexport type {\n BuiltinProviderId,\n ProviderId,\n AuthStyle,\n ProviderDefinition,\n KeySource,\n ResolvedKey,\n ValidationResult,\n ResolvedProvider,\n ProviderConfig,\n ByokConfig,\n ProviderStatus,\n StatusReport,\n WizardOptions,\n OpenAICompatibleConfig,\n ByokOptions,\n} from \"./types.js\";\n\n// --- Provider Registry ---\nexport {\n registerProvider,\n getProvider,\n listProviders,\n hasProvider,\n DEFAULT_FALLBACK_ORDER,\n} from \"./providers/registry.js\";\n\n// --- Config Resolution ---\nexport {\n initConfig,\n resolveKey,\n resolveWithFallback,\n getConfiguredProviders,\n getConfig,\n} from \"./config/resolver.js\";\n\n// --- Config Helpers ---\nexport {\n getProviderHeaders,\n getProviderBaseUrl,\n getOpenAICompatibleConfig,\n} from \"./config/helpers.js\";\n\n// --- Config Loader ---\nexport { getUserConfigPath, getKeysStorePath } from \"./config/loader.js\";\n\n// --- Key Validation ---\nexport { validateKey, validateKeyFormat, validateAllKeys } from \"./validation/validator.js\";\n\n// --- Key Storage ---\nexport { storeKey, getKey, removeKey, listStoredKeys, clearAllKeys } from \"./storage/file.js\";\n\n// --- Environment Helpers ---\nexport { hasEnvKey, getEnvKey, getEnvVarName, generateEnvTemplate } from \"./storage/env.js\";\n\n// --- UI ---\nexport { setupWizard } from \"./ui/setup-wizard.js\";\nexport { getStatus, printStatus } from \"./ui/status.js\";\n\n// --- Convenience: Quick setup for common patterns ---\n\nimport type { ByokOptions, ProviderId, ResolvedProvider } from \"./types.js\";\nimport { initConfig, resolveWithFallback } from \"./config/resolver.js\";\nimport { setupWizard } from \"./ui/setup-wizard.js\";\n\n/**\n * All-in-one initialization: loads config, checks for keys,\n * and optionally runs the setup wizard if no keys are found.\n *\n * @example\n * ```typescript\n * import { init } from 'byok-ai';\n *\n * const provider = await init({\n * providers: ['anthropic', 'openai', 'openrouter'],\n * appName: 'my-cli-tool',\n * });\n *\n * // provider.key, provider.baseUrl, provider.headers are ready to use\n * ```\n */\nexport async function init(\n options: ByokOptions & {\n /** Providers to check (in fallback order) */\n providers?: ProviderId[];\n /** App name for wizard prompts */\n appName?: string;\n /** Run wizard if no keys found (default: true) */\n interactive?: boolean;\n } = {},\n): Promise<ResolvedProvider | null> {\n const { providers, appName, interactive = true, ...byokOptions } = options;\n\n // Load config\n initConfig(byokOptions);\n\n // Try to resolve a provider\n let resolved = await resolveWithFallback(providers);\n\n // If no provider found and interactive mode, run wizard\n if (!resolved && interactive && process.stdin.isTTY) {\n await setupWizard({\n providers,\n appName,\n });\n\n // Try again after wizard\n resolved = await resolveWithFallback(providers);\n }\n\n return resolved;\n}\n","// ============================================================\n// byok-ai — Key Resolution Engine\n// ============================================================\n\nimport type {\n ByokConfig,\n ByokOptions,\n ProviderId,\n ResolvedKey,\n ResolvedProvider,\n ProviderConfig,\n} from \"../types.js\";\nimport { getProvider, listProviders, DEFAULT_FALLBACK_ORDER } from \"../providers/registry.js\";\nimport { loadConfig } from \"./loader.js\";\nimport { getKey } from \"../storage/file.js\";\nimport { buildAuthHeaders, getEffectiveBaseUrl } from \"./helpers.js\";\n\n/** Cached merged config */\nlet cachedConfig: ByokConfig | null = null;\nlet cachedOptions: ByokOptions | null = null;\n\n/**\n * Initialize / reset the config cache. Call this if you change options at runtime.\n */\nexport function initConfig(options?: ByokOptions): ByokConfig {\n const { config } = loadConfig(options?.configPath);\n\n // Merge runtime provider overrides\n if (options?.providers) {\n if (!config.providers) config.providers = {};\n for (const [id, providerOpts] of Object.entries(options.providers)) {\n config.providers[id] = { ...config.providers[id], ...providerOpts };\n }\n }\n\n cachedConfig = config;\n cachedOptions = options || null;\n return config;\n}\n\n/**\n * Get the current config (loads if needed).\n */\nexport function getConfig(): ByokConfig {\n if (!cachedConfig) {\n return initConfig(cachedOptions || undefined);\n }\n return cachedConfig;\n}\n\n/**\n * Resolve an API key for a provider, checking all layers.\n *\n * Resolution order:\n * 1. Runtime options (passed via init or resolveKey options)\n * 2. Environment variables\n * 3. Project config file\n * 4. User config file\n * 5. Stored keys (~/.config/byok-ai/keys.json)\n */\nexport async function resolveKey(\n providerId: ProviderId,\n runtimeKey?: string,\n): Promise<ResolvedKey | null> {\n const provider = getProvider(providerId);\n if (!provider) return null;\n\n const config = getConfig();\n const providerConfig: ProviderConfig | undefined = config.providers?.[providerId];\n\n // Check if provider is explicitly disabled\n if (providerConfig?.disabled) return null;\n\n // 1. Runtime key (highest priority)\n if (runtimeKey) {\n return { key: runtimeKey, source: \"runtime\", providerId };\n }\n\n // 2. Runtime config\n if (providerConfig?.apiKey) {\n return {\n key: providerConfig.apiKey,\n source: \"runtime\",\n providerId,\n };\n }\n\n // 3. Environment variables\n for (const envKey of provider.envKeys) {\n const value = process.env[envKey];\n if (value) {\n return { key: value, source: \"env\", providerId, envVar: envKey };\n }\n }\n\n // 4. Stored keys file\n const storedKey = await getKey(providerId);\n if (storedKey) {\n return { key: storedKey, source: \"user-config\", providerId };\n }\n\n return null;\n}\n\n/**\n * Try to resolve a working provider from a list, in order.\n * Returns the first provider that has a configured key.\n */\nexport async function resolveWithFallback(\n providerIds?: ProviderId[],\n): Promise<ResolvedProvider | null> {\n const order = providerIds || getConfig().fallbackOrder || DEFAULT_FALLBACK_ORDER;\n\n for (const id of order) {\n const provider = getProvider(id);\n if (!provider) continue;\n\n const resolved = await resolveKey(id);\n if (!resolved) continue;\n\n const config = getConfig();\n const providerConfig = config.providers?.[id];\n\n return {\n providerId: id,\n key: resolved.key,\n source: resolved.source,\n baseUrl: getEffectiveBaseUrl(id, providerConfig),\n headers: buildAuthHeaders(provider, resolved.key, providerConfig),\n };\n }\n\n return null;\n}\n\n/**\n * Get all providers that currently have keys configured.\n */\nexport async function getConfiguredProviders(): Promise<ResolvedKey[]> {\n const results: ResolvedKey[] = [];\n\n for (const provider of listProviders()) {\n const resolved = await resolveKey(provider.id);\n if (resolved) {\n results.push(resolved);\n }\n }\n\n return results;\n}\n","// ============================================================\n// byok-ai — Config File Loader\n// ============================================================\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { ByokConfig } from \"../types.js\";\n\n/**\n * Resolve the XDG config home directory.\n */\nfunction getConfigHome(): string {\n return process.env.XDG_CONFIG_HOME || join(homedir(), \".config\");\n}\n\n/**\n * Get the user-level config path.\n */\nexport function getUserConfigPath(): string {\n return join(getConfigHome(), \"byok-ai\", \"config.json\");\n}\n\n/**\n * Get the user-level keys storage path.\n */\nexport function getKeysStorePath(): string {\n return join(getConfigHome(), \"byok-ai\", \"keys.json\");\n}\n\n/**\n * Resolve `{env:VAR_NAME}` and `{file:/path}` placeholders in a string.\n */\nexport function resolveValue(value: string): string {\n // {env:VAR_NAME}\n const envMatch = value.match(/^\\{env:([^}]+)\\}$/);\n if (envMatch) {\n return process.env[envMatch[1]] || \"\";\n }\n\n // {file:/path/to/file}\n const fileMatch = value.match(/^\\{file:([^}]+)\\}$/);\n if (fileMatch) {\n const filePath = fileMatch[1].replace(/^~/, homedir());\n try {\n return readFileSync(filePath, \"utf-8\").trim();\n } catch {\n return \"\";\n }\n }\n\n return value;\n}\n\n/**\n * Try to read and parse a JSON config file. Returns null if not found.\n */\nfunction readJsonConfig(filePath: string): ByokConfig | null {\n try {\n if (!existsSync(filePath)) return null;\n const raw = readFileSync(filePath, \"utf-8\");\n const parsed = JSON.parse(raw);\n\n // Resolve {env:...} and {file:...} in apiKey values\n if (parsed.providers) {\n for (const [, config] of Object.entries(parsed.providers)) {\n const providerConf = config as Record<string, unknown>;\n if (typeof providerConf.apiKey === \"string\") {\n providerConf.apiKey = resolveValue(providerConf.apiKey);\n }\n }\n }\n\n return parsed as ByokConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Try to read the `byok` field from package.json in the current directory.\n */\nfunction readPackageJsonConfig(): ByokConfig | null {\n try {\n const pkgPath = join(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) return null;\n const raw = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(raw);\n if (pkg.byok && typeof pkg.byok === \"object\") {\n return pkg.byok as ByokConfig;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Search for project-level config files.\n */\nconst PROJECT_CONFIG_NAMES = [\".byokrc.json\", \".byokrc\", \"byok.config.json\"];\n\nfunction findProjectConfig(): ByokConfig | null {\n for (const name of PROJECT_CONFIG_NAMES) {\n const filePath = join(process.cwd(), name);\n const config = readJsonConfig(filePath);\n if (config) return config;\n }\n return readPackageJsonConfig();\n}\n\n/**\n * Merge two configs. `override` takes priority over `base`.\n */\nfunction mergeConfigs(base: ByokConfig, override: ByokConfig): ByokConfig {\n const merged: ByokConfig = { ...base, ...override };\n\n // Deep merge providers\n if (base.providers || override.providers) {\n merged.providers = { ...base.providers };\n if (override.providers) {\n for (const [id, config] of Object.entries(override.providers)) {\n merged.providers[id] = { ...merged.providers[id], ...config };\n }\n }\n }\n\n return merged;\n}\n\nexport interface LoadedConfig {\n config: ByokConfig;\n sources: string[];\n}\n\n/**\n * Load and merge all config layers.\n * Priority: custom path > project config > user config\n */\nexport function loadConfig(customPath?: string): LoadedConfig {\n let config: ByokConfig = {};\n const sources: string[] = [];\n\n // Layer 1: User config (lowest priority)\n const userConfig = readJsonConfig(getUserConfigPath());\n if (userConfig) {\n config = mergeConfigs(config, userConfig);\n sources.push(\"user-config\");\n }\n\n // Layer 2: Project config\n const projectConfig = findProjectConfig();\n if (projectConfig) {\n config = mergeConfigs(config, projectConfig);\n sources.push(\"project-config\");\n }\n\n // Layer 3: Custom path (highest priority for file-based)\n if (customPath) {\n const customConfig = readJsonConfig(customPath);\n if (customConfig) {\n config = mergeConfigs(config, customConfig);\n sources.push(\"custom-config\");\n }\n }\n\n return { config, sources };\n}\n","// ============================================================\n// byok-ai — Secure File Storage\n// ============================================================\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, chmodSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { getKeysStorePath } from \"../config/loader.js\";\nimport type { ProviderId } from \"../types.js\";\n\ntype KeyStore = Record<string, string>;\n\n/**\n * Read the keys store file.\n */\nfunction readStore(): KeyStore {\n const storePath = getKeysStorePath();\n try {\n if (!existsSync(storePath)) return {};\n const raw = readFileSync(storePath, \"utf-8\");\n return JSON.parse(raw) as KeyStore;\n } catch {\n return {};\n }\n}\n\n/**\n * Write the keys store file with secure permissions (0600).\n */\nfunction writeStore(store: KeyStore): void {\n const storePath = getKeysStorePath();\n const dir = dirname(storePath);\n\n // Ensure directory exists\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n\n writeFileSync(storePath, JSON.stringify(store, null, 2), { mode: 0o600 });\n\n // Ensure permissions (in case file already existed)\n try {\n chmodSync(storePath, 0o600);\n } catch {\n // May fail on some systems, that's ok\n }\n}\n\n/**\n * Store an API key for a provider.\n */\nexport async function storeKey(providerId: ProviderId, key: string): Promise<void> {\n const store = readStore();\n store[providerId] = key;\n writeStore(store);\n}\n\n/**\n * Get a stored API key for a provider.\n */\nexport async function getKey(providerId: ProviderId): Promise<string | null> {\n const store = readStore();\n return store[providerId] || null;\n}\n\n/**\n * Remove a stored API key for a provider.\n */\nexport async function removeKey(providerId: ProviderId): Promise<void> {\n const store = readStore();\n delete store[providerId];\n writeStore(store);\n}\n\n/**\n * List all stored provider IDs.\n */\nexport async function listStoredKeys(): Promise<ProviderId[]> {\n const store = readStore();\n return Object.keys(store);\n}\n\n/**\n * Clear all stored keys.\n */\nexport async function clearAllKeys(): Promise<void> {\n writeStore({});\n}\n","// ============================================================\n// byok-ai — Auth & URL Helpers\n// ============================================================\n\nimport type {\n OpenAICompatibleConfig,\n ProviderConfig,\n ProviderDefinition,\n ProviderId,\n} from \"../types.js\";\nimport { getProvider } from \"../providers/registry.js\";\nimport { resolveKey } from \"./resolver.js\";\nimport { getConfig } from \"./resolver.js\";\n\n/**\n * Build authentication headers for a provider.\n */\nexport function buildAuthHeaders(\n provider: ProviderDefinition,\n key: string,\n providerConfig?: ProviderConfig,\n): Record<string, string> {\n const headers: Record<string, string> = {};\n\n // Auth header\n switch (provider.authStyle) {\n case \"x-api-key\":\n headers[provider.authHeader || \"x-api-key\"] = key;\n break;\n case \"bearer\":\n headers[\"Authorization\"] = `Bearer ${key}`;\n break;\n case \"query-param\":\n // Handled at URL level, not headers\n break;\n }\n\n // Default provider headers (e.g. anthropic-version)\n if (provider.defaultHeaders) {\n Object.assign(headers, provider.defaultHeaders);\n }\n\n // Custom headers from config\n if (providerConfig?.headers) {\n Object.assign(headers, providerConfig.headers);\n }\n\n return headers;\n}\n\n/**\n * Get the effective base URL for a provider (config override or default).\n */\nexport function getEffectiveBaseUrl(\n providerId: ProviderId,\n providerConfig?: ProviderConfig,\n): string {\n if (providerConfig?.baseUrl) return providerConfig.baseUrl;\n const provider = getProvider(providerId);\n return provider?.baseUrl || \"\";\n}\n\n/**\n * Get auth headers for a provider (resolves key automatically).\n */\nexport async function getProviderHeaders(providerId: ProviderId): Promise<Record<string, string>> {\n const provider = getProvider(providerId);\n if (!provider) throw new Error(`Unknown provider: ${providerId}`);\n\n const resolved = await resolveKey(providerId);\n if (!resolved) {\n throw new Error(\n `No API key configured for ${provider.name}. ` +\n `Set ${provider.envKeys[0]} or run the setup wizard.`,\n );\n }\n\n const config = getConfig();\n const providerConfig = config.providers?.[providerId];\n return buildAuthHeaders(provider, resolved.key, providerConfig);\n}\n\n/**\n * Get the base URL for a provider.\n */\nexport function getProviderBaseUrl(providerId: ProviderId): string {\n const config = getConfig();\n const providerConfig = config.providers?.[providerId];\n return getEffectiveBaseUrl(providerId, providerConfig);\n}\n\n/**\n * Get a config object compatible with the OpenAI SDK.\n * Works for: openai, openrouter, groq, xai, mistral, deepseek, and any\n * other provider marked as openaiCompatible.\n */\nexport async function getOpenAICompatibleConfig(\n providerId: ProviderId,\n): Promise<OpenAICompatibleConfig> {\n const provider = getProvider(providerId);\n if (!provider) throw new Error(`Unknown provider: ${providerId}`);\n\n const resolved = await resolveKey(providerId);\n if (!resolved) {\n throw new Error(\n `No API key configured for ${provider.name}. ` +\n `Set ${provider.envKeys[0]} or run the setup wizard.`,\n );\n }\n\n const config = getConfig();\n const providerConfig = config.providers?.[providerId];\n\n const result: OpenAICompatibleConfig = {\n apiKey: resolved.key,\n baseURL: getEffectiveBaseUrl(providerId, providerConfig),\n };\n\n // Merge default + custom headers\n const extraHeaders = {\n ...provider.defaultHeaders,\n ...providerConfig?.headers,\n };\n\n if (Object.keys(extraHeaders).length > 0) {\n result.defaultHeaders = extraHeaders;\n }\n\n return result;\n}\n\n/**\n * Build a full URL for a provider endpoint, handling query-param auth.\n */\nexport function buildUrl(\n provider: ProviderDefinition,\n endpoint: string,\n key?: string,\n providerConfig?: ProviderConfig,\n): string {\n const base = providerConfig?.baseUrl || provider.baseUrl;\n const url = new URL(endpoint, base);\n\n if (provider.authStyle === \"query-param\" && key) {\n url.searchParams.set(\"key\", key);\n }\n\n return url.toString();\n}\n","// ============================================================\n// byok-ai — Key Validation\n// ============================================================\n\nimport type { ProviderId, ValidationResult } from \"../types.js\";\nimport { getProvider } from \"../providers/registry.js\";\nimport { buildAuthHeaders, buildUrl } from \"../config/helpers.js\";\nimport { resolveKey } from \"../config/resolver.js\";\n\n/**\n * Validate a key's format (prefix check).\n */\nexport function validateKeyFormat(providerId: ProviderId, key: string): ValidationResult {\n const provider = getProvider(providerId);\n if (!provider) {\n return { valid: false, error: `Unknown provider: ${providerId}` };\n }\n\n if (!key || key.trim().length === 0) {\n return { valid: false, error: \"Key is empty\" };\n }\n\n // Check prefix if defined\n if (provider.keyPrefix) {\n const prefixes = Array.isArray(provider.keyPrefix) ? provider.keyPrefix : [provider.keyPrefix];\n\n const hasValidPrefix = prefixes.some((p) => key.startsWith(p));\n if (!hasValidPrefix) {\n return {\n valid: false,\n error: `Key should start with ${prefixes.join(\" or \")} for ${provider.name}`,\n };\n }\n }\n\n // Basic length check\n if (key.length < 10) {\n return { valid: false, error: \"Key seems too short\" };\n }\n\n return { valid: true };\n}\n\n/**\n * Validate a key by making a lightweight API call.\n * This hits a read-only endpoint (like listing models) to verify the key works.\n */\nexport async function validateKey(providerId: ProviderId, key: string): Promise<ValidationResult> {\n // First, format check\n const formatResult = validateKeyFormat(providerId, key);\n if (!formatResult.valid) return formatResult;\n\n const provider = getProvider(providerId);\n if (!provider) {\n return { valid: false, error: `Unknown provider: ${providerId}` };\n }\n\n // If no validation endpoint, just trust the format check\n if (!provider.validateEndpoint) {\n return { valid: true };\n }\n\n try {\n const url = buildUrl(provider, provider.validateEndpoint, key);\n const headers = buildAuthHeaders(provider, key);\n headers[\"Content-Type\"] = \"application/json\";\n\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n signal: AbortSignal.timeout(10000), // 10 second timeout\n });\n\n if (response.ok) {\n // Try to extract useful metadata\n const meta: Record<string, unknown> = {};\n\n try {\n const data = (await response.json()) as Record<string, unknown>;\n\n // OpenRouter returns key info with usage data\n if (providerId === \"openrouter\" && data?.data) {\n const d = data.data as Record<string, unknown>;\n meta.usage = d.usage;\n meta.limit = d.limit;\n meta.label = d.label;\n }\n } catch {\n // JSON parsing failed, but status was OK so key is valid\n }\n\n return { valid: true, meta: Object.keys(meta).length > 0 ? meta : undefined };\n }\n\n if (response.status === 401 || response.status === 403) {\n return { valid: false, error: \"Invalid API key (authentication failed)\" };\n }\n\n if (response.status === 429) {\n // Rate limited but key is valid\n return {\n valid: true,\n meta: { warning: \"Rate limited — key is valid but currently throttled\" },\n };\n }\n\n return {\n valid: false,\n error: `Validation failed with status ${response.status}`,\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n\n // Timeout or network error — don't assume key is invalid\n if (message.includes(\"timeout\") || message.includes(\"ENOTFOUND\")) {\n return {\n valid: true,\n meta: { warning: \"Could not reach provider API to validate (network issue)\" },\n };\n }\n\n return { valid: false, error: `Validation error: ${message}` };\n }\n}\n\n/**\n * Validate all currently configured keys.\n */\nexport async function validateAllKeys(): Promise<Record<string, ValidationResult>> {\n const { listProviders } = await import(\"../providers/registry.js\");\n const results: Record<string, ValidationResult> = {};\n\n const providers = listProviders();\n\n // Run validations in parallel\n const promises = providers.map(async (provider) => {\n const resolved = await resolveKey(provider.id);\n if (!resolved) {\n results[provider.id] = { valid: false, error: \"No key configured\" };\n return;\n }\n results[provider.id] = await validateKey(provider.id, resolved.key);\n });\n\n await Promise.all(promises);\n return results;\n}\n","// ============================================================\n// byok-ai — Environment Variable Helpers\n// ============================================================\n\nimport type { ProviderId } from \"../types.js\";\nimport { getProvider, listProviders } from \"../providers/registry.js\";\n\n/**\n * Check if a provider has its API key set via environment variable.\n */\nexport function hasEnvKey(providerId: ProviderId): boolean {\n const provider = getProvider(providerId);\n if (!provider) return false;\n return provider.envKeys.some((key) => !!process.env[key]);\n}\n\n/**\n * Get the env var value for a provider (checks all registered env var names).\n */\nexport function getEnvKey(providerId: ProviderId): string | null {\n const provider = getProvider(providerId);\n if (!provider) return null;\n\n for (const key of provider.envKeys) {\n const value = process.env[key];\n if (value) return value;\n }\n\n return null;\n}\n\n/**\n * Get the primary env var name for a provider (for display/docs).\n */\nexport function getEnvVarName(providerId: ProviderId): string | null {\n const provider = getProvider(providerId);\n if (!provider) return null;\n return provider.envKeys[0] || null;\n}\n\n/**\n * Generate a .env template string with all providers.\n */\nexport function generateEnvTemplate(providerIds?: ProviderId[]): string {\n const providers = providerIds\n ? providerIds.map((id) => getProvider(id)).filter(Boolean)\n : listProviders();\n\n const lines: string[] = [\n \"# byok-ai — API Keys\",\n \"# Add your API keys below. You only need keys for providers you want to use.\",\n \"\",\n ];\n\n for (const provider of providers) {\n if (!provider) continue;\n lines.push(`# ${provider.name} — Get a key at: ${provider.docsUrl}`);\n for (const envKey of provider.envKeys) {\n lines.push(`# ${envKey}=`);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","// ============================================================\n// byok-ai — Interactive Setup Wizard\n// ============================================================\n// Uses raw Node.js readline — zero dependencies.\n\nimport { createInterface } from \"node:readline\";\nimport type { WizardOptions } from \"../types.js\";\nimport { getProvider, listProviders } from \"../providers/registry.js\";\nimport { resolveKey } from \"../config/resolver.js\";\nimport { storeKey } from \"../storage/file.js\";\nimport { validateKey, validateKeyFormat } from \"../validation/validator.js\";\n\n/** ANSI color helpers */\nconst c = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n red: \"\\x1b[31m\",\n cyan: \"\\x1b[36m\",\n magenta: \"\\x1b[35m\",\n};\n\nfunction ask(rl: ReturnType<typeof createInterface>, question: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.trim());\n });\n });\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 8) return \"****\";\n return key.slice(0, 6) + \"...\" + key.slice(-4);\n}\n\n/**\n * Run the interactive setup wizard.\n *\n * Walks the user through configuring API keys for the specified providers.\n * Keys are stored in ~/.config/byok-ai/keys.json with 0600 permissions.\n */\nexport async function setupWizard(options: WizardOptions = {}): Promise<void> {\n const { appName = \"this app\", skipConfigured = true, required = [] } = options;\n\n const providerIds = options.providers || listProviders().map((p) => p.id);\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n console.log();\n console.log(`${c.bold}${c.cyan} byok-ai${c.reset} — API Key Setup`);\n console.log(`${c.dim} ${appName} needs an AI provider to work.${c.reset}`);\n console.log(`${c.dim} You only need to configure one provider.${c.reset}`);\n console.log();\n\n const configured: string[] = [];\n const skipped: string[] = [];\n\n for (const id of providerIds) {\n const provider = getProvider(id);\n if (!provider) continue;\n\n // Check if already configured\n const existing = await resolveKey(id);\n\n if (existing && skipConfigured) {\n console.log(\n ` ${c.green}✓${c.reset} ${c.bold}${provider.name}${c.reset}` +\n ` ${c.dim}(configured via ${existing.source})${c.reset}`,\n );\n configured.push(id);\n continue;\n }\n\n if (existing) {\n console.log(\n ` ${c.green}✓${c.reset} ${c.bold}${provider.name}${c.reset}` +\n ` ${c.dim}(${maskKey(existing.key)} via ${existing.source})${c.reset}`,\n );\n }\n\n // Ask for key\n console.log();\n console.log(\n ` ${c.bold}${provider.name}${c.reset}` +\n ` ${c.dim}— Get a key at: ${provider.docsUrl}${c.reset}`,\n );\n\n const input = await ask(rl, ` ${c.cyan}API Key${c.reset} (or Enter to skip): `);\n\n if (!input) {\n skipped.push(id);\n console.log(` ${c.dim}Skipped${c.reset}`);\n continue;\n }\n\n // Format validation (instant)\n const formatCheck = validateKeyFormat(id, input);\n if (!formatCheck.valid) {\n console.log(` ${c.yellow}⚠ Warning:${c.reset} ${formatCheck.error}`);\n const proceed = await ask(rl, ` ${c.dim}Save anyway? (y/N):${c.reset} `);\n if (proceed.toLowerCase() !== \"y\") {\n skipped.push(id);\n continue;\n }\n }\n\n // Live validation\n console.log(` ${c.dim}Validating...${c.reset}`);\n const result = await validateKey(id, input);\n\n if (result.valid) {\n await storeKey(id, input);\n configured.push(id);\n console.log(` ${c.green}✓ Valid!${c.reset} Key saved.`);\n\n if (result.meta?.warning) {\n console.log(` ${c.yellow}⚠ ${result.meta.warning}${c.reset}`);\n }\n } else {\n console.log(` ${c.red}✗ ${result.error}${c.reset}`);\n const saveAnyway = await ask(rl, ` ${c.dim}Save anyway? (y/N):${c.reset} `);\n if (saveAnyway.toLowerCase() === \"y\") {\n await storeKey(id, input);\n configured.push(id);\n console.log(` ${c.dim}Key saved.${c.reset}`);\n } else {\n skipped.push(id);\n }\n }\n }\n\n // Summary\n console.log();\n console.log(`${c.bold} Summary${c.reset}`);\n console.log(`${c.dim} ${\"─\".repeat(40)}${c.reset}`);\n\n if (configured.length > 0) {\n console.log(\n ` ${c.green}✓${c.reset} ${configured.length} provider(s) configured: ` +\n `${c.bold}${configured.join(\", \")}${c.reset}`,\n );\n }\n\n if (skipped.length > 0) {\n console.log(` ${c.dim}○ ${skipped.length} skipped: ${skipped.join(\", \")}${c.reset}`);\n }\n\n // Check required providers\n const missingRequired = required.filter((r) => !configured.includes(r));\n if (missingRequired.length > 0) {\n console.log();\n console.log(\n ` ${c.yellow}⚠ Required providers not configured: ` +\n `${c.bold}${missingRequired.join(\", \")}${c.reset}`,\n );\n console.log(` ${c.dim}${appName} may not work without these.${c.reset}`);\n }\n\n console.log();\n } finally {\n rl.close();\n }\n}\n","// ============================================================\n// byok-ai — Status Reporter\n// ============================================================\n\nimport type { ProviderId, ProviderStatus, StatusReport } from \"../types.js\";\nimport { getProvider, listProviders } from \"../providers/registry.js\";\nimport { resolveKey, getConfig } from \"../config/resolver.js\";\n\nfunction maskKey(key: string): string {\n if (key.length <= 8) return \"****\";\n return key.slice(0, 6) + \"...\" + key.slice(-4);\n}\n\n/**\n * Get the status of all registered providers.\n */\nexport async function getStatus(providerIds?: ProviderId[]): Promise<StatusReport> {\n const providers = providerIds\n ? providerIds.map((id) => getProvider(id)).filter((p): p is NonNullable<typeof p> => !!p)\n : listProviders();\n\n const statuses: ProviderStatus[] = [];\n\n for (const provider of providers) {\n const resolved = await resolveKey(provider.id);\n statuses.push({\n id: provider.id,\n name: provider.name,\n configured: !!resolved,\n source: resolved?.source,\n keyPreview: resolved ? maskKey(resolved.key) : undefined,\n });\n }\n\n const config = getConfig();\n\n return {\n providers: statuses,\n defaultProvider: config.defaultProvider,\n };\n}\n\n/** ANSI color helpers */\nconst col = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n cyan: \"\\x1b[36m\",\n};\n\n/**\n * Print a formatted status report to stdout.\n */\nexport async function printStatus(providerIds?: ProviderId[]): Promise<void> {\n const status = await getStatus(providerIds);\n\n console.log();\n console.log(`${col.bold}${col.cyan} byok-ai${col.reset} — Provider Status`);\n console.log(`${col.dim} ${\"─\".repeat(50)}${col.reset}`);\n\n for (const p of status.providers) {\n const icon = p.configured ? `${col.green}✓` : `${col.red}✗`;\n const source = p.source ? `${col.dim}(${p.source})${col.reset}` : \"\";\n const preview = p.keyPreview ? `${col.dim}${p.keyPreview}${col.reset}` : \"\";\n\n console.log(\n ` ${icon}${col.reset} ${col.bold}${p.name.padEnd(16)}${col.reset} ${preview} ${source}`,\n );\n }\n\n const total = status.providers.length;\n const active = status.providers.filter((p) => p.configured).length;\n console.log();\n console.log(` ${col.dim}${active}/${total} providers configured${col.reset}`);\n\n if (status.defaultProvider) {\n console.log(` ${col.dim}Default: ${status.defaultProvider}${col.reset}`);\n }\n\n console.log();\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/** Supported built-in provider IDs */
|
|
2
|
+
type BuiltinProviderId = "anthropic" | "openai" | "openrouter" | "google" | "groq" | "xai" | "mistral" | "deepseek";
|
|
3
|
+
/** Any provider ID (builtins + custom) */
|
|
4
|
+
type ProviderId = BuiltinProviderId | (string & {});
|
|
5
|
+
/** How a provider authenticates requests */
|
|
6
|
+
type AuthStyle = "x-api-key" | "bearer" | "query-param";
|
|
7
|
+
/** Definition of a provider */
|
|
8
|
+
interface ProviderDefinition {
|
|
9
|
+
/** Unique identifier, e.g. 'anthropic' */
|
|
10
|
+
id: ProviderId;
|
|
11
|
+
/** Human-readable name, e.g. 'Anthropic' */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Environment variable names to check, in order */
|
|
14
|
+
envKeys: string[];
|
|
15
|
+
/** Expected key prefix for format validation (e.g. 'sk-ant-') */
|
|
16
|
+
keyPrefix?: string | string[];
|
|
17
|
+
/** Base URL for API requests */
|
|
18
|
+
baseUrl: string;
|
|
19
|
+
/** URL where users can get an API key */
|
|
20
|
+
docsUrl: string;
|
|
21
|
+
/** How this provider authenticates */
|
|
22
|
+
authStyle: AuthStyle;
|
|
23
|
+
/** Custom auth header name (default depends on authStyle) */
|
|
24
|
+
authHeader?: string;
|
|
25
|
+
/** Extra default headers to include */
|
|
26
|
+
defaultHeaders?: Record<string, string>;
|
|
27
|
+
/** Lightweight endpoint to validate a key (GET request) */
|
|
28
|
+
validateEndpoint?: string;
|
|
29
|
+
/** Whether this provider is OpenAI-SDK-compatible */
|
|
30
|
+
openaiCompatible?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/** Where a resolved key came from */
|
|
33
|
+
type KeySource = "runtime" | "env" | "project-config" | "user-config";
|
|
34
|
+
/** A resolved API key with metadata */
|
|
35
|
+
interface ResolvedKey {
|
|
36
|
+
key: string;
|
|
37
|
+
source: KeySource;
|
|
38
|
+
providerId: ProviderId;
|
|
39
|
+
envVar?: string;
|
|
40
|
+
}
|
|
41
|
+
/** Result of key validation */
|
|
42
|
+
interface ValidationResult {
|
|
43
|
+
valid: boolean;
|
|
44
|
+
error?: string;
|
|
45
|
+
/** Extra metadata from the provider (e.g. org name, remaining credits) */
|
|
46
|
+
meta?: Record<string, unknown>;
|
|
47
|
+
}
|
|
48
|
+
/** Result of fallback resolution */
|
|
49
|
+
interface ResolvedProvider {
|
|
50
|
+
providerId: ProviderId;
|
|
51
|
+
key: string;
|
|
52
|
+
source: KeySource;
|
|
53
|
+
baseUrl: string;
|
|
54
|
+
headers: Record<string, string>;
|
|
55
|
+
}
|
|
56
|
+
/** Per-provider config in config files */
|
|
57
|
+
interface ProviderConfig {
|
|
58
|
+
apiKey?: string;
|
|
59
|
+
baseUrl?: string;
|
|
60
|
+
disabled?: boolean;
|
|
61
|
+
headers?: Record<string, string>;
|
|
62
|
+
}
|
|
63
|
+
/** Full byok-ai config file shape */
|
|
64
|
+
interface ByokConfig {
|
|
65
|
+
providers?: Record<string, ProviderConfig>;
|
|
66
|
+
defaultProvider?: ProviderId;
|
|
67
|
+
fallbackOrder?: ProviderId[];
|
|
68
|
+
}
|
|
69
|
+
/** Status of a single provider */
|
|
70
|
+
interface ProviderStatus {
|
|
71
|
+
id: ProviderId;
|
|
72
|
+
name: string;
|
|
73
|
+
configured: boolean;
|
|
74
|
+
source?: KeySource;
|
|
75
|
+
keyPreview?: string;
|
|
76
|
+
valid?: boolean;
|
|
77
|
+
error?: string;
|
|
78
|
+
}
|
|
79
|
+
/** Overall status report */
|
|
80
|
+
interface StatusReport {
|
|
81
|
+
providers: ProviderStatus[];
|
|
82
|
+
defaultProvider?: ProviderId;
|
|
83
|
+
}
|
|
84
|
+
/** Options for the setup wizard */
|
|
85
|
+
interface WizardOptions {
|
|
86
|
+
/** Which providers to offer for configuration */
|
|
87
|
+
providers?: ProviderId[];
|
|
88
|
+
/** At least one of these must be configured */
|
|
89
|
+
required?: ProviderId[];
|
|
90
|
+
/** App name shown in prompts */
|
|
91
|
+
appName?: string;
|
|
92
|
+
/** Skip providers that already have keys configured */
|
|
93
|
+
skipConfigured?: boolean;
|
|
94
|
+
}
|
|
95
|
+
/** OpenAI-SDK-compatible configuration */
|
|
96
|
+
interface OpenAICompatibleConfig {
|
|
97
|
+
apiKey: string;
|
|
98
|
+
baseURL: string;
|
|
99
|
+
defaultHeaders?: Record<string, string>;
|
|
100
|
+
}
|
|
101
|
+
/** Options passed to the top-level init */
|
|
102
|
+
interface ByokOptions {
|
|
103
|
+
/** Provider overrides (runtime keys) */
|
|
104
|
+
providers?: Record<string, ProviderConfig>;
|
|
105
|
+
/** Path to project config file */
|
|
106
|
+
configPath?: string;
|
|
107
|
+
/** Disable user config loading */
|
|
108
|
+
noUserConfig?: boolean;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Register a custom provider (or override a built-in one).
|
|
113
|
+
*/
|
|
114
|
+
declare function registerProvider(definition: ProviderDefinition): void;
|
|
115
|
+
/**
|
|
116
|
+
* Get a provider definition by ID.
|
|
117
|
+
*/
|
|
118
|
+
declare function getProvider(id: ProviderId): ProviderDefinition | undefined;
|
|
119
|
+
/**
|
|
120
|
+
* List all registered providers.
|
|
121
|
+
*/
|
|
122
|
+
declare function listProviders(): ProviderDefinition[];
|
|
123
|
+
/**
|
|
124
|
+
* Check if a provider is registered.
|
|
125
|
+
*/
|
|
126
|
+
declare function hasProvider(id: ProviderId): boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Default fallback order (most common providers first).
|
|
129
|
+
*/
|
|
130
|
+
declare const DEFAULT_FALLBACK_ORDER: ProviderId[];
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Initialize / reset the config cache. Call this if you change options at runtime.
|
|
134
|
+
*/
|
|
135
|
+
declare function initConfig(options?: ByokOptions): ByokConfig;
|
|
136
|
+
/**
|
|
137
|
+
* Get the current config (loads if needed).
|
|
138
|
+
*/
|
|
139
|
+
declare function getConfig(): ByokConfig;
|
|
140
|
+
/**
|
|
141
|
+
* Resolve an API key for a provider, checking all layers.
|
|
142
|
+
*
|
|
143
|
+
* Resolution order:
|
|
144
|
+
* 1. Runtime options (passed via init or resolveKey options)
|
|
145
|
+
* 2. Environment variables
|
|
146
|
+
* 3. Project config file
|
|
147
|
+
* 4. User config file
|
|
148
|
+
* 5. Stored keys (~/.config/byok-ai/keys.json)
|
|
149
|
+
*/
|
|
150
|
+
declare function resolveKey(providerId: ProviderId, runtimeKey?: string): Promise<ResolvedKey | null>;
|
|
151
|
+
/**
|
|
152
|
+
* Try to resolve a working provider from a list, in order.
|
|
153
|
+
* Returns the first provider that has a configured key.
|
|
154
|
+
*/
|
|
155
|
+
declare function resolveWithFallback(providerIds?: ProviderId[]): Promise<ResolvedProvider | null>;
|
|
156
|
+
/**
|
|
157
|
+
* Get all providers that currently have keys configured.
|
|
158
|
+
*/
|
|
159
|
+
declare function getConfiguredProviders(): Promise<ResolvedKey[]>;
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Get auth headers for a provider (resolves key automatically).
|
|
163
|
+
*/
|
|
164
|
+
declare function getProviderHeaders(providerId: ProviderId): Promise<Record<string, string>>;
|
|
165
|
+
/**
|
|
166
|
+
* Get the base URL for a provider.
|
|
167
|
+
*/
|
|
168
|
+
declare function getProviderBaseUrl(providerId: ProviderId): string;
|
|
169
|
+
/**
|
|
170
|
+
* Get a config object compatible with the OpenAI SDK.
|
|
171
|
+
* Works for: openai, openrouter, groq, xai, mistral, deepseek, and any
|
|
172
|
+
* other provider marked as openaiCompatible.
|
|
173
|
+
*/
|
|
174
|
+
declare function getOpenAICompatibleConfig(providerId: ProviderId): Promise<OpenAICompatibleConfig>;
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Get the user-level config path.
|
|
178
|
+
*/
|
|
179
|
+
declare function getUserConfigPath(): string;
|
|
180
|
+
/**
|
|
181
|
+
* Get the user-level keys storage path.
|
|
182
|
+
*/
|
|
183
|
+
declare function getKeysStorePath(): string;
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Validate a key's format (prefix check).
|
|
187
|
+
*/
|
|
188
|
+
declare function validateKeyFormat(providerId: ProviderId, key: string): ValidationResult;
|
|
189
|
+
/**
|
|
190
|
+
* Validate a key by making a lightweight API call.
|
|
191
|
+
* This hits a read-only endpoint (like listing models) to verify the key works.
|
|
192
|
+
*/
|
|
193
|
+
declare function validateKey(providerId: ProviderId, key: string): Promise<ValidationResult>;
|
|
194
|
+
/**
|
|
195
|
+
* Validate all currently configured keys.
|
|
196
|
+
*/
|
|
197
|
+
declare function validateAllKeys(): Promise<Record<string, ValidationResult>>;
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Store an API key for a provider.
|
|
201
|
+
*/
|
|
202
|
+
declare function storeKey(providerId: ProviderId, key: string): Promise<void>;
|
|
203
|
+
/**
|
|
204
|
+
* Get a stored API key for a provider.
|
|
205
|
+
*/
|
|
206
|
+
declare function getKey(providerId: ProviderId): Promise<string | null>;
|
|
207
|
+
/**
|
|
208
|
+
* Remove a stored API key for a provider.
|
|
209
|
+
*/
|
|
210
|
+
declare function removeKey(providerId: ProviderId): Promise<void>;
|
|
211
|
+
/**
|
|
212
|
+
* List all stored provider IDs.
|
|
213
|
+
*/
|
|
214
|
+
declare function listStoredKeys(): Promise<ProviderId[]>;
|
|
215
|
+
/**
|
|
216
|
+
* Clear all stored keys.
|
|
217
|
+
*/
|
|
218
|
+
declare function clearAllKeys(): Promise<void>;
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Check if a provider has its API key set via environment variable.
|
|
222
|
+
*/
|
|
223
|
+
declare function hasEnvKey(providerId: ProviderId): boolean;
|
|
224
|
+
/**
|
|
225
|
+
* Get the env var value for a provider (checks all registered env var names).
|
|
226
|
+
*/
|
|
227
|
+
declare function getEnvKey(providerId: ProviderId): string | null;
|
|
228
|
+
/**
|
|
229
|
+
* Get the primary env var name for a provider (for display/docs).
|
|
230
|
+
*/
|
|
231
|
+
declare function getEnvVarName(providerId: ProviderId): string | null;
|
|
232
|
+
/**
|
|
233
|
+
* Generate a .env template string with all providers.
|
|
234
|
+
*/
|
|
235
|
+
declare function generateEnvTemplate(providerIds?: ProviderId[]): string;
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Run the interactive setup wizard.
|
|
239
|
+
*
|
|
240
|
+
* Walks the user through configuring API keys for the specified providers.
|
|
241
|
+
* Keys are stored in ~/.config/byok-ai/keys.json with 0600 permissions.
|
|
242
|
+
*/
|
|
243
|
+
declare function setupWizard(options?: WizardOptions): Promise<void>;
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Get the status of all registered providers.
|
|
247
|
+
*/
|
|
248
|
+
declare function getStatus(providerIds?: ProviderId[]): Promise<StatusReport>;
|
|
249
|
+
/**
|
|
250
|
+
* Print a formatted status report to stdout.
|
|
251
|
+
*/
|
|
252
|
+
declare function printStatus(providerIds?: ProviderId[]): Promise<void>;
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* All-in-one initialization: loads config, checks for keys,
|
|
256
|
+
* and optionally runs the setup wizard if no keys are found.
|
|
257
|
+
*
|
|
258
|
+
* @example
|
|
259
|
+
* ```typescript
|
|
260
|
+
* import { init } from 'byok-ai';
|
|
261
|
+
*
|
|
262
|
+
* const provider = await init({
|
|
263
|
+
* providers: ['anthropic', 'openai', 'openrouter'],
|
|
264
|
+
* appName: 'my-cli-tool',
|
|
265
|
+
* });
|
|
266
|
+
*
|
|
267
|
+
* // provider.key, provider.baseUrl, provider.headers are ready to use
|
|
268
|
+
* ```
|
|
269
|
+
*/
|
|
270
|
+
declare function init(options?: ByokOptions & {
|
|
271
|
+
/** Providers to check (in fallback order) */
|
|
272
|
+
providers?: ProviderId[];
|
|
273
|
+
/** App name for wizard prompts */
|
|
274
|
+
appName?: string;
|
|
275
|
+
/** Run wizard if no keys found (default: true) */
|
|
276
|
+
interactive?: boolean;
|
|
277
|
+
}): Promise<ResolvedProvider | null>;
|
|
278
|
+
|
|
279
|
+
export { type AuthStyle, type BuiltinProviderId, type ByokConfig, type ByokOptions, DEFAULT_FALLBACK_ORDER, type KeySource, type OpenAICompatibleConfig, type ProviderConfig, type ProviderDefinition, type ProviderId, type ProviderStatus, type ResolvedKey, type ResolvedProvider, type StatusReport, type ValidationResult, type WizardOptions, clearAllKeys, generateEnvTemplate, getConfig, getConfiguredProviders, getEnvKey, getEnvVarName, getKey, getKeysStorePath, getOpenAICompatibleConfig, getProvider, getProviderBaseUrl, getProviderHeaders, getStatus, getUserConfigPath, hasEnvKey, hasProvider, init, initConfig, listProviders, listStoredKeys, printStatus, registerProvider, removeKey, resolveKey, resolveWithFallback, setupWizard, storeKey, validateAllKeys, validateKey, validateKeyFormat };
|