fix(telegram): compare full provider/model in models picker

This commit is contained in:
fumin
2026-04-03 23:27:28 +08:00
committed by Peter Steinberger
parent bb4e54ccf7
commit 43272d27f8
2 changed files with 34 additions and 6 deletions

View File

@@ -205,6 +205,11 @@ describe("buildModelsKeyboard", () => {
currentModel: "anthropic/claude-sonnet-4",
firstText: "claude-sonnet-4 ✓",
},
{
name: "legacy bare model id fallback still marks current model",
currentModel: "claude-sonnet-4",
firstText: "claude-sonnet-4 ✓",
},
] as const;
for (const testCase of cases) {
const result = buildModelsKeyboard({
@@ -283,6 +288,20 @@ describe("buildModelsKeyboard", () => {
expect(anthropicResult[0]?.[0]?.text).toBe("Anthropic Shared");
});
it("does not mark same-id models from other providers as current", () => {
const result = buildModelsKeyboard({
provider: "openai-codex",
models: ["gpt-5.4", "gpt-5.3-codex-spark"],
currentModel: "github-copilot/gpt-5.4",
currentPage: 1,
totalPages: 1,
});
const texts = result.flat().map((button) => button.text);
expect(texts).toContain("gpt-5.4");
expect(texts).not.toContain("gpt-5.4 ✓");
});
it("renders pagination controls for first, middle, and last pages", () => {
const cases = [
{

View File

@@ -144,6 +144,20 @@ export function resolveModelSelection(params: {
};
}
function isCurrentModelSelection(params: {
currentModel?: string;
provider: string;
model: string;
}): boolean {
const currentModel = params.currentModel?.trim();
if (!currentModel) {
return false;
}
return currentModel.includes("/")
? currentModel === `${params.provider}/${params.model}`
: currentModel === params.model;
}
/**
* Build provider selection keyboard with 2 providers per row.
*/
@@ -195,11 +209,6 @@ export function buildModelsKeyboard(params: ModelsKeyboardParams): ButtonRow[] {
const endIndex = Math.min(startIndex + pageSize, models.length);
const pageModels = models.slice(startIndex, endIndex);
// Model buttons - one per row
const currentModelId = currentModel?.includes("/")
? currentModel.split("/").slice(1).join("/")
: currentModel;
for (const model of pageModels) {
const callbackData = buildModelSelectionCallbackData({ provider, model });
// Skip models that still exceed Telegram's callback_data limit.
@@ -207,7 +216,7 @@ export function buildModelsKeyboard(params: ModelsKeyboardParams): ButtonRow[] {
continue;
}
const isCurrentModel = model === currentModelId;
const isCurrentModel = isCurrentModelSelection({ currentModel, provider, model });
const displayLabel = modelNames?.get(`${provider}/${model}`) ?? model;
const displayText = truncateModelId(displayLabel, 38);
const text = isCurrentModel ? `${displayText}` : displayText;