84 lines
2.9 KiB
PL/PgSQL
84 lines
2.9 KiB
PL/PgSQL
begin;
|
|
|
|
create or replace function public.model_version_config_hash(p_version_id uuid)
|
|
returns text language sql stable security definer set search_path=''
|
|
as $$
|
|
select encode(public.digest(convert_to(jsonb_build_object(
|
|
'versionId',v.id,
|
|
'configId',v.config_id,
|
|
'version',v.version,
|
|
'providerId',v.provider_id,
|
|
'label',v.label,
|
|
'description',v.description,
|
|
'providerModel',v.provider_model,
|
|
'modelTier',v.model_tier,
|
|
'creditCost',v.credit_cost,
|
|
'contextWindow',v.context_window,
|
|
'inputCost',v.input_cost_microusd_per_million,
|
|
'outputCost',v.output_cost_microusd_per_million,
|
|
'enabled',v.enabled,
|
|
'isDefault',v.is_default,
|
|
'fallbackModelId',v.fallback_model_id,
|
|
'settings',v.settings,
|
|
'providerCode',p.code,
|
|
'providerType',p.provider_type,
|
|
'providerBaseUrl',p.base_url,
|
|
'providerCredentialHash',case when p.encrypted_api_key is null then null else encode(public.digest(convert_to(p.encrypted_api_key,'utf8'),'sha256'),'hex') end
|
|
)::text,'utf8'),'sha256'),'hex')
|
|
from public.model_config_versions v
|
|
join public.model_providers p on p.id=v.provider_id
|
|
where v.id=p_version_id
|
|
$$;
|
|
|
|
create or replace function public.prevent_published_model_provider_runtime_mutation()
|
|
returns trigger language plpgsql set search_path=''
|
|
as $$
|
|
declare v_has_historical_version boolean;
|
|
begin
|
|
select exists(
|
|
select 1 from public.model_config_versions
|
|
where provider_id=old.id and status in ('published','retired')
|
|
) into v_has_historical_version;
|
|
|
|
if v_has_historical_version
|
|
and (new.code,new.provider_type,new.base_url)
|
|
is distinct from
|
|
(old.code,old.provider_type,old.base_url)
|
|
then
|
|
raise exception 'model_provider_runtime_immutable' using
|
|
errcode='23514',
|
|
hint='Create a new provider and model config version, then test and publish it.';
|
|
end if;
|
|
|
|
if v_has_historical_version and old.enabled and not new.enabled then
|
|
new.updated_at:=clock_timestamp();
|
|
end if;
|
|
|
|
if v_has_historical_version and not old.enabled and new.enabled
|
|
and (
|
|
new.encrypted_api_key is distinct from old.encrypted_api_key
|
|
or not exists(
|
|
select 1
|
|
from public.model_config_versions v
|
|
join public.model_connection_test_evidence e
|
|
on e.version_id=v.id
|
|
and e.provider_id=old.id
|
|
and e.config_hash=public.model_version_config_hash(v.id)
|
|
and e.http_status between 200 and 299
|
|
and e.expires_at>clock_timestamp()
|
|
and e.tested_at>old.updated_at
|
|
where v.provider_id=old.id
|
|
and v.status in ('published','retired')
|
|
)
|
|
)
|
|
then
|
|
raise exception 'model_provider_reenable_test_required' using
|
|
errcode='23514',
|
|
hint='Test a published or retired model version with the saved provider credentials after disabling the provider and before re-enabling it.';
|
|
end if;
|
|
|
|
return new;
|
|
end $$;
|
|
|
|
commit;
|