From 1afc3a5f65183419850f59ef5fd181c6b7d6ecba Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Fri, 16 Jan 2026 12:47:05 +0800 Subject: [PATCH] feat(auth): add support for `kiro` OAuth model alias - Introduced `kiro` channel and alias resolution in `oauth_model_alias` logic. - Updated supported channels documentation and examples to include `kiro` and `github-copilot`. - Enhanced unit tests to validate `kiro` alias functionality. --- config.example.yaml | 2 +- internal/config/config.go | 2 +- sdk/cliproxy/auth/oauth_model_alias.go | 4 ++-- sdk/cliproxy/auth/oauth_model_alias_test.go | 11 +++++++++++ 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/config.example.yaml b/config.example.yaml index 203712d4..e20a9318 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -218,7 +218,7 @@ nonstream-keepalive-interval: 0 # Global OAuth model name aliases (per channel) # These aliases rename model IDs for both model listing and request routing. -# Supported channels: gemini-cli, vertex, aistudio, antigravity, claude, codex, qwen, iflow. +# Supported channels: gemini-cli, vertex, aistudio, antigravity, claude, codex, qwen, iflow, kiro, github-copilot. # NOTE: Aliases do not apply to gemini-api-key, codex-api-key, claude-api-key, openai-compatibility, vertex-api-key, or ampcode. # You can repeat the same name with different aliases to expose multiple client model names. #oauth-model-alias: diff --git a/internal/config/config.go b/internal/config/config.go index 5fefc073..12aef098 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -103,7 +103,7 @@ type Config struct { // OAuthModelAlias defines global model name aliases for OAuth/file-backed auth channels. // These aliases affect both model listing and model routing for supported channels: - // gemini-cli, vertex, aistudio, antigravity, claude, codex, qwen, iflow. + // gemini-cli, vertex, aistudio, antigravity, claude, codex, qwen, iflow, kiro, github-copilot. // // NOTE: This does not apply to existing per-credential model alias features under: // gemini-api-key, codex-api-key, claude-api-key, openai-compatibility, vertex-api-key, and ampcode. diff --git a/sdk/cliproxy/auth/oauth_model_alias.go b/sdk/cliproxy/auth/oauth_model_alias.go index 4111663e..a7858790 100644 --- a/sdk/cliproxy/auth/oauth_model_alias.go +++ b/sdk/cliproxy/auth/oauth_model_alias.go @@ -221,7 +221,7 @@ func modelAliasChannel(auth *Auth) string { // and auth kind. Returns empty string if the provider/authKind combination doesn't support // OAuth model alias (e.g., API key authentication). // -// Supported channels: gemini-cli, vertex, aistudio, antigravity, claude, codex, qwen, iflow. +// Supported channels: gemini-cli, vertex, aistudio, antigravity, claude, codex, qwen, iflow, kiro, github-copilot. func OAuthModelAliasChannel(provider, authKind string) string { provider = strings.ToLower(strings.TrimSpace(provider)) authKind = strings.ToLower(strings.TrimSpace(authKind)) @@ -245,7 +245,7 @@ func OAuthModelAliasChannel(provider, authKind string) string { return "" } return "codex" - case "gemini-cli", "aistudio", "antigravity", "qwen", "iflow": + case "gemini-cli", "aistudio", "antigravity", "qwen", "iflow", "kiro", "github-copilot": return provider default: return "" diff --git a/sdk/cliproxy/auth/oauth_model_alias_test.go b/sdk/cliproxy/auth/oauth_model_alias_test.go index 6956411c..decc810d 100644 --- a/sdk/cliproxy/auth/oauth_model_alias_test.go +++ b/sdk/cliproxy/auth/oauth_model_alias_test.go @@ -43,6 +43,15 @@ func TestResolveOAuthUpstreamModel_SuffixPreservation(t *testing.T) { input: "gemini-2.5-pro", want: "gemini-2.5-pro-exp-03-25", }, + { + name: "kiro alias resolves", + aliases: map[string][]internalconfig.OAuthModelAlias{ + "kiro": {{Name: "kiro-claude-sonnet-4-5", Alias: "sonnet"}}, + }, + channel: "kiro", + input: "sonnet", + want: "kiro-claude-sonnet-4-5", + }, { name: "config suffix takes priority", aliases: map[string][]internalconfig.OAuthModelAlias{ @@ -152,6 +161,8 @@ func createAuthForChannel(channel string) *Auth { return &Auth{Provider: "qwen"} case "iflow": return &Auth{Provider: "iflow"} + case "kiro": + return &Auth{Provider: "kiro"} default: return &Auth{Provider: channel} }