d534865b33
- 节点任务:管理端向节点池下发(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 包测试通过,前后端构建通过。
47 lines
2.6 KiB
SQL
47 lines
2.6 KiB
SQL
-- 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()
|
|
);
|