Files
Aether/crates/aether-data/runtime/schema/generated/sqlite/baseline/006_usage.sql
T
elky 579f2c7cc1 feat(security): harden gateway boundaries and usage policies
Consolidate subscription usage policy enforcement, privacy-safe persistence, and gateway security hardening into one reviewable change.

Includes bounded HTTP and execution envelopes, header and protocol guards, DNS and relay validation, authentication and secret projection hardening, secure backup/install paths, and regression coverage.
2026-09-04 03:45:52 +08:00

275 lines
12 KiB
SQL

-- Generated by aether-data-schema from crates/aether-data/runtime/schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS "usage" (
request_id TEXT PRIMARY KEY NOT NULL,
id TEXT,
user_id TEXT,
api_key_id TEXT,
provider_name TEXT NOT NULL DEFAULT 'unknown',
model TEXT NOT NULL DEFAULT 'unknown',
target_model TEXT,
provider_id TEXT,
provider_endpoint_id TEXT,
provider_api_key_id TEXT,
request_type TEXT,
api_format TEXT,
api_family TEXT,
endpoint_kind TEXT,
endpoint_api_format TEXT,
provider_api_family TEXT,
provider_endpoint_kind TEXT,
has_format_conversion INTEGER NOT NULL DEFAULT 0,
is_stream INTEGER NOT NULL DEFAULT 0,
upstream_is_stream INTEGER,
input_tokens INTEGER NOT NULL DEFAULT 0,
output_tokens INTEGER NOT NULL DEFAULT 0,
input_output_total_tokens INTEGER NOT NULL DEFAULT 0,
total_tokens INTEGER NOT NULL DEFAULT 0,
cache_creation_input_tokens INTEGER NOT NULL DEFAULT 0,
cache_creation_input_tokens_5m INTEGER NOT NULL DEFAULT 0,
cache_creation_input_tokens_1h INTEGER NOT NULL DEFAULT 0,
cache_creation_ephemeral_5m_input_tokens INTEGER NOT NULL DEFAULT 0,
cache_creation_ephemeral_1h_input_tokens INTEGER NOT NULL DEFAULT 0,
cache_read_input_tokens INTEGER NOT NULL DEFAULT 0,
input_context_tokens INTEGER NOT NULL DEFAULT 0,
input_cost_usd REAL NOT NULL DEFAULT 0,
output_cost_usd REAL NOT NULL DEFAULT 0,
cache_cost_usd REAL NOT NULL DEFAULT 0,
cache_creation_cost_usd REAL NOT NULL DEFAULT 0,
cache_creation_cost_usd_5m REAL NOT NULL DEFAULT 0,
cache_creation_cost_usd_1h REAL NOT NULL DEFAULT 0,
cache_read_cost_usd REAL NOT NULL DEFAULT 0,
request_cost_usd REAL NOT NULL DEFAULT 0,
actual_input_cost_usd REAL NOT NULL DEFAULT 0,
actual_output_cost_usd REAL NOT NULL DEFAULT 0,
actual_cache_cost_usd REAL NOT NULL DEFAULT 0,
actual_cache_creation_cost_usd REAL NOT NULL DEFAULT 0,
actual_cache_creation_cost_usd_5m REAL NOT NULL DEFAULT 0,
actual_cache_creation_cost_usd_1h REAL NOT NULL DEFAULT 0,
actual_cache_read_cost_usd REAL NOT NULL DEFAULT 0,
actual_request_cost_usd REAL NOT NULL DEFAULT 0,
rate_multiplier REAL NOT NULL DEFAULT 1,
input_price_per_1m REAL,
output_price_per_1m REAL,
cache_creation_price_per_1m REAL,
cache_creation_price_per_1m_5m REAL,
cache_creation_price_per_1m_1h REAL,
cache_read_price_per_1m REAL,
price_per_request REAL,
status_code INTEGER,
error_message TEXT,
error_category TEXT,
response_time_ms INTEGER,
first_byte_time_ms INTEGER,
wallet_id TEXT,
status TEXT NOT NULL DEFAULT 'completed',
billing_status TEXT NOT NULL DEFAULT 'pending',
total_cost_usd REAL NOT NULL DEFAULT 0,
actual_total_cost_usd REAL NOT NULL DEFAULT 0,
request_headers TEXT,
request_body TEXT,
provider_request_headers TEXT,
provider_request_body TEXT,
response_headers TEXT,
response_body TEXT,
client_response_headers TEXT,
client_response_body TEXT,
request_body_compressed BLOB,
provider_request_body_compressed BLOB,
response_body_compressed BLOB,
client_response_body_compressed BLOB,
request_metadata TEXT,
created_at INTEGER,
candidate_id TEXT,
candidate_index INTEGER,
key_name TEXT,
username TEXT,
api_key_name TEXT,
planner_kind TEXT,
route_family TEXT,
route_kind TEXT,
execution_path TEXT,
local_execution_runtime_miss_reason TEXT,
wallet_balance_before REAL,
wallet_balance_after REAL,
wallet_recharge_balance_before REAL,
wallet_recharge_balance_after REAL,
wallet_gift_balance_before REAL,
wallet_gift_balance_after REAL,
finalized_at INTEGER,
created_at_unix_ms INTEGER NOT NULL DEFAULT 0,
updated_at_unix_secs INTEGER NOT NULL DEFAULT 0
);
CREATE INDEX IF NOT EXISTS usage_api_key_id_idx ON "usage" (api_key_id);
CREATE INDEX IF NOT EXISTS usage_billing_status_idx ON "usage" (billing_status);
CREATE INDEX IF NOT EXISTS usage_created_at_idx ON "usage" (created_at_unix_ms);
CREATE INDEX IF NOT EXISTS usage_provider_api_key_id_idx ON "usage" (provider_api_key_id);
CREATE INDEX IF NOT EXISTS usage_provider_id_idx ON "usage" (provider_id);
CREATE INDEX IF NOT EXISTS usage_request_id_idx ON "usage" (request_id);
CREATE INDEX IF NOT EXISTS usage_user_id_idx ON "usage" (user_id);
CREATE INDEX IF NOT EXISTS usage_wallet_id_idx ON "usage" (wallet_id);
CREATE TABLE IF NOT EXISTS usage_body_blobs (
body_ref TEXT PRIMARY KEY NOT NULL,
request_id TEXT NOT NULL,
body_field TEXT NOT NULL,
payload_gzip BLOB NOT NULL,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
UNIQUE (request_id, body_field),
CONSTRAINT usage_body_blobs_request_id_fkey FOREIGN KEY (request_id) REFERENCES usage (request_id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS ix_usage_body_blobs_request_id ON usage_body_blobs (request_id);
CREATE TABLE IF NOT EXISTS usage_http_audits (
request_id TEXT PRIMARY KEY NOT NULL,
request_headers TEXT,
provider_request_headers TEXT,
response_headers TEXT,
client_response_headers TEXT,
request_body_ref TEXT,
provider_request_body_ref TEXT,
response_body_ref TEXT,
client_response_body_ref TEXT,
request_body_state TEXT,
provider_request_body_state TEXT,
response_body_state TEXT,
client_response_body_state TEXT,
body_capture_mode TEXT NOT NULL DEFAULT 'none',
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
CONSTRAINT usage_http_audits_request_id_fkey FOREIGN KEY (request_id) REFERENCES usage (request_id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS ix_usage_http_audits_updated_at ON usage_http_audits (updated_at);
CREATE TABLE IF NOT EXISTS usage_routing_snapshots (
request_id TEXT PRIMARY KEY NOT NULL,
candidate_id TEXT,
candidate_index INTEGER,
key_name TEXT,
planner_kind TEXT,
route_family TEXT,
route_kind TEXT,
execution_path TEXT,
local_execution_runtime_miss_reason TEXT,
selected_provider_id TEXT,
selected_endpoint_id TEXT,
selected_provider_api_key_id TEXT,
has_format_conversion INTEGER,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
CONSTRAINT usage_routing_snapshots_request_id_fkey FOREIGN KEY (request_id) REFERENCES usage (request_id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS ix_usage_routing_snapshots_route_family_kind ON usage_routing_snapshots (route_family, route_kind);
CREATE INDEX IF NOT EXISTS ix_usage_routing_snapshots_candidate_id ON usage_routing_snapshots (candidate_id);
CREATE TABLE IF NOT EXISTS usage_counter_deltas (
id TEXT PRIMARY KEY NOT NULL,
request_id TEXT NOT NULL,
kind TEXT NOT NULL,
target_id TEXT NOT NULL,
target_tunnel_generation TEXT,
request_count_delta INTEGER NOT NULL DEFAULT 0,
total_requests_delta INTEGER NOT NULL DEFAULT 0,
success_count_delta INTEGER NOT NULL DEFAULT 0,
error_count_delta INTEGER NOT NULL DEFAULT 0,
dns_failures_delta INTEGER NOT NULL DEFAULT 0,
stream_errors_delta INTEGER NOT NULL DEFAULT 0,
total_tokens_delta INTEGER NOT NULL DEFAULT 0,
total_cost_usd_delta REAL NOT NULL DEFAULT 0,
total_response_time_ms_delta INTEGER NOT NULL DEFAULT 0,
last_used_at_unix_secs INTEGER,
last_used_ip TEXT,
candidate_last_used_at_unix_secs INTEGER,
removed_last_used_at_unix_secs INTEGER,
usage_created_at_unix_secs INTEGER,
created_at INTEGER NOT NULL,
processed_at INTEGER
);
CREATE INDEX IF NOT EXISTS ix_usage_counter_deltas_unprocessed ON usage_counter_deltas (created_at, id);
CREATE INDEX IF NOT EXISTS ix_usage_counter_deltas_processed ON usage_counter_deltas (processed_at, created_at, id);
CREATE INDEX IF NOT EXISTS ix_usage_counter_deltas_request_kind ON usage_counter_deltas (request_id, kind, target_id);
CREATE TABLE IF NOT EXISTS usage_settlement_snapshots (
request_id TEXT PRIMARY KEY NOT NULL,
billing_status TEXT NOT NULL,
wallet_id TEXT,
wallet_balance_before REAL,
wallet_balance_after REAL,
wallet_recharge_balance_before REAL,
wallet_recharge_balance_after REAL,
wallet_gift_balance_before REAL,
wallet_gift_balance_after REAL,
provider_monthly_used_usd REAL,
billing_snapshot_schema_version TEXT,
billing_snapshot_status TEXT,
rate_multiplier REAL,
is_free_tier INTEGER,
input_price_per_1m REAL,
output_price_per_1m REAL,
cache_creation_price_per_1m REAL,
cache_read_price_per_1m REAL,
price_per_request REAL,
settlement_snapshot_schema_version TEXT,
settlement_snapshot TEXT,
billing_dimensions TEXT,
billing_input_tokens INTEGER,
billing_effective_input_tokens INTEGER,
billing_output_tokens INTEGER,
billing_cache_creation_tokens INTEGER,
billing_cache_creation_5m_tokens INTEGER,
billing_cache_creation_1h_tokens INTEGER,
billing_cache_read_tokens INTEGER,
billing_total_input_context INTEGER,
billing_cache_creation_cost_usd REAL,
billing_cache_read_cost_usd REAL,
billing_total_cost_usd REAL,
billing_actual_total_cost_usd REAL,
billing_pricing_source TEXT,
billing_rule_id TEXT,
billing_rule_version TEXT,
finalized_at INTEGER,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS usage_settlement_snapshots_billing_status_idx ON usage_settlement_snapshots (billing_status);
CREATE INDEX IF NOT EXISTS usage_settlement_snapshots_wallet_id_idx ON usage_settlement_snapshots (wallet_id);
CREATE INDEX IF NOT EXISTS ix_usage_settlement_snapshots_schema_version ON usage_settlement_snapshots (settlement_snapshot_schema_version);
CREATE INDEX IF NOT EXISTS ix_usage_settlement_snapshots_pricing_source ON usage_settlement_snapshots (billing_pricing_source);
CREATE TABLE IF NOT EXISTS usage_cost_reservations (
request_id TEXT NOT NULL,
subject_id TEXT NOT NULL,
reservation_token TEXT PRIMARY KEY NOT NULL,
admitted_at INTEGER NOT NULL,
reserved_cost_units INTEGER NOT NULL,
actual_cost_units INTEGER,
state TEXT NOT NULL,
reservation_expires_at INTEGER NOT NULL,
retain_until INTEGER NOT NULL,
finalized_at INTEGER,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
CONSTRAINT usage_cost_reservations_subject_id_fkey FOREIGN KEY (subject_id) REFERENCES users (id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS usage_cost_reservations_request_id_idx ON usage_cost_reservations (request_id);
CREATE INDEX IF NOT EXISTS usage_cost_reservations_subject_admitted_at_idx ON usage_cost_reservations (subject_id, admitted_at);
CREATE INDEX IF NOT EXISTS usage_cost_reservations_reservation_expires_at_idx ON usage_cost_reservations (reservation_expires_at);
CREATE INDEX IF NOT EXISTS usage_cost_reservations_retain_until_token_idx ON usage_cost_reservations (retain_until, reservation_token);
CREATE TABLE IF NOT EXISTS usage_request_admissions (
request_id TEXT NOT NULL,
subject_id TEXT NOT NULL,
event_token TEXT PRIMARY KEY NOT NULL,
admitted_at INTEGER NOT NULL,
retain_until INTEGER NOT NULL,
state TEXT NOT NULL,
released_at INTEGER,
created_at INTEGER NOT NULL,
CONSTRAINT usage_request_admissions_subject_id_fkey FOREIGN KEY (subject_id) REFERENCES users (id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS usage_request_admissions_subject_admitted_at_idx ON usage_request_admissions (subject_id, admitted_at);
CREATE INDEX IF NOT EXISTS usage_request_admissions_retain_until_token_idx ON usage_request_admissions (retain_until, event_token);