245 lines
11 KiB
SQL
245 lines
11 KiB
SQL
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
|
|
|
INSERT INTO gateway_user_groups (
|
|
group_key, name, description, priority,
|
|
recharge_discount_policy, billing_discount_policy, rate_limit_policy, quota_policy, metadata, status
|
|
)
|
|
VALUES
|
|
(
|
|
'default', 'Default Users', 'Built-in default group for local and synchronized users.', 100,
|
|
'{"discountFactor":1}'::jsonb,
|
|
'{"discountFactor":1}'::jsonb,
|
|
'{"rules":[{"metric":"rpm","limit":60,"windowSeconds":60},{"metric":"tpm_total","limit":120000,"windowSeconds":60},{"metric":"concurrent","limit":3,"leaseTtlSeconds":120}]}'::jsonb,
|
|
'{}'::jsonb,
|
|
'{"seed":"phase1"}'::jsonb,
|
|
'active'
|
|
),
|
|
(
|
|
'vip', 'VIP Users', 'Higher quota group for future recharge and concurrency policies.', 50,
|
|
'{"discountFactor":0.9}'::jsonb,
|
|
'{"discountFactor":0.95}'::jsonb,
|
|
'{"rules":[{"metric":"rpm","limit":300,"windowSeconds":60},{"metric":"tpm_total","limit":600000,"windowSeconds":60},{"metric":"concurrent","limit":10,"leaseTtlSeconds":120}]}'::jsonb,
|
|
'{}'::jsonb,
|
|
'{"seed":"phase1"}'::jsonb,
|
|
'active'
|
|
)
|
|
ON CONFLICT (group_key) DO UPDATE
|
|
SET name = EXCLUDED.name,
|
|
description = EXCLUDED.description,
|
|
priority = EXCLUDED.priority,
|
|
recharge_discount_policy = EXCLUDED.recharge_discount_policy,
|
|
billing_discount_policy = EXCLUDED.billing_discount_policy,
|
|
rate_limit_policy = EXCLUDED.rate_limit_policy,
|
|
updated_at = now();
|
|
|
|
INSERT INTO gateway_tenants (tenant_key, source, external_tenant_id, name, default_user_group_id, metadata, status)
|
|
VALUES (
|
|
'default',
|
|
'gateway',
|
|
'default',
|
|
'Default Tenant',
|
|
(SELECT id FROM gateway_user_groups WHERE group_key = 'default'),
|
|
'{"seed":"phase1"}'::jsonb,
|
|
'active'
|
|
)
|
|
ON CONFLICT (tenant_key) DO UPDATE
|
|
SET name = EXCLUDED.name,
|
|
default_user_group_id = EXCLUDED.default_user_group_id,
|
|
updated_at = now();
|
|
|
|
INSERT INTO model_catalog_providers (
|
|
provider_key, provider_code, display_name, provider_type, icon_path, source, capability_schema, default_rate_limit_policy, metadata, status
|
|
)
|
|
VALUES
|
|
(
|
|
'openai',
|
|
'openai',
|
|
'OpenAI',
|
|
'openai',
|
|
NULL,
|
|
'server-main.integration-platform',
|
|
'{"chat":true,"imageGeneration":true,"imageEdit":true,"stream":true}'::jsonb,
|
|
'{"rules":[{"metric":"rpm","limit":500,"windowSeconds":60},{"metric":"tpm_total","limit":1000000,"windowSeconds":60},{"metric":"concurrent","limit":20,"leaseTtlSeconds":120}]}'::jsonb,
|
|
'{"seed":"phase1","syncSource":"server-main.integration-platform","sourceCode":"openai"}'::jsonb,
|
|
'active'
|
|
),
|
|
(
|
|
'gemini',
|
|
'google-gemini',
|
|
'Google Gemini',
|
|
'gemini',
|
|
'https://static.51easyai.com/gemini-color.png',
|
|
'server-main.integration-platform',
|
|
'{"chat":true,"imageGeneration":true,"imageEdit":true,"stream":true}'::jsonb,
|
|
'{"rules":[{"metric":"rpm","limit":500,"windowSeconds":60},{"metric":"tpm_total","limit":1000000,"windowSeconds":60},{"metric":"concurrent","limit":20,"leaseTtlSeconds":120}]}'::jsonb,
|
|
'{"seed":"phase1","syncSource":"server-main.integration-platform","sourceCode":"google-gemini"}'::jsonb,
|
|
'active'
|
|
)
|
|
ON CONFLICT (provider_key) DO UPDATE
|
|
SET provider_code = EXCLUDED.provider_code,
|
|
display_name = EXCLUDED.display_name,
|
|
provider_type = EXCLUDED.provider_type,
|
|
icon_path = EXCLUDED.icon_path,
|
|
source = EXCLUDED.source,
|
|
capability_schema = EXCLUDED.capability_schema,
|
|
default_rate_limit_policy = EXCLUDED.default_rate_limit_policy,
|
|
metadata = model_catalog_providers.metadata || EXCLUDED.metadata,
|
|
updated_at = now();
|
|
|
|
INSERT INTO base_model_catalog (
|
|
provider_id, provider_key, canonical_model_key, provider_model_name, model_type, display_name,
|
|
capabilities, base_billing_config, default_rate_limit_policy, metadata, status
|
|
)
|
|
VALUES
|
|
(
|
|
(SELECT id FROM model_catalog_providers WHERE provider_key = 'openai'),
|
|
'openai',
|
|
'openai:gpt-4o-mini',
|
|
'gpt-4o-mini',
|
|
'chat',
|
|
'GPT-4o mini',
|
|
'{"stream":true,"vision":true,"inputModalities":["text","image"],"outputModalities":["text"],"maxInputTokens":128000}'::jsonb,
|
|
'{"textInputPer1k":0.15,"textOutputPer1k":0.6,"currency":"resource"}'::jsonb,
|
|
'{"rules":[{"metric":"rpm","limit":300,"windowSeconds":60},{"metric":"tpm_total","limit":500000,"windowSeconds":60},{"metric":"concurrent","limit":10,"leaseTtlSeconds":120}]}'::jsonb,
|
|
'{"seed":"phase1"}'::jsonb,
|
|
'active'
|
|
),
|
|
(
|
|
(SELECT id FROM model_catalog_providers WHERE provider_key = 'openai'),
|
|
'openai',
|
|
'openai:gpt-image-1',
|
|
'gpt-image-1',
|
|
'image',
|
|
'GPT Image 1',
|
|
'{"imageGeneration":true,"imageEdit":true,"inputModalities":["text","image","mask"],"outputModalities":["image"],"sizes":["1024x1024","1024x1536","1536x1024"],"qualities":["low","medium","high"]}'::jsonb,
|
|
'{"imageBase":5,"editBase":6,"currency":"resource","qualityWeights":{"low":0.7,"standard":1,"medium":1,"high":1.4},"sizeWeights":{"1024x1024":1,"1024x1536":1.35,"1536x1024":1.35}}'::jsonb,
|
|
'{"rules":[{"metric":"rpm","limit":60,"windowSeconds":60},{"metric":"concurrent","limit":4,"leaseTtlSeconds":180}]}'::jsonb,
|
|
'{"seed":"phase1"}'::jsonb,
|
|
'active'
|
|
),
|
|
(
|
|
(SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini'),
|
|
'gemini',
|
|
'gemini:gemini-2.5-flash',
|
|
'gemini-2.5-flash',
|
|
'chat',
|
|
'Gemini 2.5 Flash',
|
|
'{"stream":true,"vision":true,"inputModalities":["text","image"],"outputModalities":["text"],"maxInputTokens":1048576}'::jsonb,
|
|
'{"textInputPer1k":0.1,"textOutputPer1k":0.4,"currency":"resource"}'::jsonb,
|
|
'{"rules":[{"metric":"rpm","limit":300,"windowSeconds":60},{"metric":"tpm_total","limit":500000,"windowSeconds":60},{"metric":"concurrent","limit":10,"leaseTtlSeconds":120}]}'::jsonb,
|
|
'{"seed":"phase1"}'::jsonb,
|
|
'active'
|
|
),
|
|
(
|
|
(SELECT id FROM model_catalog_providers WHERE provider_key = 'gemini'),
|
|
'gemini',
|
|
'gemini:gemini-2.5-flash-image',
|
|
'gemini-2.5-flash-image',
|
|
'image',
|
|
'Gemini 2.5 Flash Image',
|
|
'{"imageGeneration":true,"imageEdit":true,"inputModalities":["text","image","mask"],"outputModalities":["image"],"sizes":["1024x1024","1024x1536","1536x1024"],"qualities":["standard","high"]}'::jsonb,
|
|
'{"imageBase":4,"editBase":5,"currency":"resource","qualityWeights":{"standard":1,"high":1.35},"sizeWeights":{"1024x1024":1,"1024x1536":1.3,"1536x1024":1.3}}'::jsonb,
|
|
'{"rules":[{"metric":"rpm","limit":60,"windowSeconds":60},{"metric":"concurrent","limit":4,"leaseTtlSeconds":180}]}'::jsonb,
|
|
'{"seed":"phase1"}'::jsonb,
|
|
'active'
|
|
)
|
|
ON CONFLICT (canonical_model_key) DO UPDATE
|
|
SET provider_id = EXCLUDED.provider_id,
|
|
provider_key = EXCLUDED.provider_key,
|
|
provider_model_name = EXCLUDED.provider_model_name,
|
|
model_type = EXCLUDED.model_type,
|
|
display_name = EXCLUDED.display_name,
|
|
capabilities = EXCLUDED.capabilities,
|
|
base_billing_config = EXCLUDED.base_billing_config,
|
|
default_rate_limit_policy = EXCLUDED.default_rate_limit_policy,
|
|
updated_at = now();
|
|
|
|
INSERT INTO integration_platforms (
|
|
provider, platform_key, name, base_url, auth_type, credentials, config,
|
|
default_pricing_mode, default_discount_factor, retry_policy, rate_limit_policy, priority, status
|
|
)
|
|
VALUES
|
|
(
|
|
'openai', 'openai-simulation', 'OpenAI Simulation',
|
|
'https://api.openai.com/v1', 'bearer',
|
|
'{"mode":"simulation"}'::jsonb,
|
|
'{"testMode":true,"seed":"phase1"}'::jsonb,
|
|
'inherit_discount', 1,
|
|
'{"enabled":true,"maxAttempts":2,"retryOn":["rate_limit","timeout","server_error","network"]}'::jsonb,
|
|
'{"rules":[{"metric":"rpm","limit":120,"windowSeconds":60},{"metric":"tpm_total","limit":240000,"windowSeconds":60},{"metric":"concurrent","limit":6,"leaseTtlSeconds":120}]}'::jsonb,
|
|
900,
|
|
'enabled'
|
|
),
|
|
(
|
|
'gemini', 'gemini-simulation', 'Gemini Simulation',
|
|
'https://generativelanguage.googleapis.com', 'api_key',
|
|
'{"mode":"simulation"}'::jsonb,
|
|
'{"testMode":true,"seed":"phase1"}'::jsonb,
|
|
'inherit_discount', 1,
|
|
'{"enabled":true,"maxAttempts":2,"retryOn":["rate_limit","timeout","server_error","network"]}'::jsonb,
|
|
'{"rules":[{"metric":"rpm","limit":120,"windowSeconds":60},{"metric":"tpm_total","limit":240000,"windowSeconds":60},{"metric":"concurrent","limit":6,"leaseTtlSeconds":120}]}'::jsonb,
|
|
910,
|
|
'enabled'
|
|
)
|
|
ON CONFLICT (platform_key) DO UPDATE
|
|
SET name = EXCLUDED.name,
|
|
base_url = EXCLUDED.base_url,
|
|
auth_type = EXCLUDED.auth_type,
|
|
credentials = EXCLUDED.credentials,
|
|
config = EXCLUDED.config,
|
|
default_pricing_mode = EXCLUDED.default_pricing_mode,
|
|
default_discount_factor = EXCLUDED.default_discount_factor,
|
|
retry_policy = EXCLUDED.retry_policy,
|
|
rate_limit_policy = EXCLUDED.rate_limit_policy,
|
|
priority = EXCLUDED.priority,
|
|
status = EXCLUDED.status,
|
|
updated_at = now();
|
|
|
|
INSERT INTO platform_models (
|
|
platform_id, base_model_id, model_name, model_alias, model_type, display_name,
|
|
capabilities, pricing_mode, billing_config, retry_policy, rate_limit_policy, enabled
|
|
)
|
|
SELECT p.id, b.id, b.provider_model_name, b.canonical_model_key, b.model_type, b.display_name,
|
|
b.capabilities, 'inherit_discount', b.base_billing_config,
|
|
'{"enabled":true,"maxAttempts":2}'::jsonb,
|
|
b.default_rate_limit_policy,
|
|
true
|
|
FROM integration_platforms p
|
|
JOIN base_model_catalog b ON b.provider_key = p.provider
|
|
WHERE p.platform_key IN ('openai-simulation', 'gemini-simulation')
|
|
ON CONFLICT (platform_id, model_name, model_type) DO UPDATE
|
|
SET base_model_id = EXCLUDED.base_model_id,
|
|
model_alias = EXCLUDED.model_alias,
|
|
display_name = EXCLUDED.display_name,
|
|
capabilities = EXCLUDED.capabilities,
|
|
pricing_mode = EXCLUDED.pricing_mode,
|
|
billing_config = EXCLUDED.billing_config,
|
|
retry_policy = EXCLUDED.retry_policy,
|
|
rate_limit_policy = EXCLUDED.rate_limit_policy,
|
|
enabled = EXCLUDED.enabled,
|
|
updated_at = now();
|
|
|
|
INSERT INTO model_pricing_rules (scope_type, scope_id, resource_type, unit, base_price, currency, base_weight, dynamic_weight)
|
|
SELECT 'base_model', b.id, item.resource_type, item.unit, item.base_price, 'resource', item.base_weight, item.dynamic_weight
|
|
FROM base_model_catalog b
|
|
JOIN (
|
|
VALUES
|
|
('openai:gpt-4o-mini', 'text_input', '1k_tokens', 0.15::numeric, '{}'::jsonb, '{}'::jsonb),
|
|
('openai:gpt-4o-mini', 'text_output', '1k_tokens', 0.60::numeric, '{}'::jsonb, '{}'::jsonb),
|
|
('openai:gpt-image-1', 'image', 'image', 5.00::numeric, '{"mode":"generation"}'::jsonb, '{"quality":true,"size":true}'::jsonb),
|
|
('openai:gpt-image-1', 'image_edit', 'image', 6.00::numeric, '{"mode":"edit"}'::jsonb, '{"quality":true,"size":true}'::jsonb),
|
|
('gemini:gemini-2.5-flash', 'text_input', '1k_tokens', 0.10::numeric, '{}'::jsonb, '{}'::jsonb),
|
|
('gemini:gemini-2.5-flash', 'text_output', '1k_tokens', 0.40::numeric, '{}'::jsonb, '{}'::jsonb),
|
|
('gemini:gemini-2.5-flash-image', 'image', 'image', 4.00::numeric, '{"mode":"generation"}'::jsonb, '{"quality":true,"size":true}'::jsonb),
|
|
('gemini:gemini-2.5-flash-image', 'image_edit', 'image', 5.00::numeric, '{"mode":"edit"}'::jsonb, '{"quality":true,"size":true}'::jsonb)
|
|
) AS item(canonical_model_key, resource_type, unit, base_price, base_weight, dynamic_weight)
|
|
ON item.canonical_model_key = b.canonical_model_key
|
|
WHERE NOT EXISTS (
|
|
SELECT 1
|
|
FROM model_pricing_rules existing
|
|
WHERE existing.scope_type = 'base_model'
|
|
AND existing.scope_id = b.id
|
|
AND existing.resource_type = item.resource_type
|
|
AND existing.unit = item.unit
|
|
);
|