9a9416c99c
* feat: support profile-aware group chat bridge flows * feat: route cron jobs through hermes cli * Fix group chat routing and isolate bridge tests * Add Grok image-to-video media skill * Default Grok videos to media directory * Fix bridge profile fallback and cron repeat clearing * Refine bridge chat and gateway platform handling * Filter bridge tool-call text deltas * Preserve structured bridge chat history * Prepare beta release build artifacts * Fix Windows run profile resolution * Fix Windows path compatibility checks * Fix profile-scoped model page display * Hide Windows subprocess windows for jobs and updates * Hide Windows file backend subprocess windows * Avoid Windows gateway restart lock conflicts * Treat Windows gateway lock as running on startup * Force release Windows gateway lock on restart * Tighten Windows gateway lock cleanup * Update chat e2e source expectation * Bump package version to 0.5.30 --------- Co-authored-by: Codex <codex@openai.com>
48 lines
2.1 KiB
TypeScript
48 lines
2.1 KiB
TypeScript
import { readConfigYamlForProfile } from '../../config-helpers'
|
|
|
|
export type RunModelGroup = { provider: string; models: string[] }
|
|
|
|
async function resolveDefaultModelConfig(profile: string): Promise<{ model: string; provider: string }> {
|
|
try {
|
|
const config = await readConfigYamlForProfile(profile)
|
|
const modelConfig = config?.model
|
|
const model = typeof modelConfig === 'string'
|
|
? modelConfig.trim()
|
|
: String(modelConfig?.default || '').trim()
|
|
const provider = typeof modelConfig === 'object'
|
|
? String(modelConfig?.provider || '').trim()
|
|
: ''
|
|
return { model, provider }
|
|
} catch {
|
|
return { model: '', provider: '' }
|
|
}
|
|
}
|
|
|
|
function hasModelInGroups(groups: RunModelGroup[] | undefined, provider: string, model: string): boolean {
|
|
if (!groups?.length || !provider || !model) return false
|
|
const group = groups.find(item => item.provider === provider)
|
|
return Array.isArray(group?.models) && group.models.includes(model)
|
|
}
|
|
|
|
export async function resolveBridgeRunModelConfig(options: {
|
|
profile: string
|
|
sessionModel?: string | null
|
|
sessionProvider?: string | null
|
|
requestedModel?: string | null
|
|
requestedProvider?: string | null
|
|
modelGroups?: RunModelGroup[]
|
|
}): Promise<{ model: string; provider: string }> {
|
|
const sessionModel = String(options.sessionModel || '').trim()
|
|
const sessionProvider = String(options.sessionProvider || '').trim()
|
|
const requestedModel = String(options.requestedModel || '').trim()
|
|
const requestedProvider = String(options.requestedProvider || '').trim()
|
|
const candidateModel = sessionModel || requestedModel
|
|
const candidateProvider = sessionProvider || requestedProvider
|
|
const hasGroups = Array.isArray(options.modelGroups) && options.modelGroups.length > 0
|
|
const candidateAvailable = hasGroups && hasModelInGroups(options.modelGroups, candidateProvider, candidateModel)
|
|
const shouldUseDefault = !candidateModel || !candidateProvider || !candidateAvailable
|
|
return shouldUseDefault
|
|
? resolveDefaultModelConfig(options.profile)
|
|
: { model: candidateModel, provider: candidateProvider }
|
|
}
|