From 74c4197855a5e3fc273c4959796891a409226e52 Mon Sep 17 00:00:00 2001 From: BayLee4 <63376748+BayLee4@users.noreply.github.com> Date: Wed, 1 Apr 2026 04:51:53 +0200 Subject: [PATCH] feat(coding-agent): priority to commit model for titles with fallback to smol (#573) Co-authored-by: le-cameleon <200889489+le-cameleon@users.noreply.github.com> --- README.md | 2 +- .../src/commit/model-selection.ts | 20 +----------------- .../coding-agent/src/config/model-resolver.ts | 21 +++++++++++++++++++ .../coding-agent/src/utils/title-generator.ts | 11 ++++------ 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 3ceaabe29..27091ce1e 100644 --- a/README.md +++ b/README.md @@ -313,7 +313,7 @@ Create images directly from the agent: Modern terminal interface with smart session management: -- **Auto session titles**: Sessions automatically titled based on first message using smol model +- **Auto session titles**: Sessions automatically titled based on first message using commit model, fallback to smol - **Welcome screen**: Logo, tips, recent sessions with selection - **Powerline footer**: Model, cwd, git branch/status, token usage, context % - **LSP status**: Shows which language servers are active and ready diff --git a/packages/coding-agent/src/commit/model-selection.ts b/packages/coding-agent/src/commit/model-selection.ts index 54e3d5cb0..2416256b2 100644 --- a/packages/coding-agent/src/commit/model-selection.ts +++ b/packages/coding-agent/src/commit/model-selection.ts @@ -1,7 +1,7 @@ import type { ThinkingLevel } from "@oh-my-pi/pi-agent-core"; import type { Api, Model } from "@oh-my-pi/pi-ai"; import { MODEL_ROLE_IDS } from "../config/model-registry"; -import { parseModelPattern, resolveModelRoleValue } from "../config/model-resolver"; +import { parseModelPattern, resolveModelRoleValue, resolveRoleSelection } from "../config/model-resolver"; import type { Settings } from "../config/settings"; import MODEL_PRIO from "../priority.json" with { type: "json" }; @@ -11,24 +11,6 @@ export interface ResolvedCommitModel { thinkingLevel?: ThinkingLevel; } -function resolveRoleSelection( - roles: readonly string[], - settings: Settings, - availableModels: Model[], -): { model: Model; thinkingLevel?: ThinkingLevel } | undefined { - const matchPreferences = { usageOrder: settings.getStorage()?.getModelUsageOrder() }; - for (const role of roles) { - const resolved = resolveModelRoleValue(settings.getModelRole(role), availableModels, { - settings, - matchPreferences, - }); - if (resolved.model) { - return { model: resolved.model, thinkingLevel: resolved.thinkingLevel }; - } - } - return undefined; -} - export async function resolvePrimaryModel( override: string | undefined, settings: Settings, diff --git a/packages/coding-agent/src/config/model-resolver.ts b/packages/coding-agent/src/config/model-resolver.ts index f4c1c3f7c..c9e7f2ff5 100644 --- a/packages/coding-agent/src/config/model-resolver.ts +++ b/packages/coding-agent/src/config/model-resolver.ts @@ -587,6 +587,27 @@ export function resolveModelOverride( return { explicitThinkingLevel: false }; } +/** + * Resolve a list of role patterns to the first matching model. + */ +export function resolveRoleSelection( + roles: readonly string[], + settings: Settings, + availableModels: Model[], +): { model: Model; thinkingLevel?: ThinkingLevel } | undefined { + const matchPreferences = { usageOrder: settings.getStorage()?.getModelUsageOrder() }; + for (const role of roles) { + const resolved = resolveModelRoleValue(settings.getModelRole(role), availableModels, { + settings, + matchPreferences, + }); + if (resolved.model) { + return { model: resolved.model, thinkingLevel: resolved.thinkingLevel }; + } + } + return undefined; +} + /** * Resolve model patterns to actual Model objects with optional thinking levels * Format: "pattern:level" where :level is optional diff --git a/packages/coding-agent/src/utils/title-generator.ts b/packages/coding-agent/src/utils/title-generator.ts index 5d7d42a61..4b986640e 100644 --- a/packages/coding-agent/src/utils/title-generator.ts +++ b/packages/coding-agent/src/utils/title-generator.ts @@ -7,7 +7,7 @@ import type { Api, Model } from "@oh-my-pi/pi-ai"; import { completeSimple } from "@oh-my-pi/pi-ai"; import { logger } from "@oh-my-pi/pi-utils"; import type { ModelRegistry } from "../config/model-registry"; -import { resolveModelRoleValue } from "../config/model-resolver"; +import { resolveRoleSelection } from "../config/model-resolver"; import { renderPromptTemplate } from "../config/prompt-templates"; import type { Settings } from "../config/settings"; import titleSystemPrompt from "../prompts/system/title-system.md" with { type: "text" }; @@ -29,12 +29,9 @@ function getTitleModel( if (availableModels.length === 0) return undefined; const matchPreferences = { usageOrder: settings.getStorage()?.getModelUsageOrder() }; - const configuredSmol = resolveModelRoleValue(settings.getModelRole("smol"), availableModels, { - settings, - matchPreferences, - }); - if (configuredSmol.model) { - return { model: configuredSmol.model, thinkingLevel: configuredSmol.thinkingLevel }; + const titleModel = resolveRoleSelection(["commit", "smol"], settings, availableModels); + if (titleModel) { + return { model: titleModel.model, thinkingLevel: titleModel.thinkingLevel }; } if (currentModel) {