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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,23 @@
UPDATE api_keys
SET
total_requests = GREATEST(COALESCE(total_requests, 0) + $2, 0),
total_tokens = GREATEST(COALESCE(total_tokens, 0) + $3, 0),
total_cost_usd = CAST(
GREATEST(CAST(COALESCE(total_cost_usd, 0) AS DOUBLE PRECISION) + $4, 0) AS NUMERIC(20,8)
),
last_used_at = CASE
WHEN $5::double precision IS NOT NULL THEN CASE
WHEN last_used_at IS NULL THEN TO_TIMESTAMP($5::double precision)
ELSE GREATEST(last_used_at, TO_TIMESTAMP($5::double precision))
END
WHEN $6::double precision IS NOT NULL
AND last_used_at IS NOT NULL
AND EXTRACT(EPOCH FROM last_used_at)::BIGINT = $6::BIGINT
THEN (
SELECT MAX(created_at)
FROM "usage"
WHERE api_key_id = $1
)
ELSE last_used_at
END
WHERE id = $1

View File

@@ -0,0 +1,26 @@
UPDATE provider_api_keys
SET
request_count = GREATEST(COALESCE(request_count, 0) + $2, 0),
success_count = GREATEST(COALESCE(success_count, 0) + $3, 0),
error_count = GREATEST(COALESCE(error_count, 0) + $4, 0),
total_tokens = GREATEST(total_tokens + $5, 0),
total_cost_usd = CAST(
GREATEST(CAST(total_cost_usd AS DOUBLE PRECISION) + $6, 0) AS NUMERIC(20,8)
),
total_response_time_ms = GREATEST(COALESCE(total_response_time_ms, 0) + $7, 0),
last_used_at = CASE
WHEN $8::double precision IS NOT NULL THEN CASE
WHEN last_used_at IS NULL THEN TO_TIMESTAMP($8::double precision)
ELSE GREATEST(last_used_at, TO_TIMESTAMP($8::double precision))
END
WHEN $9::double precision IS NOT NULL
AND last_used_at IS NOT NULL
AND EXTRACT(EPOCH FROM last_used_at)::BIGINT = $9::BIGINT
THEN (
SELECT MAX(created_at)
FROM "usage"
WHERE provider_api_key_id = $1
)
ELSE last_used_at
END
WHERE id = $1

View File

@@ -0,0 +1,2 @@
DELETE FROM usage_body_blobs
WHERE body_ref = $1

View File

@@ -0,0 +1,177 @@
SELECT
"usage".id,
"usage".request_id,
"usage".user_id,
"usage".api_key_id,
"usage".username,
"usage".api_key_name,
"usage".provider_name,
"usage".model,
"usage".target_model,
"usage".provider_id,
"usage".provider_endpoint_id,
"usage".provider_api_key_id,
"usage".request_type,
"usage".api_format,
"usage".api_family,
"usage".endpoint_kind,
"usage".endpoint_api_format,
"usage".provider_api_family,
"usage".provider_endpoint_kind,
COALESCE("usage".has_format_conversion, FALSE) AS has_format_conversion,
COALESCE("usage".is_stream, FALSE) AS is_stream,
CAST("usage".input_tokens AS INTEGER) AS input_tokens,
CAST(COALESCE(usage_settlement_snapshots.billing_output_tokens, "usage".output_tokens) AS INTEGER) AS output_tokens,
CAST(COALESCE(
CASE
WHEN usage_settlement_snapshots.billing_input_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_output_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_creation_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_creation_5m_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_creation_1h_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_read_tokens IS NOT NULL
THEN COALESCE(usage_settlement_snapshots.billing_input_tokens, 0)
+ COALESCE(usage_settlement_snapshots.billing_output_tokens, 0)
+ COALESCE(
usage_settlement_snapshots.billing_cache_creation_tokens,
COALESCE(usage_settlement_snapshots.billing_cache_creation_5m_tokens, 0)
+ COALESCE(usage_settlement_snapshots.billing_cache_creation_1h_tokens, 0),
0
)
+ COALESCE(usage_settlement_snapshots.billing_cache_read_tokens, 0)
END,
"usage".total_tokens
) AS INTEGER) AS total_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_creation_tokens,
"usage".cache_creation_input_tokens,
0
) AS INTEGER) AS cache_creation_input_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_creation_5m_tokens,
"usage".cache_creation_input_tokens_5m,
0
) AS INTEGER) AS cache_creation_ephemeral_5m_input_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_creation_1h_tokens,
"usage".cache_creation_input_tokens_1h,
0
) AS INTEGER) AS cache_creation_ephemeral_1h_input_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_read_tokens,
"usage".cache_read_input_tokens,
0
) AS INTEGER) AS cache_read_input_tokens,
COALESCE(
CAST(usage_settlement_snapshots.billing_cache_creation_cost_usd AS DOUBLE PRECISION),
CAST("usage".cache_creation_cost_usd AS DOUBLE PRECISION),
0
) AS cache_creation_cost_usd,
COALESCE(
CAST(usage_settlement_snapshots.billing_cache_read_cost_usd AS DOUBLE PRECISION),
CAST("usage".cache_read_cost_usd AS DOUBLE PRECISION),
0
) AS cache_read_cost_usd,
COALESCE(
CAST(usage_settlement_snapshots.output_price_per_1m AS DOUBLE PRECISION),
CAST("usage".output_price_per_1m AS DOUBLE PRECISION)
) AS output_price_per_1m,
COALESCE(
CAST(usage_settlement_snapshots.billing_total_cost_usd AS DOUBLE PRECISION),
CAST("usage".total_cost_usd AS DOUBLE PRECISION),
0
) AS total_cost_usd,
COALESCE(
CAST(usage_settlement_snapshots.billing_actual_total_cost_usd AS DOUBLE PRECISION),
CAST("usage".actual_total_cost_usd AS DOUBLE PRECISION),
0
) AS actual_total_cost_usd,
"usage".status_code,
"usage".error_message,
"usage".error_category,
"usage".response_time_ms,
"usage".first_byte_time_ms,
"usage".status,
COALESCE(usage_settlement_snapshots.billing_status, "usage".billing_status) AS billing_status,
COALESCE(usage_http_audits.request_headers, "usage".request_headers) AS request_headers,
"usage".request_body,
"usage".request_body_compressed,
COALESCE(
usage_http_audits.provider_request_headers,
"usage".provider_request_headers
) AS provider_request_headers,
"usage".provider_request_body,
"usage".provider_request_body_compressed,
COALESCE(usage_http_audits.response_headers, "usage".response_headers) AS response_headers,
"usage".response_body,
"usage".response_body_compressed,
COALESCE(
usage_http_audits.client_response_headers,
"usage".client_response_headers
) AS client_response_headers,
"usage".client_response_body,
"usage".client_response_body_compressed,
"usage".request_metadata,
usage_http_audits.request_body_ref AS http_request_body_ref,
usage_http_audits.provider_request_body_ref AS http_provider_request_body_ref,
usage_http_audits.response_body_ref AS http_response_body_ref,
usage_http_audits.client_response_body_ref AS http_client_response_body_ref,
usage_routing_snapshots.candidate_id AS routing_candidate_id,
usage_routing_snapshots.candidate_index AS routing_candidate_index,
usage_routing_snapshots.key_name AS routing_key_name,
usage_routing_snapshots.planner_kind AS routing_planner_kind,
usage_routing_snapshots.route_family AS routing_route_family,
usage_routing_snapshots.route_kind AS routing_route_kind,
usage_routing_snapshots.execution_path AS routing_execution_path,
usage_routing_snapshots.local_execution_runtime_miss_reason AS routing_local_execution_runtime_miss_reason,
usage_settlement_snapshots.billing_snapshot_schema_version AS settlement_billing_snapshot_schema_version,
usage_settlement_snapshots.billing_snapshot_status AS settlement_billing_snapshot_status,
CAST(usage_settlement_snapshots.rate_multiplier AS DOUBLE PRECISION) AS settlement_rate_multiplier,
usage_settlement_snapshots.is_free_tier AS settlement_is_free_tier,
CAST(usage_settlement_snapshots.input_price_per_1m AS DOUBLE PRECISION) AS settlement_input_price_per_1m,
CAST(usage_settlement_snapshots.output_price_per_1m AS DOUBLE PRECISION) AS settlement_output_price_per_1m,
CAST(usage_settlement_snapshots.cache_creation_price_per_1m AS DOUBLE PRECISION) AS settlement_cache_creation_price_per_1m,
CAST(usage_settlement_snapshots.cache_read_price_per_1m AS DOUBLE PRECISION) AS settlement_cache_read_price_per_1m,
CAST(usage_settlement_snapshots.price_per_request AS DOUBLE PRECISION) AS settlement_price_per_request,
usage_settlement_snapshots.settlement_snapshot_schema_version AS settlement_snapshot_schema_version,
usage_settlement_snapshots.settlement_snapshot AS settlement_snapshot,
usage_settlement_snapshots.billing_dimensions AS settlement_billing_dimensions,
usage_settlement_snapshots.billing_input_tokens AS settlement_billing_input_tokens,
usage_settlement_snapshots.billing_effective_input_tokens AS settlement_billing_effective_input_tokens,
usage_settlement_snapshots.billing_output_tokens AS settlement_billing_output_tokens,
usage_settlement_snapshots.billing_cache_creation_tokens AS settlement_billing_cache_creation_tokens,
usage_settlement_snapshots.billing_cache_creation_5m_tokens AS settlement_billing_cache_creation_5m_tokens,
usage_settlement_snapshots.billing_cache_creation_1h_tokens AS settlement_billing_cache_creation_1h_tokens,
usage_settlement_snapshots.billing_cache_read_tokens AS settlement_billing_cache_read_tokens,
usage_settlement_snapshots.billing_total_input_context AS settlement_billing_total_input_context,
CAST(usage_settlement_snapshots.billing_cache_creation_cost_usd AS DOUBLE PRECISION) AS settlement_billing_cache_creation_cost_usd,
CAST(usage_settlement_snapshots.billing_cache_read_cost_usd AS DOUBLE PRECISION) AS settlement_billing_cache_read_cost_usd,
CAST(usage_settlement_snapshots.billing_total_cost_usd AS DOUBLE PRECISION) AS settlement_billing_total_cost_usd,
CAST(usage_settlement_snapshots.billing_actual_total_cost_usd AS DOUBLE PRECISION) AS settlement_billing_actual_total_cost_usd,
usage_settlement_snapshots.billing_pricing_source AS settlement_billing_pricing_source,
usage_settlement_snapshots.billing_rule_id AS settlement_billing_rule_id,
usage_settlement_snapshots.billing_rule_version AS settlement_billing_rule_version,
CAST(EXTRACT(EPOCH FROM "usage".created_at) AS BIGINT) AS created_at_unix_ms,
CAST(
EXTRACT(
EPOCH FROM COALESCE(
usage_settlement_snapshots.finalized_at,
"usage".finalized_at,
"usage".created_at
)
) AS BIGINT
) AS updated_at_unix_secs,
CAST(
EXTRACT(
EPOCH FROM COALESCE(usage_settlement_snapshots.finalized_at, "usage".finalized_at)
) AS BIGINT
) AS finalized_at_unix_secs
FROM "usage"
LEFT JOIN usage_http_audits
ON usage_http_audits.request_id = "usage".request_id
LEFT JOIN usage_routing_snapshots
ON usage_routing_snapshots.request_id = "usage".request_id
LEFT JOIN usage_settlement_snapshots
ON usage_settlement_snapshots.request_id = "usage".request_id
WHERE "usage".id = $1
LIMIT 1

View File

@@ -0,0 +1,181 @@
SELECT
"usage".id,
"usage".request_id,
"usage".user_id,
"usage".api_key_id,
"usage".username,
"usage".api_key_name,
"usage".provider_name,
"usage".model,
"usage".target_model,
"usage".provider_id,
"usage".provider_endpoint_id,
"usage".provider_api_key_id,
"usage".request_type,
"usage".api_format,
"usage".api_family,
"usage".endpoint_kind,
"usage".endpoint_api_format,
"usage".provider_api_family,
"usage".provider_endpoint_kind,
COALESCE("usage".has_format_conversion, FALSE) AS has_format_conversion,
COALESCE("usage".is_stream, FALSE) AS is_stream,
CAST("usage".input_tokens AS INTEGER) AS input_tokens,
CAST(COALESCE(usage_settlement_snapshots.billing_output_tokens, "usage".output_tokens) AS INTEGER) AS output_tokens,
CAST(COALESCE(
CASE
WHEN usage_settlement_snapshots.billing_input_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_output_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_creation_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_creation_5m_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_creation_1h_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_read_tokens IS NOT NULL
THEN COALESCE(usage_settlement_snapshots.billing_input_tokens, 0)
+ COALESCE(usage_settlement_snapshots.billing_output_tokens, 0)
+ COALESCE(
usage_settlement_snapshots.billing_cache_creation_tokens,
COALESCE(usage_settlement_snapshots.billing_cache_creation_5m_tokens, 0)
+ COALESCE(usage_settlement_snapshots.billing_cache_creation_1h_tokens, 0),
0
)
+ COALESCE(usage_settlement_snapshots.billing_cache_read_tokens, 0)
END,
"usage".total_tokens
) AS INTEGER) AS total_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_creation_tokens,
"usage".cache_creation_input_tokens,
0
) AS INTEGER) AS cache_creation_input_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_creation_5m_tokens,
"usage".cache_creation_input_tokens_5m,
0
) AS INTEGER) AS cache_creation_ephemeral_5m_input_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_creation_1h_tokens,
"usage".cache_creation_input_tokens_1h,
0
) AS INTEGER) AS cache_creation_ephemeral_1h_input_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_read_tokens,
"usage".cache_read_input_tokens,
0
) AS INTEGER) AS cache_read_input_tokens,
COALESCE(
CAST(usage_settlement_snapshots.billing_cache_creation_cost_usd AS DOUBLE PRECISION),
CAST("usage".cache_creation_cost_usd AS DOUBLE PRECISION),
0
) AS cache_creation_cost_usd,
COALESCE(
CAST(usage_settlement_snapshots.billing_cache_read_cost_usd AS DOUBLE PRECISION),
CAST("usage".cache_read_cost_usd AS DOUBLE PRECISION),
0
) AS cache_read_cost_usd,
COALESCE(
CAST(usage_settlement_snapshots.output_price_per_1m AS DOUBLE PRECISION),
CAST("usage".output_price_per_1m AS DOUBLE PRECISION)
) AS output_price_per_1m,
COALESCE(
CAST(usage_settlement_snapshots.billing_total_cost_usd AS DOUBLE PRECISION),
CAST("usage".total_cost_usd AS DOUBLE PRECISION),
0
) AS total_cost_usd,
COALESCE(
CAST(usage_settlement_snapshots.billing_actual_total_cost_usd AS DOUBLE PRECISION),
CAST("usage".actual_total_cost_usd AS DOUBLE PRECISION),
0
) AS actual_total_cost_usd,
"usage".status_code,
"usage".error_message,
"usage".error_category,
"usage".response_time_ms,
"usage".first_byte_time_ms,
"usage".status,
COALESCE(usage_settlement_snapshots.billing_status, "usage".billing_status) AS billing_status,
COALESCE(usage_http_audits.request_headers, "usage".request_headers) AS request_headers,
"usage".request_body,
"usage".request_body_compressed,
COALESCE(
usage_http_audits.provider_request_headers,
"usage".provider_request_headers
) AS provider_request_headers,
"usage".provider_request_body,
"usage".provider_request_body_compressed,
COALESCE(usage_http_audits.response_headers, "usage".response_headers) AS response_headers,
"usage".response_body,
"usage".response_body_compressed,
COALESCE(
usage_http_audits.client_response_headers,
"usage".client_response_headers
) AS client_response_headers,
"usage".client_response_body,
"usage".client_response_body_compressed,
"usage".request_metadata,
usage_http_audits.request_body_ref AS http_request_body_ref,
usage_http_audits.provider_request_body_ref AS http_provider_request_body_ref,
usage_http_audits.response_body_ref AS http_response_body_ref,
usage_http_audits.client_response_body_ref AS http_client_response_body_ref,
usage_http_audits.request_body_state AS http_request_body_state,
usage_http_audits.provider_request_body_state AS http_provider_request_body_state,
usage_http_audits.response_body_state AS http_response_body_state,
usage_http_audits.client_response_body_state AS http_client_response_body_state,
usage_routing_snapshots.candidate_id AS routing_candidate_id,
usage_routing_snapshots.candidate_index AS routing_candidate_index,
usage_routing_snapshots.key_name AS routing_key_name,
usage_routing_snapshots.planner_kind AS routing_planner_kind,
usage_routing_snapshots.route_family AS routing_route_family,
usage_routing_snapshots.route_kind AS routing_route_kind,
usage_routing_snapshots.execution_path AS routing_execution_path,
usage_routing_snapshots.local_execution_runtime_miss_reason AS routing_local_execution_runtime_miss_reason,
usage_settlement_snapshots.billing_snapshot_schema_version AS settlement_billing_snapshot_schema_version,
usage_settlement_snapshots.billing_snapshot_status AS settlement_billing_snapshot_status,
CAST(usage_settlement_snapshots.rate_multiplier AS DOUBLE PRECISION) AS settlement_rate_multiplier,
usage_settlement_snapshots.is_free_tier AS settlement_is_free_tier,
CAST(usage_settlement_snapshots.input_price_per_1m AS DOUBLE PRECISION) AS settlement_input_price_per_1m,
CAST(usage_settlement_snapshots.output_price_per_1m AS DOUBLE PRECISION) AS settlement_output_price_per_1m,
CAST(usage_settlement_snapshots.cache_creation_price_per_1m AS DOUBLE PRECISION) AS settlement_cache_creation_price_per_1m,
CAST(usage_settlement_snapshots.cache_read_price_per_1m AS DOUBLE PRECISION) AS settlement_cache_read_price_per_1m,
CAST(usage_settlement_snapshots.price_per_request AS DOUBLE PRECISION) AS settlement_price_per_request,
usage_settlement_snapshots.settlement_snapshot_schema_version AS settlement_snapshot_schema_version,
usage_settlement_snapshots.settlement_snapshot AS settlement_snapshot,
usage_settlement_snapshots.billing_dimensions AS settlement_billing_dimensions,
usage_settlement_snapshots.billing_input_tokens AS settlement_billing_input_tokens,
usage_settlement_snapshots.billing_effective_input_tokens AS settlement_billing_effective_input_tokens,
usage_settlement_snapshots.billing_output_tokens AS settlement_billing_output_tokens,
usage_settlement_snapshots.billing_cache_creation_tokens AS settlement_billing_cache_creation_tokens,
usage_settlement_snapshots.billing_cache_creation_5m_tokens AS settlement_billing_cache_creation_5m_tokens,
usage_settlement_snapshots.billing_cache_creation_1h_tokens AS settlement_billing_cache_creation_1h_tokens,
usage_settlement_snapshots.billing_cache_read_tokens AS settlement_billing_cache_read_tokens,
usage_settlement_snapshots.billing_total_input_context AS settlement_billing_total_input_context,
CAST(usage_settlement_snapshots.billing_cache_creation_cost_usd AS DOUBLE PRECISION) AS settlement_billing_cache_creation_cost_usd,
CAST(usage_settlement_snapshots.billing_cache_read_cost_usd AS DOUBLE PRECISION) AS settlement_billing_cache_read_cost_usd,
CAST(usage_settlement_snapshots.billing_total_cost_usd AS DOUBLE PRECISION) AS settlement_billing_total_cost_usd,
CAST(usage_settlement_snapshots.billing_actual_total_cost_usd AS DOUBLE PRECISION) AS settlement_billing_actual_total_cost_usd,
usage_settlement_snapshots.billing_pricing_source AS settlement_billing_pricing_source,
usage_settlement_snapshots.billing_rule_id AS settlement_billing_rule_id,
usage_settlement_snapshots.billing_rule_version AS settlement_billing_rule_version,
CAST(EXTRACT(EPOCH FROM "usage".created_at) AS BIGINT) AS created_at_unix_ms,
CAST(
EXTRACT(
EPOCH FROM COALESCE(
usage_settlement_snapshots.finalized_at,
"usage".finalized_at,
"usage".created_at
)
) AS BIGINT
) AS updated_at_unix_secs,
CAST(
EXTRACT(
EPOCH FROM COALESCE(usage_settlement_snapshots.finalized_at, "usage".finalized_at)
) AS BIGINT
) AS finalized_at_unix_secs
FROM "usage"
LEFT JOIN usage_http_audits
ON usage_http_audits.request_id = "usage".request_id
LEFT JOIN usage_routing_snapshots
ON usage_routing_snapshots.request_id = "usage".request_id
LEFT JOIN usage_settlement_snapshots
ON usage_settlement_snapshots.request_id = "usage".request_id
WHERE "usage".request_id = $1
LIMIT 1

View File

@@ -0,0 +1,217 @@
SELECT
"usage".id,
"usage".request_id,
"usage".user_id,
"usage".api_key_id,
"usage".username,
"usage".api_key_name,
"usage".provider_name,
"usage".model,
"usage".target_model,
"usage".provider_id,
"usage".provider_endpoint_id,
"usage".provider_api_key_id,
"usage".request_type,
"usage".api_format,
"usage".api_family,
"usage".endpoint_kind,
"usage".endpoint_api_format,
"usage".provider_api_family,
"usage".provider_endpoint_kind,
COALESCE("usage".has_format_conversion, FALSE) AS has_format_conversion,
COALESCE("usage".is_stream, FALSE) AS is_stream,
CAST("usage".input_tokens AS INTEGER) AS input_tokens,
CAST(COALESCE(usage_settlement_snapshots.billing_output_tokens, "usage".output_tokens) AS INTEGER) AS output_tokens,
CAST(COALESCE(
CASE
WHEN usage_settlement_snapshots.billing_input_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_output_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_creation_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_creation_5m_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_creation_1h_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_read_tokens IS NOT NULL
THEN COALESCE(usage_settlement_snapshots.billing_input_tokens, 0)
+ COALESCE(usage_settlement_snapshots.billing_output_tokens, 0)
+ COALESCE(
usage_settlement_snapshots.billing_cache_creation_tokens,
COALESCE(usage_settlement_snapshots.billing_cache_creation_5m_tokens, 0)
+ COALESCE(usage_settlement_snapshots.billing_cache_creation_1h_tokens, 0),
0
)
+ COALESCE(usage_settlement_snapshots.billing_cache_read_tokens, 0)
END,
"usage".total_tokens
) AS INTEGER) AS total_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_creation_tokens,
"usage".cache_creation_input_tokens,
0
) AS INTEGER) AS cache_creation_input_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_creation_5m_tokens,
"usage".cache_creation_input_tokens_5m,
0
) AS INTEGER) AS cache_creation_ephemeral_5m_input_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_creation_1h_tokens,
"usage".cache_creation_input_tokens_1h,
0
) AS INTEGER) AS cache_creation_ephemeral_1h_input_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_read_tokens,
"usage".cache_read_input_tokens,
0
) AS INTEGER) AS cache_read_input_tokens,
COALESCE(
CAST(usage_settlement_snapshots.billing_cache_creation_cost_usd AS DOUBLE PRECISION),
CAST("usage".cache_creation_cost_usd AS DOUBLE PRECISION),
0
) AS cache_creation_cost_usd,
COALESCE(
CAST(usage_settlement_snapshots.billing_cache_read_cost_usd AS DOUBLE PRECISION),
CAST("usage".cache_read_cost_usd AS DOUBLE PRECISION),
0
) AS cache_read_cost_usd,
COALESCE(
CAST(usage_settlement_snapshots.output_price_per_1m AS DOUBLE PRECISION),
CAST("usage".output_price_per_1m AS DOUBLE PRECISION)
) AS output_price_per_1m,
COALESCE(
CAST(usage_settlement_snapshots.billing_total_cost_usd AS DOUBLE PRECISION),
CAST("usage".total_cost_usd AS DOUBLE PRECISION),
0
) AS total_cost_usd,
COALESCE(
CAST(usage_settlement_snapshots.billing_actual_total_cost_usd AS DOUBLE PRECISION),
CAST("usage".actual_total_cost_usd AS DOUBLE PRECISION),
0
) AS actual_total_cost_usd,
"usage".status_code,
"usage".error_message,
"usage".error_category,
"usage".response_time_ms,
"usage".first_byte_time_ms,
"usage".status,
COALESCE(usage_settlement_snapshots.billing_status, "usage".billing_status) AS billing_status,
NULL::json AS request_headers,
NULL::json AS request_body,
NULL::bytea AS request_body_compressed,
NULL::json AS provider_request_headers,
NULL::json AS provider_request_body,
NULL::bytea AS provider_request_body_compressed,
NULL::json AS response_headers,
NULL::json AS response_body,
NULL::bytea AS response_body_compressed,
NULL::json AS client_response_headers,
NULL::json AS client_response_body,
NULL::bytea AS client_response_body_compressed,
CASE
WHEN ("usage".request_metadata->>'client_requested_stream') IN ('true', 'false')
OR ("usage".request_metadata->>'upstream_is_stream') IN ('true', 'false')
THEN jsonb_build_object(
'client_requested_stream',
CASE
WHEN ("usage".request_metadata->>'client_requested_stream') IN ('true', 'false')
THEN ("usage".request_metadata->>'client_requested_stream')::boolean
ELSE NULL
END,
'upstream_is_stream',
CASE
WHEN ("usage".request_metadata->>'upstream_is_stream') IN ('true', 'false')
THEN ("usage".request_metadata->>'upstream_is_stream')::boolean
ELSE NULL
END
)::json
ELSE NULL::json
END AS request_metadata,
NULL::varchar AS http_request_body_ref,
NULL::varchar AS http_provider_request_body_ref,
NULL::varchar AS http_response_body_ref,
NULL::varchar AS http_client_response_body_ref,
NULL::varchar AS http_request_body_state,
NULL::varchar AS http_provider_request_body_state,
NULL::varchar AS http_response_body_state,
NULL::varchar AS http_client_response_body_state,
COALESCE(
usage_routing_snapshots.candidate_id,
NULLIF(BTRIM("usage".request_metadata->>'candidate_id'), '')
) AS routing_candidate_id,
COALESCE(
usage_routing_snapshots.candidate_index,
CASE
WHEN ("usage".request_metadata->>'candidate_index') ~ '^[0-9]+$'
THEN ("usage".request_metadata->>'candidate_index')::integer
ELSE NULL
END
) AS routing_candidate_index,
COALESCE(
usage_routing_snapshots.key_name,
NULLIF(BTRIM("usage".request_metadata->>'key_name'), '')
) AS routing_key_name,
COALESCE(
usage_routing_snapshots.planner_kind,
NULLIF(BTRIM("usage".request_metadata->>'planner_kind'), '')
) AS routing_planner_kind,
COALESCE(
usage_routing_snapshots.route_family,
NULLIF(BTRIM("usage".request_metadata->>'route_family'), '')
) AS routing_route_family,
COALESCE(
usage_routing_snapshots.route_kind,
NULLIF(BTRIM("usage".request_metadata->>'route_kind'), '')
) AS routing_route_kind,
COALESCE(
usage_routing_snapshots.execution_path,
NULLIF(BTRIM("usage".request_metadata->>'execution_path'), '')
) AS routing_execution_path,
COALESCE(
usage_routing_snapshots.local_execution_runtime_miss_reason,
NULLIF(BTRIM("usage".request_metadata->>'local_execution_runtime_miss_reason'), '')
) AS routing_local_execution_runtime_miss_reason,
usage_settlement_snapshots.billing_snapshot_schema_version AS settlement_billing_snapshot_schema_version,
usage_settlement_snapshots.billing_snapshot_status AS settlement_billing_snapshot_status,
CAST(usage_settlement_snapshots.rate_multiplier AS DOUBLE PRECISION) AS settlement_rate_multiplier,
usage_settlement_snapshots.is_free_tier AS settlement_is_free_tier,
CAST(usage_settlement_snapshots.input_price_per_1m AS DOUBLE PRECISION) AS settlement_input_price_per_1m,
CAST(usage_settlement_snapshots.output_price_per_1m AS DOUBLE PRECISION) AS settlement_output_price_per_1m,
CAST(usage_settlement_snapshots.cache_creation_price_per_1m AS DOUBLE PRECISION) AS settlement_cache_creation_price_per_1m,
CAST(usage_settlement_snapshots.cache_read_price_per_1m AS DOUBLE PRECISION) AS settlement_cache_read_price_per_1m,
CAST(usage_settlement_snapshots.price_per_request AS DOUBLE PRECISION) AS settlement_price_per_request,
usage_settlement_snapshots.settlement_snapshot_schema_version AS settlement_snapshot_schema_version,
usage_settlement_snapshots.settlement_snapshot AS settlement_snapshot,
usage_settlement_snapshots.billing_dimensions AS settlement_billing_dimensions,
usage_settlement_snapshots.billing_input_tokens AS settlement_billing_input_tokens,
usage_settlement_snapshots.billing_effective_input_tokens AS settlement_billing_effective_input_tokens,
usage_settlement_snapshots.billing_output_tokens AS settlement_billing_output_tokens,
usage_settlement_snapshots.billing_cache_creation_tokens AS settlement_billing_cache_creation_tokens,
usage_settlement_snapshots.billing_cache_creation_5m_tokens AS settlement_billing_cache_creation_5m_tokens,
usage_settlement_snapshots.billing_cache_creation_1h_tokens AS settlement_billing_cache_creation_1h_tokens,
usage_settlement_snapshots.billing_cache_read_tokens AS settlement_billing_cache_read_tokens,
usage_settlement_snapshots.billing_total_input_context AS settlement_billing_total_input_context,
CAST(usage_settlement_snapshots.billing_cache_creation_cost_usd AS DOUBLE PRECISION) AS settlement_billing_cache_creation_cost_usd,
CAST(usage_settlement_snapshots.billing_cache_read_cost_usd AS DOUBLE PRECISION) AS settlement_billing_cache_read_cost_usd,
CAST(usage_settlement_snapshots.billing_total_cost_usd AS DOUBLE PRECISION) AS settlement_billing_total_cost_usd,
CAST(usage_settlement_snapshots.billing_actual_total_cost_usd AS DOUBLE PRECISION) AS settlement_billing_actual_total_cost_usd,
usage_settlement_snapshots.billing_pricing_source AS settlement_billing_pricing_source,
usage_settlement_snapshots.billing_rule_id AS settlement_billing_rule_id,
usage_settlement_snapshots.billing_rule_version AS settlement_billing_rule_version,
CAST(EXTRACT(EPOCH FROM "usage".created_at) AS BIGINT) AS created_at_unix_ms,
CAST(
EXTRACT(
EPOCH FROM COALESCE(
usage_settlement_snapshots.finalized_at,
"usage".finalized_at,
"usage".created_at
)
) AS BIGINT
) AS updated_at_unix_secs,
CAST(
EXTRACT(
EPOCH FROM COALESCE(usage_settlement_snapshots.finalized_at, "usage".finalized_at)
) AS BIGINT
) AS finalized_at_unix_secs
FROM "usage"
LEFT JOIN usage_routing_snapshots
ON usage_routing_snapshots.request_id = "usage".request_id
LEFT JOIN usage_settlement_snapshots
ON usage_settlement_snapshots.request_id = "usage".request_id

View File

@@ -0,0 +1,217 @@
SELECT
"usage".id,
"usage".request_id,
"usage".user_id,
"usage".api_key_id,
"usage".username,
"usage".api_key_name,
"usage".provider_name,
"usage".model,
"usage".target_model,
"usage".provider_id,
"usage".provider_endpoint_id,
"usage".provider_api_key_id,
"usage".request_type,
"usage".api_format,
"usage".api_family,
"usage".endpoint_kind,
"usage".endpoint_api_format,
"usage".provider_api_family,
"usage".provider_endpoint_kind,
COALESCE("usage".has_format_conversion, FALSE) AS has_format_conversion,
COALESCE("usage".is_stream, FALSE) AS is_stream,
CAST("usage".input_tokens AS INTEGER) AS input_tokens,
CAST(COALESCE(usage_settlement_snapshots.billing_output_tokens, "usage".output_tokens) AS INTEGER) AS output_tokens,
CAST(COALESCE(
CASE
WHEN usage_settlement_snapshots.billing_input_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_output_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_creation_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_creation_5m_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_creation_1h_tokens IS NOT NULL
OR usage_settlement_snapshots.billing_cache_read_tokens IS NOT NULL
THEN COALESCE(usage_settlement_snapshots.billing_input_tokens, 0)
+ COALESCE(usage_settlement_snapshots.billing_output_tokens, 0)
+ COALESCE(
usage_settlement_snapshots.billing_cache_creation_tokens,
COALESCE(usage_settlement_snapshots.billing_cache_creation_5m_tokens, 0)
+ COALESCE(usage_settlement_snapshots.billing_cache_creation_1h_tokens, 0),
0
)
+ COALESCE(usage_settlement_snapshots.billing_cache_read_tokens, 0)
END,
"usage".total_tokens
) AS INTEGER) AS total_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_creation_tokens,
"usage".cache_creation_input_tokens,
0
) AS INTEGER) AS cache_creation_input_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_creation_5m_tokens,
"usage".cache_creation_input_tokens_5m,
0
) AS INTEGER) AS cache_creation_ephemeral_5m_input_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_creation_1h_tokens,
"usage".cache_creation_input_tokens_1h,
0
) AS INTEGER) AS cache_creation_ephemeral_1h_input_tokens,
CAST(COALESCE(
usage_settlement_snapshots.billing_cache_read_tokens,
"usage".cache_read_input_tokens,
0
) AS INTEGER) AS cache_read_input_tokens,
COALESCE(
CAST(usage_settlement_snapshots.billing_cache_creation_cost_usd AS DOUBLE PRECISION),
CAST("usage".cache_creation_cost_usd AS DOUBLE PRECISION),
0
) AS cache_creation_cost_usd,
COALESCE(
CAST(usage_settlement_snapshots.billing_cache_read_cost_usd AS DOUBLE PRECISION),
CAST("usage".cache_read_cost_usd AS DOUBLE PRECISION),
0
) AS cache_read_cost_usd,
COALESCE(
CAST(usage_settlement_snapshots.output_price_per_1m AS DOUBLE PRECISION),
CAST("usage".output_price_per_1m AS DOUBLE PRECISION)
) AS output_price_per_1m,
COALESCE(
CAST(usage_settlement_snapshots.billing_total_cost_usd AS DOUBLE PRECISION),
CAST("usage".total_cost_usd AS DOUBLE PRECISION),
0
) AS total_cost_usd,
COALESCE(
CAST(usage_settlement_snapshots.billing_actual_total_cost_usd AS DOUBLE PRECISION),
CAST("usage".actual_total_cost_usd AS DOUBLE PRECISION),
0
) AS actual_total_cost_usd,
"usage".status_code,
"usage".error_message,
"usage".error_category,
"usage".response_time_ms,
"usage".first_byte_time_ms,
"usage".status,
COALESCE(usage_settlement_snapshots.billing_status, "usage".billing_status) AS billing_status,
NULL::json AS request_headers,
NULL::json AS request_body,
NULL::bytea AS request_body_compressed,
NULL::json AS provider_request_headers,
NULL::json AS provider_request_body,
NULL::bytea AS provider_request_body_compressed,
NULL::json AS response_headers,
NULL::json AS response_body,
NULL::bytea AS response_body_compressed,
NULL::json AS client_response_headers,
NULL::json AS client_response_body,
NULL::bytea AS client_response_body_compressed,
CASE
WHEN ("usage".request_metadata->>'client_requested_stream') IN ('true', 'false')
OR ("usage".request_metadata->>'upstream_is_stream') IN ('true', 'false')
THEN jsonb_build_object(
'client_requested_stream',
CASE
WHEN ("usage".request_metadata->>'client_requested_stream') IN ('true', 'false')
THEN ("usage".request_metadata->>'client_requested_stream')::boolean
ELSE NULL
END,
'upstream_is_stream',
CASE
WHEN ("usage".request_metadata->>'upstream_is_stream') IN ('true', 'false')
THEN ("usage".request_metadata->>'upstream_is_stream')::boolean
ELSE NULL
END
)::json
ELSE NULL::json
END AS request_metadata,
NULL::varchar AS http_request_body_ref,
NULL::varchar AS http_provider_request_body_ref,
NULL::varchar AS http_response_body_ref,
NULL::varchar AS http_client_response_body_ref,
NULL::varchar AS http_request_body_state,
NULL::varchar AS http_provider_request_body_state,
NULL::varchar AS http_response_body_state,
NULL::varchar AS http_client_response_body_state,
COALESCE(
usage_routing_snapshots.candidate_id,
NULLIF(BTRIM("usage".request_metadata->>'candidate_id'), '')
) AS routing_candidate_id,
COALESCE(
usage_routing_snapshots.candidate_index,
CASE
WHEN ("usage".request_metadata->>'candidate_index') ~ '^[0-9]+$'
THEN ("usage".request_metadata->>'candidate_index')::integer
ELSE NULL
END
) AS routing_candidate_index,
COALESCE(
usage_routing_snapshots.key_name,
NULLIF(BTRIM("usage".request_metadata->>'key_name'), '')
) AS routing_key_name,
COALESCE(
usage_routing_snapshots.planner_kind,
NULLIF(BTRIM("usage".request_metadata->>'planner_kind'), '')
) AS routing_planner_kind,
COALESCE(
usage_routing_snapshots.route_family,
NULLIF(BTRIM("usage".request_metadata->>'route_family'), '')
) AS routing_route_family,
COALESCE(
usage_routing_snapshots.route_kind,
NULLIF(BTRIM("usage".request_metadata->>'route_kind'), '')
) AS routing_route_kind,
COALESCE(
usage_routing_snapshots.execution_path,
NULLIF(BTRIM("usage".request_metadata->>'execution_path'), '')
) AS routing_execution_path,
COALESCE(
usage_routing_snapshots.local_execution_runtime_miss_reason,
NULLIF(BTRIM("usage".request_metadata->>'local_execution_runtime_miss_reason'), '')
) AS routing_local_execution_runtime_miss_reason,
usage_settlement_snapshots.billing_snapshot_schema_version AS settlement_billing_snapshot_schema_version,
usage_settlement_snapshots.billing_snapshot_status AS settlement_billing_snapshot_status,
CAST(usage_settlement_snapshots.rate_multiplier AS DOUBLE PRECISION) AS settlement_rate_multiplier,
usage_settlement_snapshots.is_free_tier AS settlement_is_free_tier,
CAST(usage_settlement_snapshots.input_price_per_1m AS DOUBLE PRECISION) AS settlement_input_price_per_1m,
CAST(usage_settlement_snapshots.output_price_per_1m AS DOUBLE PRECISION) AS settlement_output_price_per_1m,
CAST(usage_settlement_snapshots.cache_creation_price_per_1m AS DOUBLE PRECISION) AS settlement_cache_creation_price_per_1m,
CAST(usage_settlement_snapshots.cache_read_price_per_1m AS DOUBLE PRECISION) AS settlement_cache_read_price_per_1m,
CAST(usage_settlement_snapshots.price_per_request AS DOUBLE PRECISION) AS settlement_price_per_request,
usage_settlement_snapshots.settlement_snapshot_schema_version AS settlement_snapshot_schema_version,
usage_settlement_snapshots.settlement_snapshot AS settlement_snapshot,
usage_settlement_snapshots.billing_dimensions AS settlement_billing_dimensions,
usage_settlement_snapshots.billing_input_tokens AS settlement_billing_input_tokens,
usage_settlement_snapshots.billing_effective_input_tokens AS settlement_billing_effective_input_tokens,
usage_settlement_snapshots.billing_output_tokens AS settlement_billing_output_tokens,
usage_settlement_snapshots.billing_cache_creation_tokens AS settlement_billing_cache_creation_tokens,
usage_settlement_snapshots.billing_cache_creation_5m_tokens AS settlement_billing_cache_creation_5m_tokens,
usage_settlement_snapshots.billing_cache_creation_1h_tokens AS settlement_billing_cache_creation_1h_tokens,
usage_settlement_snapshots.billing_cache_read_tokens AS settlement_billing_cache_read_tokens,
usage_settlement_snapshots.billing_total_input_context AS settlement_billing_total_input_context,
CAST(usage_settlement_snapshots.billing_cache_creation_cost_usd AS DOUBLE PRECISION) AS settlement_billing_cache_creation_cost_usd,
CAST(usage_settlement_snapshots.billing_cache_read_cost_usd AS DOUBLE PRECISION) AS settlement_billing_cache_read_cost_usd,
CAST(usage_settlement_snapshots.billing_total_cost_usd AS DOUBLE PRECISION) AS settlement_billing_total_cost_usd,
CAST(usage_settlement_snapshots.billing_actual_total_cost_usd AS DOUBLE PRECISION) AS settlement_billing_actual_total_cost_usd,
usage_settlement_snapshots.billing_pricing_source AS settlement_billing_pricing_source,
usage_settlement_snapshots.billing_rule_id AS settlement_billing_rule_id,
usage_settlement_snapshots.billing_rule_version AS settlement_billing_rule_version,
CAST(EXTRACT(EPOCH FROM "usage".created_at) AS BIGINT) AS created_at_unix_ms,
CAST(
EXTRACT(
EPOCH FROM COALESCE(
usage_settlement_snapshots.finalized_at,
"usage".finalized_at,
"usage".created_at
)
) AS BIGINT
) AS updated_at_unix_secs,
CAST(
EXTRACT(
EPOCH FROM COALESCE(usage_settlement_snapshots.finalized_at, "usage".finalized_at)
) AS BIGINT
) AS finalized_at_unix_secs
FROM "usage"
LEFT JOIN usage_routing_snapshots
ON usage_routing_snapshots.request_id = "usage".request_id
LEFT JOIN usage_settlement_snapshots
ON usage_settlement_snapshots.request_id = "usage".request_id

View File

@@ -0,0 +1 @@
SELECT pg_advisory_xact_lock(hashtext($1)::BIGINT)

View File

@@ -0,0 +1,28 @@
WITH aggregated AS (
SELECT
api_key_id,
COUNT(*)::INTEGER AS total_requests,
COALESCE(SUM(
GREATEST(
COALESCE(
total_tokens,
COALESCE(input_tokens, 0) + COALESCE(output_tokens, 0)
),
0
)::BIGINT
), 0)::BIGINT AS total_tokens,
COALESCE(SUM(COALESCE(total_cost_usd, 0)), 0)::NUMERIC(20,8) AS total_cost_usd,
MAX(created_at) AS last_used_at
FROM usage_billing_facts AS "usage"
WHERE api_key_id IS NOT NULL
AND BTRIM(api_key_id) <> ''
GROUP BY api_key_id
)
UPDATE api_keys
SET
total_requests = aggregated.total_requests,
total_tokens = aggregated.total_tokens,
total_cost_usd = aggregated.total_cost_usd,
last_used_at = aggregated.last_used_at
FROM aggregated
WHERE api_keys.id = aggregated.api_key_id

View File

@@ -0,0 +1,62 @@
WITH aggregated AS (
SELECT
provider_api_key_id,
COUNT(*)::INTEGER AS request_count,
COALESCE(SUM(
CASE
WHEN status IN ('completed', 'success', 'ok', 'billed', 'settled')
AND (status_code IS NULL OR status_code < 400)
AND NULLIF(BTRIM(error_message), '') IS NULL
THEN 1
ELSE 0
END
), 0)::INTEGER AS success_count,
COALESCE(SUM(
CASE
WHEN status NOT IN ('pending', 'streaming')
AND NOT (
status IN ('completed', 'success', 'ok', 'billed', 'settled')
AND (status_code IS NULL OR status_code < 400)
AND NULLIF(BTRIM(error_message), '') IS NULL
)
THEN 1
ELSE 0
END
), 0)::INTEGER AS error_count,
COALESCE(SUM(
GREATEST(
COALESCE(
total_tokens,
COALESCE(input_tokens, 0) + COALESCE(output_tokens, 0)
),
0
)::BIGINT
), 0)::BIGINT AS total_tokens,
COALESCE(SUM(COALESCE(total_cost_usd, 0)), 0)::NUMERIC(20,8) AS total_cost_usd,
COALESCE(SUM(
CASE
WHEN status IN ('completed', 'success', 'ok', 'billed', 'settled')
AND (status_code IS NULL OR status_code < 400)
AND NULLIF(BTRIM(error_message), '') IS NULL
AND response_time_ms IS NOT NULL
THEN GREATEST(response_time_ms, 0)
ELSE 0
END
), 0)::INTEGER AS total_response_time_ms,
MAX(created_at) AS last_used_at
FROM usage_billing_facts AS "usage"
WHERE provider_api_key_id IS NOT NULL
AND BTRIM(provider_api_key_id) <> ''
GROUP BY provider_api_key_id
)
UPDATE provider_api_keys
SET
request_count = aggregated.request_count,
success_count = aggregated.success_count,
error_count = aggregated.error_count,
total_tokens = aggregated.total_tokens,
total_cost_usd = aggregated.total_cost_usd,
total_response_time_ms = aggregated.total_response_time_ms,
last_used_at = aggregated.last_used_at
FROM aggregated
WHERE provider_api_keys.id = aggregated.provider_api_key_id

View File

@@ -0,0 +1,6 @@
UPDATE api_keys
SET
total_requests = 0,
total_tokens = 0,
total_cost_usd = 0,
last_used_at = NULL

View File

@@ -0,0 +1,9 @@
UPDATE provider_api_keys
SET
request_count = 0,
success_count = 0,
error_count = 0,
total_tokens = 0,
total_cost_usd = 0,
total_response_time_ms = 0,
last_used_at = NULL

View File

@@ -0,0 +1,7 @@
UPDATE usage_settlement_snapshots
SET
billing_status = 'pending',
finalized_at = NULL,
updated_at = NOW()
WHERE request_id = $1
AND billing_status = 'void'

View File

@@ -0,0 +1,7 @@
UPDATE "usage"
SET
billing_status = 'pending',
finalized_at = NULL
WHERE request_id = $1
AND billing_status = 'void'
AND status IN ('failed', 'cancelled')

View File

@@ -0,0 +1,9 @@
SELECT
COALESCE(SUM(total_requests), 0) AS total_requests,
COALESCE(SUM(successful_requests), 0) AS successful_requests,
COALESCE(SUM(failed_requests), 0) AS failed_requests,
COALESCE(AVG(avg_response_time_ms), 0) AS avg_response_time_ms,
COALESCE(SUM(total_cost_usd), 0) AS total_cost_usd
FROM provider_usage_tracking
WHERE provider_id = $1
AND window_start >= TO_TIMESTAMP($2::double precision)

View File

@@ -0,0 +1,15 @@
SELECT
api_key_id,
COALESCE(
SUM(
COALESCE(
total_tokens,
COALESCE(input_tokens, 0) + COALESCE(output_tokens, 0)
)
),
0
) AS total_tokens
FROM usage_billing_facts AS "usage"
WHERE api_key_id = ANY($1::TEXT[])
GROUP BY api_key_id
ORDER BY api_key_id ASC

View File

@@ -0,0 +1,10 @@
SELECT
id AS provider_api_key_id,
COALESCE(request_count, 0)::BIGINT AS request_count,
COALESCE(total_tokens, 0)::BIGINT AS total_tokens,
CAST(COALESCE(total_cost_usd, 0) AS DOUBLE PRECISION) AS total_cost_usd,
CAST(EXTRACT(EPOCH FROM last_used_at) AS BIGINT) AS last_used_at_unix_secs
FROM provider_api_keys
WHERE id = ANY($1::TEXT[])
AND COALESCE(request_count, 0) > 0
ORDER BY id ASC

View File

@@ -0,0 +1,10 @@
SELECT
"usage".user_id,
COUNT(*)::BIGINT AS request_count,
COALESCE(SUM(GREATEST(COALESCE("usage".total_tokens, 0), 0)), 0)::BIGINT AS total_tokens
FROM usage_billing_facts AS "usage"
WHERE "usage".user_id = ANY($1::TEXT[])
AND "usage".status NOT IN ('pending', 'streaming')
AND "usage".provider_name NOT IN ('unknown', 'pending')
GROUP BY "usage".user_id
ORDER BY "usage".user_id ASC

View File

@@ -0,0 +1,309 @@
INSERT INTO "usage" (
id,
request_id,
user_id,
api_key_id,
username,
api_key_name,
provider_name,
model,
target_model,
provider_id,
provider_endpoint_id,
provider_api_key_id,
request_type,
api_format,
api_family,
endpoint_kind,
endpoint_api_format,
provider_api_family,
provider_endpoint_kind,
has_format_conversion,
is_stream,
input_tokens,
output_tokens,
total_tokens,
cache_creation_input_tokens,
cache_creation_input_tokens_5m,
cache_creation_input_tokens_1h,
cache_read_input_tokens,
cache_creation_cost_usd,
cache_read_cost_usd,
output_price_per_1m,
total_cost_usd,
actual_total_cost_usd,
status_code,
error_message,
error_category,
response_time_ms,
first_byte_time_ms,
status,
billing_status,
request_headers,
request_body,
request_body_compressed,
provider_request_headers,
provider_request_body,
provider_request_body_compressed,
response_headers,
response_body,
response_body_compressed,
client_response_headers,
client_response_body,
client_response_body_compressed,
request_metadata,
finalized_at,
created_at
) VALUES (
$1,
$2,
$3,
$4,
$5,
$6,
$7,
$8,
$9,
$10,
$11,
$12,
$13,
$14,
$15,
$16,
$17,
$18,
$19,
COALESCE($20, FALSE),
COALESCE($21, FALSE),
COALESCE($22, 0),
COALESCE($23, 0),
COALESCE($24, COALESCE($22, 0) + COALESCE($23, 0)),
COALESCE($25, 0),
COALESCE($26, 0),
COALESCE($27, 0),
COALESCE($28, 0),
COALESCE($29, 0),
$30,
COALESCE($31, 0),
COALESCE($32, 0),
$33,
$34,
$35,
$36,
$37,
$38,
$39,
$40,
$41::json,
$42::json,
$43,
$44::json,
$45::json,
$46,
$47::json,
$48::json,
$49,
$50::json,
$51::json,
$52,
$53::json,
CASE
WHEN $54 IS NULL THEN NULL
ELSE TO_TIMESTAMP($54::double precision)
END,
COALESCE(TO_TIMESTAMP($55::double precision), NOW())
)
ON CONFLICT (request_id)
DO UPDATE SET
user_id = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.user_id, "usage".user_id) ELSE "usage".user_id END,
api_key_id = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.api_key_id, "usage".api_key_id) ELSE "usage".api_key_id END,
username = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.username, "usage".username) ELSE "usage".username END,
api_key_name = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.api_key_name, "usage".api_key_name) ELSE "usage".api_key_name END,
provider_name = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.provider_name, "usage".provider_name) ELSE "usage".provider_name END,
model = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.model, "usage".model) ELSE "usage".model END,
target_model = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.target_model, "usage".target_model) ELSE "usage".target_model END,
provider_id = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.provider_id, "usage".provider_id) ELSE "usage".provider_id END,
provider_endpoint_id = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.provider_endpoint_id, "usage".provider_endpoint_id) ELSE "usage".provider_endpoint_id END,
provider_api_key_id = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.provider_api_key_id, "usage".provider_api_key_id) ELSE "usage".provider_api_key_id END,
request_type = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.request_type, "usage".request_type) ELSE "usage".request_type END,
api_format = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.api_format, "usage".api_format) ELSE "usage".api_format END,
api_family = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.api_family, "usage".api_family) ELSE "usage".api_family END,
endpoint_kind = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.endpoint_kind, "usage".endpoint_kind) ELSE "usage".endpoint_kind END,
endpoint_api_format = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.endpoint_api_format, "usage".endpoint_api_format) ELSE "usage".endpoint_api_format END,
provider_api_family = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.provider_api_family, "usage".provider_api_family) ELSE "usage".provider_api_family END,
provider_endpoint_kind = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.provider_endpoint_kind, "usage".provider_endpoint_kind) ELSE "usage".provider_endpoint_kind END,
has_format_conversion = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.has_format_conversion, "usage".has_format_conversion) ELSE "usage".has_format_conversion END,
is_stream = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.is_stream, "usage".is_stream) ELSE "usage".is_stream END,
input_tokens = CASE WHEN "usage".billing_status = 'pending' AND EXCLUDED.status IN ('completed', 'failed', 'cancelled') THEN GREATEST("usage".input_tokens, EXCLUDED.input_tokens) ELSE "usage".input_tokens END,
output_tokens = CASE WHEN "usage".billing_status = 'pending' AND EXCLUDED.status IN ('completed', 'failed', 'cancelled') THEN GREATEST("usage".output_tokens, EXCLUDED.output_tokens) ELSE "usage".output_tokens END,
total_tokens = CASE WHEN "usage".billing_status = 'pending' AND EXCLUDED.status IN ('completed', 'failed', 'cancelled') THEN GREATEST("usage".total_tokens, EXCLUDED.total_tokens) ELSE "usage".total_tokens END,
cache_creation_input_tokens = CASE WHEN "usage".billing_status = 'pending' AND EXCLUDED.status IN ('completed', 'failed', 'cancelled') THEN GREATEST("usage".cache_creation_input_tokens, EXCLUDED.cache_creation_input_tokens) ELSE "usage".cache_creation_input_tokens END,
cache_creation_input_tokens_5m = CASE WHEN "usage".billing_status = 'pending' AND EXCLUDED.status IN ('completed', 'failed', 'cancelled') THEN GREATEST("usage".cache_creation_input_tokens_5m, EXCLUDED.cache_creation_input_tokens_5m) ELSE "usage".cache_creation_input_tokens_5m END,
cache_creation_input_tokens_1h = CASE WHEN "usage".billing_status = 'pending' AND EXCLUDED.status IN ('completed', 'failed', 'cancelled') THEN GREATEST("usage".cache_creation_input_tokens_1h, EXCLUDED.cache_creation_input_tokens_1h) ELSE "usage".cache_creation_input_tokens_1h END,
cache_read_input_tokens = CASE WHEN "usage".billing_status = 'pending' AND EXCLUDED.status IN ('completed', 'failed', 'cancelled') THEN GREATEST("usage".cache_read_input_tokens, EXCLUDED.cache_read_input_tokens) ELSE "usage".cache_read_input_tokens END,
cache_creation_cost_usd = CASE WHEN "usage".billing_status = 'pending' AND EXCLUDED.status IN ('completed', 'failed', 'cancelled') THEN GREATEST("usage".cache_creation_cost_usd, EXCLUDED.cache_creation_cost_usd) ELSE "usage".cache_creation_cost_usd END,
cache_read_cost_usd = CASE WHEN "usage".billing_status = 'pending' AND EXCLUDED.status IN ('completed', 'failed', 'cancelled') THEN GREATEST("usage".cache_read_cost_usd, EXCLUDED.cache_read_cost_usd) ELSE "usage".cache_read_cost_usd END,
output_price_per_1m = NULL,
total_cost_usd = CASE WHEN "usage".billing_status = 'pending' AND EXCLUDED.status IN ('completed', 'failed', 'cancelled') THEN GREATEST("usage".total_cost_usd, EXCLUDED.total_cost_usd) ELSE "usage".total_cost_usd END,
actual_total_cost_usd = CASE WHEN "usage".billing_status = 'pending' AND EXCLUDED.status IN ('completed', 'failed', 'cancelled') THEN GREATEST("usage".actual_total_cost_usd, EXCLUDED.actual_total_cost_usd) ELSE "usage".actual_total_cost_usd END,
status_code = CASE WHEN "usage".billing_status = 'pending' THEN CASE
WHEN "usage".status = 'streaming' AND EXCLUDED.status = 'pending' THEN "usage".status_code
WHEN EXCLUDED.status IN ('pending', 'streaming', 'completed', 'cancelled') AND EXCLUDED.status_code IS NULL THEN NULL
ELSE COALESCE(EXCLUDED.status_code, "usage".status_code)
END ELSE "usage".status_code END,
error_message = CASE WHEN "usage".billing_status = 'pending' THEN CASE
WHEN "usage".status = 'streaming' AND EXCLUDED.status = 'pending' THEN "usage".error_message
WHEN EXCLUDED.status IN ('pending', 'streaming', 'completed', 'cancelled') THEN EXCLUDED.error_message
ELSE COALESCE(EXCLUDED.error_message, "usage".error_message)
END ELSE "usage".error_message END,
error_category = CASE WHEN "usage".billing_status = 'pending' THEN CASE
WHEN "usage".status = 'streaming' AND EXCLUDED.status = 'pending' THEN "usage".error_category
WHEN EXCLUDED.status IN ('pending', 'streaming', 'completed', 'cancelled') THEN EXCLUDED.error_category
ELSE COALESCE(EXCLUDED.error_category, "usage".error_category)
END ELSE "usage".error_category END,
response_time_ms = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.response_time_ms, "usage".response_time_ms) ELSE "usage".response_time_ms END,
first_byte_time_ms = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.first_byte_time_ms, "usage".first_byte_time_ms) ELSE "usage".first_byte_time_ms END,
status = CASE WHEN "usage".billing_status = 'pending' THEN CASE
WHEN "usage".status = 'streaming' AND EXCLUDED.status = 'pending' THEN "usage".status
ELSE EXCLUDED.status
END ELSE "usage".status END,
billing_status = CASE WHEN "usage".billing_status = 'pending' THEN EXCLUDED.billing_status ELSE "usage".billing_status END,
request_headers = NULL,
request_body = CASE WHEN "usage".billing_status = 'pending' THEN CASE
WHEN EXCLUDED.request_body_compressed IS NOT NULL OR $56 THEN NULL
ELSE COALESCE(EXCLUDED.request_body, "usage".request_body)
END ELSE "usage".request_body END,
request_body_compressed = CASE WHEN "usage".billing_status = 'pending' THEN CASE
WHEN EXCLUDED.request_body IS NOT NULL OR $56 THEN NULL
ELSE COALESCE(EXCLUDED.request_body_compressed, "usage".request_body_compressed)
END ELSE "usage".request_body_compressed END,
provider_request_headers = NULL,
provider_request_body = CASE WHEN "usage".billing_status = 'pending' THEN CASE
WHEN EXCLUDED.provider_request_body_compressed IS NOT NULL OR $57 THEN NULL
ELSE COALESCE(EXCLUDED.provider_request_body, "usage".provider_request_body)
END ELSE "usage".provider_request_body END,
provider_request_body_compressed = CASE WHEN "usage".billing_status = 'pending' THEN CASE
WHEN EXCLUDED.provider_request_body IS NOT NULL OR $57 THEN NULL
ELSE COALESCE(EXCLUDED.provider_request_body_compressed, "usage".provider_request_body_compressed)
END ELSE "usage".provider_request_body_compressed END,
response_headers = NULL,
response_body = CASE WHEN "usage".billing_status = 'pending' THEN CASE
WHEN EXCLUDED.response_body_compressed IS NOT NULL OR $58 THEN NULL
ELSE COALESCE(EXCLUDED.response_body, "usage".response_body)
END ELSE "usage".response_body END,
response_body_compressed = CASE WHEN "usage".billing_status = 'pending' THEN CASE
WHEN EXCLUDED.response_body IS NOT NULL OR $58 THEN NULL
ELSE COALESCE(EXCLUDED.response_body_compressed, "usage".response_body_compressed)
END ELSE "usage".response_body_compressed END,
client_response_headers = NULL,
client_response_body = CASE WHEN "usage".billing_status = 'pending' THEN CASE
WHEN EXCLUDED.client_response_body_compressed IS NOT NULL OR $59 THEN NULL
ELSE COALESCE(EXCLUDED.client_response_body, "usage".client_response_body)
END ELSE "usage".client_response_body END,
client_response_body_compressed = CASE WHEN "usage".billing_status = 'pending' THEN CASE
WHEN EXCLUDED.client_response_body IS NOT NULL OR $59 THEN NULL
ELSE COALESCE(EXCLUDED.client_response_body_compressed, "usage".client_response_body_compressed)
END ELSE "usage".client_response_body_compressed END,
request_metadata = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.request_metadata, "usage".request_metadata) ELSE "usage".request_metadata END,
finalized_at = CASE WHEN "usage".billing_status = 'pending' THEN COALESCE(EXCLUDED.finalized_at, "usage".finalized_at) ELSE "usage".finalized_at END
RETURNING
id,
request_id,
user_id,
api_key_id,
username,
api_key_name,
provider_name,
model,
target_model,
provider_id,
provider_endpoint_id,
provider_api_key_id,
request_type,
api_format,
api_family,
endpoint_kind,
endpoint_api_format,
provider_api_family,
provider_endpoint_kind,
COALESCE(has_format_conversion, FALSE) AS has_format_conversion,
COALESCE(is_stream, FALSE) AS is_stream,
input_tokens,
output_tokens,
total_tokens,
COALESCE(cache_creation_input_tokens, 0) AS cache_creation_input_tokens,
COALESCE(cache_creation_input_tokens_5m, 0) AS cache_creation_ephemeral_5m_input_tokens,
COALESCE(cache_creation_input_tokens_1h, 0) AS cache_creation_ephemeral_1h_input_tokens,
COALESCE(cache_read_input_tokens, 0) AS cache_read_input_tokens,
COALESCE(CAST(cache_creation_cost_usd AS DOUBLE PRECISION), 0) AS cache_creation_cost_usd,
COALESCE(CAST(cache_read_cost_usd AS DOUBLE PRECISION), 0) AS cache_read_cost_usd,
CAST(output_price_per_1m AS DOUBLE PRECISION) AS output_price_per_1m,
COALESCE(CAST(total_cost_usd AS DOUBLE PRECISION), 0) AS total_cost_usd,
COALESCE(CAST(actual_total_cost_usd AS DOUBLE PRECISION), 0) AS actual_total_cost_usd,
status_code,
error_message,
error_category,
response_time_ms,
first_byte_time_ms,
status,
billing_status,
request_headers,
request_body,
request_body_compressed,
provider_request_headers,
provider_request_body,
provider_request_body_compressed,
response_headers,
response_body,
response_body_compressed,
client_response_headers,
client_response_body,
client_response_body_compressed,
request_metadata,
NULL::varchar AS http_request_body_ref,
NULL::varchar AS http_provider_request_body_ref,
NULL::varchar AS http_response_body_ref,
NULL::varchar AS http_client_response_body_ref,
NULL::varchar AS http_request_body_state,
NULL::varchar AS http_provider_request_body_state,
NULL::varchar AS http_response_body_state,
NULL::varchar AS http_client_response_body_state,
NULL::varchar AS routing_candidate_id,
NULL::integer AS routing_candidate_index,
NULL::varchar AS routing_key_name,
NULL::varchar AS routing_planner_kind,
NULL::varchar AS routing_route_family,
NULL::varchar AS routing_route_kind,
NULL::varchar AS routing_execution_path,
NULL::varchar AS routing_local_execution_runtime_miss_reason,
NULL::varchar AS settlement_billing_snapshot_schema_version,
NULL::varchar AS settlement_billing_snapshot_status,
NULL::double precision AS settlement_rate_multiplier,
NULL::boolean AS settlement_is_free_tier,
NULL::double precision AS settlement_input_price_per_1m,
NULL::double precision AS settlement_output_price_per_1m,
NULL::double precision AS settlement_cache_creation_price_per_1m,
NULL::double precision AS settlement_cache_read_price_per_1m,
NULL::double precision AS settlement_price_per_request,
NULL::varchar AS settlement_snapshot_schema_version,
NULL::jsonb AS settlement_snapshot,
NULL::jsonb AS settlement_billing_dimensions,
NULL::bigint AS settlement_billing_input_tokens,
NULL::bigint AS settlement_billing_effective_input_tokens,
NULL::bigint AS settlement_billing_output_tokens,
NULL::bigint AS settlement_billing_cache_creation_tokens,
NULL::bigint AS settlement_billing_cache_creation_5m_tokens,
NULL::bigint AS settlement_billing_cache_creation_1h_tokens,
NULL::bigint AS settlement_billing_cache_read_tokens,
NULL::bigint AS settlement_billing_total_input_context,
NULL::double precision AS settlement_billing_cache_creation_cost_usd,
NULL::double precision AS settlement_billing_cache_read_cost_usd,
NULL::double precision AS settlement_billing_total_cost_usd,
NULL::double precision AS settlement_billing_actual_total_cost_usd,
NULL::varchar AS settlement_billing_pricing_source,
NULL::varchar AS settlement_billing_rule_id,
NULL::varchar AS settlement_billing_rule_version,
CAST(EXTRACT(EPOCH FROM created_at) AS BIGINT) AS created_at_unix_ms,
CAST(EXTRACT(EPOCH FROM COALESCE(finalized_at, created_at)) AS BIGINT) AS updated_at_unix_secs,
CAST(EXTRACT(EPOCH FROM finalized_at) AS BIGINT) AS finalized_at_unix_secs

View File

@@ -0,0 +1,15 @@
INSERT INTO usage_body_blobs (
body_ref,
request_id,
body_field,
payload_gzip
) VALUES (
$1,
$2,
$3,
$4
)
ON CONFLICT (body_ref)
DO UPDATE SET
payload_gzip = EXCLUDED.payload_gzip,
updated_at = NOW()

View File

@@ -0,0 +1,75 @@
INSERT INTO usage_http_audits (
request_id,
request_headers,
provider_request_headers,
response_headers,
client_response_headers,
request_body_ref,
provider_request_body_ref,
response_body_ref,
client_response_body_ref,
request_body_state,
provider_request_body_state,
response_body_state,
client_response_body_state,
body_capture_mode
) VALUES (
$1,
$2::json,
$3::json,
$4::json,
$5::json,
$6,
$7,
$8,
$9,
$10,
$11,
$12,
$13,
$14
)
ON CONFLICT (request_id)
DO UPDATE SET
request_headers = COALESCE(EXCLUDED.request_headers, usage_http_audits.request_headers),
provider_request_headers = COALESCE(
EXCLUDED.provider_request_headers,
usage_http_audits.provider_request_headers
),
response_headers = COALESCE(EXCLUDED.response_headers, usage_http_audits.response_headers),
client_response_headers = COALESCE(
EXCLUDED.client_response_headers,
usage_http_audits.client_response_headers
),
request_body_ref = COALESCE(EXCLUDED.request_body_ref, usage_http_audits.request_body_ref),
provider_request_body_ref = COALESCE(
EXCLUDED.provider_request_body_ref,
usage_http_audits.provider_request_body_ref
),
response_body_ref = COALESCE(EXCLUDED.response_body_ref, usage_http_audits.response_body_ref),
client_response_body_ref = COALESCE(
EXCLUDED.client_response_body_ref,
usage_http_audits.client_response_body_ref
),
request_body_state = COALESCE(
EXCLUDED.request_body_state,
usage_http_audits.request_body_state
),
provider_request_body_state = COALESCE(
EXCLUDED.provider_request_body_state,
usage_http_audits.provider_request_body_state
),
response_body_state = COALESCE(
EXCLUDED.response_body_state,
usage_http_audits.response_body_state
),
client_response_body_state = COALESCE(
EXCLUDED.client_response_body_state,
usage_http_audits.client_response_body_state
),
body_capture_mode = COALESCE(
NULLIF(EXCLUDED.body_capture_mode, 'none'),
usage_http_audits.body_capture_mode,
'none'
),
updated_at = NOW()

View File

@@ -0,0 +1,62 @@
INSERT INTO usage_routing_snapshots (
request_id,
candidate_id,
candidate_index,
key_name,
planner_kind,
route_family,
route_kind,
execution_path,
local_execution_runtime_miss_reason,
selected_provider_id,
selected_endpoint_id,
selected_provider_api_key_id,
has_format_conversion
) VALUES (
$1,
$2,
$3,
$4,
$5,
$6,
$7,
$8,
$9,
$10,
$11,
$12,
$13
)
ON CONFLICT (request_id)
DO UPDATE SET
candidate_id = COALESCE(EXCLUDED.candidate_id, usage_routing_snapshots.candidate_id),
candidate_index = COALESCE(
EXCLUDED.candidate_index,
usage_routing_snapshots.candidate_index
),
key_name = COALESCE(EXCLUDED.key_name, usage_routing_snapshots.key_name),
planner_kind = COALESCE(EXCLUDED.planner_kind, usage_routing_snapshots.planner_kind),
route_family = COALESCE(EXCLUDED.route_family, usage_routing_snapshots.route_family),
route_kind = COALESCE(EXCLUDED.route_kind, usage_routing_snapshots.route_kind),
execution_path = COALESCE(EXCLUDED.execution_path, usage_routing_snapshots.execution_path),
local_execution_runtime_miss_reason = COALESCE(
EXCLUDED.local_execution_runtime_miss_reason,
usage_routing_snapshots.local_execution_runtime_miss_reason
),
selected_provider_id = COALESCE(
EXCLUDED.selected_provider_id,
usage_routing_snapshots.selected_provider_id
),
selected_endpoint_id = COALESCE(
EXCLUDED.selected_endpoint_id,
usage_routing_snapshots.selected_endpoint_id
),
selected_provider_api_key_id = COALESCE(
EXCLUDED.selected_provider_api_key_id,
usage_routing_snapshots.selected_provider_api_key_id
),
has_format_conversion = COALESCE(
EXCLUDED.has_format_conversion,
usage_routing_snapshots.has_format_conversion
),
updated_at = NOW()

View File

@@ -0,0 +1,172 @@
INSERT INTO usage_settlement_snapshots (
request_id,
billing_status,
billing_snapshot_schema_version,
billing_snapshot_status,
settlement_snapshot_schema_version,
settlement_snapshot,
billing_dimensions,
billing_input_tokens,
billing_effective_input_tokens,
billing_output_tokens,
billing_cache_creation_tokens,
billing_cache_creation_5m_tokens,
billing_cache_creation_1h_tokens,
billing_cache_read_tokens,
billing_total_input_context,
billing_cache_creation_cost_usd,
billing_cache_read_cost_usd,
billing_total_cost_usd,
billing_actual_total_cost_usd,
billing_pricing_source,
billing_rule_id,
billing_rule_version,
rate_multiplier,
is_free_tier,
input_price_per_1m,
output_price_per_1m,
cache_creation_price_per_1m,
cache_read_price_per_1m,
price_per_request
) VALUES (
$1,
$2,
$3,
$4,
$5,
$6,
$7,
$8,
$9,
$10,
$11,
$12,
$13,
$14,
$15,
$16,
$17,
$18,
$19,
$20,
$21,
$22,
$23,
$24,
$25,
$26,
$27,
$28,
$29
)
ON CONFLICT (request_id)
DO UPDATE SET
billing_snapshot_schema_version = COALESCE(
EXCLUDED.billing_snapshot_schema_version,
usage_settlement_snapshots.billing_snapshot_schema_version
),
billing_snapshot_status = COALESCE(
EXCLUDED.billing_snapshot_status,
usage_settlement_snapshots.billing_snapshot_status
),
settlement_snapshot_schema_version = COALESCE(
EXCLUDED.settlement_snapshot_schema_version,
usage_settlement_snapshots.settlement_snapshot_schema_version
),
settlement_snapshot = COALESCE(
EXCLUDED.settlement_snapshot,
usage_settlement_snapshots.settlement_snapshot
),
billing_dimensions = COALESCE(
EXCLUDED.billing_dimensions,
usage_settlement_snapshots.billing_dimensions
),
billing_input_tokens = COALESCE(
EXCLUDED.billing_input_tokens,
usage_settlement_snapshots.billing_input_tokens
),
billing_effective_input_tokens = COALESCE(
EXCLUDED.billing_effective_input_tokens,
usage_settlement_snapshots.billing_effective_input_tokens
),
billing_output_tokens = COALESCE(
EXCLUDED.billing_output_tokens,
usage_settlement_snapshots.billing_output_tokens
),
billing_cache_creation_tokens = COALESCE(
EXCLUDED.billing_cache_creation_tokens,
usage_settlement_snapshots.billing_cache_creation_tokens
),
billing_cache_creation_5m_tokens = COALESCE(
EXCLUDED.billing_cache_creation_5m_tokens,
usage_settlement_snapshots.billing_cache_creation_5m_tokens
),
billing_cache_creation_1h_tokens = COALESCE(
EXCLUDED.billing_cache_creation_1h_tokens,
usage_settlement_snapshots.billing_cache_creation_1h_tokens
),
billing_cache_read_tokens = COALESCE(
EXCLUDED.billing_cache_read_tokens,
usage_settlement_snapshots.billing_cache_read_tokens
),
billing_total_input_context = COALESCE(
EXCLUDED.billing_total_input_context,
usage_settlement_snapshots.billing_total_input_context
),
billing_cache_creation_cost_usd = COALESCE(
EXCLUDED.billing_cache_creation_cost_usd,
usage_settlement_snapshots.billing_cache_creation_cost_usd
),
billing_cache_read_cost_usd = COALESCE(
EXCLUDED.billing_cache_read_cost_usd,
usage_settlement_snapshots.billing_cache_read_cost_usd
),
billing_total_cost_usd = COALESCE(
EXCLUDED.billing_total_cost_usd,
usage_settlement_snapshots.billing_total_cost_usd
),
billing_actual_total_cost_usd = COALESCE(
EXCLUDED.billing_actual_total_cost_usd,
usage_settlement_snapshots.billing_actual_total_cost_usd
),
billing_pricing_source = COALESCE(
EXCLUDED.billing_pricing_source,
usage_settlement_snapshots.billing_pricing_source
),
billing_rule_id = COALESCE(
EXCLUDED.billing_rule_id,
usage_settlement_snapshots.billing_rule_id
),
billing_rule_version = COALESCE(
EXCLUDED.billing_rule_version,
usage_settlement_snapshots.billing_rule_version
),
rate_multiplier = COALESCE(
EXCLUDED.rate_multiplier,
usage_settlement_snapshots.rate_multiplier
),
is_free_tier = COALESCE(
EXCLUDED.is_free_tier,
usage_settlement_snapshots.is_free_tier
),
input_price_per_1m = COALESCE(
EXCLUDED.input_price_per_1m,
usage_settlement_snapshots.input_price_per_1m
),
output_price_per_1m = COALESCE(
EXCLUDED.output_price_per_1m,
usage_settlement_snapshots.output_price_per_1m
),
cache_creation_price_per_1m = COALESCE(
EXCLUDED.cache_creation_price_per_1m,
usage_settlement_snapshots.cache_creation_price_per_1m
),
cache_read_price_per_1m = COALESCE(
EXCLUDED.cache_read_price_per_1m,
usage_settlement_snapshots.cache_read_price_per_1m
),
price_per_request = COALESCE(
EXCLUDED.price_per_request,
usage_settlement_snapshots.price_per_request
),
updated_at = NOW()

File diff suppressed because it is too large Load Diff