/** * `asModerationPort` —— 面收窄(§4 职责)。 * * 把 `guardGeneration` 收窄成 `@drama/llm` 生成时回调消费的最小面 `ModerationPort`。 * llm 包内 grep 不到 `import moderation`:moderation 不 import llm,llm 经此注入式 Port * 在生成时回调审核,`decision==='block'` 时 llm 必须中止回流该产物(架构 §8,验收 5)。 * * 本文件只做面收窄,不加新判定逻辑——保证 Port 形状稳定(§5 review 关注点 3)。 * * @typedef {object} ModerationPortReviewResult * @property {'allow'|'flag'|'block'} decision * @property {string[]} reasons * @property {string[]} categories * * @typedef {object} ModerationPort * @property {(args:{ text:string, context?:any, policy?:string, region?:string }) => * Promise} review */ /** * @param {(args:{ text:string, context?:any, policy?:string, region?:string }) => * Promise} guardGeneration * @returns {ModerationPort} */ export function asModerationPort(guardGeneration) { return { /** * @param {{ text:string, context?:any, policy?:string, region?:string }} args * @returns {Promise} */ async review(args) { const r = await guardGeneration(args) // 只暴露 review 三元组,不外泄 guardLevel 等护栏内部细节。 return { decision: r.decision, reasons: r.reasons, categories: r.categories } }, } }