mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-01 17:00:21 +08:00
chore: resolve pr 377 checks
This commit is contained in:
791
crates/aether-data/migrations/mysql/20260403000000_baseline.sql
Normal file
791
crates/aether-data/migrations/mysql/20260403000000_baseline.sql
Normal file
@@ -0,0 +1,791 @@
|
||||
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)
|
||||
);
|
||||
@@ -0,0 +1,18 @@
|
||||
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)
|
||||
);
|
||||
@@ -0,0 +1,44 @@
|
||||
CREATE TABLE IF NOT EXISTS user_preferences (
|
||||
id VARCHAR(36) PRIMARY KEY,
|
||||
user_id VARCHAR(36) NOT NULL UNIQUE,
|
||||
avatar_url VARCHAR(500),
|
||||
bio TEXT,
|
||||
default_provider_id VARCHAR(36),
|
||||
theme VARCHAR(20) NOT NULL DEFAULT 'light',
|
||||
language VARCHAR(10) NOT NULL DEFAULT 'zh-CN',
|
||||
timezone VARCHAR(50) NOT NULL DEFAULT 'Asia/Shanghai',
|
||||
email_notifications BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
usage_alerts BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
announcement_notifications BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
created_at BIGINT NOT NULL,
|
||||
updated_at BIGINT NOT NULL,
|
||||
INDEX user_preferences_default_provider_id_idx (default_provider_id),
|
||||
INDEX user_preferences_user_id_idx (user_id)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS user_sessions (
|
||||
id VARCHAR(36) PRIMARY KEY,
|
||||
user_id VARCHAR(36) NOT NULL,
|
||||
client_device_id VARCHAR(128) NOT NULL,
|
||||
device_label VARCHAR(120),
|
||||
device_type VARCHAR(20) NOT NULL DEFAULT 'unknown',
|
||||
browser_name VARCHAR(50),
|
||||
browser_version VARCHAR(50),
|
||||
os_name VARCHAR(50),
|
||||
os_version VARCHAR(50),
|
||||
device_model VARCHAR(100),
|
||||
ip_address VARCHAR(45),
|
||||
user_agent VARCHAR(1000),
|
||||
client_hints TEXT,
|
||||
refresh_token_hash VARCHAR(64) NOT NULL,
|
||||
prev_refresh_token_hash VARCHAR(64),
|
||||
rotated_at BIGINT,
|
||||
last_seen_at BIGINT NOT NULL,
|
||||
expires_at BIGINT NOT NULL,
|
||||
revoked_at BIGINT,
|
||||
revoke_reason VARCHAR(100),
|
||||
created_at BIGINT NOT NULL,
|
||||
updated_at BIGINT NOT NULL,
|
||||
INDEX user_sessions_user_active_idx (user_id, revoked_at, expires_at),
|
||||
INDEX user_sessions_user_device_idx (user_id, client_device_id)
|
||||
);
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE users ADD COLUMN ldap_dn VARCHAR(1024);
|
||||
ALTER TABLE users ADD COLUMN ldap_username VARCHAR(255);
|
||||
@@ -0,0 +1,3 @@
|
||||
ALTER TABLE user_oauth_links
|
||||
ADD UNIQUE KEY uq_user_oauth_links_provider_user (provider_type, provider_user_id),
|
||||
ADD UNIQUE KEY uq_user_oauth_links_user_provider (user_id, provider_type);
|
||||
@@ -0,0 +1,177 @@
|
||||
CREATE TABLE IF NOT EXISTS stats_hourly (
|
||||
id VARCHAR(64) PRIMARY KEY,
|
||||
hour_utc BIGINT NOT NULL,
|
||||
total_requests BIGINT NOT NULL DEFAULT 0,
|
||||
success_requests BIGINT NOT NULL DEFAULT 0,
|
||||
error_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,
|
||||
total_cost DOUBLE NOT NULL DEFAULT 0,
|
||||
actual_total_cost DOUBLE NOT NULL DEFAULT 0,
|
||||
avg_response_time_ms DOUBLE NOT NULL DEFAULT 0,
|
||||
is_complete TINYINT(1) NOT NULL DEFAULT 0,
|
||||
aggregated_at BIGINT,
|
||||
created_at BIGINT NOT NULL,
|
||||
updated_at BIGINT NOT NULL,
|
||||
UNIQUE KEY uq_stats_hourly_hour (hour_utc)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_hourly_user (
|
||||
id VARCHAR(64) PRIMARY KEY,
|
||||
hour_utc BIGINT NOT NULL,
|
||||
user_id VARCHAR(64) NOT NULL,
|
||||
total_requests BIGINT NOT NULL DEFAULT 0,
|
||||
success_requests BIGINT NOT NULL DEFAULT 0,
|
||||
error_requests BIGINT NOT NULL DEFAULT 0,
|
||||
input_tokens BIGINT NOT NULL DEFAULT 0,
|
||||
output_tokens BIGINT NOT NULL DEFAULT 0,
|
||||
total_cost DOUBLE NOT NULL DEFAULT 0,
|
||||
created_at BIGINT NOT NULL,
|
||||
updated_at BIGINT NOT NULL,
|
||||
UNIQUE KEY uq_stats_hourly_user (hour_utc, user_id)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_hourly_user_model (
|
||||
id VARCHAR(64) PRIMARY KEY,
|
||||
hour_utc BIGINT NOT NULL,
|
||||
user_id VARCHAR(64) NOT NULL,
|
||||
model VARCHAR(255) NOT NULL,
|
||||
total_requests BIGINT NOT NULL DEFAULT 0,
|
||||
input_tokens BIGINT NOT NULL DEFAULT 0,
|
||||
output_tokens BIGINT NOT NULL DEFAULT 0,
|
||||
total_cost DOUBLE NOT NULL DEFAULT 0,
|
||||
created_at BIGINT NOT NULL,
|
||||
updated_at BIGINT NOT NULL,
|
||||
UNIQUE KEY uq_stats_hourly_user_model (hour_utc, user_id, model)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_hourly_model (
|
||||
id VARCHAR(64) PRIMARY KEY,
|
||||
hour_utc BIGINT NOT NULL,
|
||||
model VARCHAR(255) NOT NULL,
|
||||
total_requests BIGINT NOT NULL DEFAULT 0,
|
||||
input_tokens BIGINT NOT NULL DEFAULT 0,
|
||||
output_tokens BIGINT NOT NULL DEFAULT 0,
|
||||
total_cost DOUBLE NOT NULL DEFAULT 0,
|
||||
avg_response_time_ms DOUBLE NOT NULL DEFAULT 0,
|
||||
created_at BIGINT NOT NULL,
|
||||
updated_at BIGINT NOT NULL,
|
||||
UNIQUE KEY uq_stats_hourly_model (hour_utc, model)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_hourly_provider (
|
||||
id VARCHAR(64) PRIMARY KEY,
|
||||
hour_utc BIGINT NOT NULL,
|
||||
provider_name VARCHAR(255) NOT NULL,
|
||||
total_requests BIGINT NOT NULL DEFAULT 0,
|
||||
input_tokens BIGINT NOT NULL DEFAULT 0,
|
||||
output_tokens BIGINT NOT NULL DEFAULT 0,
|
||||
total_cost DOUBLE NOT NULL DEFAULT 0,
|
||||
created_at BIGINT NOT NULL,
|
||||
updated_at BIGINT NOT NULL,
|
||||
UNIQUE KEY uq_stats_hourly_provider (hour_utc, provider_name)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_daily (
|
||||
id VARCHAR(64) PRIMARY KEY,
|
||||
`date` BIGINT NOT NULL,
|
||||
total_requests BIGINT NOT NULL DEFAULT 0,
|
||||
success_requests BIGINT NOT NULL DEFAULT 0,
|
||||
error_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,
|
||||
total_cost DOUBLE NOT NULL DEFAULT 0,
|
||||
actual_total_cost DOUBLE NOT NULL DEFAULT 0,
|
||||
avg_response_time_ms DOUBLE NOT NULL DEFAULT 0,
|
||||
fallback_count BIGINT NOT NULL DEFAULT 0,
|
||||
unique_models BIGINT NOT NULL DEFAULT 0,
|
||||
unique_providers BIGINT NOT NULL DEFAULT 0,
|
||||
is_complete TINYINT(1) NOT NULL DEFAULT 0,
|
||||
aggregated_at BIGINT,
|
||||
created_at BIGINT NOT NULL,
|
||||
updated_at BIGINT NOT NULL,
|
||||
UNIQUE KEY uq_stats_daily_date (`date`)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_daily_model (
|
||||
id VARCHAR(64) PRIMARY KEY,
|
||||
`date` BIGINT NOT NULL,
|
||||
model VARCHAR(255) NOT NULL,
|
||||
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,
|
||||
total_cost DOUBLE NOT NULL DEFAULT 0,
|
||||
avg_response_time_ms DOUBLE NOT NULL DEFAULT 0,
|
||||
created_at BIGINT NOT NULL,
|
||||
updated_at BIGINT NOT NULL,
|
||||
UNIQUE KEY uq_stats_daily_model (`date`, model)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_daily_provider (
|
||||
id VARCHAR(64) PRIMARY KEY,
|
||||
`date` BIGINT NOT NULL,
|
||||
provider_name VARCHAR(255) NOT NULL,
|
||||
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,
|
||||
total_cost DOUBLE NOT NULL DEFAULT 0,
|
||||
created_at BIGINT NOT NULL,
|
||||
updated_at BIGINT NOT NULL,
|
||||
UNIQUE KEY uq_stats_daily_provider (`date`, provider_name)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_daily_api_key (
|
||||
id VARCHAR(64) PRIMARY KEY,
|
||||
api_key_id VARCHAR(64) NOT NULL,
|
||||
`date` BIGINT NOT NULL,
|
||||
total_requests BIGINT NOT NULL DEFAULT 0,
|
||||
success_requests BIGINT NOT NULL DEFAULT 0,
|
||||
error_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,
|
||||
total_cost DOUBLE NOT NULL DEFAULT 0,
|
||||
api_key_name VARCHAR(255),
|
||||
created_at BIGINT NOT NULL,
|
||||
updated_at BIGINT NOT NULL,
|
||||
UNIQUE KEY uq_stats_daily_api_key (`date`, api_key_id)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_daily_error (
|
||||
id VARCHAR(64) PRIMARY KEY,
|
||||
`date` BIGINT NOT NULL,
|
||||
error_category VARCHAR(255) NOT NULL,
|
||||
provider_name VARCHAR(255),
|
||||
model VARCHAR(255),
|
||||
count BIGINT NOT NULL DEFAULT 0,
|
||||
created_at BIGINT NOT NULL,
|
||||
updated_at BIGINT NOT NULL,
|
||||
UNIQUE KEY uq_stats_daily_error (`date`, error_category, provider_name, model)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_user_daily (
|
||||
id VARCHAR(64) PRIMARY KEY,
|
||||
user_id VARCHAR(64) NOT NULL,
|
||||
`date` BIGINT NOT NULL,
|
||||
total_requests BIGINT NOT NULL DEFAULT 0,
|
||||
success_requests BIGINT NOT NULL DEFAULT 0,
|
||||
error_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,
|
||||
total_cost DOUBLE NOT NULL DEFAULT 0,
|
||||
username VARCHAR(255),
|
||||
created_at BIGINT NOT NULL,
|
||||
updated_at BIGINT NOT NULL,
|
||||
UNIQUE KEY uq_stats_user_daily (`date`, user_id)
|
||||
);
|
||||
@@ -165,6 +165,8 @@ CREATE TABLE IF NOT EXISTS public.api_keys (
|
||||
key_hash character varying(64) NOT NULL,
|
||||
key_encrypted text,
|
||||
name character varying(100),
|
||||
key_prefix character varying(64),
|
||||
status character varying(64) DEFAULT 'active'::character varying NOT NULL,
|
||||
total_requests integer DEFAULT 0,
|
||||
total_cost_usd numeric(20,8) DEFAULT '0'::double precision,
|
||||
is_standalone boolean DEFAULT false NOT NULL,
|
||||
@@ -178,6 +180,7 @@ CREATE TABLE IF NOT EXISTS public.api_keys (
|
||||
last_used_at timestamp with time zone,
|
||||
expires_at timestamp with time zone,
|
||||
auto_delete_on_expiry boolean DEFAULT false NOT NULL,
|
||||
metadata json,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
is_locked boolean DEFAULT false NOT NULL,
|
||||
@@ -276,15 +279,17 @@ CREATE TABLE IF NOT EXISTS public.gemini_file_mappings (
|
||||
CREATE TABLE IF NOT EXISTS public.global_models (
|
||||
id character varying(36) NOT NULL,
|
||||
name character varying(100) NOT NULL,
|
||||
display_name character varying(100) NOT NULL,
|
||||
display_name character varying(100),
|
||||
enabled boolean DEFAULT true NOT NULL,
|
||||
default_price_per_request numeric(20,8),
|
||||
default_tiered_pricing json NOT NULL,
|
||||
default_tiered_pricing json,
|
||||
supported_capabilities json,
|
||||
is_active boolean DEFAULT true NOT NULL,
|
||||
usage_count integer DEFAULT 0 NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
config jsonb
|
||||
config jsonb,
|
||||
metadata json
|
||||
);
|
||||
|
||||
|
||||
@@ -366,8 +371,11 @@ CREATE TABLE IF NOT EXISTS public.management_tokens (
|
||||
CREATE TABLE IF NOT EXISTS public.models (
|
||||
id character varying(36) NOT NULL,
|
||||
provider_id character varying(36) NOT NULL,
|
||||
global_model_id character varying(36) NOT NULL,
|
||||
global_model_id character varying(36),
|
||||
provider_model_name character varying(200) NOT NULL,
|
||||
global_model_name character varying(255),
|
||||
api_format character varying(128),
|
||||
enabled boolean DEFAULT true NOT NULL,
|
||||
price_per_request numeric(20,8),
|
||||
tiered_pricing json,
|
||||
supports_vision boolean,
|
||||
@@ -380,7 +388,8 @@ CREATE TABLE IF NOT EXISTS public.models (
|
||||
config json,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
provider_model_mappings jsonb
|
||||
provider_model_mappings jsonb,
|
||||
metadata json
|
||||
);
|
||||
|
||||
|
||||
@@ -465,6 +474,7 @@ CREATE TABLE IF NOT EXISTS public.payment_orders (
|
||||
CREATE TABLE IF NOT EXISTS public.provider_api_keys (
|
||||
id character varying(36) NOT NULL,
|
||||
api_key text,
|
||||
encrypted_key text,
|
||||
name character varying(100) NOT NULL,
|
||||
note character varying(500),
|
||||
internal_priority integer DEFAULT 50,
|
||||
@@ -515,7 +525,10 @@ CREATE TABLE IF NOT EXISTS public.provider_api_keys (
|
||||
fingerprint json,
|
||||
total_tokens bigint NOT NULL,
|
||||
total_cost_usd numeric(20,8) NOT NULL,
|
||||
status_snapshot json
|
||||
status_snapshot json,
|
||||
status character varying(64) DEFAULT 'active'::character varying NOT NULL,
|
||||
weight bigint DEFAULT 1 NOT NULL,
|
||||
metadata json
|
||||
);
|
||||
|
||||
|
||||
@@ -527,10 +540,13 @@ CREATE TABLE IF NOT EXISTS public.provider_api_keys (
|
||||
CREATE TABLE IF NOT EXISTS public.provider_endpoints (
|
||||
id character varying(36) NOT NULL,
|
||||
provider_id character varying(36) NOT NULL,
|
||||
api_format character varying(50) NOT NULL,
|
||||
name character varying(255),
|
||||
api_format character varying(50),
|
||||
base_url character varying(500) NOT NULL,
|
||||
max_retries integer DEFAULT 3,
|
||||
enabled boolean DEFAULT true NOT NULL,
|
||||
is_active boolean DEFAULT true NOT NULL,
|
||||
weight bigint DEFAULT 1 NOT NULL,
|
||||
custom_path character varying(200),
|
||||
config json,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
@@ -541,7 +557,8 @@ CREATE TABLE IF NOT EXISTS public.provider_endpoints (
|
||||
api_family character varying(50),
|
||||
endpoint_kind character varying(50),
|
||||
body_rules json,
|
||||
health_score double precision DEFAULT 1.0 NOT NULL
|
||||
health_score double precision DEFAULT 1.0 NOT NULL,
|
||||
metadata json
|
||||
);
|
||||
|
||||
|
||||
@@ -582,6 +599,8 @@ CREATE TABLE IF NOT EXISTS public.providers (
|
||||
quota_reset_day integer DEFAULT 30,
|
||||
quota_last_reset_at timestamp with time zone,
|
||||
quota_expires_at timestamp with time zone,
|
||||
enabled boolean DEFAULT true NOT NULL,
|
||||
priority bigint DEFAULT 0 NOT NULL,
|
||||
provider_priority integer DEFAULT 100,
|
||||
is_active boolean DEFAULT true NOT NULL,
|
||||
concurrent_limit integer,
|
||||
@@ -1002,6 +1021,22 @@ CREATE TABLE IF NOT EXISTS public.system_configs (
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Name: auth_modules; Type: TABLE; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.auth_modules (
|
||||
id character varying(36) NOT NULL,
|
||||
module_type character varying(128) NOT NULL,
|
||||
enabled boolean DEFAULT true NOT NULL,
|
||||
config json NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT auth_modules_pkey PRIMARY KEY (id),
|
||||
CONSTRAINT auth_modules_module_type_key UNIQUE (module_type)
|
||||
);
|
||||
|
||||
|
||||
|
||||
--
|
||||
-- Name: usage; Type: TABLE; Schema: public; Owner: -
|
||||
@@ -1075,6 +1110,8 @@ CREATE TABLE IF NOT EXISTS public.usage (
|
||||
provider_endpoint_kind character varying(50),
|
||||
cache_creation_input_tokens_5m integer DEFAULT 0 NOT NULL,
|
||||
cache_creation_input_tokens_1h integer DEFAULT 0 NOT NULL,
|
||||
cache_creation_ephemeral_5m_input_tokens integer DEFAULT 0 NOT NULL,
|
||||
cache_creation_ephemeral_1h_input_tokens integer DEFAULT 0 NOT NULL,
|
||||
wallet_id character varying(36),
|
||||
wallet_balance_before numeric(20,8),
|
||||
wallet_balance_after numeric(20,8),
|
||||
@@ -1092,7 +1129,9 @@ CREATE TABLE IF NOT EXISTS public.usage (
|
||||
actual_cache_creation_cost_usd_1h numeric(20,8) DEFAULT '0'::numeric NOT NULL,
|
||||
actual_cache_cost_usd numeric(20,8) DEFAULT '0'::numeric NOT NULL,
|
||||
cache_creation_price_per_1m_5m numeric(20,8),
|
||||
cache_creation_price_per_1m_1h numeric(20,8)
|
||||
cache_creation_price_per_1m_1h numeric(20,8),
|
||||
created_at_unix_ms bigint DEFAULT 0 NOT NULL,
|
||||
updated_at_unix_secs bigint DEFAULT 0 NOT NULL
|
||||
);
|
||||
|
||||
|
||||
@@ -1189,6 +1228,7 @@ CREATE TABLE IF NOT EXISTS public.user_sessions (
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.users (
|
||||
id character varying(36) NOT NULL,
|
||||
external_id character varying(255),
|
||||
email character varying(255),
|
||||
username character varying(100) NOT NULL,
|
||||
password_hash character varying(255),
|
||||
@@ -1206,7 +1246,8 @@ CREATE TABLE IF NOT EXISTS public.users (
|
||||
ldap_dn character varying(512),
|
||||
ldap_username character varying(255),
|
||||
email_verified boolean NOT NULL,
|
||||
rate_limit integer
|
||||
rate_limit integer,
|
||||
metadata json
|
||||
);
|
||||
|
||||
|
||||
@@ -4579,7 +4620,6 @@ EXCEPTION
|
||||
WHEN duplicate_table THEN NULL;
|
||||
WHEN invalid_table_definition THEN NULL;
|
||||
END $mig$;
|
||||
|
||||
-- Restore a normal lookup path before sqlx records this migration in the
|
||||
-- same transaction. sqlx inserts into `_sqlx_migrations` unqualified.
|
||||
SELECT pg_catalog.set_config('search_path', 'public', true);
|
||||
@@ -0,0 +1,61 @@
|
||||
ALTER TABLE public.users
|
||||
ADD COLUMN IF NOT EXISTS external_id character varying(255),
|
||||
ADD COLUMN IF NOT EXISTS metadata json;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.auth_modules (
|
||||
id character varying(36) NOT NULL,
|
||||
module_type character varying(128) NOT NULL,
|
||||
enabled boolean DEFAULT true NOT NULL,
|
||||
config json NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
updated_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT auth_modules_pkey PRIMARY KEY (id),
|
||||
CONSTRAINT auth_modules_module_type_key UNIQUE (module_type)
|
||||
);
|
||||
|
||||
ALTER TABLE public.api_keys
|
||||
ADD COLUMN IF NOT EXISTS key_prefix character varying(64),
|
||||
ADD COLUMN IF NOT EXISTS status character varying(64) DEFAULT 'active'::character varying NOT NULL,
|
||||
ADD COLUMN IF NOT EXISTS metadata json;
|
||||
|
||||
ALTER TABLE public.providers
|
||||
ADD COLUMN IF NOT EXISTS enabled boolean DEFAULT true NOT NULL,
|
||||
ADD COLUMN IF NOT EXISTS priority bigint DEFAULT 0 NOT NULL;
|
||||
|
||||
ALTER TABLE public.provider_api_keys
|
||||
ADD COLUMN IF NOT EXISTS encrypted_key text,
|
||||
ADD COLUMN IF NOT EXISTS status character varying(64) DEFAULT 'active'::character varying NOT NULL,
|
||||
ADD COLUMN IF NOT EXISTS weight bigint DEFAULT 1 NOT NULL,
|
||||
ADD COLUMN IF NOT EXISTS metadata json;
|
||||
|
||||
ALTER TABLE public.provider_endpoints
|
||||
ADD COLUMN IF NOT EXISTS name character varying(255),
|
||||
ADD COLUMN IF NOT EXISTS enabled boolean DEFAULT true NOT NULL,
|
||||
ADD COLUMN IF NOT EXISTS weight bigint DEFAULT 1 NOT NULL,
|
||||
ADD COLUMN IF NOT EXISTS metadata json;
|
||||
|
||||
ALTER TABLE public.provider_endpoints
|
||||
ALTER COLUMN api_format DROP NOT NULL;
|
||||
|
||||
ALTER TABLE public.global_models
|
||||
ADD COLUMN IF NOT EXISTS enabled boolean DEFAULT true NOT NULL,
|
||||
ADD COLUMN IF NOT EXISTS metadata json;
|
||||
|
||||
ALTER TABLE public.global_models
|
||||
ALTER COLUMN display_name DROP NOT NULL,
|
||||
ALTER COLUMN default_tiered_pricing DROP NOT NULL;
|
||||
|
||||
ALTER TABLE public.models
|
||||
ADD COLUMN IF NOT EXISTS global_model_name character varying(255),
|
||||
ADD COLUMN IF NOT EXISTS api_format character varying(128),
|
||||
ADD COLUMN IF NOT EXISTS enabled boolean DEFAULT true NOT NULL,
|
||||
ADD COLUMN IF NOT EXISTS metadata json;
|
||||
|
||||
ALTER TABLE public.models
|
||||
ALTER COLUMN global_model_id DROP NOT NULL;
|
||||
|
||||
ALTER TABLE public.usage
|
||||
ADD COLUMN IF NOT EXISTS cache_creation_ephemeral_5m_input_tokens integer DEFAULT 0 NOT NULL,
|
||||
ADD COLUMN IF NOT EXISTS cache_creation_ephemeral_1h_input_tokens integer DEFAULT 0 NOT NULL,
|
||||
ADD COLUMN IF NOT EXISTS created_at_unix_ms bigint DEFAULT 0 NOT NULL,
|
||||
ADD COLUMN IF NOT EXISTS updated_at_unix_secs bigint DEFAULT 0 NOT NULL;
|
||||
810
crates/aether-data/migrations/sqlite/20260403000000_baseline.sql
Normal file
810
crates/aether-data/migrations/sqlite/20260403000000_baseline.sql
Normal file
@@ -0,0 +1,810 @@
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id TEXT PRIMARY KEY,
|
||||
external_id TEXT,
|
||||
email TEXT UNIQUE,
|
||||
username TEXT UNIQUE,
|
||||
password_hash TEXT,
|
||||
role TEXT,
|
||||
auth_source TEXT NOT NULL DEFAULT 'local',
|
||||
email_verified INTEGER NOT NULL DEFAULT 0,
|
||||
is_active INTEGER NOT NULL DEFAULT 1,
|
||||
is_deleted INTEGER NOT NULL DEFAULT 0,
|
||||
allowed_models TEXT,
|
||||
allowed_providers TEXT,
|
||||
allowed_api_formats TEXT,
|
||||
model_capability_settings TEXT,
|
||||
rate_limit INTEGER,
|
||||
metadata TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
last_login_at INTEGER
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS api_keys (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
key_hash TEXT NOT NULL UNIQUE,
|
||||
key_encrypted TEXT,
|
||||
name TEXT,
|
||||
key_prefix TEXT,
|
||||
status TEXT NOT NULL DEFAULT 'active',
|
||||
allowed_models TEXT,
|
||||
allowed_providers TEXT,
|
||||
allowed_api_formats TEXT,
|
||||
rate_limit INTEGER DEFAULT 100,
|
||||
concurrent_limit INTEGER,
|
||||
force_capabilities TEXT,
|
||||
is_active INTEGER NOT NULL DEFAULT 1,
|
||||
is_locked INTEGER NOT NULL DEFAULT 0,
|
||||
is_standalone INTEGER NOT NULL DEFAULT 0,
|
||||
auto_delete_on_expiry INTEGER NOT NULL DEFAULT 0,
|
||||
total_requests INTEGER NOT NULL DEFAULT 0,
|
||||
total_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
total_cost_usd REAL NOT NULL DEFAULT 0,
|
||||
metadata TEXT,
|
||||
expires_at INTEGER,
|
||||
last_used_at INTEGER,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS api_keys_user_id_idx ON api_keys (user_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS audit_logs (
|
||||
id TEXT PRIMARY KEY,
|
||||
event_type TEXT NOT NULL,
|
||||
user_id TEXT,
|
||||
api_key_id TEXT,
|
||||
description TEXT NOT NULL,
|
||||
ip_address TEXT,
|
||||
user_agent TEXT,
|
||||
request_id TEXT,
|
||||
event_metadata TEXT,
|
||||
status_code INTEGER,
|
||||
error_message TEXT,
|
||||
created_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS audit_logs_created_at_idx ON audit_logs (created_at);
|
||||
CREATE INDEX IF NOT EXISTS audit_logs_event_type_idx ON audit_logs (event_type);
|
||||
CREATE INDEX IF NOT EXISTS audit_logs_request_id_idx ON audit_logs (request_id);
|
||||
CREATE INDEX IF NOT EXISTS audit_logs_user_id_idx ON audit_logs (user_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS announcements (
|
||||
id TEXT PRIMARY KEY,
|
||||
title TEXT NOT NULL,
|
||||
content TEXT NOT NULL,
|
||||
type TEXT NOT NULL DEFAULT 'info',
|
||||
priority INTEGER NOT NULL DEFAULT 0,
|
||||
author_id TEXT,
|
||||
is_active INTEGER NOT NULL DEFAULT 1,
|
||||
is_pinned INTEGER NOT NULL DEFAULT 0,
|
||||
start_time INTEGER,
|
||||
end_time INTEGER,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS announcements_author_id_idx ON announcements (author_id);
|
||||
CREATE INDEX IF NOT EXISTS announcements_created_at_idx ON announcements (created_at);
|
||||
CREATE INDEX IF NOT EXISTS announcements_is_active_idx ON announcements (is_active);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS announcement_reads (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
announcement_id TEXT NOT NULL,
|
||||
read_at INTEGER NOT NULL,
|
||||
UNIQUE (user_id, announcement_id)
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS announcement_reads_announcement_id_idx ON announcement_reads (announcement_id);
|
||||
CREATE INDEX IF NOT EXISTS announcement_reads_user_id_idx ON announcement_reads (user_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS management_tokens (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
description TEXT,
|
||||
token_hash TEXT NOT NULL UNIQUE,
|
||||
token_prefix TEXT,
|
||||
allowed_ips TEXT,
|
||||
expires_at INTEGER,
|
||||
last_used_at INTEGER,
|
||||
last_used_ip TEXT,
|
||||
usage_count INTEGER NOT NULL DEFAULT 0,
|
||||
is_active INTEGER NOT NULL DEFAULT 1,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
UNIQUE (user_id, name)
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS management_tokens_user_id_idx ON management_tokens (user_id);
|
||||
CREATE TABLE IF NOT EXISTS billing_rules (
|
||||
id TEXT PRIMARY KEY,
|
||||
global_model_id TEXT,
|
||||
model_id TEXT,
|
||||
name TEXT NOT NULL,
|
||||
task_type TEXT NOT NULL DEFAULT 'chat',
|
||||
expression TEXT NOT NULL,
|
||||
variables TEXT NOT NULL DEFAULT '{}',
|
||||
dimension_mappings TEXT NOT NULL DEFAULT '{}',
|
||||
is_enabled INTEGER NOT NULL DEFAULT 1,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
CHECK (
|
||||
(global_model_id IS NOT NULL AND model_id IS NULL)
|
||||
OR (global_model_id IS NULL AND model_id IS NOT NULL)
|
||||
)
|
||||
);
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS uq_billing_rules_global_model_task
|
||||
ON billing_rules (global_model_id, task_type)
|
||||
WHERE is_enabled = 1 AND global_model_id IS NOT NULL;
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS uq_billing_rules_model_task
|
||||
ON billing_rules (model_id, task_type)
|
||||
WHERE is_enabled = 1 AND model_id IS NOT NULL;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS dimension_collectors (
|
||||
id TEXT PRIMARY KEY,
|
||||
api_format TEXT NOT NULL,
|
||||
task_type TEXT NOT NULL,
|
||||
dimension_name TEXT NOT NULL,
|
||||
source_type TEXT NOT NULL,
|
||||
source_path TEXT,
|
||||
value_type TEXT NOT NULL DEFAULT 'float',
|
||||
transform_expression TEXT,
|
||||
default_value TEXT,
|
||||
priority INTEGER NOT NULL DEFAULT 0,
|
||||
is_enabled INTEGER NOT NULL DEFAULT 1,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
CHECK (
|
||||
(source_type = 'computed' AND source_path IS NULL AND transform_expression IS NOT NULL)
|
||||
OR (source_type <> 'computed' AND source_path IS NOT NULL)
|
||||
)
|
||||
);
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS uq_dimension_collectors_enabled
|
||||
ON dimension_collectors (api_format, task_type, dimension_name, priority)
|
||||
WHERE is_enabled = 1;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS providers (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
description TEXT,
|
||||
website TEXT,
|
||||
provider_type TEXT NOT NULL,
|
||||
billing_type TEXT,
|
||||
monthly_quota_usd REAL,
|
||||
monthly_used_usd REAL,
|
||||
quota_reset_day INTEGER,
|
||||
quota_last_reset_at INTEGER,
|
||||
quota_expires_at INTEGER,
|
||||
enabled INTEGER NOT NULL DEFAULT 1,
|
||||
is_active INTEGER NOT NULL DEFAULT 1,
|
||||
priority INTEGER NOT NULL DEFAULT 0,
|
||||
provider_priority INTEGER NOT NULL DEFAULT 100,
|
||||
keep_priority_on_conversion INTEGER NOT NULL DEFAULT 0,
|
||||
enable_format_conversion INTEGER NOT NULL DEFAULT 1,
|
||||
concurrent_limit INTEGER,
|
||||
max_retries INTEGER,
|
||||
proxy TEXT,
|
||||
request_timeout REAL,
|
||||
stream_first_byte_timeout REAL,
|
||||
config TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS provider_api_keys (
|
||||
id TEXT PRIMARY KEY,
|
||||
provider_id TEXT NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
api_key TEXT,
|
||||
encrypted_key TEXT,
|
||||
auth_type TEXT NOT NULL DEFAULT 'api_key',
|
||||
auth_config TEXT,
|
||||
note TEXT,
|
||||
internal_priority INTEGER 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 INTEGER,
|
||||
cache_ttl_minutes INTEGER NOT NULL DEFAULT 5,
|
||||
max_probe_interval_minutes INTEGER NOT NULL DEFAULT 32,
|
||||
proxy TEXT,
|
||||
fingerprint TEXT,
|
||||
concurrent_limit INTEGER,
|
||||
learned_rpm_limit INTEGER,
|
||||
concurrent_429_count INTEGER NOT NULL DEFAULT 0,
|
||||
rpm_429_count INTEGER NOT NULL DEFAULT 0,
|
||||
last_429_at INTEGER,
|
||||
last_429_type TEXT,
|
||||
adjustment_history TEXT,
|
||||
utilization_samples TEXT,
|
||||
last_probe_increase_at INTEGER,
|
||||
last_rpm_peak INTEGER,
|
||||
request_count INTEGER NOT NULL DEFAULT 0,
|
||||
total_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
total_cost_usd REAL NOT NULL DEFAULT 0,
|
||||
success_count INTEGER NOT NULL DEFAULT 0,
|
||||
error_count INTEGER NOT NULL DEFAULT 0,
|
||||
total_response_time_ms INTEGER NOT NULL DEFAULT 0,
|
||||
last_used_at INTEGER,
|
||||
auto_fetch_models INTEGER NOT NULL DEFAULT 0,
|
||||
last_models_fetch_at INTEGER,
|
||||
last_models_fetch_error TEXT,
|
||||
locked_models TEXT,
|
||||
model_include_patterns TEXT,
|
||||
model_exclude_patterns TEXT,
|
||||
upstream_metadata TEXT,
|
||||
oauth_invalid_at INTEGER,
|
||||
oauth_invalid_reason TEXT,
|
||||
status_snapshot TEXT,
|
||||
health_by_format TEXT,
|
||||
circuit_breaker_by_format TEXT,
|
||||
status TEXT NOT NULL DEFAULT 'active',
|
||||
is_active INTEGER NOT NULL DEFAULT 1,
|
||||
weight INTEGER NOT NULL DEFAULT 1,
|
||||
rpm_limit INTEGER,
|
||||
metadata TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS provider_api_keys_provider_id_idx ON provider_api_keys (provider_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS gemini_file_mappings (
|
||||
id TEXT PRIMARY KEY,
|
||||
file_name TEXT NOT NULL UNIQUE,
|
||||
key_id TEXT NOT NULL,
|
||||
user_id TEXT,
|
||||
display_name TEXT,
|
||||
mime_type TEXT,
|
||||
source_hash TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
expires_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS gemini_file_mappings_key_id_idx ON gemini_file_mappings (key_id);
|
||||
CREATE INDEX IF NOT EXISTS gemini_file_mappings_user_id_idx ON gemini_file_mappings (user_id);
|
||||
CREATE INDEX IF NOT EXISTS gemini_file_mappings_expires_at_idx ON gemini_file_mappings (expires_at);
|
||||
CREATE INDEX IF NOT EXISTS gemini_file_mappings_source_hash_idx ON gemini_file_mappings (source_hash);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS request_candidates (
|
||||
id TEXT PRIMARY KEY,
|
||||
request_id TEXT NOT NULL,
|
||||
user_id TEXT,
|
||||
api_key_id TEXT,
|
||||
username TEXT,
|
||||
api_key_name TEXT,
|
||||
candidate_index INTEGER NOT NULL,
|
||||
retry_index INTEGER NOT NULL DEFAULT 0,
|
||||
provider_id TEXT,
|
||||
endpoint_id TEXT,
|
||||
key_id TEXT,
|
||||
status TEXT NOT NULL,
|
||||
skip_reason TEXT,
|
||||
is_cached INTEGER NOT NULL DEFAULT 0,
|
||||
status_code INTEGER,
|
||||
error_type TEXT,
|
||||
error_message TEXT,
|
||||
latency_ms INTEGER,
|
||||
concurrent_requests INTEGER,
|
||||
extra_data TEXT,
|
||||
required_capabilities TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
started_at INTEGER,
|
||||
finished_at INTEGER,
|
||||
UNIQUE (request_id, candidate_index, retry_index)
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS request_candidates_request_id_idx ON request_candidates (request_id);
|
||||
CREATE INDEX IF NOT EXISTS request_candidates_provider_id_idx ON request_candidates (provider_id);
|
||||
CREATE INDEX IF NOT EXISTS request_candidates_endpoint_id_idx ON request_candidates (endpoint_id);
|
||||
CREATE INDEX IF NOT EXISTS request_candidates_status_idx ON request_candidates (status);
|
||||
CREATE INDEX IF NOT EXISTS request_candidates_created_at_idx ON request_candidates (created_at);
|
||||
CREATE INDEX IF NOT EXISTS request_candidates_endpoint_status_created_idx ON request_candidates (endpoint_id, status, created_at);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS video_tasks (
|
||||
id TEXT PRIMARY KEY,
|
||||
short_id TEXT UNIQUE,
|
||||
request_id TEXT NOT NULL UNIQUE,
|
||||
user_id TEXT,
|
||||
api_key_id TEXT,
|
||||
username TEXT,
|
||||
api_key_name TEXT,
|
||||
external_task_id TEXT,
|
||||
provider_id TEXT,
|
||||
endpoint_id TEXT,
|
||||
key_id TEXT,
|
||||
client_api_format TEXT,
|
||||
provider_api_format TEXT,
|
||||
format_converted INTEGER NOT NULL DEFAULT 0,
|
||||
model TEXT,
|
||||
prompt TEXT,
|
||||
original_request_body TEXT,
|
||||
duration_seconds INTEGER,
|
||||
resolution TEXT,
|
||||
aspect_ratio TEXT,
|
||||
size TEXT,
|
||||
status TEXT NOT NULL DEFAULT 'pending',
|
||||
progress_percent INTEGER NOT NULL DEFAULT 0,
|
||||
progress_message TEXT,
|
||||
retry_count INTEGER NOT NULL DEFAULT 0,
|
||||
poll_interval_seconds INTEGER NOT NULL DEFAULT 10,
|
||||
next_poll_at INTEGER,
|
||||
poll_count INTEGER NOT NULL DEFAULT 0,
|
||||
max_poll_count INTEGER NOT NULL DEFAULT 360,
|
||||
created_at INTEGER NOT NULL,
|
||||
submitted_at INTEGER,
|
||||
completed_at INTEGER,
|
||||
updated_at INTEGER NOT NULL,
|
||||
error_code TEXT,
|
||||
error_message TEXT,
|
||||
video_url TEXT,
|
||||
request_metadata TEXT
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS video_tasks_external_id_idx ON video_tasks (external_task_id);
|
||||
CREATE INDEX IF NOT EXISTS video_tasks_next_poll_idx ON video_tasks (next_poll_at);
|
||||
CREATE INDEX IF NOT EXISTS video_tasks_request_id_idx ON video_tasks (request_id);
|
||||
CREATE INDEX IF NOT EXISTS video_tasks_user_status_idx ON video_tasks (user_id, status);
|
||||
CREATE INDEX IF NOT EXISTS video_tasks_api_key_id_idx ON video_tasks (api_key_id);
|
||||
CREATE INDEX IF NOT EXISTS video_tasks_provider_id_idx ON video_tasks (provider_id);
|
||||
CREATE INDEX IF NOT EXISTS video_tasks_endpoint_id_idx ON video_tasks (endpoint_id);
|
||||
CREATE INDEX IF NOT EXISTS video_tasks_key_id_idx ON video_tasks (key_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS provider_endpoints (
|
||||
id TEXT PRIMARY KEY,
|
||||
provider_id TEXT NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
base_url TEXT NOT NULL,
|
||||
api_format TEXT,
|
||||
api_family TEXT,
|
||||
endpoint_kind TEXT,
|
||||
enabled INTEGER NOT NULL DEFAULT 1,
|
||||
is_active INTEGER NOT NULL DEFAULT 1,
|
||||
health_score REAL NOT NULL DEFAULT 1.0,
|
||||
weight INTEGER NOT NULL DEFAULT 1,
|
||||
header_rules TEXT,
|
||||
body_rules TEXT,
|
||||
max_retries INTEGER,
|
||||
custom_path TEXT,
|
||||
metadata TEXT,
|
||||
config TEXT,
|
||||
format_acceptance_config TEXT,
|
||||
proxy TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS provider_endpoints_provider_id_idx ON provider_endpoints (provider_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS models (
|
||||
id TEXT PRIMARY KEY,
|
||||
provider_id TEXT NOT NULL,
|
||||
global_model_id TEXT,
|
||||
provider_model_name TEXT NOT NULL,
|
||||
global_model_name TEXT,
|
||||
api_format TEXT,
|
||||
enabled INTEGER NOT NULL DEFAULT 1,
|
||||
is_active INTEGER NOT NULL DEFAULT 1,
|
||||
is_available INTEGER NOT NULL DEFAULT 1,
|
||||
price_per_request REAL,
|
||||
tiered_pricing TEXT,
|
||||
supports_vision INTEGER,
|
||||
supports_function_calling INTEGER,
|
||||
supports_streaming INTEGER,
|
||||
supports_extended_thinking INTEGER,
|
||||
supports_image_generation INTEGER,
|
||||
provider_model_mappings TEXT,
|
||||
config TEXT,
|
||||
metadata TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS models_provider_id_idx ON models (provider_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS global_models (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
display_name TEXT,
|
||||
enabled INTEGER NOT NULL DEFAULT 1,
|
||||
is_active INTEGER NOT NULL DEFAULT 1,
|
||||
default_price_per_request REAL,
|
||||
default_tiered_pricing TEXT,
|
||||
supported_capabilities TEXT,
|
||||
usage_count INTEGER NOT NULL DEFAULT 0,
|
||||
config TEXT,
|
||||
metadata TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS system_configs (
|
||||
id TEXT PRIMARY KEY,
|
||||
key TEXT NOT NULL UNIQUE,
|
||||
value TEXT NOT NULL,
|
||||
description TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS auth_modules (
|
||||
id TEXT PRIMARY KEY,
|
||||
module_type TEXT NOT NULL UNIQUE,
|
||||
enabled INTEGER NOT NULL DEFAULT 1,
|
||||
config TEXT NOT NULL,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS oauth_providers (
|
||||
provider_type TEXT PRIMARY KEY,
|
||||
display_name TEXT NOT NULL,
|
||||
client_id TEXT NOT NULL,
|
||||
client_secret_encrypted TEXT,
|
||||
authorization_url_override TEXT,
|
||||
token_url_override TEXT,
|
||||
userinfo_url_override TEXT,
|
||||
scopes TEXT,
|
||||
redirect_uri TEXT NOT NULL,
|
||||
frontend_callback_url TEXT NOT NULL,
|
||||
attribute_mapping TEXT,
|
||||
extra_config TEXT,
|
||||
is_enabled INTEGER NOT NULL DEFAULT 0,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS ldap_configs (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
server_url TEXT NOT NULL,
|
||||
bind_dn TEXT NOT NULL,
|
||||
bind_password_encrypted TEXT,
|
||||
base_dn TEXT NOT NULL,
|
||||
user_search_filter TEXT DEFAULT '(uid={username})' NOT NULL,
|
||||
username_attr TEXT DEFAULT 'uid' NOT NULL,
|
||||
email_attr TEXT DEFAULT 'mail' NOT NULL,
|
||||
display_name_attr TEXT DEFAULT 'cn' NOT NULL,
|
||||
is_enabled INTEGER NOT NULL DEFAULT 0,
|
||||
is_exclusive INTEGER NOT NULL DEFAULT 0,
|
||||
use_starttls INTEGER NOT NULL DEFAULT 0,
|
||||
connect_timeout INTEGER NOT NULL DEFAULT 10,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS user_oauth_links (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
provider_type TEXT NOT NULL,
|
||||
provider_user_id TEXT NOT NULL,
|
||||
provider_username TEXT,
|
||||
provider_email TEXT,
|
||||
extra_data TEXT,
|
||||
linked_at INTEGER NOT NULL,
|
||||
last_login_at INTEGER
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS user_oauth_links_provider_type_idx ON user_oauth_links (provider_type);
|
||||
CREATE INDEX IF NOT EXISTS user_oauth_links_user_id_idx ON user_oauth_links (user_id);
|
||||
CREATE TABLE IF NOT EXISTS proxy_nodes (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
ip TEXT NOT NULL,
|
||||
port INTEGER NOT NULL,
|
||||
region TEXT,
|
||||
status TEXT NOT NULL DEFAULT 'online',
|
||||
registered_by TEXT,
|
||||
last_heartbeat_at INTEGER,
|
||||
heartbeat_interval INTEGER NOT NULL DEFAULT 30,
|
||||
active_connections INTEGER NOT NULL DEFAULT 0,
|
||||
total_requests INTEGER NOT NULL DEFAULT 0,
|
||||
avg_latency_ms REAL,
|
||||
is_manual INTEGER NOT NULL DEFAULT 0,
|
||||
proxy_url TEXT,
|
||||
proxy_username TEXT,
|
||||
proxy_password TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
remote_config TEXT,
|
||||
config_version INTEGER NOT NULL DEFAULT 0,
|
||||
hardware_info TEXT,
|
||||
estimated_max_concurrency INTEGER,
|
||||
tunnel_mode INTEGER NOT NULL DEFAULT 0,
|
||||
tunnel_connected INTEGER NOT NULL DEFAULT 0,
|
||||
tunnel_connected_at INTEGER,
|
||||
failed_requests INTEGER NOT NULL DEFAULT 0,
|
||||
dns_failures INTEGER NOT NULL DEFAULT 0,
|
||||
stream_errors INTEGER NOT NULL DEFAULT 0,
|
||||
proxy_metadata TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS proxy_node_events (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
node_id TEXT NOT NULL,
|
||||
event_type TEXT NOT NULL,
|
||||
detail TEXT,
|
||||
created_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS wallets (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT UNIQUE,
|
||||
api_key_id TEXT UNIQUE,
|
||||
balance REAL NOT NULL DEFAULT 0,
|
||||
gift_balance REAL NOT NULL DEFAULT 0,
|
||||
limit_mode TEXT NOT NULL DEFAULT 'finite',
|
||||
currency TEXT NOT NULL DEFAULT 'USD',
|
||||
status TEXT NOT NULL DEFAULT 'active',
|
||||
total_recharged REAL NOT NULL DEFAULT 0,
|
||||
total_consumed REAL NOT NULL DEFAULT 0,
|
||||
total_refunded REAL NOT NULL DEFAULT 0,
|
||||
total_adjusted REAL NOT NULL DEFAULT 0,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS wallets_api_key_id_idx ON wallets (api_key_id);
|
||||
CREATE INDEX IF NOT EXISTS wallets_user_id_idx ON wallets (user_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS wallet_transactions (
|
||||
id TEXT PRIMARY KEY,
|
||||
wallet_id TEXT NOT NULL,
|
||||
category TEXT NOT NULL,
|
||||
reason_code TEXT NOT NULL,
|
||||
amount REAL NOT NULL,
|
||||
balance_before REAL NOT NULL,
|
||||
balance_after REAL NOT NULL,
|
||||
recharge_balance_before REAL NOT NULL,
|
||||
recharge_balance_after REAL NOT NULL,
|
||||
gift_balance_before REAL NOT NULL,
|
||||
gift_balance_after REAL NOT NULL,
|
||||
link_type TEXT,
|
||||
link_id TEXT,
|
||||
operator_id TEXT,
|
||||
description TEXT,
|
||||
created_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_wallet_tx_wallet_created
|
||||
ON wallet_transactions (wallet_id, created_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_wallet_tx_category_created
|
||||
ON wallet_transactions (category, created_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_wallet_tx_reason_created
|
||||
ON wallet_transactions (reason_code, created_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_wallet_tx_link
|
||||
ON wallet_transactions (link_type, link_id);
|
||||
CREATE INDEX IF NOT EXISTS ix_wallet_transactions_operator_id
|
||||
ON wallet_transactions (operator_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS wallet_daily_usage_ledgers (
|
||||
id TEXT PRIMARY KEY,
|
||||
wallet_id TEXT NOT NULL,
|
||||
billing_date TEXT NOT NULL,
|
||||
billing_timezone TEXT NOT NULL,
|
||||
total_cost_usd REAL NOT NULL DEFAULT 0,
|
||||
total_requests INTEGER NOT NULL DEFAULT 0,
|
||||
input_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
output_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_creation_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_read_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
first_finalized_at INTEGER,
|
||||
last_finalized_at INTEGER,
|
||||
aggregated_at INTEGER NOT NULL,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_wallet_daily_usage_wallet_date
|
||||
ON wallet_daily_usage_ledgers (wallet_id, billing_timezone, billing_date);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS payment_orders (
|
||||
id TEXT PRIMARY KEY,
|
||||
order_no TEXT NOT NULL UNIQUE,
|
||||
wallet_id TEXT NOT NULL,
|
||||
user_id TEXT,
|
||||
amount_usd REAL NOT NULL,
|
||||
pay_amount REAL,
|
||||
pay_currency TEXT,
|
||||
exchange_rate REAL,
|
||||
refunded_amount_usd REAL NOT NULL DEFAULT 0,
|
||||
refundable_amount_usd REAL NOT NULL DEFAULT 0,
|
||||
payment_method TEXT NOT NULL,
|
||||
gateway_order_id TEXT,
|
||||
gateway_response TEXT,
|
||||
status TEXT NOT NULL DEFAULT 'pending',
|
||||
created_at INTEGER NOT NULL,
|
||||
paid_at INTEGER,
|
||||
credited_at INTEGER,
|
||||
expires_at INTEGER
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_payment_orders_wallet_created
|
||||
ON payment_orders (wallet_id, created_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_payment_orders_user_created
|
||||
ON payment_orders (user_id, created_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_payment_orders_status
|
||||
ON payment_orders (status);
|
||||
CREATE INDEX IF NOT EXISTS idx_payment_orders_gateway_order_id
|
||||
ON payment_orders (gateway_order_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS payment_callbacks (
|
||||
id TEXT PRIMARY KEY,
|
||||
payment_order_id TEXT,
|
||||
payment_method TEXT NOT NULL,
|
||||
callback_key TEXT NOT NULL UNIQUE,
|
||||
order_no TEXT,
|
||||
gateway_order_id TEXT,
|
||||
payload_hash TEXT,
|
||||
signature_valid INTEGER NOT NULL DEFAULT 0,
|
||||
status TEXT NOT NULL DEFAULT 'received',
|
||||
payload TEXT,
|
||||
error_message TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
processed_at INTEGER
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_payment_callbacks_order
|
||||
ON payment_callbacks (order_no);
|
||||
CREATE INDEX IF NOT EXISTS idx_payment_callbacks_gateway_order
|
||||
ON payment_callbacks (gateway_order_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_payment_callbacks_created
|
||||
ON payment_callbacks (created_at);
|
||||
CREATE INDEX IF NOT EXISTS ix_payment_callbacks_payment_order_id
|
||||
ON payment_callbacks (payment_order_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS refund_requests (
|
||||
id TEXT PRIMARY KEY,
|
||||
refund_no TEXT NOT NULL UNIQUE,
|
||||
wallet_id TEXT NOT NULL,
|
||||
user_id TEXT,
|
||||
payment_order_id TEXT,
|
||||
source_type TEXT NOT NULL,
|
||||
source_id TEXT,
|
||||
refund_mode TEXT NOT NULL,
|
||||
amount_usd REAL NOT NULL,
|
||||
status TEXT NOT NULL DEFAULT 'pending_approval',
|
||||
reason TEXT,
|
||||
requested_by TEXT,
|
||||
approved_by TEXT,
|
||||
processed_by TEXT,
|
||||
gateway_refund_id TEXT,
|
||||
payout_method TEXT,
|
||||
payout_reference TEXT,
|
||||
payout_proof TEXT,
|
||||
failure_reason TEXT,
|
||||
idempotency_key TEXT UNIQUE,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
processed_at INTEGER,
|
||||
completed_at INTEGER
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_refund_wallet_created
|
||||
ON refund_requests (wallet_id, created_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_refund_user_created
|
||||
ON refund_requests (user_id, created_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_refund_status
|
||||
ON refund_requests (status);
|
||||
CREATE INDEX IF NOT EXISTS ix_refund_requests_payment_order_id
|
||||
ON refund_requests (payment_order_id);
|
||||
CREATE INDEX IF NOT EXISTS ix_refund_requests_requested_by
|
||||
ON refund_requests (requested_by);
|
||||
CREATE INDEX IF NOT EXISTS ix_refund_requests_approved_by
|
||||
ON refund_requests (approved_by);
|
||||
CREATE INDEX IF NOT EXISTS ix_refund_requests_processed_by
|
||||
ON refund_requests (processed_by);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS redeem_code_batches (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
amount_usd REAL NOT NULL,
|
||||
currency TEXT NOT NULL DEFAULT 'USD',
|
||||
balance_bucket TEXT NOT NULL DEFAULT 'gift',
|
||||
total_count INTEGER NOT NULL,
|
||||
status TEXT NOT NULL DEFAULT 'active',
|
||||
description TEXT,
|
||||
created_by TEXT,
|
||||
expires_at INTEGER,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_redeem_code_batches_status
|
||||
ON redeem_code_batches (status, created_at);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS redeem_codes (
|
||||
id TEXT PRIMARY KEY,
|
||||
batch_id TEXT NOT NULL,
|
||||
code_hash TEXT NOT NULL UNIQUE,
|
||||
code_prefix TEXT NOT NULL,
|
||||
code_suffix TEXT NOT NULL,
|
||||
status TEXT NOT NULL DEFAULT 'active',
|
||||
redeemed_by_user_id TEXT,
|
||||
redeemed_wallet_id TEXT,
|
||||
redeemed_payment_order_id TEXT,
|
||||
redeemed_at INTEGER,
|
||||
disabled_by TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_redeem_codes_batch_created
|
||||
ON redeem_codes (batch_id, created_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_redeem_codes_status
|
||||
ON redeem_codes (status, updated_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_redeem_codes_redeemed_user
|
||||
ON redeem_codes (redeemed_by_user_id, redeemed_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_redeem_codes_redeemed_order
|
||||
ON redeem_codes (redeemed_payment_order_id);
|
||||
CREATE TABLE IF NOT EXISTS "usage" (
|
||||
request_id TEXT PRIMARY KEY,
|
||||
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,
|
||||
input_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
output_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
total_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_creation_input_tokens 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,
|
||||
cache_creation_cost_usd REAL NOT NULL DEFAULT 0,
|
||||
cache_read_cost_usd REAL NOT NULL DEFAULT 0,
|
||||
output_price_per_1m 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_metadata TEXT,
|
||||
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,
|
||||
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_settlement_snapshots (
|
||||
request_id TEXT PRIMARY KEY,
|
||||
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,
|
||||
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);
|
||||
@@ -0,0 +1,18 @@
|
||||
CREATE TABLE IF NOT EXISTS audit_logs (
|
||||
id TEXT PRIMARY KEY,
|
||||
event_type TEXT NOT NULL,
|
||||
user_id TEXT,
|
||||
api_key_id TEXT,
|
||||
description TEXT NOT NULL,
|
||||
ip_address TEXT,
|
||||
user_agent TEXT,
|
||||
request_id TEXT,
|
||||
event_metadata TEXT,
|
||||
status_code INTEGER,
|
||||
error_message TEXT,
|
||||
created_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS audit_logs_created_at_idx ON audit_logs (created_at);
|
||||
CREATE INDEX IF NOT EXISTS audit_logs_event_type_idx ON audit_logs (event_type);
|
||||
CREATE INDEX IF NOT EXISTS audit_logs_request_id_idx ON audit_logs (request_id);
|
||||
CREATE INDEX IF NOT EXISTS audit_logs_user_id_idx ON audit_logs (user_id);
|
||||
@@ -0,0 +1,48 @@
|
||||
CREATE TABLE IF NOT EXISTS user_preferences (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL UNIQUE,
|
||||
avatar_url TEXT,
|
||||
bio TEXT,
|
||||
default_provider_id TEXT,
|
||||
theme TEXT NOT NULL DEFAULT 'light',
|
||||
language TEXT NOT NULL DEFAULT 'zh-CN',
|
||||
timezone TEXT NOT NULL DEFAULT 'Asia/Shanghai',
|
||||
email_notifications INTEGER NOT NULL DEFAULT 1,
|
||||
usage_alerts INTEGER NOT NULL DEFAULT 1,
|
||||
announcement_notifications INTEGER NOT NULL DEFAULT 1,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS user_preferences_default_provider_id_idx
|
||||
ON user_preferences (default_provider_id);
|
||||
CREATE INDEX IF NOT EXISTS user_preferences_user_id_idx
|
||||
ON user_preferences (user_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS user_sessions (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
client_device_id TEXT NOT NULL,
|
||||
device_label TEXT,
|
||||
device_type TEXT NOT NULL DEFAULT 'unknown',
|
||||
browser_name TEXT,
|
||||
browser_version TEXT,
|
||||
os_name TEXT,
|
||||
os_version TEXT,
|
||||
device_model TEXT,
|
||||
ip_address TEXT,
|
||||
user_agent TEXT,
|
||||
client_hints TEXT,
|
||||
refresh_token_hash TEXT NOT NULL,
|
||||
prev_refresh_token_hash TEXT,
|
||||
rotated_at INTEGER,
|
||||
last_seen_at INTEGER NOT NULL,
|
||||
expires_at INTEGER NOT NULL,
|
||||
revoked_at INTEGER,
|
||||
revoke_reason TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS user_sessions_user_active_idx
|
||||
ON user_sessions (user_id, revoked_at, expires_at);
|
||||
CREATE INDEX IF NOT EXISTS user_sessions_user_device_idx
|
||||
ON user_sessions (user_id, client_device_id);
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE users ADD COLUMN ldap_dn TEXT;
|
||||
ALTER TABLE users ADD COLUMN ldap_username TEXT;
|
||||
@@ -0,0 +1,5 @@
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS uq_user_oauth_links_provider_user
|
||||
ON user_oauth_links (provider_type, provider_user_id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS uq_user_oauth_links_user_provider
|
||||
ON user_oauth_links (user_id, provider_type);
|
||||
@@ -0,0 +1,175 @@
|
||||
CREATE TABLE IF NOT EXISTS stats_hourly (
|
||||
id TEXT PRIMARY KEY,
|
||||
hour_utc INTEGER NOT NULL UNIQUE,
|
||||
total_requests INTEGER NOT NULL DEFAULT 0,
|
||||
success_requests INTEGER NOT NULL DEFAULT 0,
|
||||
error_requests INTEGER NOT NULL DEFAULT 0,
|
||||
input_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
output_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_creation_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_read_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
total_cost REAL NOT NULL DEFAULT 0,
|
||||
actual_total_cost REAL NOT NULL DEFAULT 0,
|
||||
avg_response_time_ms REAL NOT NULL DEFAULT 0,
|
||||
is_complete INTEGER NOT NULL DEFAULT 0,
|
||||
aggregated_at INTEGER,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_hourly_user (
|
||||
id TEXT PRIMARY KEY,
|
||||
hour_utc INTEGER NOT NULL,
|
||||
user_id TEXT NOT NULL,
|
||||
total_requests INTEGER NOT NULL DEFAULT 0,
|
||||
success_requests INTEGER NOT NULL DEFAULT 0,
|
||||
error_requests INTEGER NOT NULL DEFAULT 0,
|
||||
input_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
output_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
total_cost REAL NOT NULL DEFAULT 0,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
UNIQUE (hour_utc, user_id)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_hourly_user_model (
|
||||
id TEXT PRIMARY KEY,
|
||||
hour_utc INTEGER NOT NULL,
|
||||
user_id TEXT NOT NULL,
|
||||
model TEXT NOT NULL,
|
||||
total_requests INTEGER NOT NULL DEFAULT 0,
|
||||
input_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
output_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
total_cost REAL NOT NULL DEFAULT 0,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
UNIQUE (hour_utc, user_id, model)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_hourly_model (
|
||||
id TEXT PRIMARY KEY,
|
||||
hour_utc INTEGER NOT NULL,
|
||||
model TEXT NOT NULL,
|
||||
total_requests INTEGER NOT NULL DEFAULT 0,
|
||||
input_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
output_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
total_cost REAL NOT NULL DEFAULT 0,
|
||||
avg_response_time_ms REAL NOT NULL DEFAULT 0,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
UNIQUE (hour_utc, model)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_hourly_provider (
|
||||
id TEXT PRIMARY KEY,
|
||||
hour_utc INTEGER NOT NULL,
|
||||
provider_name TEXT NOT NULL,
|
||||
total_requests INTEGER NOT NULL DEFAULT 0,
|
||||
input_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
output_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
total_cost REAL NOT NULL DEFAULT 0,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
UNIQUE (hour_utc, provider_name)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_daily (
|
||||
id TEXT PRIMARY KEY,
|
||||
"date" INTEGER NOT NULL UNIQUE,
|
||||
total_requests INTEGER NOT NULL DEFAULT 0,
|
||||
success_requests INTEGER NOT NULL DEFAULT 0,
|
||||
error_requests INTEGER NOT NULL DEFAULT 0,
|
||||
input_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
output_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_creation_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_read_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
total_cost REAL NOT NULL DEFAULT 0,
|
||||
actual_total_cost REAL NOT NULL DEFAULT 0,
|
||||
avg_response_time_ms REAL NOT NULL DEFAULT 0,
|
||||
fallback_count INTEGER NOT NULL DEFAULT 0,
|
||||
unique_models INTEGER NOT NULL DEFAULT 0,
|
||||
unique_providers INTEGER NOT NULL DEFAULT 0,
|
||||
is_complete INTEGER NOT NULL DEFAULT 0,
|
||||
aggregated_at INTEGER,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_daily_model (
|
||||
id TEXT PRIMARY KEY,
|
||||
"date" INTEGER NOT NULL,
|
||||
model TEXT NOT NULL,
|
||||
total_requests INTEGER NOT NULL DEFAULT 0,
|
||||
input_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
output_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_creation_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_read_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
total_cost REAL NOT NULL DEFAULT 0,
|
||||
avg_response_time_ms REAL NOT NULL DEFAULT 0,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
UNIQUE ("date", model)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_daily_provider (
|
||||
id TEXT PRIMARY KEY,
|
||||
"date" INTEGER NOT NULL,
|
||||
provider_name TEXT NOT NULL,
|
||||
total_requests INTEGER NOT NULL DEFAULT 0,
|
||||
input_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
output_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_creation_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_read_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
total_cost REAL NOT NULL DEFAULT 0,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
UNIQUE ("date", provider_name)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_daily_api_key (
|
||||
id TEXT PRIMARY KEY,
|
||||
api_key_id TEXT NOT NULL,
|
||||
"date" INTEGER NOT NULL,
|
||||
total_requests INTEGER NOT NULL DEFAULT 0,
|
||||
success_requests INTEGER NOT NULL DEFAULT 0,
|
||||
error_requests INTEGER NOT NULL DEFAULT 0,
|
||||
input_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
output_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_creation_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_read_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
total_cost REAL NOT NULL DEFAULT 0,
|
||||
api_key_name TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
UNIQUE ("date", api_key_id)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_daily_error (
|
||||
id TEXT PRIMARY KEY,
|
||||
"date" INTEGER NOT NULL,
|
||||
error_category TEXT NOT NULL,
|
||||
provider_name TEXT,
|
||||
model TEXT,
|
||||
count INTEGER NOT NULL DEFAULT 0,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
UNIQUE ("date", error_category, provider_name, model)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS stats_user_daily (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL,
|
||||
"date" INTEGER NOT NULL,
|
||||
total_requests INTEGER NOT NULL DEFAULT 0,
|
||||
success_requests INTEGER NOT NULL DEFAULT 0,
|
||||
error_requests INTEGER NOT NULL DEFAULT 0,
|
||||
input_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
output_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_creation_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
cache_read_tokens INTEGER NOT NULL DEFAULT 0,
|
||||
total_cost REAL NOT NULL DEFAULT 0,
|
||||
username TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
UNIQUE ("date", user_id)
|
||||
);
|
||||
Reference in New Issue
Block a user