5759c1862e
M0-M7 已完成:核心网关(身份/RBAC/TOTP/OIDC/SAML/Provider/配额/路由/内容策略/审计/定价)+ 资源市场(MCP/Skills/数字员工)。 含 22 个 PostgreSQL 迁移、管理端/门户端前端源码、OpenAPI 契约、部署 compose。 Co-Authored-By: Claude <noreply@anthropic.com>
131 lines
6.6 KiB
SQL
131 lines
6.6 KiB
SQL
-- 旗舰版资源市场:MCP 服务器 / Skills / 数字员工
|
|
-- 三类可发布资产 + 共享分类 + 市场安装(工作区绑定 + 权限)。
|
|
|
|
-- 共享市场分类(resource_type = '' 表示全局分类,适用所有资源类型)
|
|
CREATE TABLE IF NOT EXISTS gateway.marketplace_categories (
|
|
id uuid PRIMARY KEY,
|
|
name text NOT NULL UNIQUE,
|
|
description text NOT NULL DEFAULT '',
|
|
resource_type text NOT NULL DEFAULT ''
|
|
CHECK (resource_type IN ('', 'mcp_server', 'skill', 'digital_employee')),
|
|
sort_order integer NOT NULL DEFAULT 0 CHECK (sort_order >= 0),
|
|
created_by uuid REFERENCES gateway.admin_accounts(id),
|
|
created_at timestamptz NOT NULL DEFAULT clock_timestamp()
|
|
);
|
|
|
|
-- MCP 服务器:连接外部 MCP 服务器的注册信息(transport/endpoint/凭证)
|
|
CREATE TABLE IF NOT EXISTS gateway.mcp_servers (
|
|
id uuid PRIMARY KEY,
|
|
code text NOT NULL UNIQUE CHECK (code ~ '^[a-z][a-z0-9_-]{1,63}$'),
|
|
name text NOT NULL,
|
|
description text NOT NULL DEFAULT '',
|
|
transport text NOT NULL DEFAULT 'streamable-http'
|
|
CHECK (transport IN ('streamable-http', 'sse')),
|
|
endpoint_url text NOT NULL,
|
|
encrypted_headers bytea NOT NULL DEFAULT ''::bytea,
|
|
headers_kek_version integer NOT NULL DEFAULT 1,
|
|
status text NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'published', 'archived')),
|
|
category_id uuid REFERENCES gateway.marketplace_categories(id) ON DELETE SET NULL,
|
|
tags text[] NOT NULL DEFAULT '{}',
|
|
department_ids uuid[] NOT NULL DEFAULT '{}',
|
|
enabled boolean NOT NULL DEFAULT true,
|
|
revision bigint NOT NULL DEFAULT 1,
|
|
created_by uuid REFERENCES gateway.admin_accounts(id),
|
|
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
|
updated_at timestamptz NOT NULL DEFAULT clock_timestamp()
|
|
);
|
|
|
|
-- Skills:带绑定的提示词包(content + variables + 工具/MCP/知识库绑定)
|
|
CREATE TABLE IF NOT EXISTS gateway.skills (
|
|
id uuid PRIMARY KEY,
|
|
code text NOT NULL UNIQUE CHECK (code ~ '^[a-z][a-z0-9_-]{1,63}$'),
|
|
name text NOT NULL,
|
|
description text NOT NULL DEFAULT '',
|
|
content text NOT NULL CHECK (length(content) BETWEEN 1 AND 100000),
|
|
variables jsonb NOT NULL DEFAULT '[]'::jsonb CHECK (jsonb_typeof(variables) = 'array'),
|
|
tool_ids uuid[] NOT NULL DEFAULT '{}',
|
|
mcp_server_ids uuid[] NOT NULL DEFAULT '{}',
|
|
knowledge_base_ids uuid[] NOT NULL DEFAULT '{}',
|
|
status text NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'published', 'archived')),
|
|
category_id uuid REFERENCES gateway.marketplace_categories(id) ON DELETE SET NULL,
|
|
tags text[] NOT NULL DEFAULT '{}',
|
|
department_ids uuid[] NOT NULL DEFAULT '{}',
|
|
enabled boolean NOT NULL DEFAULT true,
|
|
revision bigint NOT NULL DEFAULT 1,
|
|
created_by uuid REFERENCES gateway.admin_accounts(id),
|
|
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
|
updated_at timestamptz NOT NULL DEFAULT clock_timestamp()
|
|
);
|
|
|
|
-- 数字员工:复合编排(persona + 模型 + 技能/工具/MCP/知识库绑定 + 生成参数)
|
|
CREATE TABLE IF NOT EXISTS gateway.digital_employees (
|
|
id uuid PRIMARY KEY,
|
|
code text NOT NULL UNIQUE CHECK (code ~ '^[a-z][a-z0-9_-]{2,63}$'),
|
|
name text NOT NULL,
|
|
description text NOT NULL DEFAULT '',
|
|
persona text NOT NULL DEFAULT '',
|
|
model text NOT NULL DEFAULT '',
|
|
skill_ids uuid[] NOT NULL DEFAULT '{}',
|
|
tool_ids uuid[] NOT NULL DEFAULT '{}',
|
|
mcp_server_ids uuid[] NOT NULL DEFAULT '{}',
|
|
knowledge_base_ids uuid[] NOT NULL DEFAULT '{}',
|
|
temperature numeric NOT NULL DEFAULT 0.7 CHECK (temperature >= 0 AND temperature <= 2),
|
|
retrieval_top_k integer NOT NULL DEFAULT 5 CHECK (retrieval_top_k BETWEEN 1 AND 50),
|
|
max_tool_rounds integer NOT NULL DEFAULT 5 CHECK (max_tool_rounds BETWEEN 1 AND 20),
|
|
status text NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'published', 'archived')),
|
|
category_id uuid REFERENCES gateway.marketplace_categories(id) ON DELETE SET NULL,
|
|
tags text[] NOT NULL DEFAULT '{}',
|
|
department_ids uuid[] NOT NULL DEFAULT '{}',
|
|
enabled boolean NOT NULL DEFAULT true,
|
|
revision bigint NOT NULL DEFAULT 1,
|
|
created_by uuid REFERENCES gateway.admin_accounts(id),
|
|
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
|
updated_at timestamptz NOT NULL DEFAULT clock_timestamp()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS gateway.digital_employee_runs (
|
|
id uuid PRIMARY KEY,
|
|
digital_employee_id uuid NOT NULL REFERENCES gateway.digital_employees(id) ON DELETE CASCADE,
|
|
api_key_id uuid REFERENCES gateway.api_keys(id) ON DELETE SET NULL,
|
|
request_id text NOT NULL,
|
|
status text NOT NULL CHECK (status IN ('success', 'error')),
|
|
latency_ms bigint NOT NULL DEFAULT 0,
|
|
retrieval_count integer NOT NULL DEFAULT 0,
|
|
tool_count integer NOT NULL DEFAULT 0,
|
|
error text NOT NULL DEFAULT '',
|
|
created_at timestamptz NOT NULL DEFAULT clock_timestamp()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS digital_employee_runs_de_time_idx
|
|
ON gateway.digital_employee_runs (digital_employee_id, created_at DESC);
|
|
|
|
-- 市场安装:portal 用户工作区绑定(资源权限:跨部门使用需先安装)
|
|
CREATE TABLE IF NOT EXISTS gateway.marketplace_installations (
|
|
id uuid PRIMARY KEY,
|
|
resource_type text NOT NULL
|
|
CHECK (resource_type IN ('mcp_server', 'skill', 'digital_employee')),
|
|
resource_id uuid NOT NULL,
|
|
portal_user_id uuid NOT NULL REFERENCES gateway.portal_users(id) ON DELETE CASCADE,
|
|
config_override jsonb NOT NULL DEFAULT '{}'::jsonb CHECK (jsonb_typeof(config_override) = 'object'),
|
|
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
|
UNIQUE (resource_type, resource_id, portal_user_id)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS marketplace_installations_user_idx
|
|
ON gateway.marketplace_installations (portal_user_id);
|
|
|
|
-- 市场可见性:published + enabled 的资源按更新时间倒序
|
|
CREATE INDEX IF NOT EXISTS mcp_servers_visible_idx
|
|
ON gateway.mcp_servers (status, enabled, updated_at DESC);
|
|
CREATE INDEX IF NOT EXISTS skills_visible_idx
|
|
ON gateway.skills (status, enabled, updated_at DESC);
|
|
CREATE INDEX IF NOT EXISTS digital_employees_visible_idx
|
|
ON gateway.digital_employees (status, enabled, updated_at DESC);
|
|
|
|
COMMENT ON TABLE gateway.mcp_servers IS
|
|
'Marketplace MCP server registrations (streamable-http/sse). Tools are discovered live via the MCP client, not stored.';
|
|
COMMENT ON TABLE gateway.digital_employees IS
|
|
'Composite digital employees: persona + model + bound skills/tools/MCP servers/knowledge bases.';
|
|
COMMENT ON TABLE gateway.marketplace_installations IS
|
|
'Portal workspace bindings granting cross-department access to published marketplace resources.';
|