diff --git a/config/base-iflow.settings.json b/config/base-iflow.settings.json new file mode 100644 index 00000000..2fc56b47 --- /dev/null +++ b/config/base-iflow.settings.json @@ -0,0 +1,10 @@ +{ + "env": { + "ANTHROPIC_BASE_URL": "http://127.0.0.1:8317/api/provider/iflow", + "ANTHROPIC_AUTH_TOKEN": "ccs-internal-managed", + "ANTHROPIC_MODEL": "deepseek-v3.2", + "ANTHROPIC_DEFAULT_OPUS_MODEL": "kimi-k2-thinking", + "ANTHROPIC_DEFAULT_SONNET_MODEL": "deepseek-v3.2", + "ANTHROPIC_DEFAULT_HAIKU_MODEL": "minimax-m2" + } +} diff --git a/config/base-qwen.settings.json b/config/base-qwen.settings.json index 03b3e36c..03c510ca 100644 --- a/config/base-qwen.settings.json +++ b/config/base-qwen.settings.json @@ -2,9 +2,9 @@ "env": { "ANTHROPIC_BASE_URL": "http://127.0.0.1:8317/api/provider/qwen", "ANTHROPIC_AUTH_TOKEN": "ccs-internal-managed", - "ANTHROPIC_MODEL": "qwen3-coder", - "ANTHROPIC_DEFAULT_OPUS_MODEL": "qwen3-coder", - "ANTHROPIC_DEFAULT_SONNET_MODEL": "qwen3-coder", - "ANTHROPIC_DEFAULT_HAIKU_MODEL": "qwen3-coder" + "ANTHROPIC_MODEL": "qwen3-coder-plus", + "ANTHROPIC_DEFAULT_OPUS_MODEL": "qwen3-coder-plus", + "ANTHROPIC_DEFAULT_SONNET_MODEL": "qwen3-coder-plus", + "ANTHROPIC_DEFAULT_HAIKU_MODEL": "qwen3-vl-plus" } } diff --git a/src/cliproxy/auth-handler.ts b/src/cliproxy/auth-handler.ts index 4a192c33..311ad428 100644 --- a/src/cliproxy/auth-handler.ts +++ b/src/cliproxy/auth-handler.ts @@ -12,12 +12,12 @@ * Each provider has its own directory to avoid conflicts. */ +import { execSync, spawn } from 'child_process'; import * as fs from 'fs'; import * as path from 'path'; -import { spawn, execSync } from 'child_process'; import { ProgressIndicator } from '../utils/progress-indicator'; -import { getProviderAuthDir, generateConfig } from './config-generator'; import { ensureCLIProxyBinary } from './binary-manager'; +import { generateConfig, getProviderAuthDir } from './config-generator'; import { CLIProxyProvider } from './types'; /** @@ -169,6 +169,13 @@ const OAUTH_CONFIGS: Record = { scopes: ['openid', 'profile', 'email', 'model.completion'], authFlag: '--qwen-login', }, + iflow: { + provider: 'iflow', + displayName: 'iFlow', + authUrl: 'https://iflow.cn/oauth', + scopes: ['phone', 'profile', 'email'], + authFlag: '--iflow-login', + }, }; /** @@ -199,6 +206,7 @@ const PROVIDER_AUTH_PREFIXES: Record = { codex: ['codex-', 'openai-'], agy: ['antigravity-', 'agy-'], qwen: ['qwen-'], + iflow: ['iflow-'], }; /** @@ -210,6 +218,7 @@ const PROVIDER_TYPE_VALUES: Record = { codex: ['codex'], agy: ['antigravity'], qwen: ['qwen'], + iflow: ['iflow'], }; /** @@ -327,7 +336,7 @@ export function getAuthStatus(provider: CLIProxyProvider): AuthStatus { * Get auth status for all providers */ export function getAllAuthStatus(): AuthStatus[] { - const providers: CLIProxyProvider[] = ['gemini', 'codex', 'agy', 'qwen']; + const providers: CLIProxyProvider[] = ['gemini', 'codex', 'agy', 'qwen', 'iflow']; return providers.map(getAuthStatus); } diff --git a/src/cliproxy/config-generator.ts b/src/cliproxy/config-generator.ts index 9c6cde6c..c267bc29 100644 --- a/src/cliproxy/config-generator.ts +++ b/src/cliproxy/config-generator.ts @@ -12,7 +12,7 @@ import * as fs from 'fs'; import * as path from 'path'; import { getCcsDir } from '../utils/config-manager'; import { CLIProxyProvider, ProviderConfig, ProviderModelMapping } from './types'; -import { getModelMappingFromConfig } from './base-config-loader'; +import { getModelMappingFromConfig, getEnvVarsFromConfig } from './base-config-loader'; /** Settings file structure for user overrides */ interface ProviderSettings { @@ -31,6 +31,7 @@ const PROVIDER_DISPLAY_NAMES: Record = { codex: 'Codex', agy: 'Antigravity', qwen: 'Qwen Code', + iflow: 'iFlow', }; /** @@ -197,7 +198,11 @@ export function getClaudeEnvVars( ): NodeJS.ProcessEnv { const models = getModelMapping(provider); - return { + // Base env vars from config file (includes ANTHROPIC_MAX_TOKENS, etc.) + const baseEnvVars = getEnvVarsFromConfig(provider); + + // Core env vars that we always set dynamically + const coreEnvVars = { // Provider-specific endpoint - routes to correct provider via URL path ANTHROPIC_BASE_URL: `http://127.0.0.1:${port}/api/provider/${provider}`, ANTHROPIC_AUTH_TOKEN: CCS_INTERNAL_API_KEY, @@ -206,6 +211,23 @@ export function getClaudeEnvVars( ANTHROPIC_DEFAULT_SONNET_MODEL: models.sonnetModel || models.claudeModel, ANTHROPIC_DEFAULT_HAIKU_MODEL: models.haikuModel || models.claudeModel, }; + + // Filter out core env vars from base config to avoid conflicts + const { + ANTHROPIC_BASE_URL: _baseUrl, + ANTHROPIC_AUTH_TOKEN: _authToken, + ANTHROPIC_MODEL: _model, + ANTHROPIC_DEFAULT_OPUS_MODEL: _opusModel, + ANTHROPIC_DEFAULT_SONNET_MODEL: _sonnetModel, + ANTHROPIC_DEFAULT_HAIKU_MODEL: _haikuModel, + ...additionalEnvVars + } = baseEnvVars; + + // Merge core env vars with additional env vars from base config + return { + ...coreEnvVars, + ...additionalEnvVars, // Includes ANTHROPIC_MAX_TOKENS, etc. + }; } /** diff --git a/src/cliproxy/types.ts b/src/cliproxy/types.ts index a9ae85a7..f42e4edc 100644 --- a/src/cliproxy/types.ts +++ b/src/cliproxy/types.ts @@ -46,8 +46,6 @@ export interface BinaryManagerConfig { maxRetries: number; /** Enable verbose logging */ verbose: boolean; - /** Force specific version (skip auto-upgrade to latest) */ - forceVersion?: boolean; } /** @@ -113,8 +111,9 @@ export interface DownloadResult { * - codex: OpenAI Codex via OAuth * - agy: Antigravity via OAuth (short name for easy usage) * - qwen: Qwen Code via OAuth (qwen3-coder) + * - iflow: iFlow via OAuth */ -export type CLIProxyProvider = 'gemini' | 'codex' | 'agy' | 'qwen'; +export type CLIProxyProvider = 'gemini' | 'codex' | 'agy' | 'qwen' | 'iflow'; /** * CLIProxy config.yaml structure (minimal)