ManimCat-show / src /studio-agent /runtime /session /session-agent-config.ts
Bin29's picture
Sync from main: 68df783 feat: support multimodal studio reference images
d47b053
import type { StudioSession, StudioToolChoice } from '../../domain/types'
export interface StudioSessionAgentConfig {
toolChoice?: StudioToolChoice
}
export function getStudioSessionAgentConfig(session: StudioSession): StudioSessionAgentConfig {
const metadata = session.metadata
if (!metadata || typeof metadata !== 'object') {
return {}
}
const candidate = (metadata as Record<string, unknown>).agentConfig
if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {
return {}
}
const toolChoice = normalizeToolChoice((candidate as Record<string, unknown>).toolChoice)
return toolChoice ? { toolChoice } : {}
}
export function resolveStudioToolChoice(input: {
session: StudioSession
override?: StudioToolChoice
}): StudioToolChoice | undefined {
return normalizeToolChoice(input.override) ?? getStudioSessionAgentConfig(input.session).toolChoice
}
export function inheritStudioSessionMetadata(session: StudioSession): Record<string, unknown> | undefined {
if (!session.metadata || typeof session.metadata !== 'object') {
return undefined
}
return { ...session.metadata }
}
export function createStudioSessionMetadata(input: {
existing?: Record<string, unknown>
agentConfig?: StudioSessionAgentConfig
permissionMode?: 'safe' | 'auto' | 'full'
}): Record<string, unknown> | undefined {
const toolChoice = normalizeToolChoice(input.agentConfig?.toolChoice)
const permissionMode = normalizePermissionMode(input.permissionMode)
const base = input.existing ? { ...input.existing } : {}
const existingAgentConfig = base.agentConfig && typeof base.agentConfig === 'object' && !Array.isArray(base.agentConfig)
? { ...(base.agentConfig as Record<string, unknown>) }
: {}
if (!toolChoice) {
if (!Object.keys(existingAgentConfig).length) {
delete base.agentConfig
} else {
base.agentConfig = existingAgentConfig
}
} else {
base.agentConfig = {
...existingAgentConfig,
toolChoice,
}
}
if (permissionMode) {
base.permissionMode = permissionMode
} else {
delete base.permissionMode
}
return Object.keys(base).length ? base : undefined
}
function normalizeToolChoice(value: unknown): StudioToolChoice | undefined {
return value === 'auto' || value === 'required' || value === 'none' ? value : undefined
}
function normalizePermissionMode(value: unknown): 'safe' | 'auto' | 'full' | undefined {
return value === 'safe' || value === 'auto' || value === 'full' ? value : undefined
}