Files
Aether/crates/aether-data/migrations/mysql/20260403000000_baseline.sql
2026-05-06 02:22:32 +08:00

792 lines
27 KiB
SQL

CREATE TABLE IF NOT EXISTS users (
id VARCHAR(64) PRIMARY KEY,
external_id VARCHAR(255),
email VARCHAR(320),
username VARCHAR(255),
password_hash VARCHAR(255),
role VARCHAR(64),
auth_source VARCHAR(64) NOT NULL DEFAULT 'local',
email_verified TINYINT(1) NOT NULL DEFAULT 0,
is_active TINYINT(1) NOT NULL DEFAULT 1,
is_deleted TINYINT(1) NOT NULL DEFAULT 0,
allowed_models TEXT,
allowed_providers TEXT,
allowed_api_formats TEXT,
model_capability_settings TEXT,
rate_limit INT,
metadata TEXT,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
last_login_at BIGINT,
UNIQUE KEY users_email_key (email),
UNIQUE KEY users_username_key (username)
);
CREATE TABLE IF NOT EXISTS api_keys (
id VARCHAR(64) PRIMARY KEY,
user_id VARCHAR(64) NOT NULL,
key_hash VARCHAR(255) NOT NULL,
key_encrypted TEXT,
name VARCHAR(255),
key_prefix VARCHAR(64),
status VARCHAR(64) NOT NULL DEFAULT 'active',
allowed_models TEXT,
allowed_providers TEXT,
allowed_api_formats TEXT,
rate_limit INT DEFAULT 100,
concurrent_limit INT,
force_capabilities TEXT,
is_active TINYINT(1) NOT NULL DEFAULT 1,
is_locked TINYINT(1) NOT NULL DEFAULT 0,
is_standalone TINYINT(1) NOT NULL DEFAULT 0,
auto_delete_on_expiry TINYINT(1) NOT NULL DEFAULT 0,
total_requests BIGINT NOT NULL DEFAULT 0,
total_tokens BIGINT NOT NULL DEFAULT 0,
total_cost_usd DOUBLE NOT NULL DEFAULT 0,
metadata TEXT,
expires_at BIGINT,
last_used_at BIGINT,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
UNIQUE KEY api_keys_key_hash_key (key_hash),
KEY api_keys_user_id_idx (user_id)
);
CREATE TABLE IF NOT EXISTS audit_logs (
id VARCHAR(64) PRIMARY KEY,
event_type VARCHAR(64) NOT NULL,
user_id VARCHAR(64),
api_key_id VARCHAR(64),
description TEXT NOT NULL,
ip_address VARCHAR(64),
user_agent VARCHAR(512),
request_id VARCHAR(128),
event_metadata TEXT,
status_code INT,
error_message TEXT,
created_at BIGINT NOT NULL,
KEY audit_logs_created_at_idx (created_at),
KEY audit_logs_event_type_idx (event_type),
KEY audit_logs_request_id_idx (request_id),
KEY audit_logs_user_id_idx (user_id)
);
CREATE TABLE IF NOT EXISTS announcements (
id VARCHAR(64) PRIMARY KEY,
title VARCHAR(200) NOT NULL,
content TEXT NOT NULL,
`type` VARCHAR(32) NOT NULL DEFAULT 'info',
priority INT NOT NULL DEFAULT 0,
author_id VARCHAR(64),
is_active TINYINT(1) NOT NULL DEFAULT 1,
is_pinned TINYINT(1) NOT NULL DEFAULT 0,
start_time BIGINT,
end_time BIGINT,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
KEY announcements_author_id_idx (author_id),
KEY announcements_created_at_idx (created_at),
KEY announcements_is_active_idx (is_active)
);
CREATE TABLE IF NOT EXISTS announcement_reads (
id VARCHAR(64) PRIMARY KEY,
user_id VARCHAR(64) NOT NULL,
announcement_id VARCHAR(64) NOT NULL,
read_at BIGINT NOT NULL,
UNIQUE KEY uq_user_announcement (user_id, announcement_id),
KEY announcement_reads_announcement_id_idx (announcement_id),
KEY announcement_reads_user_id_idx (user_id)
);
CREATE TABLE IF NOT EXISTS management_tokens (
id VARCHAR(64) PRIMARY KEY,
user_id VARCHAR(64) NOT NULL,
name VARCHAR(255) NOT NULL,
description TEXT,
token_hash VARCHAR(255) NOT NULL,
token_prefix VARCHAR(64),
allowed_ips TEXT,
expires_at BIGINT,
last_used_at BIGINT,
last_used_ip VARCHAR(255),
usage_count BIGINT NOT NULL DEFAULT 0,
is_active TINYINT(1) NOT NULL DEFAULT 1,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
UNIQUE KEY management_tokens_token_hash_key (token_hash),
UNIQUE KEY uq_management_tokens_user_name (user_id, name),
KEY management_tokens_user_id_idx (user_id)
);
CREATE TABLE IF NOT EXISTS billing_rules (
id VARCHAR(64) PRIMARY KEY,
global_model_id VARCHAR(64),
model_id VARCHAR(64),
name VARCHAR(255) NOT NULL,
task_type VARCHAR(64) NOT NULL DEFAULT 'chat',
expression TEXT NOT NULL,
variables TEXT NOT NULL,
dimension_mappings TEXT NOT NULL,
is_enabled TINYINT(1) NOT NULL DEFAULT 1,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
KEY billing_rules_global_model_task_idx (global_model_id, task_type, is_enabled),
KEY billing_rules_model_task_idx (model_id, task_type, is_enabled)
);
CREATE TABLE IF NOT EXISTS dimension_collectors (
id VARCHAR(64) PRIMARY KEY,
api_format VARCHAR(64) NOT NULL,
task_type VARCHAR(64) NOT NULL,
dimension_name VARCHAR(128) NOT NULL,
source_type VARCHAR(64) NOT NULL,
source_path VARCHAR(255),
value_type VARCHAR(64) NOT NULL DEFAULT 'float',
transform_expression TEXT,
default_value VARCHAR(255),
priority INT NOT NULL DEFAULT 0,
is_enabled TINYINT(1) NOT NULL DEFAULT 1,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
KEY dimension_collectors_enabled_idx (
api_format,
task_type,
dimension_name,
priority,
is_enabled
)
);
CREATE TABLE IF NOT EXISTS providers (
id VARCHAR(64) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
website VARCHAR(500),
provider_type VARCHAR(64) NOT NULL,
billing_type VARCHAR(64),
monthly_quota_usd DOUBLE,
monthly_used_usd DOUBLE,
quota_reset_day INT,
quota_last_reset_at BIGINT,
quota_expires_at BIGINT,
enabled TINYINT(1) NOT NULL DEFAULT 1,
is_active TINYINT(1) NOT NULL DEFAULT 1,
priority BIGINT NOT NULL DEFAULT 0,
provider_priority INT NOT NULL DEFAULT 100,
keep_priority_on_conversion TINYINT(1) NOT NULL DEFAULT 0,
enable_format_conversion TINYINT(1) NOT NULL DEFAULT 1,
concurrent_limit INT,
max_retries INT,
proxy TEXT,
request_timeout DOUBLE,
stream_first_byte_timeout DOUBLE,
config TEXT,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
UNIQUE KEY providers_name_key (name)
);
CREATE TABLE IF NOT EXISTS provider_api_keys (
id VARCHAR(64) PRIMARY KEY,
provider_id VARCHAR(64) NOT NULL,
name VARCHAR(255) NOT NULL,
api_key TEXT,
encrypted_key TEXT,
auth_type VARCHAR(32) NOT NULL DEFAULT 'api_key',
auth_config TEXT,
note TEXT,
internal_priority INT NOT NULL DEFAULT 50,
capabilities TEXT,
api_formats TEXT,
auth_type_by_format TEXT,
allow_auth_channel_mismatch_formats TEXT,
rate_multipliers TEXT,
global_priority_by_format TEXT,
allowed_models TEXT,
expires_at BIGINT,
cache_ttl_minutes INT NOT NULL DEFAULT 5,
max_probe_interval_minutes INT NOT NULL DEFAULT 32,
proxy TEXT,
fingerprint TEXT,
concurrent_limit INT,
learned_rpm_limit INT,
concurrent_429_count INT NOT NULL DEFAULT 0,
rpm_429_count INT NOT NULL DEFAULT 0,
last_429_at BIGINT,
last_429_type VARCHAR(64),
adjustment_history TEXT,
utilization_samples TEXT,
last_probe_increase_at BIGINT,
last_rpm_peak INT,
request_count BIGINT NOT NULL DEFAULT 0,
total_tokens BIGINT NOT NULL DEFAULT 0,
total_cost_usd DOUBLE NOT NULL DEFAULT 0,
success_count BIGINT NOT NULL DEFAULT 0,
error_count BIGINT NOT NULL DEFAULT 0,
total_response_time_ms BIGINT NOT NULL DEFAULT 0,
last_used_at BIGINT,
auto_fetch_models TINYINT(1) NOT NULL DEFAULT 0,
last_models_fetch_at BIGINT,
last_models_fetch_error TEXT,
locked_models TEXT,
model_include_patterns TEXT,
model_exclude_patterns TEXT,
upstream_metadata TEXT,
oauth_invalid_at BIGINT,
oauth_invalid_reason VARCHAR(255),
status_snapshot TEXT,
health_by_format TEXT,
circuit_breaker_by_format TEXT,
status VARCHAR(64) NOT NULL DEFAULT 'active',
is_active TINYINT(1) NOT NULL DEFAULT 1,
weight BIGINT NOT NULL DEFAULT 1,
rpm_limit BIGINT,
metadata TEXT,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
KEY provider_api_keys_provider_id_idx (provider_id)
);
CREATE TABLE IF NOT EXISTS gemini_file_mappings (
id VARCHAR(64) PRIMARY KEY,
file_name VARCHAR(512) NOT NULL,
key_id VARCHAR(64) NOT NULL,
user_id VARCHAR(64),
display_name VARCHAR(512),
mime_type VARCHAR(255),
source_hash VARCHAR(128),
created_at BIGINT NOT NULL,
expires_at BIGINT NOT NULL,
UNIQUE KEY gemini_file_mappings_file_name_key (file_name),
KEY gemini_file_mappings_key_id_idx (key_id),
KEY gemini_file_mappings_user_id_idx (user_id),
KEY gemini_file_mappings_expires_at_idx (expires_at),
KEY gemini_file_mappings_source_hash_idx (source_hash)
);
CREATE TABLE IF NOT EXISTS request_candidates (
id VARCHAR(64) PRIMARY KEY,
request_id VARCHAR(128) NOT NULL,
user_id VARCHAR(64),
api_key_id VARCHAR(64),
username VARCHAR(255),
api_key_name VARCHAR(255),
candidate_index INT NOT NULL,
retry_index INT NOT NULL DEFAULT 0,
provider_id VARCHAR(64),
endpoint_id VARCHAR(64),
key_id VARCHAR(64),
status VARCHAR(32) NOT NULL,
skip_reason TEXT,
is_cached TINYINT(1) NOT NULL DEFAULT 0,
status_code INT,
error_type VARCHAR(128),
error_message TEXT,
latency_ms INT,
concurrent_requests INT,
extra_data TEXT,
required_capabilities TEXT,
created_at BIGINT NOT NULL,
started_at BIGINT,
finished_at BIGINT,
UNIQUE KEY uq_request_candidate_with_retry (request_id, candidate_index, retry_index),
KEY request_candidates_request_id_idx (request_id),
KEY request_candidates_provider_id_idx (provider_id),
KEY request_candidates_endpoint_id_idx (endpoint_id),
KEY request_candidates_status_idx (status),
KEY request_candidates_created_at_idx (created_at),
KEY request_candidates_endpoint_status_created_idx (endpoint_id, status, created_at)
);
CREATE TABLE IF NOT EXISTS video_tasks (
id VARCHAR(64) PRIMARY KEY,
short_id VARCHAR(32),
request_id VARCHAR(128) NOT NULL,
user_id VARCHAR(64),
api_key_id VARCHAR(64),
username VARCHAR(255),
api_key_name VARCHAR(255),
external_task_id VARCHAR(255),
provider_id VARCHAR(64),
endpoint_id VARCHAR(64),
key_id VARCHAR(64),
client_api_format VARCHAR(128),
provider_api_format VARCHAR(128),
format_converted TINYINT(1) NOT NULL DEFAULT 0,
model VARCHAR(255),
prompt TEXT,
original_request_body TEXT,
duration_seconds INT,
resolution VARCHAR(64),
aspect_ratio VARCHAR(32),
size VARCHAR(64),
status VARCHAR(32) NOT NULL DEFAULT 'pending',
progress_percent INT NOT NULL DEFAULT 0,
progress_message TEXT,
retry_count INT NOT NULL DEFAULT 0,
poll_interval_seconds INT NOT NULL DEFAULT 10,
next_poll_at BIGINT,
poll_count INT NOT NULL DEFAULT 0,
max_poll_count INT NOT NULL DEFAULT 360,
created_at BIGINT NOT NULL,
submitted_at BIGINT,
completed_at BIGINT,
updated_at BIGINT NOT NULL,
error_code VARCHAR(128),
error_message TEXT,
video_url TEXT,
request_metadata TEXT,
UNIQUE KEY video_tasks_short_id_key (short_id),
UNIQUE KEY video_tasks_request_id_key (request_id),
KEY video_tasks_external_id_idx (external_task_id),
KEY video_tasks_next_poll_idx (next_poll_at),
KEY video_tasks_user_status_idx (user_id, status),
KEY video_tasks_api_key_id_idx (api_key_id),
KEY video_tasks_provider_id_idx (provider_id),
KEY video_tasks_endpoint_id_idx (endpoint_id),
KEY video_tasks_key_id_idx (key_id)
);
CREATE TABLE IF NOT EXISTS provider_endpoints (
id VARCHAR(64) PRIMARY KEY,
provider_id VARCHAR(64) NOT NULL,
name VARCHAR(255) NOT NULL,
base_url TEXT NOT NULL,
api_format VARCHAR(128),
api_family VARCHAR(128),
endpoint_kind VARCHAR(128),
enabled TINYINT(1) NOT NULL DEFAULT 1,
is_active TINYINT(1) NOT NULL DEFAULT 1,
health_score DOUBLE NOT NULL DEFAULT 1.0,
weight BIGINT NOT NULL DEFAULT 1,
header_rules TEXT,
body_rules TEXT,
max_retries INT,
custom_path TEXT,
metadata TEXT,
config TEXT,
format_acceptance_config TEXT,
proxy TEXT,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
KEY provider_endpoints_provider_id_idx (provider_id)
);
CREATE TABLE IF NOT EXISTS models (
id VARCHAR(64) PRIMARY KEY,
provider_id VARCHAR(64) NOT NULL,
global_model_id VARCHAR(64),
provider_model_name VARCHAR(255) NOT NULL,
global_model_name VARCHAR(255),
api_format VARCHAR(128),
enabled TINYINT(1) NOT NULL DEFAULT 1,
is_active TINYINT(1) NOT NULL DEFAULT 1,
is_available TINYINT(1) NOT NULL DEFAULT 1,
price_per_request DOUBLE,
tiered_pricing TEXT,
supports_vision TINYINT(1),
supports_function_calling TINYINT(1),
supports_streaming TINYINT(1),
supports_extended_thinking TINYINT(1),
supports_image_generation TINYINT(1),
provider_model_mappings TEXT,
config TEXT,
metadata TEXT,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
KEY models_provider_id_idx (provider_id)
);
CREATE TABLE IF NOT EXISTS global_models (
id VARCHAR(64) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
display_name VARCHAR(255),
enabled TINYINT(1) NOT NULL DEFAULT 1,
is_active TINYINT(1) NOT NULL DEFAULT 1,
default_price_per_request DOUBLE,
default_tiered_pricing TEXT,
supported_capabilities TEXT,
usage_count BIGINT NOT NULL DEFAULT 0,
config TEXT,
metadata TEXT,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
UNIQUE KEY global_models_name_key (name)
);
CREATE TABLE IF NOT EXISTS system_configs (
id VARCHAR(64) PRIMARY KEY,
`key` VARCHAR(255) NOT NULL,
value TEXT NOT NULL,
description TEXT,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
UNIQUE KEY system_configs_key_key (`key`)
);
CREATE TABLE IF NOT EXISTS auth_modules (
id VARCHAR(64) PRIMARY KEY,
module_type VARCHAR(128) NOT NULL,
enabled TINYINT(1) NOT NULL DEFAULT 1,
config TEXT NOT NULL,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
UNIQUE KEY auth_modules_module_type_key (module_type)
);
CREATE TABLE IF NOT EXISTS oauth_providers (
provider_type VARCHAR(64) PRIMARY KEY,
display_name VARCHAR(255) NOT NULL,
client_id TEXT NOT NULL,
client_secret_encrypted TEXT,
authorization_url_override VARCHAR(500),
token_url_override VARCHAR(500),
userinfo_url_override VARCHAR(500),
scopes TEXT,
redirect_uri VARCHAR(500) NOT NULL,
frontend_callback_url VARCHAR(500) NOT NULL,
attribute_mapping TEXT,
extra_config TEXT,
is_enabled TINYINT(1) NOT NULL DEFAULT 0,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL
);
CREATE TABLE IF NOT EXISTS ldap_configs (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
server_url VARCHAR(255) NOT NULL,
bind_dn TEXT NOT NULL,
bind_password_encrypted TEXT,
base_dn TEXT NOT NULL,
user_search_filter TEXT NOT NULL DEFAULT '(uid={username})',
username_attr VARCHAR(50) NOT NULL DEFAULT 'uid',
email_attr VARCHAR(50) NOT NULL DEFAULT 'mail',
display_name_attr VARCHAR(50) NOT NULL DEFAULT 'cn',
is_enabled TINYINT(1) NOT NULL DEFAULT 0,
is_exclusive TINYINT(1) NOT NULL DEFAULT 0,
use_starttls TINYINT(1) NOT NULL DEFAULT 0,
connect_timeout INT NOT NULL DEFAULT 10,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL
);
CREATE TABLE IF NOT EXISTS user_oauth_links (
id VARCHAR(64) PRIMARY KEY,
user_id VARCHAR(64) NOT NULL,
provider_type VARCHAR(64) NOT NULL,
provider_user_id VARCHAR(255) NOT NULL,
provider_username VARCHAR(255),
provider_email VARCHAR(255),
extra_data TEXT,
linked_at BIGINT NOT NULL,
last_login_at BIGINT,
KEY user_oauth_links_provider_type_idx (provider_type),
KEY user_oauth_links_user_id_idx (user_id)
);
CREATE TABLE IF NOT EXISTS proxy_nodes (
id VARCHAR(64) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
ip VARCHAR(512) NOT NULL,
port INT NOT NULL,
region VARCHAR(100),
status VARCHAR(32) NOT NULL DEFAULT 'online',
registered_by VARCHAR(64),
last_heartbeat_at BIGINT,
heartbeat_interval INT NOT NULL DEFAULT 30,
active_connections INT NOT NULL DEFAULT 0,
total_requests BIGINT NOT NULL DEFAULT 0,
avg_latency_ms DOUBLE,
is_manual TINYINT(1) NOT NULL DEFAULT 0,
proxy_url VARCHAR(500),
proxy_username VARCHAR(255),
proxy_password VARCHAR(500),
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
remote_config TEXT,
config_version INT NOT NULL DEFAULT 0,
hardware_info TEXT,
estimated_max_concurrency INT,
tunnel_mode TINYINT(1) NOT NULL DEFAULT 0,
tunnel_connected TINYINT(1) NOT NULL DEFAULT 0,
tunnel_connected_at BIGINT,
failed_requests BIGINT NOT NULL DEFAULT 0,
dns_failures BIGINT NOT NULL DEFAULT 0,
stream_errors BIGINT NOT NULL DEFAULT 0,
proxy_metadata TEXT
);
CREATE TABLE IF NOT EXISTS proxy_node_events (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
node_id VARCHAR(64) NOT NULL,
event_type VARCHAR(64) NOT NULL,
detail VARCHAR(500),
created_at BIGINT NOT NULL
);
CREATE TABLE IF NOT EXISTS wallets (
id VARCHAR(64) PRIMARY KEY,
user_id VARCHAR(64),
api_key_id VARCHAR(64),
balance DOUBLE NOT NULL DEFAULT 0,
gift_balance DOUBLE NOT NULL DEFAULT 0,
limit_mode VARCHAR(64) NOT NULL DEFAULT 'finite',
currency VARCHAR(16) NOT NULL DEFAULT 'USD',
status VARCHAR(64) NOT NULL DEFAULT 'active',
total_recharged DOUBLE NOT NULL DEFAULT 0,
total_consumed DOUBLE NOT NULL DEFAULT 0,
total_refunded DOUBLE NOT NULL DEFAULT 0,
total_adjusted DOUBLE NOT NULL DEFAULT 0,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
UNIQUE KEY wallets_user_id_key (user_id),
UNIQUE KEY wallets_api_key_id_key (api_key_id),
KEY wallets_api_key_id_idx (api_key_id),
KEY wallets_user_id_idx (user_id)
);
CREATE TABLE IF NOT EXISTS wallet_transactions (
id VARCHAR(64) PRIMARY KEY,
wallet_id VARCHAR(64) NOT NULL,
category VARCHAR(64) NOT NULL,
reason_code VARCHAR(64) NOT NULL,
amount DOUBLE NOT NULL,
balance_before DOUBLE NOT NULL,
balance_after DOUBLE NOT NULL,
recharge_balance_before DOUBLE NOT NULL,
recharge_balance_after DOUBLE NOT NULL,
gift_balance_before DOUBLE NOT NULL,
gift_balance_after DOUBLE NOT NULL,
link_type VARCHAR(64),
link_id VARCHAR(128),
operator_id VARCHAR(64),
description TEXT,
created_at BIGINT NOT NULL,
KEY idx_wallet_tx_wallet_created (wallet_id, created_at),
KEY idx_wallet_tx_category_created (category, created_at),
KEY idx_wallet_tx_reason_created (reason_code, created_at),
KEY idx_wallet_tx_link (link_type, link_id),
KEY ix_wallet_transactions_operator_id (operator_id)
);
CREATE TABLE IF NOT EXISTS wallet_daily_usage_ledgers (
id VARCHAR(64) PRIMARY KEY,
wallet_id VARCHAR(64) NOT NULL,
billing_date VARCHAR(16) NOT NULL,
billing_timezone VARCHAR(64) NOT NULL,
total_cost_usd DOUBLE NOT NULL DEFAULT 0,
total_requests BIGINT NOT NULL DEFAULT 0,
input_tokens BIGINT NOT NULL DEFAULT 0,
output_tokens BIGINT NOT NULL DEFAULT 0,
cache_creation_tokens BIGINT NOT NULL DEFAULT 0,
cache_read_tokens BIGINT NOT NULL DEFAULT 0,
first_finalized_at BIGINT,
last_finalized_at BIGINT,
aggregated_at BIGINT NOT NULL,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
KEY idx_wallet_daily_usage_wallet_date (wallet_id, billing_timezone, billing_date)
);
CREATE TABLE IF NOT EXISTS payment_orders (
id VARCHAR(64) PRIMARY KEY,
order_no VARCHAR(128) NOT NULL,
wallet_id VARCHAR(64) NOT NULL,
user_id VARCHAR(64),
amount_usd DOUBLE NOT NULL,
pay_amount DOUBLE,
pay_currency VARCHAR(16),
exchange_rate DOUBLE,
refunded_amount_usd DOUBLE NOT NULL DEFAULT 0,
refundable_amount_usd DOUBLE NOT NULL DEFAULT 0,
payment_method VARCHAR(64) NOT NULL,
gateway_order_id VARCHAR(128),
gateway_response TEXT,
status VARCHAR(64) NOT NULL DEFAULT 'pending',
created_at BIGINT NOT NULL,
paid_at BIGINT,
credited_at BIGINT,
expires_at BIGINT,
UNIQUE KEY uq_payment_orders_order_no (order_no),
KEY idx_payment_orders_wallet_created (wallet_id, created_at),
KEY idx_payment_orders_user_created (user_id, created_at),
KEY idx_payment_orders_status (status),
KEY idx_payment_orders_gateway_order_id (gateway_order_id)
);
CREATE TABLE IF NOT EXISTS payment_callbacks (
id VARCHAR(64) PRIMARY KEY,
payment_order_id VARCHAR(64),
payment_method VARCHAR(64) NOT NULL,
callback_key VARCHAR(128) NOT NULL,
order_no VARCHAR(128),
gateway_order_id VARCHAR(128),
payload_hash VARCHAR(128),
signature_valid TINYINT(1) NOT NULL DEFAULT 0,
status VARCHAR(64) NOT NULL DEFAULT 'received',
payload TEXT,
error_message TEXT,
created_at BIGINT NOT NULL,
processed_at BIGINT,
UNIQUE KEY uq_payment_callbacks_callback_key (callback_key),
KEY idx_payment_callbacks_order (order_no),
KEY idx_payment_callbacks_gateway_order (gateway_order_id),
KEY idx_payment_callbacks_created (created_at),
KEY ix_payment_callbacks_payment_order_id (payment_order_id)
);
CREATE TABLE IF NOT EXISTS refund_requests (
id VARCHAR(64) PRIMARY KEY,
refund_no VARCHAR(128) NOT NULL,
wallet_id VARCHAR(64) NOT NULL,
user_id VARCHAR(64),
payment_order_id VARCHAR(64),
source_type VARCHAR(64) NOT NULL,
source_id VARCHAR(128),
refund_mode VARCHAR(64) NOT NULL,
amount_usd DOUBLE NOT NULL,
status VARCHAR(64) NOT NULL DEFAULT 'pending_approval',
reason TEXT,
requested_by VARCHAR(64),
approved_by VARCHAR(64),
processed_by VARCHAR(64),
gateway_refund_id VARCHAR(128),
payout_method VARCHAR(64),
payout_reference VARCHAR(255),
payout_proof TEXT,
failure_reason TEXT,
idempotency_key VARCHAR(128),
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
processed_at BIGINT,
completed_at BIGINT,
UNIQUE KEY uq_refund_requests_refund_no (refund_no),
UNIQUE KEY uq_refund_requests_idempotency_key (idempotency_key),
KEY idx_refund_wallet_created (wallet_id, created_at),
KEY idx_refund_user_created (user_id, created_at),
KEY idx_refund_status (status),
KEY ix_refund_requests_payment_order_id (payment_order_id),
KEY ix_refund_requests_requested_by (requested_by),
KEY ix_refund_requests_approved_by (approved_by),
KEY ix_refund_requests_processed_by (processed_by)
);
CREATE TABLE IF NOT EXISTS redeem_code_batches (
id VARCHAR(64) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
amount_usd DOUBLE NOT NULL,
currency VARCHAR(16) NOT NULL DEFAULT 'USD',
balance_bucket VARCHAR(64) NOT NULL DEFAULT 'gift',
total_count INT NOT NULL,
status VARCHAR(64) NOT NULL DEFAULT 'active',
description TEXT,
created_by VARCHAR(64),
expires_at BIGINT,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
KEY idx_redeem_code_batches_status (status, created_at)
);
CREATE TABLE IF NOT EXISTS redeem_codes (
id VARCHAR(64) PRIMARY KEY,
batch_id VARCHAR(64) NOT NULL,
code_hash VARCHAR(128) NOT NULL,
code_prefix VARCHAR(16) NOT NULL,
code_suffix VARCHAR(16) NOT NULL,
status VARCHAR(64) NOT NULL DEFAULT 'active',
redeemed_by_user_id VARCHAR(64),
redeemed_wallet_id VARCHAR(64),
redeemed_payment_order_id VARCHAR(64),
redeemed_at BIGINT,
disabled_by VARCHAR(64),
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
UNIQUE KEY uq_redeem_codes_code_hash (code_hash),
KEY idx_redeem_codes_batch_created (batch_id, created_at),
KEY idx_redeem_codes_status (status, updated_at),
KEY idx_redeem_codes_redeemed_user (redeemed_by_user_id, redeemed_at),
KEY idx_redeem_codes_redeemed_order (redeemed_payment_order_id)
);
CREATE TABLE IF NOT EXISTS `usage` (
request_id VARCHAR(128) PRIMARY KEY,
id VARCHAR(128),
user_id VARCHAR(64),
api_key_id VARCHAR(64),
provider_name VARCHAR(255) NOT NULL DEFAULT 'unknown',
model VARCHAR(255) NOT NULL DEFAULT 'unknown',
target_model VARCHAR(255),
provider_id VARCHAR(64),
provider_endpoint_id VARCHAR(64),
provider_api_key_id VARCHAR(64),
request_type VARCHAR(64),
api_format VARCHAR(64),
api_family VARCHAR(64),
endpoint_kind VARCHAR(64),
endpoint_api_format VARCHAR(64),
provider_api_family VARCHAR(64),
provider_endpoint_kind VARCHAR(64),
has_format_conversion TINYINT(1) NOT NULL DEFAULT 0,
is_stream TINYINT(1) NOT NULL DEFAULT 0,
input_tokens BIGINT NOT NULL DEFAULT 0,
output_tokens BIGINT NOT NULL DEFAULT 0,
total_tokens BIGINT NOT NULL DEFAULT 0,
cache_creation_input_tokens BIGINT NOT NULL DEFAULT 0,
cache_creation_ephemeral_5m_input_tokens BIGINT NOT NULL DEFAULT 0,
cache_creation_ephemeral_1h_input_tokens BIGINT NOT NULL DEFAULT 0,
cache_read_input_tokens BIGINT NOT NULL DEFAULT 0,
cache_creation_cost_usd DOUBLE NOT NULL DEFAULT 0,
cache_read_cost_usd DOUBLE NOT NULL DEFAULT 0,
output_price_per_1m DOUBLE,
status_code INT,
error_message TEXT,
error_category VARCHAR(255),
response_time_ms BIGINT,
first_byte_time_ms BIGINT,
wallet_id VARCHAR(64),
status VARCHAR(64) NOT NULL DEFAULT 'completed',
billing_status VARCHAR(64) NOT NULL DEFAULT 'pending',
total_cost_usd DOUBLE NOT NULL DEFAULT 0,
actual_total_cost_usd DOUBLE NOT NULL DEFAULT 0,
request_metadata TEXT,
candidate_id VARCHAR(128),
candidate_index BIGINT,
key_name VARCHAR(255),
planner_kind VARCHAR(64),
route_family VARCHAR(128),
route_kind VARCHAR(128),
execution_path VARCHAR(128),
local_execution_runtime_miss_reason VARCHAR(255),
wallet_balance_before DOUBLE,
wallet_balance_after DOUBLE,
wallet_recharge_balance_before DOUBLE,
wallet_recharge_balance_after DOUBLE,
wallet_gift_balance_before DOUBLE,
wallet_gift_balance_after DOUBLE,
finalized_at BIGINT,
created_at_unix_ms BIGINT NOT NULL DEFAULT 0,
updated_at_unix_secs BIGINT NOT NULL DEFAULT 0,
KEY usage_api_key_id_idx (api_key_id),
KEY usage_billing_status_idx (billing_status),
KEY usage_created_at_idx (created_at_unix_ms),
KEY usage_provider_api_key_id_idx (provider_api_key_id),
KEY usage_provider_id_idx (provider_id),
KEY usage_request_id_idx (request_id),
KEY usage_user_id_idx (user_id),
KEY usage_wallet_id_idx (wallet_id)
);
CREATE TABLE IF NOT EXISTS usage_settlement_snapshots (
request_id VARCHAR(128) PRIMARY KEY,
billing_status VARCHAR(64) NOT NULL,
wallet_id VARCHAR(64),
wallet_balance_before DOUBLE,
wallet_balance_after DOUBLE,
wallet_recharge_balance_before DOUBLE,
wallet_recharge_balance_after DOUBLE,
wallet_gift_balance_before DOUBLE,
wallet_gift_balance_after DOUBLE,
provider_monthly_used_usd DOUBLE,
finalized_at BIGINT,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
KEY usage_settlement_snapshots_billing_status_idx (billing_status),
KEY usage_settlement_snapshots_wallet_id_idx (wallet_id)
);