@@ -62,7 +62,7 @@ defmodule SentinelCp.Services.KdlGenerator do
6262 defp resolve_service_configs ( services , project_id , environment ) do
6363 config_fields = [ :headers , :cors , :cache , :retry , :rate_limit , :health_check ,
6464 :access_control , :compression , :security , :request_transform ,
65- :response_transform , :path_rewrite ]
65+ :response_transform , :path_rewrite , :inference ]
6666
6767 Enum . reduce_while ( services , { :ok , [ ] } , fn service , { :ok , acc } ->
6868 case resolve_service_config_maps ( service , config_fields , project_id , environment ) do
@@ -220,6 +220,13 @@ defmodule SentinelCp.Services.KdlGenerator do
220220 defp build_route ( % Service { } = service , group_map , cert_map , auth_policy_map , middleware_chain ) do
221221 lines = [ " route #{ inspect ( service . route_path ) } {" ]
222222
223+ lines =
224+ if service . service_type && service . service_type != "standard" do
225+ lines ++ [ " service-type #{ inspect ( service . service_type ) } " ]
226+ else
227+ lines
228+ end
229+
223230 lines =
224231 cond do
225232 service . upstream_url ->
@@ -259,6 +266,7 @@ defmodule SentinelCp.Services.KdlGenerator do
259266 lines = lines ++ build_request_transform_block ( service . request_transform )
260267 lines = lines ++ build_response_transform_block ( service . response_transform )
261268 lines = lines ++ build_traffic_split_block ( service . traffic_split , group_map )
269+ lines = lines ++ build_inference_block ( service . inference )
262270
263271 # Append middleware chain blocks (after inline fields)
264272 lines = lines ++ build_middleware_chain ( middleware_chain )
@@ -466,6 +474,143 @@ defmodule SentinelCp.Services.KdlGenerator do
466474 end
467475 end
468476
477+ defp build_inference_block ( inf ) when inf == % { } or inf == nil , do: [ ]
478+
479+ defp build_inference_block ( inf ) do
480+ lines = [ " inference {" ]
481+
482+ # Provider
483+ lines =
484+ case Map . get ( inf , "provider" ) do
485+ nil -> lines
486+ provider -> lines ++ [ " provider #{ inspect ( provider ) } " ]
487+ end
488+
489+ # Token rate limit
490+ lines = lines ++ build_inference_sub_block ( Map . get ( inf , "token_rate_limit" ) , "rate-limit" )
491+
492+ # Token budget
493+ lines = lines ++ build_inference_sub_block ( Map . get ( inf , "token_budget" ) , "budget" )
494+
495+ # Cost attribution
496+ lines = lines ++ build_cost_attribution_block ( Map . get ( inf , "cost_attribution" ) )
497+
498+ # Model routing
499+ lines = lines ++ build_model_routing_block ( Map . get ( inf , "model_routing" ) )
500+
501+ # Guardrails
502+ lines = lines ++ build_guardrails_block ( Map . get ( inf , "guardrails" ) )
503+
504+ # Fallback
505+ lines = lines ++ build_fallback_block ( Map . get ( inf , "fallback" ) )
506+
507+ # Streaming
508+ lines = lines ++ build_inference_sub_block ( Map . get ( inf , "streaming" ) , "streaming" )
509+
510+ lines ++ [ " }" ]
511+ end
512+
513+ defp build_inference_sub_block ( nil , _name ) , do: [ ]
514+ defp build_inference_sub_block ( map , _name ) when map == % { } , do: [ ]
515+
516+ defp build_inference_sub_block ( map , name ) do
517+ inner =
518+ map
519+ |> Enum . sort_by ( fn { k , _ } -> k end )
520+ |> Enum . map ( fn { key , value } -> " #{ key } #{ format_value ( value ) } " end )
521+
522+ [ " #{ name } {" ] ++ inner ++ [ " }" ]
523+ end
524+
525+ defp build_cost_attribution_block ( nil ) , do: [ ]
526+ defp build_cost_attribution_block ( ca ) when ca == % { } , do: [ ]
527+
528+ defp build_cost_attribution_block ( ca ) do
529+ lines = [ " cost-attribution {" ]
530+
531+ lines =
532+ case Map . get ( ca , "currency" ) do
533+ nil -> lines
534+ currency -> lines ++ [ " currency #{ inspect ( currency ) } " ]
535+ end
536+
537+ models = Map . get ( ca , "models" , [ ] )
538+
539+ model_lines =
540+ Enum . flat_map ( models , fn model ->
541+ pattern = Map . get ( model , "pattern" , "*" )
542+ inner =
543+ model
544+ |> Map . drop ( [ "pattern" ] )
545+ |> Enum . sort_by ( fn { k , _ } -> k end )
546+ |> Enum . map ( fn { key , value } -> " #{ key } #{ format_value ( value ) } " end )
547+
548+ [ " model #{ inspect ( pattern ) } {" ] ++ inner ++ [ " }" ]
549+ end )
550+
551+ lines ++ model_lines ++ [ " }" ]
552+ end
553+
554+ defp build_model_routing_block ( nil ) , do: [ ]
555+ defp build_model_routing_block ( mr ) when mr == % { } , do: [ ]
556+
557+ defp build_model_routing_block ( mr ) do
558+ lines = [ " model-routing {" ]
559+
560+ routes = Map . get ( mr , "routes" , [ ] )
561+
562+ route_lines =
563+ Enum . flat_map ( routes , fn route ->
564+ pattern = Map . get ( route , "pattern" , "*" )
565+ inner =
566+ route
567+ |> Map . drop ( [ "pattern" ] )
568+ |> Enum . sort_by ( fn { k , _ } -> k end )
569+ |> Enum . map ( fn { key , value } -> " #{ key } #{ format_value ( value ) } " end )
570+
571+ [ " route #{ inspect ( pattern ) } {" ] ++ inner ++ [ " }" ]
572+ end )
573+
574+ lines ++ route_lines ++ [ " }" ]
575+ end
576+
577+ defp build_guardrails_block ( nil ) , do: [ ]
578+ defp build_guardrails_block ( gr ) when gr == % { } , do: [ ]
579+
580+ defp build_guardrails_block ( gr ) do
581+ lines = [ " guardrails {" ]
582+
583+ lines = lines ++ build_inference_sub_block ( Map . get ( gr , "prompt_injection" ) , "prompt-injection" )
584+ lines = lines ++ build_inference_sub_block ( Map . get ( gr , "pii_detection" ) , "pii-detection" )
585+
586+ lines ++ [ " }" ]
587+ end
588+
589+ defp build_fallback_block ( nil ) , do: [ ]
590+ defp build_fallback_block ( fb ) when fb == % { } , do: [ ]
591+
592+ defp build_fallback_block ( fb ) do
593+ lines = [ " fallback {" ]
594+
595+ mappings = Map . get ( fb , "model_mapping" , [ ] )
596+
597+ mapping_lines =
598+ Enum . map ( mappings , fn mapping ->
599+ from = Map . get ( mapping , "from" , "" )
600+ to = Map . get ( mapping , "to" , "" )
601+ " model-mapping #{ inspect ( from ) } #{ inspect ( to ) } "
602+ end )
603+
604+ # Add other top-level fallback keys
605+ other_lines =
606+ fb
607+ |> Map . drop ( [ "model_mapping" ] )
608+ |> Enum . sort_by ( fn { k , _ } -> k end )
609+ |> Enum . map ( fn { key , value } -> " #{ key } #{ format_value ( value ) } " end )
610+
611+ lines ++ other_lines ++ mapping_lines ++ [ " }" ]
612+ end
613+
469614 defp build_middleware_chain ( [ ] ) , do: [ ]
470615
471616 defp build_middleware_chain ( service_middlewares ) do
0 commit comments