0.11.4: 旗舰版第五轮完善(智能体节点任务下发/个人智能体安全策略)

- 节点任务:管理端向节点池下发(Prompt/HTTP/MCP/Skill/数字员工/自定义),
  指定节点或池路由,认领 SKIP LOCKED + 15 分钟租约,认领令牌防重放上报,
  失败 30s×次数退避重入队,达上限 failed,支持取消/重试,完成与失败站内信。
- 个人智能体安全策略:auto_approve_tools 跳过个人调用审批门;
  rate_limit_multiplier 按 (tool,user) 独立窗口放宽个人限流(全局额度不受影响)。
- 修复存量缺陷:/v1/agent/nodes/ 未挂 publicMux,节点心跳/认领端点在部署
  拓扑下不可达。
- 迁移 000046;任务全链路集成测试连真实库通过,HTTP 端到端验证
  (下发→认领→伪造令牌拒绝→上报→succeeded,列表不泄露认领令牌);
  25 包测试通过,前后端构建通过。
This commit is contained in:
LLMGuardX Dev
2026-08-13 14:30:37 +08:00
parent 87c2b04174
commit d534865b33
16 changed files with 1082 additions and 15 deletions
+46
View File
@@ -0,0 +1,46 @@
-- 000046_agent_tasks.sql — 智能体节点任务下发/认领/上报 + 个人智能体安全策略。
-- 任务表:管理员下发,节点经令牌认证后按池认领(SKIP LOCKED),执行后上报结果;
-- 失败按 attempts/max_attempts 退避重入队。
CREATE TABLE IF NOT EXISTS gateway.agent_tasks (
id uuid PRIMARY KEY,
task_type varchar(32) NOT NULL CHECK (task_type IN ('prompt', 'http', 'mcp_invoke', 'skill_run', 'digital_employee', 'custom')),
payload jsonb NOT NULL DEFAULT '{}'::jsonb,
pool_type varchar(16) NOT NULL DEFAULT 'private' CHECK (pool_type IN ('public', 'private')),
pool_code varchar(64) NOT NULL DEFAULT 'default',
node_id uuid REFERENCES gateway.agent_nodes(id) ON DELETE SET NULL,
status varchar(16) NOT NULL DEFAULT 'queued' CHECK (status IN ('queued', 'claimed', 'running', 'succeeded', 'failed', 'cancelled')),
claim_token varchar(64),
attempts integer NOT NULL DEFAULT 0 CHECK (attempts >= 0),
max_attempts integer NOT NULL DEFAULT 3 CHECK (max_attempts BETWEEN 1 AND 10),
result jsonb,
error text NOT NULL DEFAULT '' CHECK (length(error) <= 4000),
created_by uuid REFERENCES gateway.admin_accounts(id) ON DELETE SET NULL,
available_at timestamptz NOT NULL DEFAULT clock_timestamp(),
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
claimed_at timestamptz,
finished_at timestamptz
);
CREATE INDEX IF NOT EXISTS agent_tasks_queue_idx
ON gateway.agent_tasks (status, available_at, created_at)
WHERE status IN ('queued', 'claimed');
CREATE INDEX IF NOT EXISTS agent_tasks_time_idx
ON gateway.agent_tasks (created_at DESC);
-- 工具限流窗口支持按用户拆分:portal_user_id 为全零哨兵表示非个人调用(全局窗口),
-- 个人调用按 (tool_id, portal_user_id) 独立计数,便于个人限流倍数。
ALTER TABLE gateway.tool_rate_usage
DROP CONSTRAINT IF EXISTS tool_rate_usage_pkey;
ALTER TABLE gateway.tool_rate_usage
ADD COLUMN IF NOT EXISTS portal_user_id uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
ADD PRIMARY KEY (tool_id, portal_user_id, window_start);
-- 个人智能体安全策略:个人调用跳过工具审批标记、按倍数放宽个人限流。
CREATE TABLE IF NOT EXISTS gateway.portal_agent_policies (
portal_user_id uuid PRIMARY KEY REFERENCES gateway.portal_users(id) ON DELETE CASCADE,
auto_approve_tools boolean NOT NULL DEFAULT false,
rate_limit_multiplier integer NOT NULL DEFAULT 1 CHECK (rate_limit_multiplier BETWEEN 1 AND 100),
updated_at timestamptz NOT NULL DEFAULT clock_timestamp()
);