port.js 1.46 KB
/**
 * `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<ModerationPortReviewResult>} review
 */

/**
 * @param {(args:{ text:string, context?:any, policy?:string, region?:string }) =>
 *   Promise<import('./guard.js').GuardResult>} guardGeneration
 * @returns {ModerationPort}
 */
export function asModerationPort(guardGeneration) {
  return {
    /**
     * @param {{ text:string, context?:any, policy?:string, region?:string }} args
     * @returns {Promise<ModerationPortReviewResult>}
     */
    async review(args) {
      const r = await guardGeneration(args)
      // 只暴露 review 三元组,不外泄 guardLevel 等护栏内部细节。
      return { decision: r.decision, reasons: r.reasons, categories: r.categories }
    },
  }
}