mirror of
https://github.com/tiennm99/ccs.git
synced 2026-09-05 00:18:05 +00:00
feat(cliproxy): add iFlow OAuth provider support (#55)
Add iFlow as a new OAuth-based provider for CLIProxy. Changes: - Add config/base-iflow.settings.json with iFlow provider configuration - Add iFlow to CLIProxyProvider type - Add iFlow OAuth config (authUrl, scopes, authFlag) - Add iFlow to provider display names, auth prefixes, and type values - Update config-generator to support iFlow provider - Update base-qwen.settings.json models (qwen3-coder-plus) Co-authored-by: kaitranntt <kaitran.ntt@gmail.com>
This commit is contained in:
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,9 +2,9 @@
|
|||||||
"env": {
|
"env": {
|
||||||
"ANTHROPIC_BASE_URL": "http://127.0.0.1:8317/api/provider/qwen",
|
"ANTHROPIC_BASE_URL": "http://127.0.0.1:8317/api/provider/qwen",
|
||||||
"ANTHROPIC_AUTH_TOKEN": "ccs-internal-managed",
|
"ANTHROPIC_AUTH_TOKEN": "ccs-internal-managed",
|
||||||
"ANTHROPIC_MODEL": "qwen3-coder",
|
"ANTHROPIC_MODEL": "qwen3-coder-plus",
|
||||||
"ANTHROPIC_DEFAULT_OPUS_MODEL": "qwen3-coder",
|
"ANTHROPIC_DEFAULT_OPUS_MODEL": "qwen3-coder-plus",
|
||||||
"ANTHROPIC_DEFAULT_SONNET_MODEL": "qwen3-coder",
|
"ANTHROPIC_DEFAULT_SONNET_MODEL": "qwen3-coder-plus",
|
||||||
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "qwen3-coder"
|
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "qwen3-vl-plus"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,12 +12,12 @@
|
|||||||
* Each provider has its own directory to avoid conflicts.
|
* Each provider has its own directory to avoid conflicts.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { execSync, spawn } from 'child_process';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import { spawn, execSync } from 'child_process';
|
|
||||||
import { ProgressIndicator } from '../utils/progress-indicator';
|
import { ProgressIndicator } from '../utils/progress-indicator';
|
||||||
import { getProviderAuthDir, generateConfig } from './config-generator';
|
|
||||||
import { ensureCLIProxyBinary } from './binary-manager';
|
import { ensureCLIProxyBinary } from './binary-manager';
|
||||||
|
import { generateConfig, getProviderAuthDir } from './config-generator';
|
||||||
import { CLIProxyProvider } from './types';
|
import { CLIProxyProvider } from './types';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -169,6 +169,13 @@ const OAUTH_CONFIGS: Record<CLIProxyProvider, ProviderOAuthConfig> = {
|
|||||||
scopes: ['openid', 'profile', 'email', 'model.completion'],
|
scopes: ['openid', 'profile', 'email', 'model.completion'],
|
||||||
authFlag: '--qwen-login',
|
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<CLIProxyProvider, string[]> = {
|
|||||||
codex: ['codex-', 'openai-'],
|
codex: ['codex-', 'openai-'],
|
||||||
agy: ['antigravity-', 'agy-'],
|
agy: ['antigravity-', 'agy-'],
|
||||||
qwen: ['qwen-'],
|
qwen: ['qwen-'],
|
||||||
|
iflow: ['iflow-'],
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -210,6 +218,7 @@ const PROVIDER_TYPE_VALUES: Record<CLIProxyProvider, string[]> = {
|
|||||||
codex: ['codex'],
|
codex: ['codex'],
|
||||||
agy: ['antigravity'],
|
agy: ['antigravity'],
|
||||||
qwen: ['qwen'],
|
qwen: ['qwen'],
|
||||||
|
iflow: ['iflow'],
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -327,7 +336,7 @@ export function getAuthStatus(provider: CLIProxyProvider): AuthStatus {
|
|||||||
* Get auth status for all providers
|
* Get auth status for all providers
|
||||||
*/
|
*/
|
||||||
export function getAllAuthStatus(): AuthStatus[] {
|
export function getAllAuthStatus(): AuthStatus[] {
|
||||||
const providers: CLIProxyProvider[] = ['gemini', 'codex', 'agy', 'qwen'];
|
const providers: CLIProxyProvider[] = ['gemini', 'codex', 'agy', 'qwen', 'iflow'];
|
||||||
return providers.map(getAuthStatus);
|
return providers.map(getAuthStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import * as fs from 'fs';
|
|||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import { getCcsDir } from '../utils/config-manager';
|
import { getCcsDir } from '../utils/config-manager';
|
||||||
import { CLIProxyProvider, ProviderConfig, ProviderModelMapping } from './types';
|
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 */
|
/** Settings file structure for user overrides */
|
||||||
interface ProviderSettings {
|
interface ProviderSettings {
|
||||||
@@ -31,6 +31,7 @@ const PROVIDER_DISPLAY_NAMES: Record<CLIProxyProvider, string> = {
|
|||||||
codex: 'Codex',
|
codex: 'Codex',
|
||||||
agy: 'Antigravity',
|
agy: 'Antigravity',
|
||||||
qwen: 'Qwen Code',
|
qwen: 'Qwen Code',
|
||||||
|
iflow: 'iFlow',
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -197,7 +198,11 @@ export function getClaudeEnvVars(
|
|||||||
): NodeJS.ProcessEnv {
|
): NodeJS.ProcessEnv {
|
||||||
const models = getModelMapping(provider);
|
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
|
// Provider-specific endpoint - routes to correct provider via URL path
|
||||||
ANTHROPIC_BASE_URL: `http://127.0.0.1:${port}/api/provider/${provider}`,
|
ANTHROPIC_BASE_URL: `http://127.0.0.1:${port}/api/provider/${provider}`,
|
||||||
ANTHROPIC_AUTH_TOKEN: CCS_INTERNAL_API_KEY,
|
ANTHROPIC_AUTH_TOKEN: CCS_INTERNAL_API_KEY,
|
||||||
@@ -206,6 +211,23 @@ export function getClaudeEnvVars(
|
|||||||
ANTHROPIC_DEFAULT_SONNET_MODEL: models.sonnetModel || models.claudeModel,
|
ANTHROPIC_DEFAULT_SONNET_MODEL: models.sonnetModel || models.claudeModel,
|
||||||
ANTHROPIC_DEFAULT_HAIKU_MODEL: models.haikuModel || 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.
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -46,8 +46,6 @@ export interface BinaryManagerConfig {
|
|||||||
maxRetries: number;
|
maxRetries: number;
|
||||||
/** Enable verbose logging */
|
/** Enable verbose logging */
|
||||||
verbose: boolean;
|
verbose: boolean;
|
||||||
/** Force specific version (skip auto-upgrade to latest) */
|
|
||||||
forceVersion?: boolean;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -113,8 +111,9 @@ export interface DownloadResult {
|
|||||||
* - codex: OpenAI Codex via OAuth
|
* - codex: OpenAI Codex via OAuth
|
||||||
* - agy: Antigravity via OAuth (short name for easy usage)
|
* - agy: Antigravity via OAuth (short name for easy usage)
|
||||||
* - qwen: Qwen Code via OAuth (qwen3-coder)
|
* - 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)
|
* CLIProxy config.yaml structure (minimal)
|
||||||
|
|||||||
Reference in New Issue
Block a user