Add multi-database data layer

Introduce aether-data-schema and driver-specific schema generation for Postgres, MySQL, and SQLite.

Split data backends, lifecycle, repositories, and gateway runtime integration across database drivers.

Verified with cargo fmt --all --check, cargo clippy --workspace --all-targets -- -D warnings, and cargo test --workspace.
This commit is contained in:
fawney19
2026-05-05 18:27:36 +08:00
parent 099653f732
commit fce7e959e5
372 changed files with 86217 additions and 21160 deletions

View File

@@ -0,0 +1,12 @@
# Generated Schema
This directory is generated by `aether-data-schema` from `../logical/*.toml`.
It is checked in only as an auditable compiler output and drift-detection fixture.
Do not edit files in this directory by hand. Update `../logical/*.toml`, then run:
```bash
bash crates/aether-data/schema/compose_schema.sh generate
```
Runtime migrations are not loaded from this directory. The executable SQL remains under `crates/aether-data/migrations/{postgres,mysql,sqlite}`, and the Postgres bootstrap snapshot is generated at build time from `crates/aether-data/schema/bootstrap/postgres` into the crate build output until a generated fragment is deliberately promoted into the driver-specific schema manifests.

View File

@@ -0,0 +1,180 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS users (
`id` VARCHAR(64) NOT NULL,
`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` JSON,
`allowed_providers` JSON,
`allowed_api_formats` JSON,
`model_capability_settings` JSON,
`rate_limit` INT,
`metadata` JSON,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
`last_login_at` BIGINT,
`ldap_dn` VARCHAR(1024),
`ldap_username` VARCHAR(255),
PRIMARY KEY (`id`),
UNIQUE KEY users_email_key (`email`),
UNIQUE KEY users_username_key (`username`)
);
CREATE TABLE IF NOT EXISTS api_keys (
`id` VARCHAR(64) NOT NULL,
`user_id` VARCHAR(64) NOT NULL,
`key_hash` VARCHAR(255) NOT NULL,
`key_encrypted` LONGTEXT,
`name` VARCHAR(255),
`key_prefix` VARCHAR(64),
`status` VARCHAR(64) NOT NULL DEFAULT 'active',
`allowed_models` JSON,
`allowed_providers` JSON,
`allowed_api_formats` JSON,
`rate_limit` INT DEFAULT 100,
`concurrent_limit` INT,
`force_capabilities` JSON,
`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` JSON,
`expires_at` BIGINT,
`last_used_at` BIGINT,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
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) NOT NULL,
`event_type` VARCHAR(64) NOT NULL,
`user_id` VARCHAR(64),
`api_key_id` VARCHAR(64),
`description` LONGTEXT NOT NULL,
`ip_address` VARCHAR(64),
`user_agent` VARCHAR(512),
`request_id` VARCHAR(128),
`event_metadata` JSON,
`status_code` INT,
`error_message` LONGTEXT,
`created_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
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) NOT NULL,
`title` VARCHAR(200) NOT NULL,
`content` LONGTEXT 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,
PRIMARY KEY (`id`),
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) NOT NULL,
`user_id` VARCHAR(64) NOT NULL,
`announcement_id` VARCHAR(64) NOT NULL,
`read_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
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) NOT NULL,
`user_id` VARCHAR(64) NOT NULL,
`name` VARCHAR(255) NOT NULL,
`description` LONGTEXT,
`token_hash` VARCHAR(255) NOT NULL,
`token_prefix` VARCHAR(64),
`allowed_ips` JSON,
`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,
PRIMARY KEY (`id`),
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 user_preferences (
`id` VARCHAR(64) NOT NULL,
`user_id` VARCHAR(64) NOT NULL,
`avatar_url` VARCHAR(500),
`bio` LONGTEXT,
`default_provider_id` VARCHAR(64),
`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` TINYINT(1) NOT NULL DEFAULT 1,
`usage_alerts` TINYINT(1) NOT NULL DEFAULT 1,
`announcement_notifications` TINYINT(1) NOT NULL DEFAULT 1,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY user_preferences_user_id_key (`user_id`),
KEY user_preferences_default_provider_id_idx (`default_provider_id`),
KEY user_preferences_user_id_idx (`user_id`)
);
CREATE TABLE IF NOT EXISTS user_sessions (
`id` VARCHAR(64) NOT NULL,
`user_id` VARCHAR(64) 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` JSON,
`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,
PRIMARY KEY (`id`),
KEY user_sessions_user_active_idx (`user_id`, `revoked_at`, `expires_at`),
KEY user_sessions_user_device_idx (`user_id`, `client_device_id`)
);

View File

@@ -0,0 +1,354 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS billing_rules (
`id` VARCHAR(64) NOT NULL,
`global_model_id` VARCHAR(64),
`model_id` VARCHAR(64),
`name` VARCHAR(255) NOT NULL,
`task_type` VARCHAR(64) NOT NULL DEFAULT 'chat',
`expression` LONGTEXT NOT NULL,
`variables` JSON NOT NULL,
`dimension_mappings` JSON NOT NULL,
`is_enabled` TINYINT(1) NOT NULL DEFAULT 1,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
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) NOT NULL,
`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` LONGTEXT,
`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,
PRIMARY KEY (`id`),
KEY dimension_collectors_enabled_idx (`api_format`, `task_type`, `dimension_name`, `priority`, `is_enabled`)
);
CREATE TABLE IF NOT EXISTS providers (
`id` VARCHAR(64) NOT NULL,
`name` VARCHAR(255) NOT NULL,
`description` LONGTEXT,
`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` JSON,
`request_timeout` DOUBLE,
`stream_first_byte_timeout` DOUBLE,
`config` JSON,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY providers_name_key (`name`)
);
CREATE TABLE IF NOT EXISTS provider_api_keys (
`id` VARCHAR(64) NOT NULL,
`provider_id` VARCHAR(64) NOT NULL,
`name` VARCHAR(255) NOT NULL,
`api_key` LONGTEXT,
`encrypted_key` LONGTEXT,
`auth_type` VARCHAR(32) NOT NULL DEFAULT 'api_key',
`auth_config` JSON,
`note` LONGTEXT,
`internal_priority` INT NOT NULL DEFAULT 50,
`capabilities` JSON,
`api_formats` JSON,
`auth_type_by_format` JSON,
`allow_auth_channel_mismatch_formats` JSON,
`rate_multipliers` JSON,
`global_priority_by_format` JSON,
`allowed_models` JSON,
`expires_at` BIGINT,
`cache_ttl_minutes` INT NOT NULL DEFAULT 5,
`max_probe_interval_minutes` INT NOT NULL DEFAULT 32,
`proxy` JSON,
`fingerprint` JSON,
`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` JSON,
`utilization_samples` JSON,
`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,
`last_error_at` BIGINT,
`last_error_msg` LONGTEXT,
`auto_fetch_models` TINYINT(1) NOT NULL DEFAULT 0,
`last_models_fetch_at` BIGINT,
`last_models_fetch_error` LONGTEXT,
`locked_models` JSON,
`model_include_patterns` JSON,
`model_exclude_patterns` JSON,
`upstream_metadata` JSON,
`oauth_invalid_at` BIGINT,
`oauth_invalid_reason` VARCHAR(255),
`status_snapshot` JSON,
`health_by_format` JSON,
`circuit_breaker_by_format` JSON,
`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` JSON,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
KEY provider_api_keys_provider_id_idx (`provider_id`)
);
CREATE TABLE IF NOT EXISTS api_key_provider_mappings (
`id` VARCHAR(64) NOT NULL,
`api_key_id` VARCHAR(64) NOT NULL,
`provider_id` VARCHAR(64) NOT NULL,
`priority_adjustment` INT NOT NULL DEFAULT 0,
`weight_multiplier` DOUBLE NOT NULL DEFAULT 1,
`is_enabled` TINYINT(1) NOT NULL DEFAULT 1,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY uq_apikey_provider (`api_key_id`, `provider_id`),
KEY api_key_provider_mappings_api_key_id_idx (`api_key_id`),
KEY api_key_provider_mappings_provider_id_idx (`provider_id`),
KEY idx_apikey_provider_enabled (`api_key_id`, `is_enabled`)
);
CREATE TABLE IF NOT EXISTS gemini_file_mappings (
`id` VARCHAR(64) NOT NULL,
`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,
PRIMARY KEY (`id`),
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) NOT NULL,
`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` LONGTEXT,
`is_cached` TINYINT(1) NOT NULL DEFAULT 0,
`status_code` INT,
`error_type` VARCHAR(128),
`error_message` LONGTEXT,
`latency_ms` INT,
`concurrent_requests` INT,
`extra_data` JSON,
`required_capabilities` JSON,
`created_at` BIGINT NOT NULL,
`started_at` BIGINT,
`finished_at` BIGINT,
PRIMARY KEY (`id`),
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) NOT NULL,
`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` LONGTEXT,
`original_request_body` JSON,
`converted_request_body` JSON,
`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` LONGTEXT,
`retry_count` INT NOT NULL DEFAULT 0,
`max_retries` INT NOT NULL DEFAULT 3,
`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` LONGTEXT,
`video_url` LONGTEXT,
`video_urls` JSON,
`thumbnail_url` LONGTEXT,
`video_size_bytes` BIGINT,
`video_expires_at` BIGINT,
`stored_video_path` VARCHAR(500),
`storage_provider` VARCHAR(50),
`remixed_from_task_id` VARCHAR(64),
`webhook_url` VARCHAR(500),
`webhook_sent` TINYINT(1) NOT NULL DEFAULT 0,
`webhook_sent_at` BIGINT,
`request_metadata` JSON,
`video_duration_seconds` DOUBLE,
PRIMARY KEY (`id`),
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) NOT NULL,
`provider_id` VARCHAR(64) NOT NULL,
`name` VARCHAR(255) NOT NULL,
`base_url` LONGTEXT 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` JSON,
`body_rules` JSON,
`max_retries` INT,
`custom_path` LONGTEXT,
`metadata` JSON,
`config` JSON,
`format_acceptance_config` JSON,
`proxy` JSON,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
KEY provider_endpoints_provider_id_idx (`provider_id`)
);
CREATE TABLE IF NOT EXISTS provider_usage_tracking (
`id` VARCHAR(64) NOT NULL,
`provider_id` VARCHAR(64) NOT NULL,
`window_start` BIGINT NOT NULL,
`window_end` BIGINT NOT NULL,
`total_requests` INT NOT NULL DEFAULT 0,
`successful_requests` INT NOT NULL DEFAULT 0,
`failed_requests` INT NOT NULL DEFAULT 0,
`avg_response_time_ms` DOUBLE NOT NULL DEFAULT 0,
`total_response_time_ms` DOUBLE NOT NULL DEFAULT 0,
`total_cost_usd` DOUBLE NOT NULL DEFAULT 0,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
KEY provider_usage_tracking_provider_id_idx (`provider_id`),
KEY provider_usage_tracking_window_start_idx (`window_start`),
KEY idx_provider_window (`provider_id`, `window_start`),
KEY idx_window_time (`window_start`, `window_end`)
);
CREATE TABLE IF NOT EXISTS models (
`id` VARCHAR(64) NOT NULL,
`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` JSON,
`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` JSON,
`config` JSON,
`metadata` JSON,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
KEY models_provider_id_idx (`provider_id`)
);
CREATE TABLE IF NOT EXISTS global_models (
`id` VARCHAR(64) NOT NULL,
`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` JSON,
`supported_capabilities` JSON,
`usage_count` BIGINT NOT NULL DEFAULT 0,
`config` JSON,
`metadata` JSON,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY global_models_name_key (`name`)
);

View File

@@ -0,0 +1,80 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS system_configs (
`id` VARCHAR(64) NOT NULL,
`key` VARCHAR(255) NOT NULL,
`value` LONGTEXT NOT NULL,
`description` LONGTEXT,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY system_configs_key_key (`key`)
);
CREATE TABLE IF NOT EXISTS auth_modules (
`id` VARCHAR(64) NOT NULL,
`module_type` VARCHAR(128) NOT NULL,
`enabled` TINYINT(1) NOT NULL DEFAULT 1,
`config` JSON NOT NULL,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY auth_modules_module_type_key (`module_type`)
);
CREATE TABLE IF NOT EXISTS oauth_providers (
`provider_type` VARCHAR(64) NOT NULL,
`display_name` VARCHAR(255) NOT NULL,
`client_id` LONGTEXT NOT NULL,
`client_secret_encrypted` LONGTEXT,
`authorization_url_override` VARCHAR(500),
`token_url_override` VARCHAR(500),
`userinfo_url_override` VARCHAR(500),
`scopes` JSON,
`redirect_uri` VARCHAR(500) NOT NULL,
`frontend_callback_url` VARCHAR(500) NOT NULL,
`attribute_mapping` JSON,
`extra_config` JSON,
`is_enabled` TINYINT(1) NOT NULL DEFAULT 0,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`provider_type`)
);
CREATE TABLE IF NOT EXISTS ldap_configs (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`server_url` VARCHAR(255) NOT NULL,
`bind_dn` LONGTEXT NOT NULL,
`bind_password_encrypted` LONGTEXT,
`base_dn` LONGTEXT NOT NULL,
`user_search_filter` LONGTEXT 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,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS user_oauth_links (
`id` VARCHAR(64) NOT NULL,
`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` JSON,
`linked_at` BIGINT NOT NULL,
`last_login_at` BIGINT,
PRIMARY KEY (`id`),
UNIQUE KEY uq_user_oauth_links_provider_user (`provider_type`, `provider_user_id`),
UNIQUE KEY uq_user_oauth_links_user_provider (`user_id`, `provider_type`),
KEY user_oauth_links_provider_type_idx (`provider_type`),
KEY user_oauth_links_user_id_idx (`user_id`)
);

View File

@@ -0,0 +1,45 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS proxy_nodes (
`id` VARCHAR(64) NOT NULL,
`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` JSON,
`config_version` INT NOT NULL DEFAULT 0,
`hardware_info` JSON,
`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` JSON,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS proxy_node_events (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`node_id` VARCHAR(64) NOT NULL,
`event_type` VARCHAR(64) NOT NULL,
`detail` VARCHAR(500),
`created_at` BIGINT NOT NULL,
PRIMARY KEY (`id`)
);

View File

@@ -0,0 +1,195 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS wallets (
`id` VARCHAR(64) NOT NULL,
`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,
PRIMARY KEY (`id`),
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) NOT NULL,
`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` LONGTEXT,
`created_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
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) NOT NULL,
`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,
PRIMARY KEY (`id`),
KEY idx_wallet_daily_usage_wallet_date (`wallet_id`, `billing_timezone`, `billing_date`)
);
CREATE TABLE IF NOT EXISTS payment_orders (
`id` VARCHAR(64) NOT NULL,
`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` JSON,
`status` VARCHAR(64) NOT NULL DEFAULT 'pending',
`created_at` BIGINT NOT NULL,
`paid_at` BIGINT,
`credited_at` BIGINT,
`expires_at` BIGINT,
PRIMARY KEY (`id`),
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) NOT NULL,
`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` JSON,
`error_message` LONGTEXT,
`created_at` BIGINT NOT NULL,
`processed_at` BIGINT,
PRIMARY KEY (`id`),
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) NOT NULL,
`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` LONGTEXT,
`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` JSON,
`failure_reason` LONGTEXT,
`idempotency_key` VARCHAR(128),
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
`processed_at` BIGINT,
`completed_at` BIGINT,
PRIMARY KEY (`id`),
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) NOT NULL,
`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` LONGTEXT,
`created_by` VARCHAR(64),
`expires_at` BIGINT,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
KEY idx_redeem_code_batches_status (`status`, `created_at`)
);
CREATE TABLE IF NOT EXISTS redeem_codes (
`id` VARCHAR(64) NOT NULL,
`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,
PRIMARY KEY (`id`),
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`)
);

View File

@@ -0,0 +1,131 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS `usage` (
`request_id` VARCHAR(128) NOT NULL,
`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,
`input_output_total_tokens` BIGINT NOT NULL DEFAULT 0,
`total_tokens` BIGINT NOT NULL DEFAULT 0,
`cache_creation_input_tokens` BIGINT NOT NULL DEFAULT 0,
`cache_creation_input_tokens_5m` BIGINT NOT NULL DEFAULT 0,
`cache_creation_input_tokens_1h` 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,
`input_context_tokens` BIGINT NOT NULL DEFAULT 0,
`input_cost_usd` DOUBLE NOT NULL DEFAULT 0,
`output_cost_usd` DOUBLE NOT NULL DEFAULT 0,
`cache_cost_usd` DOUBLE NOT NULL DEFAULT 0,
`cache_creation_cost_usd` DOUBLE NOT NULL DEFAULT 0,
`cache_creation_cost_usd_5m` DOUBLE NOT NULL DEFAULT 0,
`cache_creation_cost_usd_1h` DOUBLE NOT NULL DEFAULT 0,
`cache_read_cost_usd` DOUBLE NOT NULL DEFAULT 0,
`request_cost_usd` DOUBLE NOT NULL DEFAULT 0,
`actual_input_cost_usd` DOUBLE NOT NULL DEFAULT 0,
`actual_output_cost_usd` DOUBLE NOT NULL DEFAULT 0,
`actual_cache_cost_usd` DOUBLE NOT NULL DEFAULT 0,
`actual_cache_creation_cost_usd` DOUBLE NOT NULL DEFAULT 0,
`actual_cache_creation_cost_usd_5m` DOUBLE NOT NULL DEFAULT 0,
`actual_cache_creation_cost_usd_1h` DOUBLE NOT NULL DEFAULT 0,
`actual_cache_read_cost_usd` DOUBLE NOT NULL DEFAULT 0,
`actual_request_cost_usd` DOUBLE NOT NULL DEFAULT 0,
`rate_multiplier` DOUBLE NOT NULL DEFAULT 1,
`input_price_per_1m` DOUBLE,
`output_price_per_1m` DOUBLE,
`cache_creation_price_per_1m` DOUBLE,
`cache_creation_price_per_1m_5m` DOUBLE,
`cache_creation_price_per_1m_1h` DOUBLE,
`cache_read_price_per_1m` DOUBLE,
`price_per_request` DOUBLE,
`status_code` INT,
`error_message` LONGTEXT,
`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_headers` JSON,
`request_body` JSON,
`provider_request_headers` JSON,
`provider_request_body` JSON,
`response_headers` JSON,
`response_body` JSON,
`client_response_headers` JSON,
`client_response_body` JSON,
`request_body_compressed` LONGBLOB,
`provider_request_body_compressed` LONGBLOB,
`response_body_compressed` LONGBLOB,
`client_response_body_compressed` LONGBLOB,
`request_metadata` JSON,
`created_at` BIGINT,
`candidate_id` VARCHAR(128),
`candidate_index` BIGINT,
`key_name` VARCHAR(255),
`username` VARCHAR(255),
`api_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,
PRIMARY KEY (`request_id`),
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) NOT NULL,
`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,
PRIMARY KEY (`request_id`),
KEY usage_settlement_snapshots_billing_status_idx (`billing_status`),
KEY usage_settlement_snapshots_wallet_id_idx (`wallet_id`)
);

View File

@@ -0,0 +1,236 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS stats_hourly (
`id` VARCHAR(64) NOT NULL,
`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,
PRIMARY KEY (`id`),
UNIQUE KEY uq_stats_hourly_hour (`hour_utc`)
);
CREATE TABLE IF NOT EXISTS stats_summary (
`id` VARCHAR(64) NOT NULL,
`cutoff_date` BIGINT NOT NULL,
`all_time_requests` BIGINT NOT NULL DEFAULT 0,
`all_time_success_requests` BIGINT NOT NULL DEFAULT 0,
`all_time_error_requests` BIGINT NOT NULL DEFAULT 0,
`all_time_input_tokens` BIGINT NOT NULL DEFAULT 0,
`all_time_output_tokens` BIGINT NOT NULL DEFAULT 0,
`all_time_cache_creation_tokens` BIGINT NOT NULL DEFAULT 0,
`all_time_cache_read_tokens` BIGINT NOT NULL DEFAULT 0,
`all_time_cost` DOUBLE NOT NULL DEFAULT 0,
`all_time_actual_cost` DOUBLE NOT NULL DEFAULT 0,
`total_users` BIGINT NOT NULL DEFAULT 0,
`active_users` BIGINT NOT NULL DEFAULT 0,
`total_api_keys` BIGINT NOT NULL DEFAULT 0,
`active_api_keys` BIGINT NOT NULL DEFAULT 0,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS stats_hourly_user (
`id` VARCHAR(64) NOT NULL,
`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,
PRIMARY KEY (`id`),
UNIQUE KEY uq_stats_hourly_user (`hour_utc`, `user_id`)
);
CREATE TABLE IF NOT EXISTS stats_hourly_user_model (
`id` VARCHAR(64) NOT NULL,
`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,
PRIMARY KEY (`id`),
UNIQUE KEY uq_stats_hourly_user_model (`hour_utc`, `user_id`, `model`)
);
CREATE TABLE IF NOT EXISTS user_model_usage_counts (
`id` VARCHAR(64) NOT NULL,
`user_id` VARCHAR(64) NOT NULL,
`model` VARCHAR(255) NOT NULL,
`usage_count` BIGINT NOT NULL DEFAULT 0,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY uq_user_model_usage_count (`user_id`, `model`),
KEY idx_user_model_usage_user (`user_id`),
KEY idx_user_model_usage_model (`model`)
);
CREATE TABLE IF NOT EXISTS stats_hourly_model (
`id` VARCHAR(64) NOT NULL,
`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,
PRIMARY KEY (`id`),
UNIQUE KEY uq_stats_hourly_model (`hour_utc`, `model`)
);
CREATE TABLE IF NOT EXISTS stats_hourly_provider (
`id` VARCHAR(64) NOT NULL,
`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,
PRIMARY KEY (`id`),
UNIQUE KEY uq_stats_hourly_provider (`hour_utc`, `provider_name`)
);
CREATE TABLE IF NOT EXISTS stats_daily (
`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,
`actual_total_cost` DOUBLE NOT NULL DEFAULT 0,
`input_cost` DOUBLE NOT NULL DEFAULT 0,
`output_cost` DOUBLE NOT NULL DEFAULT 0,
`cache_creation_cost` DOUBLE NOT NULL DEFAULT 0,
`cache_read_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,
`p50_response_time_ms` BIGINT,
`p90_response_time_ms` BIGINT,
`p99_response_time_ms` BIGINT,
`p50_first_byte_time_ms` BIGINT,
`p90_first_byte_time_ms` BIGINT,
`p99_first_byte_time_ms` BIGINT,
PRIMARY KEY (`id`),
UNIQUE KEY uq_stats_daily_date (`date`)
);
CREATE TABLE IF NOT EXISTS stats_daily_model (
`id` VARCHAR(64) NOT NULL,
`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,
PRIMARY KEY (`id`),
UNIQUE KEY uq_stats_daily_model (`date`, `model`)
);
CREATE TABLE IF NOT EXISTS stats_daily_provider (
`id` VARCHAR(64) NOT NULL,
`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,
PRIMARY KEY (`id`),
UNIQUE KEY uq_stats_daily_provider (`date`, `provider_name`)
);
CREATE TABLE IF NOT EXISTS stats_daily_api_key (
`id` VARCHAR(64) NOT NULL,
`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,
PRIMARY KEY (`id`),
UNIQUE KEY uq_stats_daily_api_key (`date`, `api_key_id`)
);
CREATE TABLE IF NOT EXISTS stats_daily_error (
`id` VARCHAR(64) NOT NULL,
`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,
PRIMARY KEY (`id`),
UNIQUE KEY uq_stats_daily_error (`date`, `error_category`, `provider_name`, `model`)
);
CREATE TABLE IF NOT EXISTS stats_user_daily (
`id` VARCHAR(64) NOT NULL,
`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,
PRIMARY KEY (`id`),
UNIQUE KEY uq_stats_user_daily (`date`, `user_id`)
);

View File

@@ -0,0 +1,10 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
001_identity.sql
002_provider_catalog.sql
003_auth_config.sql
004_proxy_nodes.sql
005_wallet_billing.sql
006_usage.sql
007_stats.sql

View File

@@ -0,0 +1,188 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS public.users (
id character varying(64) NOT NULL,
external_id character varying(255),
email character varying(320),
username character varying(255),
password_hash character varying(255),
role character varying(64),
auth_source character varying(64) DEFAULT 'local' NOT NULL,
email_verified boolean DEFAULT false NOT NULL,
is_active boolean DEFAULT true NOT NULL,
is_deleted boolean DEFAULT false NOT NULL,
allowed_models jsonb,
allowed_providers jsonb,
allowed_api_formats jsonb,
model_capability_settings jsonb,
rate_limit integer,
metadata jsonb,
created_at bigint NOT NULL,
updated_at bigint NOT NULL,
last_login_at bigint,
ldap_dn character varying(1024),
ldap_username character varying(255)
);
ALTER TABLE ONLY public.users ADD CONSTRAINT users_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.users ADD CONSTRAINT users_email_key UNIQUE (email);
ALTER TABLE ONLY public.users ADD CONSTRAINT users_username_key UNIQUE (username);
CREATE TABLE IF NOT EXISTS public.api_keys (
id character varying(64) NOT NULL,
user_id character varying(64) NOT NULL,
key_hash character varying(255) NOT NULL,
key_encrypted text,
name character varying(255),
key_prefix character varying(64),
status character varying(64) DEFAULT 'active' NOT NULL,
allowed_models jsonb,
allowed_providers jsonb,
allowed_api_formats jsonb,
rate_limit integer DEFAULT 100,
concurrent_limit integer,
force_capabilities jsonb,
is_active boolean DEFAULT true NOT NULL,
is_locked boolean DEFAULT false NOT NULL,
is_standalone boolean DEFAULT false NOT NULL,
auto_delete_on_expiry boolean DEFAULT false NOT NULL,
total_requests bigint DEFAULT 0 NOT NULL,
total_tokens bigint DEFAULT 0 NOT NULL,
total_cost_usd double precision DEFAULT 0 NOT NULL,
metadata jsonb,
expires_at bigint,
last_used_at bigint,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.api_keys ADD CONSTRAINT api_keys_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.api_keys ADD CONSTRAINT api_keys_key_hash_key UNIQUE (key_hash);
CREATE INDEX IF NOT EXISTS api_keys_user_id_idx ON public.api_keys USING btree (user_id);
CREATE TABLE IF NOT EXISTS public.audit_logs (
id character varying(64) NOT NULL,
event_type character varying(64) NOT NULL,
user_id character varying(64),
api_key_id character varying(64),
description text NOT NULL,
ip_address character varying(64),
user_agent character varying(512),
request_id character varying(128),
event_metadata jsonb,
status_code integer,
error_message text,
created_at bigint NOT NULL
);
ALTER TABLE ONLY public.audit_logs ADD CONSTRAINT audit_logs_pkey PRIMARY KEY (id);
CREATE INDEX IF NOT EXISTS audit_logs_created_at_idx ON public.audit_logs USING btree (created_at);
CREATE INDEX IF NOT EXISTS audit_logs_event_type_idx ON public.audit_logs USING btree (event_type);
CREATE INDEX IF NOT EXISTS audit_logs_request_id_idx ON public.audit_logs USING btree (request_id);
CREATE INDEX IF NOT EXISTS audit_logs_user_id_idx ON public.audit_logs USING btree (user_id);
CREATE TABLE IF NOT EXISTS public.announcements (
id character varying(64) NOT NULL,
title character varying(200) NOT NULL,
content text NOT NULL,
type character varying(32) DEFAULT 'info' NOT NULL,
priority integer DEFAULT 0 NOT NULL,
author_id character varying(64),
is_active boolean DEFAULT true NOT NULL,
is_pinned boolean DEFAULT false NOT NULL,
start_time bigint,
end_time bigint,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.announcements ADD CONSTRAINT announcements_pkey PRIMARY KEY (id);
CREATE INDEX IF NOT EXISTS announcements_author_id_idx ON public.announcements USING btree (author_id);
CREATE INDEX IF NOT EXISTS announcements_created_at_idx ON public.announcements USING btree (created_at);
CREATE INDEX IF NOT EXISTS announcements_is_active_idx ON public.announcements USING btree (is_active);
CREATE TABLE IF NOT EXISTS public.announcement_reads (
id character varying(64) NOT NULL,
user_id character varying(64) NOT NULL,
announcement_id character varying(64) NOT NULL,
read_at bigint NOT NULL
);
ALTER TABLE ONLY public.announcement_reads ADD CONSTRAINT announcement_reads_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.announcement_reads ADD CONSTRAINT uq_user_announcement UNIQUE (user_id, announcement_id);
CREATE INDEX IF NOT EXISTS announcement_reads_announcement_id_idx ON public.announcement_reads USING btree (announcement_id);
CREATE INDEX IF NOT EXISTS announcement_reads_user_id_idx ON public.announcement_reads USING btree (user_id);
CREATE TABLE IF NOT EXISTS public.management_tokens (
id character varying(64) NOT NULL,
user_id character varying(64) NOT NULL,
name character varying(255) NOT NULL,
description text,
token_hash character varying(255) NOT NULL,
token_prefix character varying(64),
allowed_ips jsonb,
expires_at bigint,
last_used_at bigint,
last_used_ip character varying(255),
usage_count bigint DEFAULT 0 NOT NULL,
is_active boolean DEFAULT true NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.management_tokens ADD CONSTRAINT management_tokens_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.management_tokens ADD CONSTRAINT management_tokens_token_hash_key UNIQUE (token_hash);
ALTER TABLE ONLY public.management_tokens ADD CONSTRAINT uq_management_tokens_user_name UNIQUE (user_id, name);
CREATE INDEX IF NOT EXISTS management_tokens_user_id_idx ON public.management_tokens USING btree (user_id);
CREATE TABLE IF NOT EXISTS public.user_preferences (
id character varying(64) NOT NULL,
user_id character varying(64) NOT NULL,
avatar_url character varying(500),
bio text,
default_provider_id character varying(64),
theme character varying(20) DEFAULT 'light' NOT NULL,
language character varying(10) DEFAULT 'zh-CN' NOT NULL,
timezone character varying(50) DEFAULT 'Asia/Shanghai' NOT NULL,
email_notifications boolean DEFAULT true NOT NULL,
usage_alerts boolean DEFAULT true NOT NULL,
announcement_notifications boolean DEFAULT true NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.user_preferences ADD CONSTRAINT user_preferences_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.user_preferences ADD CONSTRAINT user_preferences_user_id_key UNIQUE (user_id);
CREATE INDEX IF NOT EXISTS user_preferences_default_provider_id_idx ON public.user_preferences USING btree (default_provider_id);
CREATE INDEX IF NOT EXISTS user_preferences_user_id_idx ON public.user_preferences USING btree (user_id);
CREATE TABLE IF NOT EXISTS public.user_sessions (
id character varying(64) NOT NULL,
user_id character varying(64) NOT NULL,
client_device_id character varying(128) NOT NULL,
device_label character varying(120),
device_type character varying(20) DEFAULT 'unknown' NOT NULL,
browser_name character varying(50),
browser_version character varying(50),
os_name character varying(50),
os_version character varying(50),
device_model character varying(100),
ip_address character varying(45),
user_agent character varying(1000),
client_hints jsonb,
refresh_token_hash character varying(64) NOT NULL,
prev_refresh_token_hash character varying(64),
rotated_at bigint,
last_seen_at bigint NOT NULL,
expires_at bigint NOT NULL,
revoked_at bigint,
revoke_reason character varying(100),
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.user_sessions ADD CONSTRAINT user_sessions_pkey PRIMARY KEY (id);
CREATE INDEX IF NOT EXISTS user_sessions_user_active_idx ON public.user_sessions USING btree (user_id, revoked_at, expires_at);
CREATE INDEX IF NOT EXISTS user_sessions_user_device_idx ON public.user_sessions USING btree (user_id, client_device_id);

View File

@@ -0,0 +1,366 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS public.billing_rules (
id character varying(64) NOT NULL,
global_model_id character varying(64),
model_id character varying(64),
name character varying(255) NOT NULL,
task_type character varying(64) DEFAULT 'chat' NOT NULL,
expression text NOT NULL,
variables jsonb NOT NULL,
dimension_mappings jsonb NOT NULL,
is_enabled boolean DEFAULT true NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.billing_rules ADD CONSTRAINT billing_rules_pkey PRIMARY KEY (id);
CREATE INDEX IF NOT EXISTS billing_rules_global_model_task_idx ON public.billing_rules USING btree (global_model_id, task_type, is_enabled);
CREATE INDEX IF NOT EXISTS billing_rules_model_task_idx ON public.billing_rules USING btree (model_id, task_type, is_enabled);
CREATE TABLE IF NOT EXISTS public.dimension_collectors (
id character varying(64) NOT NULL,
api_format character varying(64) NOT NULL,
task_type character varying(64) NOT NULL,
dimension_name character varying(128) NOT NULL,
source_type character varying(64) NOT NULL,
source_path character varying(255),
value_type character varying(64) DEFAULT 'float' NOT NULL,
transform_expression text,
default_value character varying(255),
priority integer DEFAULT 0 NOT NULL,
is_enabled boolean DEFAULT true NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.dimension_collectors ADD CONSTRAINT dimension_collectors_pkey PRIMARY KEY (id);
CREATE INDEX IF NOT EXISTS dimension_collectors_enabled_idx ON public.dimension_collectors USING btree (api_format, task_type, dimension_name, priority, is_enabled);
CREATE TABLE IF NOT EXISTS public.providers (
id character varying(64) NOT NULL,
name character varying(255) NOT NULL,
description text,
website character varying(500),
provider_type character varying(64) NOT NULL,
billing_type character varying(64),
monthly_quota_usd double precision,
monthly_used_usd double precision,
quota_reset_day integer,
quota_last_reset_at bigint,
quota_expires_at bigint,
enabled boolean DEFAULT true NOT NULL,
is_active boolean DEFAULT true NOT NULL,
priority bigint DEFAULT 0 NOT NULL,
provider_priority integer DEFAULT 100 NOT NULL,
keep_priority_on_conversion boolean DEFAULT false NOT NULL,
enable_format_conversion boolean DEFAULT true NOT NULL,
concurrent_limit integer,
max_retries integer,
proxy jsonb,
request_timeout double precision,
stream_first_byte_timeout double precision,
config jsonb,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.providers ADD CONSTRAINT providers_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.providers ADD CONSTRAINT providers_name_key UNIQUE (name);
CREATE TABLE IF NOT EXISTS public.provider_api_keys (
id character varying(64) NOT NULL,
provider_id character varying(64) NOT NULL,
name character varying(255) NOT NULL,
api_key text,
encrypted_key text,
auth_type character varying(32) DEFAULT 'api_key' NOT NULL,
auth_config jsonb,
note text,
internal_priority integer DEFAULT 50 NOT NULL,
capabilities jsonb,
api_formats jsonb,
auth_type_by_format jsonb,
allow_auth_channel_mismatch_formats jsonb,
rate_multipliers jsonb,
global_priority_by_format jsonb,
allowed_models jsonb,
expires_at bigint,
cache_ttl_minutes integer DEFAULT 5 NOT NULL,
max_probe_interval_minutes integer DEFAULT 32 NOT NULL,
proxy jsonb,
fingerprint jsonb,
concurrent_limit integer,
learned_rpm_limit integer,
concurrent_429_count integer DEFAULT 0 NOT NULL,
rpm_429_count integer DEFAULT 0 NOT NULL,
last_429_at bigint,
last_429_type character varying(64),
adjustment_history jsonb,
utilization_samples jsonb,
last_probe_increase_at bigint,
last_rpm_peak integer,
request_count bigint DEFAULT 0 NOT NULL,
total_tokens bigint DEFAULT 0 NOT NULL,
total_cost_usd double precision DEFAULT 0 NOT NULL,
success_count bigint DEFAULT 0 NOT NULL,
error_count bigint DEFAULT 0 NOT NULL,
total_response_time_ms bigint DEFAULT 0 NOT NULL,
last_used_at bigint,
last_error_at bigint,
last_error_msg text,
auto_fetch_models boolean DEFAULT false NOT NULL,
last_models_fetch_at bigint,
last_models_fetch_error text,
locked_models jsonb,
model_include_patterns jsonb,
model_exclude_patterns jsonb,
upstream_metadata jsonb,
oauth_invalid_at bigint,
oauth_invalid_reason character varying(255),
status_snapshot jsonb,
health_by_format jsonb,
circuit_breaker_by_format jsonb,
status character varying(64) DEFAULT 'active' NOT NULL,
is_active boolean DEFAULT true NOT NULL,
weight bigint DEFAULT 1 NOT NULL,
rpm_limit bigint,
metadata jsonb,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.provider_api_keys ADD CONSTRAINT provider_api_keys_pkey PRIMARY KEY (id);
CREATE INDEX IF NOT EXISTS provider_api_keys_provider_id_idx ON public.provider_api_keys USING btree (provider_id);
CREATE TABLE IF NOT EXISTS public.api_key_provider_mappings (
id character varying(64) NOT NULL,
api_key_id character varying(64) NOT NULL,
provider_id character varying(64) NOT NULL,
priority_adjustment integer DEFAULT 0 NOT NULL,
weight_multiplier double precision DEFAULT 1 NOT NULL,
is_enabled boolean DEFAULT true NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.api_key_provider_mappings ADD CONSTRAINT api_key_provider_mappings_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.api_key_provider_mappings ADD CONSTRAINT uq_apikey_provider UNIQUE (api_key_id, provider_id);
CREATE INDEX IF NOT EXISTS api_key_provider_mappings_api_key_id_idx ON public.api_key_provider_mappings USING btree (api_key_id);
CREATE INDEX IF NOT EXISTS api_key_provider_mappings_provider_id_idx ON public.api_key_provider_mappings USING btree (provider_id);
CREATE INDEX IF NOT EXISTS idx_apikey_provider_enabled ON public.api_key_provider_mappings USING btree (api_key_id, is_enabled);
CREATE TABLE IF NOT EXISTS public.gemini_file_mappings (
id character varying(64) NOT NULL,
file_name character varying(512) NOT NULL,
key_id character varying(64) NOT NULL,
user_id character varying(64),
display_name character varying(512),
mime_type character varying(255),
source_hash character varying(128),
created_at bigint NOT NULL,
expires_at bigint NOT NULL
);
ALTER TABLE ONLY public.gemini_file_mappings ADD CONSTRAINT gemini_file_mappings_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.gemini_file_mappings ADD CONSTRAINT gemini_file_mappings_file_name_key UNIQUE (file_name);
CREATE INDEX IF NOT EXISTS gemini_file_mappings_key_id_idx ON public.gemini_file_mappings USING btree (key_id);
CREATE INDEX IF NOT EXISTS gemini_file_mappings_user_id_idx ON public.gemini_file_mappings USING btree (user_id);
CREATE INDEX IF NOT EXISTS gemini_file_mappings_expires_at_idx ON public.gemini_file_mappings USING btree (expires_at);
CREATE INDEX IF NOT EXISTS gemini_file_mappings_source_hash_idx ON public.gemini_file_mappings USING btree (source_hash);
CREATE TABLE IF NOT EXISTS public.request_candidates (
id character varying(64) NOT NULL,
request_id character varying(128) NOT NULL,
user_id character varying(64),
api_key_id character varying(64),
username character varying(255),
api_key_name character varying(255),
candidate_index integer NOT NULL,
retry_index integer DEFAULT 0 NOT NULL,
provider_id character varying(64),
endpoint_id character varying(64),
key_id character varying(64),
status character varying(32) NOT NULL,
skip_reason text,
is_cached boolean DEFAULT false NOT NULL,
status_code integer,
error_type character varying(128),
error_message text,
latency_ms integer,
concurrent_requests integer,
extra_data jsonb,
required_capabilities jsonb,
created_at bigint NOT NULL,
started_at bigint,
finished_at bigint
);
ALTER TABLE ONLY public.request_candidates ADD CONSTRAINT request_candidates_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.request_candidates ADD CONSTRAINT uq_request_candidate_with_retry UNIQUE (request_id, candidate_index, retry_index);
CREATE INDEX IF NOT EXISTS request_candidates_request_id_idx ON public.request_candidates USING btree (request_id);
CREATE INDEX IF NOT EXISTS request_candidates_provider_id_idx ON public.request_candidates USING btree (provider_id);
CREATE INDEX IF NOT EXISTS request_candidates_endpoint_id_idx ON public.request_candidates USING btree (endpoint_id);
CREATE INDEX IF NOT EXISTS request_candidates_status_idx ON public.request_candidates USING btree (status);
CREATE INDEX IF NOT EXISTS request_candidates_created_at_idx ON public.request_candidates USING btree (created_at);
CREATE INDEX IF NOT EXISTS request_candidates_endpoint_status_created_idx ON public.request_candidates USING btree (endpoint_id, status, created_at);
CREATE TABLE IF NOT EXISTS public.video_tasks (
id character varying(64) NOT NULL,
short_id character varying(32),
request_id character varying(128) NOT NULL,
user_id character varying(64),
api_key_id character varying(64),
username character varying(255),
api_key_name character varying(255),
external_task_id character varying(255),
provider_id character varying(64),
endpoint_id character varying(64),
key_id character varying(64),
client_api_format character varying(128),
provider_api_format character varying(128),
format_converted boolean DEFAULT false NOT NULL,
model character varying(255),
prompt text,
original_request_body jsonb,
converted_request_body jsonb,
duration_seconds integer,
resolution character varying(64),
aspect_ratio character varying(32),
size character varying(64),
status character varying(32) DEFAULT 'pending' NOT NULL,
progress_percent integer DEFAULT 0 NOT NULL,
progress_message text,
retry_count integer DEFAULT 0 NOT NULL,
max_retries integer DEFAULT 3 NOT NULL,
poll_interval_seconds integer DEFAULT 10 NOT NULL,
next_poll_at bigint,
poll_count integer DEFAULT 0 NOT NULL,
max_poll_count integer DEFAULT 360 NOT NULL,
created_at bigint NOT NULL,
submitted_at bigint,
completed_at bigint,
updated_at bigint NOT NULL,
error_code character varying(128),
error_message text,
video_url text,
video_urls jsonb,
thumbnail_url text,
video_size_bytes bigint,
video_expires_at bigint,
stored_video_path character varying(500),
storage_provider character varying(50),
remixed_from_task_id character varying(64),
webhook_url character varying(500),
webhook_sent boolean DEFAULT false NOT NULL,
webhook_sent_at bigint,
request_metadata jsonb,
video_duration_seconds double precision
);
ALTER TABLE ONLY public.video_tasks ADD CONSTRAINT video_tasks_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.video_tasks ADD CONSTRAINT video_tasks_short_id_key UNIQUE (short_id);
ALTER TABLE ONLY public.video_tasks ADD CONSTRAINT video_tasks_request_id_key UNIQUE (request_id);
CREATE INDEX IF NOT EXISTS video_tasks_external_id_idx ON public.video_tasks USING btree (external_task_id);
CREATE INDEX IF NOT EXISTS video_tasks_next_poll_idx ON public.video_tasks USING btree (next_poll_at);
CREATE INDEX IF NOT EXISTS video_tasks_user_status_idx ON public.video_tasks USING btree (user_id, status);
CREATE INDEX IF NOT EXISTS video_tasks_api_key_id_idx ON public.video_tasks USING btree (api_key_id);
CREATE INDEX IF NOT EXISTS video_tasks_provider_id_idx ON public.video_tasks USING btree (provider_id);
CREATE INDEX IF NOT EXISTS video_tasks_endpoint_id_idx ON public.video_tasks USING btree (endpoint_id);
CREATE INDEX IF NOT EXISTS video_tasks_key_id_idx ON public.video_tasks USING btree (key_id);
CREATE TABLE IF NOT EXISTS public.provider_endpoints (
id character varying(64) NOT NULL,
provider_id character varying(64) NOT NULL,
name character varying(255) NOT NULL,
base_url text NOT NULL,
api_format character varying(128),
api_family character varying(128),
endpoint_kind character varying(128),
enabled boolean DEFAULT true NOT NULL,
is_active boolean DEFAULT true NOT NULL,
health_score double precision DEFAULT 1.0 NOT NULL,
weight bigint DEFAULT 1 NOT NULL,
header_rules jsonb,
body_rules jsonb,
max_retries integer,
custom_path text,
metadata jsonb,
config jsonb,
format_acceptance_config jsonb,
proxy jsonb,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.provider_endpoints ADD CONSTRAINT provider_endpoints_pkey PRIMARY KEY (id);
CREATE INDEX IF NOT EXISTS provider_endpoints_provider_id_idx ON public.provider_endpoints USING btree (provider_id);
CREATE TABLE IF NOT EXISTS public.provider_usage_tracking (
id character varying(64) NOT NULL,
provider_id character varying(64) NOT NULL,
window_start bigint NOT NULL,
window_end bigint NOT NULL,
total_requests integer DEFAULT 0 NOT NULL,
successful_requests integer DEFAULT 0 NOT NULL,
failed_requests integer DEFAULT 0 NOT NULL,
avg_response_time_ms double precision DEFAULT 0 NOT NULL,
total_response_time_ms double precision DEFAULT 0 NOT NULL,
total_cost_usd double precision DEFAULT 0 NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.provider_usage_tracking ADD CONSTRAINT provider_usage_tracking_pkey PRIMARY KEY (id);
CREATE INDEX IF NOT EXISTS provider_usage_tracking_provider_id_idx ON public.provider_usage_tracking USING btree (provider_id);
CREATE INDEX IF NOT EXISTS provider_usage_tracking_window_start_idx ON public.provider_usage_tracking USING btree (window_start);
CREATE INDEX IF NOT EXISTS idx_provider_window ON public.provider_usage_tracking USING btree (provider_id, window_start);
CREATE INDEX IF NOT EXISTS idx_window_time ON public.provider_usage_tracking USING btree (window_start, window_end);
CREATE TABLE IF NOT EXISTS public.models (
id character varying(64) NOT NULL,
provider_id character varying(64) NOT NULL,
global_model_id character varying(64),
provider_model_name character varying(255) NOT NULL,
global_model_name character varying(255),
api_format character varying(128),
enabled boolean DEFAULT true NOT NULL,
is_active boolean DEFAULT true NOT NULL,
is_available boolean DEFAULT true NOT NULL,
price_per_request double precision,
tiered_pricing jsonb,
supports_vision boolean,
supports_function_calling boolean,
supports_streaming boolean,
supports_extended_thinking boolean,
supports_image_generation boolean,
provider_model_mappings jsonb,
config jsonb,
metadata jsonb,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.models ADD CONSTRAINT models_pkey PRIMARY KEY (id);
CREATE INDEX IF NOT EXISTS models_provider_id_idx ON public.models USING btree (provider_id);
CREATE TABLE IF NOT EXISTS public.global_models (
id character varying(64) NOT NULL,
name character varying(255) NOT NULL,
display_name character varying(255),
enabled boolean DEFAULT true NOT NULL,
is_active boolean DEFAULT true NOT NULL,
default_price_per_request double precision,
default_tiered_pricing jsonb,
supported_capabilities jsonb,
usage_count bigint DEFAULT 0 NOT NULL,
config jsonb,
metadata jsonb,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.global_models ADD CONSTRAINT global_models_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.global_models ADD CONSTRAINT global_models_name_key UNIQUE (name);

View File

@@ -0,0 +1,85 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS public.system_configs (
id character varying(64) NOT NULL,
key character varying(255) NOT NULL,
value text NOT NULL,
description text,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.system_configs ADD CONSTRAINT system_configs_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.system_configs ADD CONSTRAINT system_configs_key_key UNIQUE (key);
CREATE TABLE IF NOT EXISTS public.auth_modules (
id character varying(64) NOT NULL,
module_type character varying(128) NOT NULL,
enabled boolean DEFAULT true NOT NULL,
config jsonb NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.auth_modules ADD CONSTRAINT auth_modules_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.auth_modules ADD CONSTRAINT auth_modules_module_type_key UNIQUE (module_type);
CREATE TABLE IF NOT EXISTS public.oauth_providers (
provider_type character varying(64) NOT NULL,
display_name character varying(255) NOT NULL,
client_id text NOT NULL,
client_secret_encrypted text,
authorization_url_override character varying(500),
token_url_override character varying(500),
userinfo_url_override character varying(500),
scopes jsonb,
redirect_uri character varying(500) NOT NULL,
frontend_callback_url character varying(500) NOT NULL,
attribute_mapping jsonb,
extra_config jsonb,
is_enabled boolean DEFAULT false NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.oauth_providers ADD CONSTRAINT oauth_providers_pkey PRIMARY KEY (provider_type);
CREATE TABLE IF NOT EXISTS public.ldap_configs (
id bigserial NOT NULL,
server_url character varying(255) 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 character varying(50) DEFAULT 'uid' NOT NULL,
email_attr character varying(50) DEFAULT 'mail' NOT NULL,
display_name_attr character varying(50) DEFAULT 'cn' NOT NULL,
is_enabled boolean DEFAULT false NOT NULL,
is_exclusive boolean DEFAULT false NOT NULL,
use_starttls boolean DEFAULT false NOT NULL,
connect_timeout integer DEFAULT 10 NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.ldap_configs ADD CONSTRAINT ldap_configs_pkey PRIMARY KEY (id);
CREATE TABLE IF NOT EXISTS public.user_oauth_links (
id character varying(64) NOT NULL,
user_id character varying(64) NOT NULL,
provider_type character varying(64) NOT NULL,
provider_user_id character varying(255) NOT NULL,
provider_username character varying(255),
provider_email character varying(255),
extra_data jsonb,
linked_at bigint NOT NULL,
last_login_at bigint
);
ALTER TABLE ONLY public.user_oauth_links ADD CONSTRAINT user_oauth_links_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.user_oauth_links ADD CONSTRAINT uq_user_oauth_links_provider_user UNIQUE (provider_type, provider_user_id);
ALTER TABLE ONLY public.user_oauth_links ADD CONSTRAINT uq_user_oauth_links_user_provider UNIQUE (user_id, provider_type);
CREATE INDEX IF NOT EXISTS user_oauth_links_provider_type_idx ON public.user_oauth_links USING btree (provider_type);
CREATE INDEX IF NOT EXISTS user_oauth_links_user_id_idx ON public.user_oauth_links USING btree (user_id);

View File

@@ -0,0 +1,47 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS public.proxy_nodes (
id character varying(64) NOT NULL,
name character varying(255) NOT NULL,
ip character varying(512) NOT NULL,
port integer NOT NULL,
region character varying(100),
status character varying(32) DEFAULT 'online' NOT NULL,
registered_by character varying(64),
last_heartbeat_at bigint,
heartbeat_interval integer DEFAULT 30 NOT NULL,
active_connections integer DEFAULT 0 NOT NULL,
total_requests bigint DEFAULT 0 NOT NULL,
avg_latency_ms double precision,
is_manual boolean DEFAULT false NOT NULL,
proxy_url character varying(500),
proxy_username character varying(255),
proxy_password character varying(500),
created_at bigint NOT NULL,
updated_at bigint NOT NULL,
remote_config jsonb,
config_version integer DEFAULT 0 NOT NULL,
hardware_info jsonb,
estimated_max_concurrency integer,
tunnel_mode boolean DEFAULT false NOT NULL,
tunnel_connected boolean DEFAULT false NOT NULL,
tunnel_connected_at bigint,
failed_requests bigint DEFAULT 0 NOT NULL,
dns_failures bigint DEFAULT 0 NOT NULL,
stream_errors bigint DEFAULT 0 NOT NULL,
proxy_metadata jsonb
);
ALTER TABLE ONLY public.proxy_nodes ADD CONSTRAINT proxy_nodes_pkey PRIMARY KEY (id);
CREATE TABLE IF NOT EXISTS public.proxy_node_events (
id bigserial NOT NULL,
node_id character varying(64) NOT NULL,
event_type character varying(64) NOT NULL,
detail character varying(500),
created_at bigint NOT NULL
);
ALTER TABLE ONLY public.proxy_node_events ADD CONSTRAINT proxy_node_events_pkey PRIMARY KEY (id);

View File

@@ -0,0 +1,203 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS public.wallets (
id character varying(64) NOT NULL,
user_id character varying(64),
api_key_id character varying(64),
balance double precision DEFAULT 0 NOT NULL,
gift_balance double precision DEFAULT 0 NOT NULL,
limit_mode character varying(64) DEFAULT 'finite' NOT NULL,
currency character varying(16) DEFAULT 'USD' NOT NULL,
status character varying(64) DEFAULT 'active' NOT NULL,
total_recharged double precision DEFAULT 0 NOT NULL,
total_consumed double precision DEFAULT 0 NOT NULL,
total_refunded double precision DEFAULT 0 NOT NULL,
total_adjusted double precision DEFAULT 0 NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.wallets ADD CONSTRAINT wallets_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.wallets ADD CONSTRAINT wallets_user_id_key UNIQUE (user_id);
ALTER TABLE ONLY public.wallets ADD CONSTRAINT wallets_api_key_id_key UNIQUE (api_key_id);
CREATE INDEX IF NOT EXISTS wallets_api_key_id_idx ON public.wallets USING btree (api_key_id);
CREATE INDEX IF NOT EXISTS wallets_user_id_idx ON public.wallets USING btree (user_id);
CREATE TABLE IF NOT EXISTS public.wallet_transactions (
id character varying(64) NOT NULL,
wallet_id character varying(64) NOT NULL,
category character varying(64) NOT NULL,
reason_code character varying(64) NOT NULL,
amount double precision NOT NULL,
balance_before double precision NOT NULL,
balance_after double precision NOT NULL,
recharge_balance_before double precision NOT NULL,
recharge_balance_after double precision NOT NULL,
gift_balance_before double precision NOT NULL,
gift_balance_after double precision NOT NULL,
link_type character varying(64),
link_id character varying(128),
operator_id character varying(64),
description text,
created_at bigint NOT NULL
);
ALTER TABLE ONLY public.wallet_transactions ADD CONSTRAINT wallet_transactions_pkey PRIMARY KEY (id);
CREATE INDEX IF NOT EXISTS idx_wallet_tx_wallet_created ON public.wallet_transactions USING btree (wallet_id, created_at);
CREATE INDEX IF NOT EXISTS idx_wallet_tx_category_created ON public.wallet_transactions USING btree (category, created_at);
CREATE INDEX IF NOT EXISTS idx_wallet_tx_reason_created ON public.wallet_transactions USING btree (reason_code, created_at);
CREATE INDEX IF NOT EXISTS idx_wallet_tx_link ON public.wallet_transactions USING btree (link_type, link_id);
CREATE INDEX IF NOT EXISTS ix_wallet_transactions_operator_id ON public.wallet_transactions USING btree (operator_id);
CREATE TABLE IF NOT EXISTS public.wallet_daily_usage_ledgers (
id character varying(64) NOT NULL,
wallet_id character varying(64) NOT NULL,
billing_date character varying(16) NOT NULL,
billing_timezone character varying(64) NOT NULL,
total_cost_usd double precision DEFAULT 0 NOT NULL,
total_requests bigint DEFAULT 0 NOT NULL,
input_tokens bigint DEFAULT 0 NOT NULL,
output_tokens bigint DEFAULT 0 NOT NULL,
cache_creation_tokens bigint DEFAULT 0 NOT NULL,
cache_read_tokens bigint DEFAULT 0 NOT NULL,
first_finalized_at bigint,
last_finalized_at bigint,
aggregated_at bigint NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.wallet_daily_usage_ledgers ADD CONSTRAINT wallet_daily_usage_ledgers_pkey PRIMARY KEY (id);
CREATE INDEX IF NOT EXISTS idx_wallet_daily_usage_wallet_date ON public.wallet_daily_usage_ledgers USING btree (wallet_id, billing_timezone, billing_date);
CREATE TABLE IF NOT EXISTS public.payment_orders (
id character varying(64) NOT NULL,
order_no character varying(128) NOT NULL,
wallet_id character varying(64) NOT NULL,
user_id character varying(64),
amount_usd double precision NOT NULL,
pay_amount double precision,
pay_currency character varying(16),
exchange_rate double precision,
refunded_amount_usd double precision DEFAULT 0 NOT NULL,
refundable_amount_usd double precision DEFAULT 0 NOT NULL,
payment_method character varying(64) NOT NULL,
gateway_order_id character varying(128),
gateway_response jsonb,
status character varying(64) DEFAULT 'pending' NOT NULL,
created_at bigint NOT NULL,
paid_at bigint,
credited_at bigint,
expires_at bigint
);
ALTER TABLE ONLY public.payment_orders ADD CONSTRAINT payment_orders_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.payment_orders ADD CONSTRAINT uq_payment_orders_order_no UNIQUE (order_no);
CREATE INDEX IF NOT EXISTS idx_payment_orders_wallet_created ON public.payment_orders USING btree (wallet_id, created_at);
CREATE INDEX IF NOT EXISTS idx_payment_orders_user_created ON public.payment_orders USING btree (user_id, created_at);
CREATE INDEX IF NOT EXISTS idx_payment_orders_status ON public.payment_orders USING btree (status);
CREATE INDEX IF NOT EXISTS idx_payment_orders_gateway_order_id ON public.payment_orders USING btree (gateway_order_id);
CREATE TABLE IF NOT EXISTS public.payment_callbacks (
id character varying(64) NOT NULL,
payment_order_id character varying(64),
payment_method character varying(64) NOT NULL,
callback_key character varying(128) NOT NULL,
order_no character varying(128),
gateway_order_id character varying(128),
payload_hash character varying(128),
signature_valid boolean DEFAULT false NOT NULL,
status character varying(64) DEFAULT 'received' NOT NULL,
payload jsonb,
error_message text,
created_at bigint NOT NULL,
processed_at bigint
);
ALTER TABLE ONLY public.payment_callbacks ADD CONSTRAINT payment_callbacks_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.payment_callbacks ADD CONSTRAINT uq_payment_callbacks_callback_key UNIQUE (callback_key);
CREATE INDEX IF NOT EXISTS idx_payment_callbacks_order ON public.payment_callbacks USING btree (order_no);
CREATE INDEX IF NOT EXISTS idx_payment_callbacks_gateway_order ON public.payment_callbacks USING btree (gateway_order_id);
CREATE INDEX IF NOT EXISTS idx_payment_callbacks_created ON public.payment_callbacks USING btree (created_at);
CREATE INDEX IF NOT EXISTS ix_payment_callbacks_payment_order_id ON public.payment_callbacks USING btree (payment_order_id);
CREATE TABLE IF NOT EXISTS public.refund_requests (
id character varying(64) NOT NULL,
refund_no character varying(128) NOT NULL,
wallet_id character varying(64) NOT NULL,
user_id character varying(64),
payment_order_id character varying(64),
source_type character varying(64) NOT NULL,
source_id character varying(128),
refund_mode character varying(64) NOT NULL,
amount_usd double precision NOT NULL,
status character varying(64) DEFAULT 'pending_approval' NOT NULL,
reason text,
requested_by character varying(64),
approved_by character varying(64),
processed_by character varying(64),
gateway_refund_id character varying(128),
payout_method character varying(64),
payout_reference character varying(255),
payout_proof jsonb,
failure_reason text,
idempotency_key character varying(128),
created_at bigint NOT NULL,
updated_at bigint NOT NULL,
processed_at bigint,
completed_at bigint
);
ALTER TABLE ONLY public.refund_requests ADD CONSTRAINT refund_requests_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.refund_requests ADD CONSTRAINT uq_refund_requests_refund_no UNIQUE (refund_no);
ALTER TABLE ONLY public.refund_requests ADD CONSTRAINT uq_refund_requests_idempotency_key UNIQUE (idempotency_key);
CREATE INDEX IF NOT EXISTS idx_refund_wallet_created ON public.refund_requests USING btree (wallet_id, created_at);
CREATE INDEX IF NOT EXISTS idx_refund_user_created ON public.refund_requests USING btree (user_id, created_at);
CREATE INDEX IF NOT EXISTS idx_refund_status ON public.refund_requests USING btree (status);
CREATE INDEX IF NOT EXISTS ix_refund_requests_payment_order_id ON public.refund_requests USING btree (payment_order_id);
CREATE INDEX IF NOT EXISTS ix_refund_requests_requested_by ON public.refund_requests USING btree (requested_by);
CREATE INDEX IF NOT EXISTS ix_refund_requests_approved_by ON public.refund_requests USING btree (approved_by);
CREATE INDEX IF NOT EXISTS ix_refund_requests_processed_by ON public.refund_requests USING btree (processed_by);
CREATE TABLE IF NOT EXISTS public.redeem_code_batches (
id character varying(64) NOT NULL,
name character varying(255) NOT NULL,
amount_usd double precision NOT NULL,
currency character varying(16) DEFAULT 'USD' NOT NULL,
balance_bucket character varying(64) DEFAULT 'gift' NOT NULL,
total_count integer NOT NULL,
status character varying(64) DEFAULT 'active' NOT NULL,
description text,
created_by character varying(64),
expires_at bigint,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.redeem_code_batches ADD CONSTRAINT redeem_code_batches_pkey PRIMARY KEY (id);
CREATE INDEX IF NOT EXISTS idx_redeem_code_batches_status ON public.redeem_code_batches USING btree (status, created_at);
CREATE TABLE IF NOT EXISTS public.redeem_codes (
id character varying(64) NOT NULL,
batch_id character varying(64) NOT NULL,
code_hash character varying(128) NOT NULL,
code_prefix character varying(16) NOT NULL,
code_suffix character varying(16) NOT NULL,
status character varying(64) DEFAULT 'active' NOT NULL,
redeemed_by_user_id character varying(64),
redeemed_wallet_id character varying(64),
redeemed_payment_order_id character varying(64),
redeemed_at bigint,
disabled_by character varying(64),
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.redeem_codes ADD CONSTRAINT redeem_codes_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.redeem_codes ADD CONSTRAINT uq_redeem_codes_code_hash UNIQUE (code_hash);
CREATE INDEX IF NOT EXISTS idx_redeem_codes_batch_created ON public.redeem_codes USING btree (batch_id, created_at);
CREATE INDEX IF NOT EXISTS idx_redeem_codes_status ON public.redeem_codes USING btree (status, updated_at);
CREATE INDEX IF NOT EXISTS idx_redeem_codes_redeemed_user ON public.redeem_codes USING btree (redeemed_by_user_id, redeemed_at);
CREATE INDEX IF NOT EXISTS idx_redeem_codes_redeemed_order ON public.redeem_codes USING btree (redeemed_payment_order_id);

View File

@@ -0,0 +1,133 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS public.usage (
request_id character varying(128) NOT NULL,
id character varying(128),
user_id character varying(64),
api_key_id character varying(64),
provider_name character varying(255) DEFAULT 'unknown' NOT NULL,
model character varying(255) DEFAULT 'unknown' NOT NULL,
target_model character varying(255),
provider_id character varying(64),
provider_endpoint_id character varying(64),
provider_api_key_id character varying(64),
request_type character varying(64),
api_format character varying(64),
api_family character varying(64),
endpoint_kind character varying(64),
endpoint_api_format character varying(64),
provider_api_family character varying(64),
provider_endpoint_kind character varying(64),
has_format_conversion boolean DEFAULT false NOT NULL,
is_stream boolean DEFAULT false NOT NULL,
input_tokens bigint DEFAULT 0 NOT NULL,
output_tokens bigint DEFAULT 0 NOT NULL,
input_output_total_tokens bigint DEFAULT 0 NOT NULL,
total_tokens bigint DEFAULT 0 NOT NULL,
cache_creation_input_tokens bigint DEFAULT 0 NOT NULL,
cache_creation_input_tokens_5m bigint DEFAULT 0 NOT NULL,
cache_creation_input_tokens_1h bigint DEFAULT 0 NOT NULL,
cache_creation_ephemeral_5m_input_tokens bigint DEFAULT 0 NOT NULL,
cache_creation_ephemeral_1h_input_tokens bigint DEFAULT 0 NOT NULL,
cache_read_input_tokens bigint DEFAULT 0 NOT NULL,
input_context_tokens bigint DEFAULT 0 NOT NULL,
input_cost_usd double precision DEFAULT 0 NOT NULL,
output_cost_usd double precision DEFAULT 0 NOT NULL,
cache_cost_usd double precision DEFAULT 0 NOT NULL,
cache_creation_cost_usd double precision DEFAULT 0 NOT NULL,
cache_creation_cost_usd_5m double precision DEFAULT 0 NOT NULL,
cache_creation_cost_usd_1h double precision DEFAULT 0 NOT NULL,
cache_read_cost_usd double precision DEFAULT 0 NOT NULL,
request_cost_usd double precision DEFAULT 0 NOT NULL,
actual_input_cost_usd double precision DEFAULT 0 NOT NULL,
actual_output_cost_usd double precision DEFAULT 0 NOT NULL,
actual_cache_cost_usd double precision DEFAULT 0 NOT NULL,
actual_cache_creation_cost_usd double precision DEFAULT 0 NOT NULL,
actual_cache_creation_cost_usd_5m double precision DEFAULT 0 NOT NULL,
actual_cache_creation_cost_usd_1h double precision DEFAULT 0 NOT NULL,
actual_cache_read_cost_usd double precision DEFAULT 0 NOT NULL,
actual_request_cost_usd double precision DEFAULT 0 NOT NULL,
rate_multiplier double precision DEFAULT 1 NOT NULL,
input_price_per_1m double precision,
output_price_per_1m double precision,
cache_creation_price_per_1m double precision,
cache_creation_price_per_1m_5m double precision,
cache_creation_price_per_1m_1h double precision,
cache_read_price_per_1m double precision,
price_per_request double precision,
status_code integer,
error_message text,
error_category character varying(255),
response_time_ms bigint,
first_byte_time_ms bigint,
wallet_id character varying(64),
status character varying(64) DEFAULT 'completed' NOT NULL,
billing_status character varying(64) DEFAULT 'pending' NOT NULL,
total_cost_usd double precision DEFAULT 0 NOT NULL,
actual_total_cost_usd double precision DEFAULT 0 NOT NULL,
request_headers jsonb,
request_body jsonb,
provider_request_headers jsonb,
provider_request_body jsonb,
response_headers jsonb,
response_body jsonb,
client_response_headers jsonb,
client_response_body jsonb,
request_body_compressed bytea,
provider_request_body_compressed bytea,
response_body_compressed bytea,
client_response_body_compressed bytea,
request_metadata jsonb,
created_at bigint,
candidate_id character varying(128),
candidate_index bigint,
key_name character varying(255),
username character varying(255),
api_key_name character varying(255),
planner_kind character varying(64),
route_family character varying(128),
route_kind character varying(128),
execution_path character varying(128),
local_execution_runtime_miss_reason character varying(255),
wallet_balance_before double precision,
wallet_balance_after double precision,
wallet_recharge_balance_before double precision,
wallet_recharge_balance_after double precision,
wallet_gift_balance_before double precision,
wallet_gift_balance_after double precision,
finalized_at bigint,
created_at_unix_ms bigint DEFAULT 0 NOT NULL,
updated_at_unix_secs bigint DEFAULT 0 NOT NULL
);
ALTER TABLE ONLY public.usage ADD CONSTRAINT usage_pkey PRIMARY KEY (request_id);
CREATE INDEX IF NOT EXISTS usage_api_key_id_idx ON public.usage USING btree (api_key_id);
CREATE INDEX IF NOT EXISTS usage_billing_status_idx ON public.usage USING btree (billing_status);
CREATE INDEX IF NOT EXISTS usage_created_at_idx ON public.usage USING btree (created_at_unix_ms);
CREATE INDEX IF NOT EXISTS usage_provider_api_key_id_idx ON public.usage USING btree (provider_api_key_id);
CREATE INDEX IF NOT EXISTS usage_provider_id_idx ON public.usage USING btree (provider_id);
CREATE INDEX IF NOT EXISTS usage_request_id_idx ON public.usage USING btree (request_id);
CREATE INDEX IF NOT EXISTS usage_user_id_idx ON public.usage USING btree (user_id);
CREATE INDEX IF NOT EXISTS usage_wallet_id_idx ON public.usage USING btree (wallet_id);
CREATE TABLE IF NOT EXISTS public.usage_settlement_snapshots (
request_id character varying(128) NOT NULL,
billing_status character varying(64) NOT NULL,
wallet_id character varying(64),
wallet_balance_before double precision,
wallet_balance_after double precision,
wallet_recharge_balance_before double precision,
wallet_recharge_balance_after double precision,
wallet_gift_balance_before double precision,
wallet_gift_balance_after double precision,
provider_monthly_used_usd double precision,
finalized_at bigint,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.usage_settlement_snapshots ADD CONSTRAINT usage_settlement_snapshots_pkey PRIMARY KEY (request_id);
CREATE INDEX IF NOT EXISTS usage_settlement_snapshots_billing_status_idx ON public.usage_settlement_snapshots USING btree (billing_status);
CREATE INDEX IF NOT EXISTS usage_settlement_snapshots_wallet_id_idx ON public.usage_settlement_snapshots USING btree (wallet_id);

View File

@@ -0,0 +1,249 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS public.stats_hourly (
id character varying(64) NOT NULL,
hour_utc bigint NOT NULL,
total_requests bigint DEFAULT 0 NOT NULL,
success_requests bigint DEFAULT 0 NOT NULL,
error_requests bigint DEFAULT 0 NOT NULL,
input_tokens bigint DEFAULT 0 NOT NULL,
output_tokens bigint DEFAULT 0 NOT NULL,
cache_creation_tokens bigint DEFAULT 0 NOT NULL,
cache_read_tokens bigint DEFAULT 0 NOT NULL,
total_cost double precision DEFAULT 0 NOT NULL,
actual_total_cost double precision DEFAULT 0 NOT NULL,
avg_response_time_ms double precision DEFAULT 0 NOT NULL,
is_complete boolean DEFAULT false NOT NULL,
aggregated_at bigint,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.stats_hourly ADD CONSTRAINT stats_hourly_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.stats_hourly ADD CONSTRAINT uq_stats_hourly_hour UNIQUE (hour_utc);
CREATE TABLE IF NOT EXISTS public.stats_summary (
id character varying(64) NOT NULL,
cutoff_date bigint NOT NULL,
all_time_requests bigint DEFAULT 0 NOT NULL,
all_time_success_requests bigint DEFAULT 0 NOT NULL,
all_time_error_requests bigint DEFAULT 0 NOT NULL,
all_time_input_tokens bigint DEFAULT 0 NOT NULL,
all_time_output_tokens bigint DEFAULT 0 NOT NULL,
all_time_cache_creation_tokens bigint DEFAULT 0 NOT NULL,
all_time_cache_read_tokens bigint DEFAULT 0 NOT NULL,
all_time_cost double precision DEFAULT 0 NOT NULL,
all_time_actual_cost double precision DEFAULT 0 NOT NULL,
total_users bigint DEFAULT 0 NOT NULL,
active_users bigint DEFAULT 0 NOT NULL,
total_api_keys bigint DEFAULT 0 NOT NULL,
active_api_keys bigint DEFAULT 0 NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.stats_summary ADD CONSTRAINT stats_summary_pkey PRIMARY KEY (id);
CREATE TABLE IF NOT EXISTS public.stats_hourly_user (
id character varying(64) NOT NULL,
hour_utc bigint NOT NULL,
user_id character varying(64) NOT NULL,
total_requests bigint DEFAULT 0 NOT NULL,
success_requests bigint DEFAULT 0 NOT NULL,
error_requests bigint DEFAULT 0 NOT NULL,
input_tokens bigint DEFAULT 0 NOT NULL,
output_tokens bigint DEFAULT 0 NOT NULL,
total_cost double precision DEFAULT 0 NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.stats_hourly_user ADD CONSTRAINT stats_hourly_user_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.stats_hourly_user ADD CONSTRAINT uq_stats_hourly_user UNIQUE (hour_utc, user_id);
CREATE TABLE IF NOT EXISTS public.stats_hourly_user_model (
id character varying(64) NOT NULL,
hour_utc bigint NOT NULL,
user_id character varying(64) NOT NULL,
model character varying(255) NOT NULL,
total_requests bigint DEFAULT 0 NOT NULL,
input_tokens bigint DEFAULT 0 NOT NULL,
output_tokens bigint DEFAULT 0 NOT NULL,
total_cost double precision DEFAULT 0 NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.stats_hourly_user_model ADD CONSTRAINT stats_hourly_user_model_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.stats_hourly_user_model ADD CONSTRAINT uq_stats_hourly_user_model UNIQUE (hour_utc, user_id, model);
CREATE TABLE IF NOT EXISTS public.user_model_usage_counts (
id character varying(64) NOT NULL,
user_id character varying(64) NOT NULL,
model character varying(255) NOT NULL,
usage_count bigint DEFAULT 0 NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.user_model_usage_counts ADD CONSTRAINT user_model_usage_counts_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.user_model_usage_counts ADD CONSTRAINT uq_user_model_usage_count UNIQUE (user_id, model);
CREATE INDEX IF NOT EXISTS idx_user_model_usage_user ON public.user_model_usage_counts USING btree (user_id);
CREATE INDEX IF NOT EXISTS idx_user_model_usage_model ON public.user_model_usage_counts USING btree (model);
CREATE TABLE IF NOT EXISTS public.stats_hourly_model (
id character varying(64) NOT NULL,
hour_utc bigint NOT NULL,
model character varying(255) NOT NULL,
total_requests bigint DEFAULT 0 NOT NULL,
input_tokens bigint DEFAULT 0 NOT NULL,
output_tokens bigint DEFAULT 0 NOT NULL,
total_cost double precision DEFAULT 0 NOT NULL,
avg_response_time_ms double precision DEFAULT 0 NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.stats_hourly_model ADD CONSTRAINT stats_hourly_model_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.stats_hourly_model ADD CONSTRAINT uq_stats_hourly_model UNIQUE (hour_utc, model);
CREATE TABLE IF NOT EXISTS public.stats_hourly_provider (
id character varying(64) NOT NULL,
hour_utc bigint NOT NULL,
provider_name character varying(255) NOT NULL,
total_requests bigint DEFAULT 0 NOT NULL,
input_tokens bigint DEFAULT 0 NOT NULL,
output_tokens bigint DEFAULT 0 NOT NULL,
total_cost double precision DEFAULT 0 NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.stats_hourly_provider ADD CONSTRAINT stats_hourly_provider_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.stats_hourly_provider ADD CONSTRAINT uq_stats_hourly_provider UNIQUE (hour_utc, provider_name);
CREATE TABLE IF NOT EXISTS public.stats_daily (
id character varying(64) NOT NULL,
date bigint NOT NULL,
total_requests bigint DEFAULT 0 NOT NULL,
success_requests bigint DEFAULT 0 NOT NULL,
error_requests bigint DEFAULT 0 NOT NULL,
input_tokens bigint DEFAULT 0 NOT NULL,
output_tokens bigint DEFAULT 0 NOT NULL,
cache_creation_tokens bigint DEFAULT 0 NOT NULL,
cache_read_tokens bigint DEFAULT 0 NOT NULL,
total_cost double precision DEFAULT 0 NOT NULL,
actual_total_cost double precision DEFAULT 0 NOT NULL,
input_cost double precision DEFAULT 0 NOT NULL,
output_cost double precision DEFAULT 0 NOT NULL,
cache_creation_cost double precision DEFAULT 0 NOT NULL,
cache_read_cost double precision DEFAULT 0 NOT NULL,
avg_response_time_ms double precision DEFAULT 0 NOT NULL,
fallback_count bigint DEFAULT 0 NOT NULL,
unique_models bigint DEFAULT 0 NOT NULL,
unique_providers bigint DEFAULT 0 NOT NULL,
is_complete boolean DEFAULT false NOT NULL,
aggregated_at bigint,
created_at bigint NOT NULL,
updated_at bigint NOT NULL,
p50_response_time_ms bigint,
p90_response_time_ms bigint,
p99_response_time_ms bigint,
p50_first_byte_time_ms bigint,
p90_first_byte_time_ms bigint,
p99_first_byte_time_ms bigint
);
ALTER TABLE ONLY public.stats_daily ADD CONSTRAINT stats_daily_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.stats_daily ADD CONSTRAINT uq_stats_daily_date UNIQUE (date);
CREATE TABLE IF NOT EXISTS public.stats_daily_model (
id character varying(64) NOT NULL,
date bigint NOT NULL,
model character varying(255) NOT NULL,
total_requests bigint DEFAULT 0 NOT NULL,
input_tokens bigint DEFAULT 0 NOT NULL,
output_tokens bigint DEFAULT 0 NOT NULL,
cache_creation_tokens bigint DEFAULT 0 NOT NULL,
cache_read_tokens bigint DEFAULT 0 NOT NULL,
total_cost double precision DEFAULT 0 NOT NULL,
avg_response_time_ms double precision DEFAULT 0 NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.stats_daily_model ADD CONSTRAINT stats_daily_model_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.stats_daily_model ADD CONSTRAINT uq_stats_daily_model UNIQUE (date, model);
CREATE TABLE IF NOT EXISTS public.stats_daily_provider (
id character varying(64) NOT NULL,
date bigint NOT NULL,
provider_name character varying(255) NOT NULL,
total_requests bigint DEFAULT 0 NOT NULL,
input_tokens bigint DEFAULT 0 NOT NULL,
output_tokens bigint DEFAULT 0 NOT NULL,
cache_creation_tokens bigint DEFAULT 0 NOT NULL,
cache_read_tokens bigint DEFAULT 0 NOT NULL,
total_cost double precision DEFAULT 0 NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.stats_daily_provider ADD CONSTRAINT stats_daily_provider_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.stats_daily_provider ADD CONSTRAINT uq_stats_daily_provider UNIQUE (date, provider_name);
CREATE TABLE IF NOT EXISTS public.stats_daily_api_key (
id character varying(64) NOT NULL,
api_key_id character varying(64) NOT NULL,
date bigint NOT NULL,
total_requests bigint DEFAULT 0 NOT NULL,
success_requests bigint DEFAULT 0 NOT NULL,
error_requests bigint DEFAULT 0 NOT NULL,
input_tokens bigint DEFAULT 0 NOT NULL,
output_tokens bigint DEFAULT 0 NOT NULL,
cache_creation_tokens bigint DEFAULT 0 NOT NULL,
cache_read_tokens bigint DEFAULT 0 NOT NULL,
total_cost double precision DEFAULT 0 NOT NULL,
api_key_name character varying(255),
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.stats_daily_api_key ADD CONSTRAINT stats_daily_api_key_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.stats_daily_api_key ADD CONSTRAINT uq_stats_daily_api_key UNIQUE (date, api_key_id);
CREATE TABLE IF NOT EXISTS public.stats_daily_error (
id character varying(64) NOT NULL,
date bigint NOT NULL,
error_category character varying(255) NOT NULL,
provider_name character varying(255),
model character varying(255),
count bigint DEFAULT 0 NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.stats_daily_error ADD CONSTRAINT stats_daily_error_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.stats_daily_error ADD CONSTRAINT uq_stats_daily_error UNIQUE (date, error_category, provider_name, model);
CREATE TABLE IF NOT EXISTS public.stats_user_daily (
id character varying(64) NOT NULL,
user_id character varying(64) NOT NULL,
date bigint NOT NULL,
total_requests bigint DEFAULT 0 NOT NULL,
success_requests bigint DEFAULT 0 NOT NULL,
error_requests bigint DEFAULT 0 NOT NULL,
input_tokens bigint DEFAULT 0 NOT NULL,
output_tokens bigint DEFAULT 0 NOT NULL,
cache_creation_tokens bigint DEFAULT 0 NOT NULL,
cache_read_tokens bigint DEFAULT 0 NOT NULL,
total_cost double precision DEFAULT 0 NOT NULL,
username character varying(255),
created_at bigint NOT NULL,
updated_at bigint NOT NULL
);
ALTER TABLE ONLY public.stats_user_daily ADD CONSTRAINT stats_user_daily_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.stats_user_daily ADD CONSTRAINT uq_stats_user_daily UNIQUE (date, user_id);

View File

@@ -0,0 +1,10 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
001_identity.sql
002_provider_catalog.sql
003_auth_config.sql
004_proxy_nodes.sql
005_wallet_billing.sql
006_usage.sql
007_stats.sql

View File

@@ -0,0 +1,172 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY NOT NULL,
external_id TEXT,
email TEXT,
username TEXT,
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,
ldap_dn TEXT,
ldap_username TEXT,
UNIQUE (email),
UNIQUE (username)
);
CREATE TABLE IF NOT EXISTS api_keys (
id TEXT PRIMARY KEY NOT NULL,
user_id TEXT NOT NULL,
key_hash TEXT NOT NULL,
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,
UNIQUE (key_hash)
);
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 NOT NULL,
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 NOT NULL,
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 NOT NULL,
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 NOT NULL,
user_id TEXT NOT NULL,
name TEXT NOT NULL,
description TEXT,
token_hash TEXT NOT NULL,
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 (token_hash),
UNIQUE (user_id, name)
);
CREATE INDEX IF NOT EXISTS management_tokens_user_id_idx ON management_tokens (user_id);
CREATE TABLE IF NOT EXISTS user_preferences (
id TEXT PRIMARY KEY NOT NULL,
user_id TEXT NOT NULL,
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,
UNIQUE (user_id)
);
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 NOT NULL,
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);

View File

@@ -0,0 +1,342 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS billing_rules (
id TEXT PRIMARY KEY NOT NULL,
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,
dimension_mappings TEXT NOT NULL,
is_enabled INTEGER NOT NULL DEFAULT 1,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS billing_rules_global_model_task_idx ON billing_rules (global_model_id, task_type, is_enabled);
CREATE INDEX IF NOT EXISTS billing_rules_model_task_idx ON billing_rules (model_id, task_type, is_enabled);
CREATE TABLE IF NOT EXISTS dimension_collectors (
id TEXT PRIMARY KEY NOT NULL,
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
);
CREATE INDEX IF NOT EXISTS dimension_collectors_enabled_idx ON dimension_collectors (api_format, task_type, dimension_name, priority, is_enabled);
CREATE TABLE IF NOT EXISTS providers (
id TEXT PRIMARY KEY NOT NULL,
name TEXT NOT NULL,
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,
UNIQUE (name)
);
CREATE TABLE IF NOT EXISTS provider_api_keys (
id TEXT PRIMARY KEY NOT NULL,
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,
last_error_at INTEGER,
last_error_msg TEXT,
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 api_key_provider_mappings (
id TEXT PRIMARY KEY NOT NULL,
api_key_id TEXT NOT NULL,
provider_id TEXT NOT NULL,
priority_adjustment INTEGER NOT NULL DEFAULT 0,
weight_multiplier REAL NOT NULL DEFAULT 1,
is_enabled INTEGER NOT NULL DEFAULT 1,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
UNIQUE (api_key_id, provider_id)
);
CREATE INDEX IF NOT EXISTS api_key_provider_mappings_api_key_id_idx ON api_key_provider_mappings (api_key_id);
CREATE INDEX IF NOT EXISTS api_key_provider_mappings_provider_id_idx ON api_key_provider_mappings (provider_id);
CREATE INDEX IF NOT EXISTS idx_apikey_provider_enabled ON api_key_provider_mappings (api_key_id, is_enabled);
CREATE TABLE IF NOT EXISTS gemini_file_mappings (
id TEXT PRIMARY KEY NOT NULL,
file_name TEXT NOT NULL,
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,
UNIQUE (file_name)
);
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 NOT NULL,
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 NOT NULL,
short_id TEXT,
request_id TEXT NOT NULL,
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,
converted_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,
max_retries INTEGER NOT NULL DEFAULT 3,
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,
video_urls TEXT,
thumbnail_url TEXT,
video_size_bytes INTEGER,
video_expires_at INTEGER,
stored_video_path TEXT,
storage_provider TEXT,
remixed_from_task_id TEXT,
webhook_url TEXT,
webhook_sent INTEGER NOT NULL DEFAULT 0,
webhook_sent_at INTEGER,
request_metadata TEXT,
video_duration_seconds REAL,
UNIQUE (short_id),
UNIQUE (request_id)
);
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_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 NOT NULL,
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 provider_usage_tracking (
id TEXT PRIMARY KEY NOT NULL,
provider_id TEXT NOT NULL,
window_start INTEGER NOT NULL,
window_end INTEGER NOT NULL,
total_requests INTEGER NOT NULL DEFAULT 0,
successful_requests INTEGER NOT NULL DEFAULT 0,
failed_requests INTEGER NOT NULL DEFAULT 0,
avg_response_time_ms REAL NOT NULL DEFAULT 0,
total_response_time_ms REAL NOT NULL DEFAULT 0,
total_cost_usd REAL NOT NULL DEFAULT 0,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS provider_usage_tracking_provider_id_idx ON provider_usage_tracking (provider_id);
CREATE INDEX IF NOT EXISTS provider_usage_tracking_window_start_idx ON provider_usage_tracking (window_start);
CREATE INDEX IF NOT EXISTS idx_provider_window ON provider_usage_tracking (provider_id, window_start);
CREATE INDEX IF NOT EXISTS idx_window_time ON provider_usage_tracking (window_start, window_end);
CREATE TABLE IF NOT EXISTS models (
id TEXT PRIMARY KEY NOT NULL,
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 NOT NULL,
name TEXT NOT NULL,
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,
UNIQUE (name)
);

View File

@@ -0,0 +1,75 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS system_configs (
id TEXT PRIMARY KEY NOT NULL,
key TEXT NOT NULL,
value TEXT NOT NULL,
description TEXT,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
UNIQUE (key)
);
CREATE TABLE IF NOT EXISTS auth_modules (
id TEXT PRIMARY KEY NOT NULL,
module_type TEXT NOT NULL,
enabled INTEGER NOT NULL DEFAULT 1,
config TEXT NOT NULL,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
UNIQUE (module_type)
);
CREATE TABLE IF NOT EXISTS oauth_providers (
provider_type TEXT PRIMARY KEY NOT NULL,
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 NOT NULL DEFAULT '(uid={username})',
username_attr TEXT NOT NULL DEFAULT 'uid',
email_attr TEXT NOT NULL DEFAULT 'mail',
display_name_attr TEXT NOT NULL DEFAULT 'cn',
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 NOT NULL,
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,
UNIQUE (provider_type, provider_user_id),
UNIQUE (user_id, provider_type)
);
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);

View File

@@ -0,0 +1,43 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS proxy_nodes (
id TEXT PRIMARY KEY NOT NULL,
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
);

View File

@@ -0,0 +1,187 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS wallets (
id TEXT PRIMARY KEY NOT NULL,
user_id TEXT,
api_key_id TEXT,
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,
UNIQUE (user_id),
UNIQUE (api_key_id)
);
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 NOT NULL,
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 NOT NULL,
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 NOT NULL,
order_no TEXT NOT NULL,
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,
UNIQUE (order_no)
);
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 NOT NULL,
payment_order_id TEXT,
payment_method TEXT NOT NULL,
callback_key TEXT NOT NULL,
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,
UNIQUE (callback_key)
);
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 NOT NULL,
refund_no TEXT NOT NULL,
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,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
processed_at INTEGER,
completed_at INTEGER,
UNIQUE (refund_no),
UNIQUE (idempotency_key)
);
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 NOT NULL,
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 NOT NULL,
batch_id TEXT NOT NULL,
code_hash TEXT NOT NULL,
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,
UNIQUE (code_hash)
);
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);

View File

@@ -0,0 +1,129 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS "usage" (
request_id TEXT PRIMARY KEY NOT NULL,
id TEXT,
user_id TEXT,
api_key_id TEXT,
provider_name TEXT NOT NULL DEFAULT 'unknown',
model TEXT NOT NULL DEFAULT 'unknown',
target_model TEXT,
provider_id TEXT,
provider_endpoint_id TEXT,
provider_api_key_id TEXT,
request_type TEXT,
api_format TEXT,
api_family TEXT,
endpoint_kind TEXT,
endpoint_api_format TEXT,
provider_api_family TEXT,
provider_endpoint_kind TEXT,
has_format_conversion INTEGER NOT NULL DEFAULT 0,
is_stream INTEGER NOT NULL DEFAULT 0,
input_tokens INTEGER NOT NULL DEFAULT 0,
output_tokens INTEGER NOT NULL DEFAULT 0,
input_output_total_tokens INTEGER NOT NULL DEFAULT 0,
total_tokens INTEGER NOT NULL DEFAULT 0,
cache_creation_input_tokens INTEGER NOT NULL DEFAULT 0,
cache_creation_input_tokens_5m INTEGER NOT NULL DEFAULT 0,
cache_creation_input_tokens_1h INTEGER NOT NULL DEFAULT 0,
cache_creation_ephemeral_5m_input_tokens INTEGER NOT NULL DEFAULT 0,
cache_creation_ephemeral_1h_input_tokens INTEGER NOT NULL DEFAULT 0,
cache_read_input_tokens INTEGER NOT NULL DEFAULT 0,
input_context_tokens INTEGER NOT NULL DEFAULT 0,
input_cost_usd REAL NOT NULL DEFAULT 0,
output_cost_usd REAL NOT NULL DEFAULT 0,
cache_cost_usd REAL NOT NULL DEFAULT 0,
cache_creation_cost_usd REAL NOT NULL DEFAULT 0,
cache_creation_cost_usd_5m REAL NOT NULL DEFAULT 0,
cache_creation_cost_usd_1h REAL NOT NULL DEFAULT 0,
cache_read_cost_usd REAL NOT NULL DEFAULT 0,
request_cost_usd REAL NOT NULL DEFAULT 0,
actual_input_cost_usd REAL NOT NULL DEFAULT 0,
actual_output_cost_usd REAL NOT NULL DEFAULT 0,
actual_cache_cost_usd REAL NOT NULL DEFAULT 0,
actual_cache_creation_cost_usd REAL NOT NULL DEFAULT 0,
actual_cache_creation_cost_usd_5m REAL NOT NULL DEFAULT 0,
actual_cache_creation_cost_usd_1h REAL NOT NULL DEFAULT 0,
actual_cache_read_cost_usd REAL NOT NULL DEFAULT 0,
actual_request_cost_usd REAL NOT NULL DEFAULT 0,
rate_multiplier REAL NOT NULL DEFAULT 1,
input_price_per_1m REAL,
output_price_per_1m REAL,
cache_creation_price_per_1m REAL,
cache_creation_price_per_1m_5m REAL,
cache_creation_price_per_1m_1h REAL,
cache_read_price_per_1m REAL,
price_per_request REAL,
status_code INTEGER,
error_message TEXT,
error_category TEXT,
response_time_ms INTEGER,
first_byte_time_ms INTEGER,
wallet_id TEXT,
status TEXT NOT NULL DEFAULT 'completed',
billing_status TEXT NOT NULL DEFAULT 'pending',
total_cost_usd REAL NOT NULL DEFAULT 0,
actual_total_cost_usd REAL NOT NULL DEFAULT 0,
request_headers TEXT,
request_body TEXT,
provider_request_headers TEXT,
provider_request_body TEXT,
response_headers TEXT,
response_body TEXT,
client_response_headers TEXT,
client_response_body TEXT,
request_body_compressed BLOB,
provider_request_body_compressed BLOB,
response_body_compressed BLOB,
client_response_body_compressed BLOB,
request_metadata TEXT,
created_at INTEGER,
candidate_id TEXT,
candidate_index INTEGER,
key_name TEXT,
username TEXT,
api_key_name TEXT,
planner_kind TEXT,
route_family TEXT,
route_kind TEXT,
execution_path TEXT,
local_execution_runtime_miss_reason TEXT,
wallet_balance_before REAL,
wallet_balance_after REAL,
wallet_recharge_balance_before REAL,
wallet_recharge_balance_after REAL,
wallet_gift_balance_before REAL,
wallet_gift_balance_after REAL,
finalized_at INTEGER,
created_at_unix_ms INTEGER NOT NULL DEFAULT 0,
updated_at_unix_secs INTEGER NOT NULL DEFAULT 0
);
CREATE INDEX IF NOT EXISTS usage_api_key_id_idx ON "usage" (api_key_id);
CREATE INDEX IF NOT EXISTS usage_billing_status_idx ON "usage" (billing_status);
CREATE INDEX IF NOT EXISTS usage_created_at_idx ON "usage" (created_at_unix_ms);
CREATE INDEX IF NOT EXISTS usage_provider_api_key_id_idx ON "usage" (provider_api_key_id);
CREATE INDEX IF NOT EXISTS usage_provider_id_idx ON "usage" (provider_id);
CREATE INDEX IF NOT EXISTS usage_request_id_idx ON "usage" (request_id);
CREATE INDEX IF NOT EXISTS usage_user_id_idx ON "usage" (user_id);
CREATE INDEX IF NOT EXISTS usage_wallet_id_idx ON "usage" (wallet_id);
CREATE TABLE IF NOT EXISTS usage_settlement_snapshots (
request_id TEXT PRIMARY KEY NOT NULL,
billing_status TEXT NOT NULL,
wallet_id TEXT,
wallet_balance_before REAL,
wallet_balance_after REAL,
wallet_recharge_balance_before REAL,
wallet_recharge_balance_after REAL,
wallet_gift_balance_before REAL,
wallet_gift_balance_after REAL,
provider_monthly_used_usd REAL,
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);

View File

@@ -0,0 +1,223 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
CREATE TABLE IF NOT EXISTS stats_hourly (
id TEXT PRIMARY KEY NOT NULL,
hour_utc 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,
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,
UNIQUE (hour_utc)
);
CREATE TABLE IF NOT EXISTS stats_summary (
id TEXT PRIMARY KEY NOT NULL,
cutoff_date INTEGER NOT NULL,
all_time_requests INTEGER NOT NULL DEFAULT 0,
all_time_success_requests INTEGER NOT NULL DEFAULT 0,
all_time_error_requests INTEGER NOT NULL DEFAULT 0,
all_time_input_tokens INTEGER NOT NULL DEFAULT 0,
all_time_output_tokens INTEGER NOT NULL DEFAULT 0,
all_time_cache_creation_tokens INTEGER NOT NULL DEFAULT 0,
all_time_cache_read_tokens INTEGER NOT NULL DEFAULT 0,
all_time_cost REAL NOT NULL DEFAULT 0,
all_time_actual_cost REAL NOT NULL DEFAULT 0,
total_users INTEGER NOT NULL DEFAULT 0,
active_users INTEGER NOT NULL DEFAULT 0,
total_api_keys INTEGER NOT NULL DEFAULT 0,
active_api_keys INTEGER NOT NULL DEFAULT 0,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS stats_hourly_user (
id TEXT PRIMARY KEY NOT NULL,
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 NOT NULL,
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 user_model_usage_counts (
id TEXT PRIMARY KEY NOT NULL,
user_id TEXT NOT NULL,
model TEXT NOT NULL,
usage_count INTEGER NOT NULL DEFAULT 0,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
UNIQUE (user_id, model)
);
CREATE INDEX IF NOT EXISTS idx_user_model_usage_user ON user_model_usage_counts (user_id);
CREATE INDEX IF NOT EXISTS idx_user_model_usage_model ON user_model_usage_counts (model);
CREATE TABLE IF NOT EXISTS stats_hourly_model (
id TEXT PRIMARY KEY NOT NULL,
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 NOT NULL,
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 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,
actual_total_cost REAL NOT NULL DEFAULT 0,
input_cost REAL NOT NULL DEFAULT 0,
output_cost REAL NOT NULL DEFAULT 0,
cache_creation_cost REAL NOT NULL DEFAULT 0,
cache_read_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,
p50_response_time_ms INTEGER,
p90_response_time_ms INTEGER,
p99_response_time_ms INTEGER,
p50_first_byte_time_ms INTEGER,
p90_first_byte_time_ms INTEGER,
p99_first_byte_time_ms INTEGER,
UNIQUE (date)
);
CREATE TABLE IF NOT EXISTS stats_daily_model (
id TEXT PRIMARY KEY NOT NULL,
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 NOT NULL,
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 NOT NULL,
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 NOT NULL,
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 NOT NULL,
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)
);

View File

@@ -0,0 +1,10 @@
-- Generated by aether-data-schema from schema/logical/*.toml.
-- Do not edit generated files directly; edit logical schema or explicit overrides instead.
001_identity.sql
002_provider_catalog.sql
003_auth_config.sql
004_proxy_nodes.sql
005_wallet_billing.sql
006_usage.sql
007_stats.sql