refactor(rust): 拆分 usage sql 仓储为模块并外置 SQL 文件

- 将 usage/sql.rs 拆分为 sql/mod.rs 与 sql/tests.rs
- 将内联 SQL 抽离到 sql/queries/ 目录下的独立 .sql 文件
- 前端用量记录表格移除缓存创建 token 展示,保留 cache read 列
This commit is contained in:
fawney19
2026-04-24 20:22:24 +08:00
parent d0d71aa51a
commit 657fcd595c
26 changed files with 3127 additions and 3161 deletions

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(COALESCE(usage_settlement_snapshots.billing_input_tokens, "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(COALESCE(usage_settlement_snapshots.billing_input_tokens, "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(COALESCE(usage_settlement_snapshots.billing_input_tokens, "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(COALESCE(usage_settlement_snapshots.billing_input_tokens, "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 = "usage".input_tokens,
output_tokens = "usage".output_tokens,
total_tokens = "usage".total_tokens,
cache_creation_input_tokens = "usage".cache_creation_input_tokens,
cache_creation_input_tokens_5m = "usage".cache_creation_input_tokens_5m,
cache_creation_input_tokens_1h = "usage".cache_creation_input_tokens_1h,
cache_read_input_tokens = "usage".cache_read_input_tokens,
cache_creation_cost_usd = "usage".cache_creation_cost_usd,
cache_read_cost_usd = "usage".cache_read_cost_usd,
output_price_per_1m = NULL,
total_cost_usd = "usage".total_cost_usd,
actual_total_cost_usd = "usage".actual_total_cost_usd,
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