- 把这个交给你的智能体
- 1. 按风险等级对工具进行分类
- 2. 为每个监督事件添加审计日志
- 3. 实施基于超时的逐级上报机制
- 4. 用持久化存储支撑你的 StateAccessor
- 5. 将所有环节串联起来
- 立即开始构建
- 常见问题解答
AI 智能体不再仅仅回答问题。它们正在审批贷款申请、分诊患者入院表格、运行薪资计算、决定谁被标记为欺诈审查对象。当其中任何一个环节出错时,责任将由部署方承担。
监管机构已经跟上步伐。第一个硬性截止日期落在 2026 年 8 月,如果你正在构建涉及金融服务、医疗保健、招聘或任何错误输出会对真实个人产生实际影响的领域的智能体,合规倒计时已经开始。
三项法规都指向同一项义务:必须有人类能够监督、干预并推翻影响人们的 AI 驱动决策。Agent SDK 提供了将这些控制机制集成到你的智能体中的基础组件。
| 法规 | 生效日期 | 适用对象 | 核心要求 |
|---|---|---|---|
| 欧盟 AI 法案,第 14 条 | 2026 年 8 月(高风险义务) | 任何为欧盟居民提供或部署高风险 AI 系统的提供商或部署方,无论公司总部位于何处。 | 人类监督,具备干预和推翻能力。监督行动的审计追踪。 |
| 科罗拉多州 ADMT 法案(SB26-189) | 2027 年 1 月 | 任何在科罗拉多州开展业务的开发者或部署方,包括在科罗拉多州外但对科罗拉多州居民做出重大决策的公司。 | 受覆盖的开发者/部署方必须提供文档、信息披露、消费者权利流程,以及在受覆盖的 ADMT 实质性影响重大决策时提供有意义的人工审查/复议。 |
| NIST AI RMF(GOVERN 1) | 自愿性,被美国监管机构引用 | 任何开发或部署 AI 系统的组织(自愿性,但美国联邦机构对此的期望日益增加)。 | 与风险相称的人类监督。监督控制的文档记录。 |
共同主线:如果你的智能体做出或影响实质性影响人们(信贷、就业、医疗保健、安全)的决策,你需要在模型的建议与行动的执行之间设置一个可审查的关卡。
以下是使用 @openrouter/agent 满足这些要求的 5 种模式,它们基于 HITL 工具手册(该手册涵盖了 SDK 机制)。这里我们介绍的是在此基础上附加的合规模式。
注意:本文提供的是工程模式,而非法律建议。请咨询法律顾问,以确定哪些法规适用于您的具体用例和司法管辖区。
将此内容交给您的智能体
希望您的编程智能体实现此功能?请复制以下提示词:
I need to add regulatory-compliant human-in-the-loop controls to my AI agent using the OpenRouter Agent SDK.
Inspect my codebase to identify which tools and actions are high-risk (financial, PII, legal, or safety-critical), then infer the appropriate risk tiers and implement a compliance layer using the Agent SDK HITL tools.
The compliance layer should:
1. Mark high-risk tools with requireApproval or onToolCalled gates based on my risk classification.
2. Log every oversight event (tool invocation, human decision, timestamp, reviewer ID) to my audit backend.
3. Add timeout-based escalation: if no human responds within the deadline, escalate to a supervisor or reject the action.
4. Stamp each human decision with reviewer identity and timestamp via onResponseReceived.
5. Persist conversation state with a StateAccessor backed by my chosen storage so audit records survive restarts.
Consult these pages for current SDK shapes and patterns:
- HITL tools reference: https://openrouter.ai/docs/sdks/typescript/call-model/tools#human-in-the-loop-hitl-tools
- Tool Approval & State: https://openrouter.ai/docs/sdks/typescript/call-model/approval-and-state
- callModel API reference: https://openrouter.ai/docs/sdks/typescript/call-model/api-reference
Do not hard-code secrets. Use environment variables for API keys and database credentials. 1. 按风险等级对工具进行分类
法规要求对具有重大影响的行动进行人工审核。首先,将您的工具划分为不同等级:
| 等级 | 示例操作 | 控制方式 |
|---|---|---|
| 高风险 | 金融交易、个人身份信息处理、访问决策、医疗建议 | 带强制暂停的人工审核工具(返回 null) |
| 中风险 | 批量邮件、内容审核、数据导出 | 带条件谓词的 requireApproval |
| 低风险 | 搜索、只读查询、格式化 | 无需门控 |
import { OpenRouter, tool } from '@openrouter/agent';
import { z } from 'zod';
// High-risk: always pauses for human review
const processCreditDecision = tool({
name: 'process_credit_decision',
description: 'Issue or deny a credit application',
inputSchema: z.object({
applicationId: z.string(),
recommendedAction: z.enum(['approve', 'deny', 'refer']),
riskScore: z.number(),
applicantName: z.string(),
}),
outputSchema: z.object({
decision: z.enum(['approved', 'denied', 'referred']),
reviewerId: z.string(),
reviewedAt: z.number(),
justification: z.string(),
}),
onToolCalled: async () => {
// Always escalate to human. No auto-resolve path for high-risk.
return null;
},
}); 对于中风险工具,使用一个基于上下文进行门控的条件谓词:
const sendBulkEmail = tool({
name: 'send_bulk_email',
description: 'Send email to a recipient list',
inputSchema: z.object({
recipients: z.array(z.string().email()),
subject: z.string(),
body: z.string(),
}),
outputSchema: z.object({ sent: z.boolean(), count: z.number() }),
requireApproval: (params) => {
// Gate kicks in above 50 recipients
return params.recipients.length > 50;
},
execute: async (params) => {
await sendEmails(params);
return { sent: true, count: params.recipients.length };
},
}); 2. 为每个监督事件添加审计日志
法规要求您证明人工监督确实发生过。这意味着需要记录谁审核了什么、何时审核以及他们做出了什么决定。将此功能接入 onResponseReceived:
import { tool } from '@openrouter/agent';
import { z } from 'zod';
const auditSchema = z.object({
decision: z.enum(['approved', 'denied', 'referred']),
reviewerId: z.string(),
justification: z.string(),
});
const processCreditDecision = tool({
name: 'process_credit_decision',
description: 'Issue or deny a credit application',
inputSchema: z.object({
applicationId: z.string(),
recommendedAction: z.enum(['approve', 'deny', 'refer']),
riskScore: z.number(),
applicantName: z.string(),
}),
outputSchema: z.object({
decision: z.enum(['approved', 'denied', 'referred']),
reviewerId: z.string(),
reviewedAt: z.number(),
justification: z.string(),
}),
onToolCalled: async (input) => {
// Log the escalation event itself
await writeAuditLog({
event: 'escalated_to_human',
toolName: 'process_credit_decision',
input,
timestamp: Date.now(),
});
return null;
},
onResponseReceived: async (raw) => {
const parsed = auditSchema.parse(raw);
const reviewedAt = Date.now();
// Write the immutable audit record
await writeAuditLog({
event: 'human_decision_recorded',
toolName: 'process_credit_decision',
reviewerId: parsed.reviewerId,
decision: parsed.decision,
justification: parsed.justification,
reviewedAt,
});
return { ...parsed, reviewedAt };
},
}); writeAuditLog 函数应写入仅追加存储。一个最小化接口:
interface AuditEntry {
event: string;
toolName: string;
timestamp?: number;
reviewerId?: string;
decision?: string;
justification?: string;
input?: unknown;
reviewedAt?: number;
escalatedTo?: string;
}
async function writeAuditLog(entry: AuditEntry): Promise<void> {
// Write to your audit backend: Postgres, S3, Datadog, Splunk, etc.
// The record must be append-only and tamper-evident for compliance.
await db.insertInto('audit_log').values({
...entry,
timestamp: entry.timestamp ?? Date.now(),
id: crypto.randomUUID(),
}).execute();
} 欧盟《人工智能法案》第 12 条(记录保存)要求高风险系统在其整个运行生命周期内维护日志。将审计日志存储在持久化、仅追加的存储中,并设置符合您监管要求的保留策略。
3. 实现基于超时的升级机制
一个无人响应的人工审核门控,比根本没有门控更糟糕。法规要求系统能够处理不响应的审核员。实现一个超时机制,默认情况下要么将问题升级给主管,要么拒绝该操作。
此模式在 callModel 循环之外运行,由任何轮询检查过期待审核项的服务来执行。
interface PendingReview {
conversationId: string;
callId: string;
toolName: string;
createdAt: number;
assignedTo: string;
}
const REVIEW_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
async function escalateStaleReviews(
pendingReviews: PendingReview[],
): Promise<void> {
const now = Date.now();
for (const review of pendingReviews) {
const elapsed = now - review.createdAt;
if (elapsed < REVIEW_TIMEOUT_MS) continue;
await writeAuditLog({
event: 'review_timeout_escalated',
toolName: review.toolName,
reviewerId: review.assignedTo,
timestamp: now,
});
// Option A: Escalate to supervisor
await assignToSupervisor(review);
// Option B: Default-deny and resume the agent with a rejection
// await resumeWithDenial(review);
}
} 选择哪个选项取决于你的风险偏好。对于需要符合欧盟《人工智能法案》的高风险系统,默认拒绝(选项 B)更安全:未经明确人工批准,操作绝不执行。对于延迟会产生运营成本的较低风险系统,上报给主管(选项 A)既能保持流程推进,又能保留监督链条。
4. 为你的 StateAccessor 配备持久化存储
进程重启后,内存中的状态会消失。为了合规,你的 StateAccessor 必须使用持久化存储,这样待审核项、对话历史和审计上下文才能在崩溃、部署和水平扩展后依然保留。
import type { ConversationState, StateAccessor, Tool } from '@openrouter/agent';
function createDurableStateAccessor<TTools extends readonly Tool[]>(
conversationId: string,
): StateAccessor<TTools> {
return {
load: async () => {
const row = await db
.selectFrom('conversation_state')
.where('id', '=', conversationId)
.selectAll()
.executeTakeFirst();
if (!row) return null;
return JSON.parse(row.state) as ConversationState<TTools>;
},
: async (state) => {
await db
.insertInto('conversation_state')
.values({
id: conversationId,
state: JSON.stringify(state),
updated_at: new Date(),
})
.onConflict((oc) =>
oc.column('id').doUpdateSet({
state: JSON.stringify(state),
updated_at: new Date(),
}),
)
.execute();
},
};
} 每当状态转变为“等待人工介入”或“等待审批”时,待审核项就会被持久化保存。你的上报服务(步骤 3)会查询此表以查找过期的审核项。
5. 将所有环节串联起来
以下是完整流程:分类、门控、记录、超时、恢复。此流程假设使用了步骤 1-2 中的 processCreditDecision 和 sendBulkEmail,步骤 2 中的 writeAuditLog,以及步骤 4 中的 createDurableStateAccessor。
import { OpenRouter } from '@openrouter/agent';
// processCreditDecision, sendBulkEmail defined in steps 1-2
// createDurableStateAccessor defined in step 4
const openrouter = new OpenRouter({
apiKey: process.env.OPENROUTER_API_KEY,
});
const tools = [processCreditDecision, sendBulkEmail] as const;
const conversationId = `conv-${crypto.randomUUID()}`;
const state = createDurableStateAccessor<typeof tools>(conversationId);
// Initial request
const result = openrouter.callModel({
model: 'openai/gpt-4o',
input: 'Review application APP-2024-001 and issue a credit decision',
tools,
state,
});
// Wait for the call to complete (or pause for human review)
const snapshot = await result.getState();
if (snapshot?.status === 'awaiting_hitl' || snapshot?.status === 'awaiting_approval') {
const pending = snapshot.pendingToolCalls ?? [];
// Surface to your review UI, queue, or notification system.
// 'awaiting_hitl' fires for onToolCalled tools (processCreditDecision).
// 'awaiting_approval' fires for requireApproval tools (sendBulkEmail).
// Both resume via function_call_output here; see approval-and-state docs
// for the approveToolCalls/rejectToolCalls alternative for requireApproval tools.
for (const call of pending) {
await createPendingReview({
conversationId,
callId: call.id,
toolName: call.name,
createdAt: Date.now(),
assignedTo: getReviewerForTool(call.name),
arguments: call.arguments,
});
}
} 当审核人员(通过你的管理界面、Slack 操作、队列消费者等)做出响应时:
// Retrieve the pending call from your review queue (by conversationId, callId, etc.)
const pendingCall = await getPendingReview(conversationId);
// Human supplies their decision
const humanDecision = {
decision: 'approved' as const,
reviewerId: 'reviewer-jane-smith',
justification: 'Risk score within policy limits, verified income docs',
};
const resumed = openrouter.callModel({
model: 'openai/gpt-4o',
input: [
{
type: 'function_call_output',
callId: pendingCall.callId,
output: JSON.stringify(humanDecision),
},
],
tools,
state,
});
const text = await resumed.getText(); onResponseReceived 钩子被触发,记录审计条目,模型接收到经过验证的决策。
立即开始构建
欧盟《人工智能法案》的高风险义务将于 2026 年 8 月生效。科罗拉多州的 ADMT 法律将于 2027 年 1 月 1 日生效。NIST AI RMF 是自愿性的,但正越来越多地被美国联邦机构作为基线期望来引用。一套实施方案(风险分类、审计日志、超时上报、持久化状态)即可满足所有三个框架的要求。
Agent SDK 负责处理暂停执行、跨重启持久化状态、根据模式验证人工响应以及干净地恢复执行。你的任务是将它集成到你的审核工作流和审计存储中。
有关相关的治理控制措施(预算上限、数据保留策略、模型限制),请参阅 Guardrails。
完整的 SDK 参考和工作示例:HITL 工具文档。
常见问题解答
欧盟《人工智能法案》第 14 条要求什么?
第14条要求高风险AI系统必须包含人工监督措施。人类必须能够理解系统的能力、监控其运行、解读输出结果,并能够干预或推翻决策。审计日志留存要求则属于第12条(记录保存)和第9条(风险管理)的范畴。
欧盟AI法案何时生效?
AI法案于2024年8月生效,但高风险义务(包括第14条的人工监督)从2026年8月起适用。这是被归类为高风险的系统必须证明其具备合规监督控制措施的最后期限。
科罗拉多州ADMT法律何时生效?
科罗拉多州的自动化决策技术法案(SB26-189)通常于2027年1月1日生效,适用于该日期或之后做出的重大决策。科罗拉多州总检察长的规则制定页面会跟踪实施细节。
科罗拉多州的ADMT法律是否适用于科罗拉多州以外的公司?
是的。该法律适用于任何在科罗拉多州"开展业务"的开发者或部署者,而不仅仅是总部设在该州的公司。如果你部署的ADMT对科罗拉多州居民的重大决策(就业、金融、住房、保险、医疗、教育、基本政府服务)产生实质性影响,你很可能需要遵守该法律。这与科罗拉多州隐私法案的管辖模式相同,后者涵盖在科罗拉多州开展业务或向科罗拉多州居民提供商业产品或服务的实体。执法通过科罗拉多州消费者保护法案进行(违规行为被视为欺骗性贸易行为)。
什么是AI智能体的人机协同(HITL)?
HITL意味着人类在AI智能体执行提议的行动之前对其进行审查并批准(或拒绝)。在Agent SDK中,这是通过onToolCalled(暂停执行并等待人工输入)和requireApproval(根据参数有条件地限制工具执行)来实现的。