port.js
1.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
* `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 }
},
}
}