43 lines
1.5 KiB
TypeScript
43 lines
1.5 KiB
TypeScript
const MUTATION_INTENT =
|
|
/(?:设计|创建|生成|添加|增加|新增|修改|调整|编辑|删除|移动|旋转|缩放|布置|装修|建造|搭建|修复|design|create|generate|add|modify|update|edit|delete|remove|move|rotate|scale|furnish|build|repair|fix)/i
|
|
|
|
export function requiresPascalMutation(messages: unknown[]): boolean {
|
|
const latestUserMessage = [...messages]
|
|
.reverse()
|
|
.find(
|
|
(message) =>
|
|
Boolean(message) &&
|
|
typeof message === 'object' &&
|
|
(message as { role?: unknown }).role === 'user',
|
|
) as { parts?: unknown } | undefined
|
|
|
|
if (!Array.isArray(latestUserMessage?.parts)) return false
|
|
const text = latestUserMessage.parts
|
|
.filter((part): part is { text: string; type: 'text' } =>
|
|
Boolean(
|
|
part &&
|
|
typeof part === 'object' &&
|
|
(part as { type?: unknown }).type === 'text' &&
|
|
typeof (part as { text?: unknown }).text === 'string',
|
|
),
|
|
)
|
|
.map((part) => part.text)
|
|
.join(' ')
|
|
|
|
return MUTATION_INTENT.test(text)
|
|
}
|
|
|
|
export function pascalAgentStepPolicy(params: {
|
|
hasMutation: boolean
|
|
mutationRequired: boolean
|
|
mutationToolNames: string[]
|
|
stepNumber: number
|
|
}): { activeTools?: string[]; toolChoice: 'auto' | 'required' } {
|
|
if (!(params.mutationRequired && !params.hasMutation)) return { toolChoice: 'auto' }
|
|
if (params.stepNumber < 2) return { toolChoice: 'required' }
|
|
return {
|
|
activeTools: params.mutationToolNames,
|
|
toolChoice: 'required',
|
|
}
|
|
}
|