enhance Kiro profile ARN resolution

This commit is contained in:
decolua
2026-06-13 09:28:55 +07:00
parent 4443903900
commit b309261166
8 changed files with 40 additions and 22 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "9router", "name": "9router",
"version": "0.4.71", "version": "0.4.73",
"description": "9Router CLI - Start and manage 9Router server", "description": "9Router CLI - Start and manage 9Router server",
"bin": { "bin": {
"9router": "./cli.js" "9router": "./cli.js"
+17
View File
@@ -18,6 +18,23 @@
export const KIRO_AGENTIC_SUFFIX = "-agentic"; export const KIRO_AGENTIC_SUFFIX = "-agentic";
export const KIRO_THINKING_SUFFIX = "-thinking"; export const KIRO_THINKING_SUFFIX = "-thinking";
// Public default CodeWhisperer profile ARNs (us-east-1), keyed by auth method.
// Used when an account cannot resolve its own profileArn. Builder ID and social
// (Google/GitHub) sign-ins map to different shared profiles.
export const KIRO_DEFAULT_PROFILE_ARNS = {
"builder-id": "arn:aws:codewhisperer:us-east-1:638616132270:profile/AAAACCCCXXXX",
social: "arn:aws:codewhisperer:us-east-1:699475941385:profile/EHGA3GRVQMUK",
};
// Back-compat single default (Builder ID).
export const KIRO_DEFAULT_PROFILE_ARN = KIRO_DEFAULT_PROFILE_ARNS["builder-id"];
/** Resolve the shared default profileArn for a given auth method. */
export function resolveDefaultProfileArn(authMethod) {
const social = authMethod === "google" || authMethod === "github";
return social ? KIRO_DEFAULT_PROFILE_ARNS.social : KIRO_DEFAULT_PROFILE_ARNS["builder-id"];
}
export const KIRO_THINKING_BUDGET_DEFAULT = 16000; export const KIRO_THINKING_BUDGET_DEFAULT = 16000;
export const KIRO_AGENTIC_SYSTEM_PROMPT = ` export const KIRO_AGENTIC_SYSTEM_PROMPT = `
+1 -1
View File
@@ -428,7 +428,7 @@ export async function refreshKiroToken(refreshToken, providerSpecificData, log,
accessToken: tokens.accessToken, accessToken: tokens.accessToken,
refreshToken: tokens.refreshToken || refreshToken, refreshToken: tokens.refreshToken || refreshToken,
expiresIn: tokens.expiresIn, expiresIn: tokens.expiresIn,
...(await resolveKiroProfileArnPatch(providerSpecificData, tokens.accessToken)), ...(await resolveKiroProfileArnPatch(providerSpecificData, tokens.accessToken, tokens.profileArn)),
}; };
} }
+2 -3
View File
@@ -4,6 +4,7 @@
import { CLIENT_METADATA, getPlatformUserAgent } from "../config/appConstants.js"; import { CLIENT_METADATA, getPlatformUserAgent } from "../config/appConstants.js";
import { proxyAwareFetch } from "../utils/proxyFetch.js"; import { proxyAwareFetch } from "../utils/proxyFetch.js";
import { resolveDefaultProfileArn } from "../config/kiroConstants.js";
// GitHub API config // GitHub API config
const GITHUB_CONFIG = { const GITHUB_CONFIG = {
@@ -753,10 +754,8 @@ function parseKiroQuotaData(data) {
} }
async function getKiroUsage(accessToken, providerSpecificData, proxyOptions = null) { async function getKiroUsage(accessToken, providerSpecificData, proxyOptions = null) {
// Default profileArn fallback
const DEFAULT_PROFILE_ARN = "arn:aws:codewhisperer:us-east-1:638616132270:profile/AAAACCCCXXXX";
const profileArn = providerSpecificData?.profileArn || DEFAULT_PROFILE_ARN;
const authMethod = providerSpecificData?.authMethod || "builder-id"; const authMethod = providerSpecificData?.authMethod || "builder-id";
const profileArn = providerSpecificData?.profileArn || resolveDefaultProfileArn(authMethod);
const getUsageParams = new URLSearchParams({ const getUsageParams = new URLSearchParams({
isEmailRequired: "true", isEmailRequired: "true",
+13 -14
View File
@@ -230,22 +230,21 @@ export function openaiToGeminiCLIRequest(model, body, stream) {
const gemini = openaiToGeminiBase(model, body, stream, DEFAULT_THINKING_GEMINI_CLI_SIGNATURE); const gemini = openaiToGeminiBase(model, body, stream, DEFAULT_THINKING_GEMINI_CLI_SIGNATURE);
const isClaude = model.toLowerCase().includes("claude"); const isClaude = model.toLowerCase().includes("claude");
// Add thinking config for CLI // Map reasoning effort → thinkingConfig.thinkingLevel (gemini-3 enum: minimal|low|medium|high)
if (body.reasoning_effort) { // Gemini 3 cannot fully disable thinking; "none"/"off" map to "minimal" (closest to no-thinking)
const budgetMap = { low: 1024, medium: 8192, high: 32768 }; // Accept both OpenAI chat (reasoning_effort) and Responses (reasoning.effort) shapes
const budget = budgetMap[body.reasoning_effort] || 8192; const reasoningEffort = body.reasoning_effort ?? body.reasoning?.effort;
gemini.generationConfig.thinkingConfig = { if (reasoningEffort) {
thinkingBudget: budget, const effort = String(reasoningEffort).toLowerCase().trim();
include_thoughts: true const level = (effort === "none" || effort === "off") ? "minimal" : effort;
}; gemini.generationConfig.thinkingConfig = { thinkingLevel: level, includeThoughts: level !== "minimal" };
} }
// Thinking config from Claude format // Claude-format thinking: disabled → minimal, enabled → high
if (body.thinking?.type === "enabled" && body.thinking.budget_tokens) { if (body.thinking?.type === "disabled") {
gemini.generationConfig.thinkingConfig = { gemini.generationConfig.thinkingConfig = { thinkingLevel: "minimal", includeThoughts: false };
thinkingBudget: body.thinking.budget_tokens, } else if (body.thinking?.type === "enabled") {
include_thoughts: true gemini.generationConfig.thinkingConfig = { thinkingLevel: "high", includeThoughts: true };
};
} }
// Clean schema for tools // Clean schema for tools
@@ -9,7 +9,8 @@ import {
resolveKiroModel, resolveKiroModel,
isThinkingEnabled, isThinkingEnabled,
buildThinkingSystemPrefix, buildThinkingSystemPrefix,
KIRO_AGENTIC_SYSTEM_PROMPT KIRO_AGENTIC_SYSTEM_PROMPT,
resolveDefaultProfileArn
} from "../../config/kiroConstants.js"; } from "../../config/kiroConstants.js";
/** Render a single tool call as a readable text line. */ /** Render a single tool call as a readable text line. */
@@ -520,7 +521,8 @@ export function buildKiroPayload(model, body, stream, credentials) {
const { history, currentMessage } = convertMessages(messages, tools, upstreamModel); const { history, currentMessage } = convertMessages(messages, tools, upstreamModel);
const profileArn = credentials?.providerSpecificData?.profileArn || ""; const profileArn = credentials?.providerSpecificData?.profileArn
|| resolveDefaultProfileArn(credentials?.providerSpecificData?.authMethod);
let finalContent = currentMessage?.userInputMessage?.content || ""; let finalContent = currentMessage?.userInputMessage?.content || "";
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "9router-app", "name": "9router-app",
"version": "0.4.71", "version": "0.4.73",
"description": "9Router web dashboard", "description": "9Router web dashboard",
"private": true, "private": true,
"scripts": { "scripts": {
+1
View File
@@ -200,6 +200,7 @@ export class KiroService {
return { return {
accessToken: data.accessToken, accessToken: data.accessToken,
refreshToken: data.refreshToken || refreshToken, refreshToken: data.refreshToken || refreshToken,
profileArn: data.profileArn,
expiresIn: data.expiresIn, expiresIn: data.expiresIn,
}; };
} }