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

View File

@@ -1,6 +1,6 @@
{
"name": "9router",
"version": "0.4.71",
"version": "0.4.73",
"description": "9Router CLI - Start and manage 9Router server",
"bin": {
"9router": "./cli.js"

View File

@@ -18,6 +18,23 @@
export const KIRO_AGENTIC_SUFFIX = "-agentic";
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_AGENTIC_SYSTEM_PROMPT = `

View File

@@ -428,7 +428,7 @@ export async function refreshKiroToken(refreshToken, providerSpecificData, log,
accessToken: tokens.accessToken,
refreshToken: tokens.refreshToken || refreshToken,
expiresIn: tokens.expiresIn,
...(await resolveKiroProfileArnPatch(providerSpecificData, tokens.accessToken)),
...(await resolveKiroProfileArnPatch(providerSpecificData, tokens.accessToken, tokens.profileArn)),
};
}

View File

@@ -4,6 +4,7 @@
import { CLIENT_METADATA, getPlatformUserAgent } from "../config/appConstants.js";
import { proxyAwareFetch } from "../utils/proxyFetch.js";
import { resolveDefaultProfileArn } from "../config/kiroConstants.js";
// GitHub API config
const GITHUB_CONFIG = {
@@ -753,10 +754,8 @@ function parseKiroQuotaData(data) {
}
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 profileArn = providerSpecificData?.profileArn || resolveDefaultProfileArn(authMethod);
const getUsageParams = new URLSearchParams({
isEmailRequired: "true",

View File

@@ -230,22 +230,21 @@ export function openaiToGeminiCLIRequest(model, body, stream) {
const gemini = openaiToGeminiBase(model, body, stream, DEFAULT_THINKING_GEMINI_CLI_SIGNATURE);
const isClaude = model.toLowerCase().includes("claude");
// Add thinking config for CLI
if (body.reasoning_effort) {
const budgetMap = { low: 1024, medium: 8192, high: 32768 };
const budget = budgetMap[body.reasoning_effort] || 8192;
gemini.generationConfig.thinkingConfig = {
thinkingBudget: budget,
include_thoughts: true
};
// Map reasoning effort → thinkingConfig.thinkingLevel (gemini-3 enum: minimal|low|medium|high)
// Gemini 3 cannot fully disable thinking; "none"/"off" map to "minimal" (closest to no-thinking)
// Accept both OpenAI chat (reasoning_effort) and Responses (reasoning.effort) shapes
const reasoningEffort = body.reasoning_effort ?? body.reasoning?.effort;
if (reasoningEffort) {
const effort = String(reasoningEffort).toLowerCase().trim();
const level = (effort === "none" || effort === "off") ? "minimal" : effort;
gemini.generationConfig.thinkingConfig = { thinkingLevel: level, includeThoughts: level !== "minimal" };
}
// Thinking config from Claude format
if (body.thinking?.type === "enabled" && body.thinking.budget_tokens) {
gemini.generationConfig.thinkingConfig = {
thinkingBudget: body.thinking.budget_tokens,
include_thoughts: true
};
// Claude-format thinking: disabled → minimal, enabled → high
if (body.thinking?.type === "disabled") {
gemini.generationConfig.thinkingConfig = { thinkingLevel: "minimal", includeThoughts: false };
} else if (body.thinking?.type === "enabled") {
gemini.generationConfig.thinkingConfig = { thinkingLevel: "high", includeThoughts: true };
}
// Clean schema for tools

View File

@@ -9,7 +9,8 @@ import {
resolveKiroModel,
isThinkingEnabled,
buildThinkingSystemPrefix,
KIRO_AGENTIC_SYSTEM_PROMPT
KIRO_AGENTIC_SYSTEM_PROMPT,
resolveDefaultProfileArn
} from "../../config/kiroConstants.js";
/** 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 profileArn = credentials?.providerSpecificData?.profileArn || "";
const profileArn = credentials?.providerSpecificData?.profileArn
|| resolveDefaultProfileArn(credentials?.providerSpecificData?.authMethod);
let finalContent = currentMessage?.userInputMessage?.content || "";

View File

@@ -1,6 +1,6 @@
{
"name": "9router-app",
"version": "0.4.71",
"version": "0.4.73",
"description": "9Router web dashboard",
"private": true,
"scripts": {

View File

@@ -200,6 +200,7 @@ export class KiroService {
return {
accessToken: data.accessToken,
refreshToken: data.refreshToken || refreshToken,
profileArn: data.profileArn,
expiresIn: data.expiresIn,
};
}