Skip to content

router/rule_based_router.cpp

Rule-based router implementation. More...

Namespaces

Name
sgns
sgns::neoswarm
sgns::neoswarm::router

Detailed Description

Rule-based router implementation.

Date: 2026-05-06

Source code

#include "rule_based_router.hpp"
#include "common/logging.hpp"

namespace sgns::neoswarm::router
{
    namespace
    {
        auto RouterLogger()
        {
            return neoswarm::CreateLogger( "Router" );
        }
    } // namespace

    RuleBasedRouter::RuleBasedRouter()
        : m_cfg( {} )
    {
    }
    RuleBasedRouter::RuleBasedRouter( Config cfg )
        : m_cfg( std::move( cfg ) )
    {
    }

    // -----------------------------------------------------------------------
    // SelectMode
    // -----------------------------------------------------------------------
    ExecutionMode RuleBasedRouter::SelectMode( const PromptFeatures& features, ExecutionMode requested ) const
    {
        // Honour explicit Swarm or Specialist request
        if ( requested == ExecutionMode::Swarm )
        {
            return ExecutionMode::Swarm;
        }
        if ( requested == ExecutionMode::Specialist )
        {
            return ExecutionMode::Specialist;
        }

        // Auto-upgrade to Swarm for complex prompts
        if ( m_cfg.enable_swarm_m_mode && features.complexity_ > m_cfg.complexity_swarm_threshold_ )
        {
            return ExecutionMode::Swarm;
        }

        // Specialist mode when a specialist is needed
        if ( features.numeric_density_ > m_cfg.numeric_density_threshold_ || features.has_math_keywords_ ||
             features.has_grammar_request_ )
        {
            return ExecutionMode::Specialist;
        }

        return ExecutionMode::SingleNode;
    }

    // -----------------------------------------------------------------------
    // Route
    // -----------------------------------------------------------------------
    outcome::result<RouteDecision> RuleBasedRouter::Route( const Task& task )
    {
        PromptFeatures features = m_analyzer.Analyze( task.m_prompt );

        RouteDecision decision;
        decision.m_mode = SelectMode( features, task.m_mode );

        if ( features.numeric_density_ > m_cfg.numeric_density_threshold_ || features.has_math_keywords_ )
        {
            decision.m_target = RouteTarget::CorePlusMath;
            decision.confidence_ = 0.85f + features.numeric_density_ * 0.15f;
            decision.m_reasoning = "High numeric density or math keywords detected";
        }
        else if ( features.has_grammar_request_ )
        {
            decision.m_target = RouteTarget::CorePlusGrammar;
            decision.confidence_ = 0.90f;
            decision.m_reasoning = "Grammar/writing correction request detected";
        }
        else if ( features.has_code_syntax_ )
        {
            decision.m_target = RouteTarget::CoreOnly;
            decision.confidence_ = 0.75f;
            decision.m_reasoning = "Code syntax detected — routing to Core (Code specialist: future)";
        }
        else
        {
            decision.m_target = RouteTarget::CoreOnly;
            decision.confidence_ = 1.0f;
            decision.m_reasoning = "General prompt — Core LLM only";
        }

        RouterLogger()->debug( "Route: target={} mode={} confidence={:.2f} reason='{}'",
                               static_cast<int>( decision.m_target ), static_cast<int>( decision.m_mode ),
                               decision.confidence_, decision.m_reasoning );

        return outcome::success( std::move( decision ) );
    }

} // namespace sgns::neoswarm::router

Updated on 2026-07-25 at 22:56:57 +0000