module Application.Helper.ModelRouter where -- IHF Phase 11 — Advanced AI Federation (IHUB-WP-0012 T04) -- Resolve the AgentRegistration to use for a hub + task type. import IHP.Prelude import IHP.ControllerPrelude import Generated.Types import Web.Routes () import Database.PostgreSQL.Simple (Only(..)) -- | Resolve the highest-priority active AgentRegistration for the given hub -- and task type. Returns Nothing if no matching policy exists (callers should -- fall back gracefully or surface an error to the operator). resolveAgent :: (?modelContext :: ModelContext) => Id Hub -> Text -> IO (Maybe AgentRegistration) resolveAgent hubId taskType = do rows <- sqlQuery "SELECT mrp.agent_registration_id \ \ FROM model_routing_policies mrp \ \ WHERE mrp.hub_id = ? AND mrp.task_type = ? AND mrp.is_active = TRUE \ \ ORDER BY mrp.priority DESC \ \ LIMIT 1" (hubId, taskType) case rows of [Only agentId] -> fetchOneOrNothing agentId _ -> pure Nothing -- | Return all active AgentRegistrations for a hub + task_type ordered by -- priority (highest first). Used by CollectiveProposals to fan out. resolveAllAgents :: (?modelContext :: ModelContext) => Id Hub -> Text -> IO [AgentRegistration] resolveAllAgents hubId taskType = do rows <- sqlQuery "SELECT mrp.agent_registration_id \ \ FROM model_routing_policies mrp \ \ WHERE mrp.hub_id = ? AND mrp.task_type = ? AND mrp.is_active = TRUE \ \ ORDER BY mrp.priority DESC" (hubId, taskType) mapM (fetch . (\(Only i) -> i)) rows