Merge pull request #229 from kaitranntt/fix/228-variant-port-not-passed

fix(cliproxy): pass variant port to executor for isolation
This commit is contained in:
Kai (Tam Nhu) Tran authored and GitHub committed 2025-12-30 10:41:14 -08:00
commit ae40e4c42f
5 files changed
+30 -6

No files matched your search

+5
View File
@@ -39,6 +39,8 @@ export interface ProfileDetectionResult {
message?: string;
/** For cliproxy variants: the underlying provider (gemini, codex, agy, qwen) */
provider?: CLIProxyProfileName;
/** For cliproxy variants: dedicated port for isolation (8318-8417) */
port?: number;
/** For unified config profiles: merged env vars (config + secrets) */
env?: Record<string, string>;
/** For copilot profile: the copilot config */
@@ -110,6 +112,8 @@ class ProfileDetector {
type: 'cliproxy',
name: profileName,
provider: variant.provider as CLIProxyProfileName,
settingsPath: variant.settings,
port: variant.port,
};
}
@@ -250,6 +254,7 @@ class ProfileDetector {
name: profileName,
provider: variant.provider as CLIProxyProfileName,
settingsPath: variant.settings,
port: variant.port,
};
}
+5 -1
View File
@@ -511,7 +511,11 @@ async function main(): Promise<void> {
// CLIPROXY FLOW: OAuth-based profiles (gemini, codex, agy, qwen) or user-defined variants
const provider = profileInfo.provider || (profileInfo.name as CLIProxyProvider);
const customSettingsPath = profileInfo.settingsPath; // undefined for hardcoded profiles
await execClaudeWithCLIProxy(claudeCli, provider, remainingArgs, { customSettingsPath });
const variantPort = profileInfo.port; // variant-specific port for isolation
await execClaudeWithCLIProxy(claudeCli, provider, remainingArgs, {
customSettingsPath,
port: variantPort,
});
} else if (profileInfo.type === 'copilot') {
// COPILOT FLOW: GitHub Copilot subscription via copilot-api proxy
const { executeCopilotProfile } = await import('./copilot');
+11 -1
View File
@@ -154,7 +154,17 @@ export async function execClaudeWithCLIProxy(
});
// Use resolved port from proxy config (overrides ExecutorConfig)
if (proxyConfig.port !== CLIPROXY_DEFAULT_PORT) {
// Priority: CLI flags > Variant port (cfg.port) > config.yaml > default
// cfg.port is set if variant has dedicated port; proxyConfig.port comes from CLI/ENV/config.yaml
if (cfg.port && cfg.port !== CLIPROXY_DEFAULT_PORT) {
// Variant port already set via config param - keep it (highest priority after CLI flags)
// CLI flags would have been parsed in resolveProxyConfig and set proxyConfig.port
// So if proxyConfig.port differs from default AND cfg.port differs, CLI wins
if (proxyConfig.port !== CLIPROXY_DEFAULT_PORT) {
cfg.port = proxyConfig.port; // CLI/ENV override variant port
}
// else: keep cfg.port (variant port)
} else if (proxyConfig.port !== CLIPROXY_DEFAULT_PORT) {
cfg.port = proxyConfig.port;
}
@@ -94,8 +94,9 @@ export function ProviderEditor({
const accounts = authStatus.accounts || [];
const handleApplyPreset = (updates: Record<string, string>) => {
const effectivePort = port ?? CLIPROXY_PORT;
updateEnvValues({
ANTHROPIC_BASE_URL: `http://127.0.0.1:${CLIPROXY_PORT}/api/provider/${provider}`,
ANTHROPIC_BASE_URL: `http://127.0.0.1:${effectivePort}/api/provider/${provider}`,
ANTHROPIC_AUTH_TOKEN: 'ccs-internal-managed',
...updates,
});
@@ -103,8 +104,9 @@ export function ProviderEditor({
};
const handleCustomPresetApply = (values: ModelMappingValues, presetName?: string) => {
const effectivePort = port ?? CLIPROXY_PORT;
updateEnvValues({
ANTHROPIC_BASE_URL: `http://127.0.0.1:${CLIPROXY_PORT}/api/provider/${provider}`,
ANTHROPIC_BASE_URL: `http://127.0.0.1:${effectivePort}/api/provider/${provider}`,
ANTHROPIC_AUTH_TOKEN: 'ccs-internal-managed',
ANTHROPIC_MODEL: values.default,
ANTHROPIC_DEFAULT_OPUS_MODEL: values.opus,
+5 -2
View File
@@ -13,10 +13,12 @@ export const CLIPROXY_PORT = 8317;
* Uses the first model's presetMapping or falls back to using defaultModel for all tiers
*
* @param provider - The provider ID (e.g., 'gemini', 'codex', 'agy')
* @param port - Optional custom port (defaults to CLIPROXY_PORT)
* @returns Object with success status and applied preset name
*/
export async function applyDefaultPreset(
provider: string
provider: string,
port?: number
): Promise<{ success: boolean; presetName?: string }> {
const catalog = MODEL_CATALOGS[provider];
if (!catalog) return { success: false };
@@ -30,9 +32,10 @@ export async function applyDefaultPreset(
haiku: catalog.defaultModel,
};
const effectivePort = port ?? CLIPROXY_PORT;
const settings = {
env: {
ANTHROPIC_BASE_URL: `http://127.0.0.1:${CLIPROXY_PORT}/api/provider/${provider}`,
ANTHROPIC_BASE_URL: `http://127.0.0.1:${effectivePort}/api/provider/${provider}`,
ANTHROPIC_AUTH_TOKEN: 'ccs-internal-managed',
ANTHROPIC_MODEL: mapping.default,
ANTHROPIC_DEFAULT_OPUS_MODEL: mapping.opus,