AI Gateway Go 0.10.0 源码快照 + 旗舰版需求规划报告
M0-M7 已完成:核心网关(身份/RBAC/TOTP/OIDC/SAML/Provider/配额/路由/内容策略/审计/定价)+ 资源市场(MCP/Skills/数字员工)。 含 22 个 PostgreSQL 迁移、管理端/门户端前端源码、OpenAPI 契约、部署 compose。 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
CREATE SCHEMA IF NOT EXISTS gateway;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS gateway.outbox_events (
|
||||
event_id uuid PRIMARY KEY,
|
||||
event_type text NOT NULL,
|
||||
event_version integer NOT NULL CHECK (event_version > 0),
|
||||
tenant_id uuid,
|
||||
aggregate_type text NOT NULL,
|
||||
aggregate_id text NOT NULL,
|
||||
payload jsonb NOT NULL,
|
||||
trace_context jsonb NOT NULL DEFAULT '{}'::jsonb,
|
||||
occurred_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
available_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
attempts integer NOT NULL DEFAULT 0 CHECK (attempts >= 0),
|
||||
locked_at timestamptz,
|
||||
locked_by text,
|
||||
processed_at timestamptz,
|
||||
last_error text
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS outbox_events_pending_idx
|
||||
ON gateway.outbox_events (available_at, occurred_at)
|
||||
WHERE processed_at IS NULL;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS gateway.event_consumptions (
|
||||
subscriber text NOT NULL,
|
||||
event_id uuid NOT NULL,
|
||||
consumed_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
PRIMARY KEY (subscriber, event_id)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS gateway.api_keys (
|
||||
id uuid PRIMARY KEY,
|
||||
tenant_id uuid,
|
||||
name text NOT NULL,
|
||||
key_prefix varchar(16) NOT NULL,
|
||||
key_hash bytea NOT NULL,
|
||||
scopes text[] NOT NULL DEFAULT '{}',
|
||||
enabled boolean NOT NULL DEFAULT true,
|
||||
expires_at timestamptz,
|
||||
last_used_at timestamptz,
|
||||
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
updated_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
UNIQUE (key_prefix, key_hash)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS api_keys_tenant_idx ON gateway.api_keys (tenant_id, enabled);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS gateway.providers (
|
||||
id uuid PRIMARY KEY,
|
||||
tenant_id uuid,
|
||||
code text NOT NULL,
|
||||
adapter text NOT NULL,
|
||||
base_url text NOT NULL,
|
||||
encrypted_credentials bytea NOT NULL,
|
||||
credential_kek_version integer NOT NULL,
|
||||
capabilities text[] NOT NULL DEFAULT '{}',
|
||||
config jsonb NOT NULL DEFAULT '{}'::jsonb,
|
||||
enabled boolean NOT NULL DEFAULT true,
|
||||
revision bigint NOT NULL DEFAULT 1,
|
||||
created_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
updated_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
UNIQUE NULLS NOT DISTINCT (tenant_id, code)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS gateway.audit_events (
|
||||
id uuid NOT NULL,
|
||||
tenant_id uuid,
|
||||
request_id text NOT NULL,
|
||||
actor_id uuid,
|
||||
api_key_id uuid,
|
||||
provider_code text,
|
||||
model text,
|
||||
protocol text NOT NULL,
|
||||
status_code integer,
|
||||
prompt_tokens bigint CHECK (prompt_tokens IS NULL OR prompt_tokens >= 0),
|
||||
completion_tokens bigint CHECK (completion_tokens IS NULL OR completion_tokens >= 0),
|
||||
cost_microunits bigint CHECK (cost_microunits IS NULL OR cost_microunits >= 0),
|
||||
latency_ms integer CHECK (latency_ms IS NULL OR latency_ms >= 0),
|
||||
request_preview text CHECK (request_preview IS NULL OR octet_length(request_preview) <= 65536),
|
||||
response_preview text CHECK (response_preview IS NULL OR octet_length(response_preview) <= 65536),
|
||||
labels jsonb NOT NULL DEFAULT '{}'::jsonb,
|
||||
recorded_at timestamptz NOT NULL DEFAULT clock_timestamp(),
|
||||
PRIMARY KEY (id, recorded_at)
|
||||
) PARTITION BY RANGE (recorded_at);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS gateway.audit_events_default
|
||||
PARTITION OF gateway.audit_events DEFAULT;
|
||||
|
||||
CREATE INDEX IF NOT EXISTS audit_events_default_tenant_time_idx
|
||||
ON gateway.audit_events_default (tenant_id, recorded_at DESC);
|
||||
CREATE INDEX IF NOT EXISTS audit_events_default_request_idx
|
||||
ON gateway.audit_events_default (request_id);
|
||||
|
||||
COMMENT ON TABLE gateway.audit_events IS
|
||||
'PostgreSQL baseline audit storage. Full unbounded bodies are deliberately not retained.';
|
||||
|
||||
Reference in New Issue
Block a user