Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions llm_inference/model_inference.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,11 @@ def _get_provider(self, model_name: str) -> str:
"xiaomi/mimo-v2-flash:free": "openrouter",
"openai/gpt-oss-120b": "openrouter",
"qwen/qwen3-235b-a22b-2507": "openrouter",
"openai/gpt-6-luna": "openrouter",
"deepseek/deepseek-v4.1-flash": "openrouter",
"deepseek/deepseek-v4-flash-0731": "openrouter",
"google/gemma-4-31b-it": "openrouter",
"google/gemini-3-flash-preview": "openrouter",
"qwen/qwen3-next-80b-a3b-instruct": "openrouter",
"Qwen/Qwen3-Coder-Next": "openrouter",
"deepseek/deepseek-v4-flash": "openrouter",
Expand Down
12 changes: 12 additions & 0 deletions model_cost/model_cost.json
Original file line number Diff line number Diff line change
Expand Up @@ -386,5 +386,17 @@
"google/gemma-4-31b-it": {
"input_token_price_per_million": 0.08,
"output_token_price_per_million": 0.35
},
"openai/gpt-6-luna": {
"input_token_price_per_million": 0.1,
"output_token_price_per_million": 0.5
},
"deepseek/deepseek-v4.1-flash": {
"input_token_price_per_million": 0.03,
"output_token_price_per_million": 0.6
},
"deepseek/deepseek-v4-flash-0731": {
"input_token_price_per_million": 0.021,
"output_token_price_per_million": 0.32
}
}
1 change: 1 addition & 0 deletions router_inference/config/kdb-router-model.json

Large diffs are not rendered by default.

14 changes: 14 additions & 0 deletions router_inference/config/kdb-router.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"pipeline_params": {
"router_name": "kdb-router",
"router_cls_name": "KDBRouter",
"models": [
"deepseek/deepseek-v4-flash-0731",
"deepseek/deepseek-v4.1-flash",
"google/gemini-3-flash-preview",
"google/gemma-4-31b-it",
"openai/gpt-6-luna"
],
"description": "KDB Router: content-only, cost-first routing (question body -> content category via MiniLM + logistic regression trained on an external calibration set -> model / reasoning setting). No RouterArena templates, config files, labels or proportions used."
}
}
11,182 changes: 11,182 additions & 0 deletions router_inference/predictions/kdb-router-robustness.json

Large diffs are not rendered by default.

309,186 changes: 309,186 additions & 0 deletions router_inference/predictions/kdb-router.json

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions router_inference/router/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from router_inference.router.llm_router import LLMRouter
from router_inference.router.lynkr_router import LynkrRouter
from router_inference.router.cruq_sc_router import CruqSCRouter
from router_inference.router.kdb_router import KDBRouter

__all__ = [
"BaseRouter",
Expand All @@ -21,4 +22,5 @@
"ChuzomSoloV32Router",
"LynkrRouter",
"CruqSCRouter",
"KDBRouter",
]
58 changes: 58 additions & 0 deletions router_inference/router/kdb_router.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# SPDX-FileCopyrightText: Copyright contributors to the RouterArena project
# SPDX-License-Identifier: Apache-2.0

"""KDB Router: content-only, cost-first routing.

The question body (first/last paragraph dropped; line labels, option letters and "None" placeholders stripped) is
embedded with all-MiniLM-L6-v2 and classified into one of 11 content categories by a logistic regression trained on
an external calibration set (no RouterArena data). Each category maps to a model, optionally with a reasoning setting
(`model@low` = reasoning effort low, `model@off` = reasoning off); the prediction is the base model name.
Weights and table: config/kdb-router-model.json.
"""

import json
import os
import re

import numpy as np

from router_inference.router.base_router import BaseRouter

_CFG = os.path.join(os.path.dirname(__file__), "..", "config", "kdb-router-model.json")
_LABEL = re.compile(r"(?m)^[ \t]*[A-Za-z][A-Za-z0-9 _\-\"']{0,30}:[ \t]*")
_OPTION = re.compile(r"(?m)^[ \t]*\(?[A-Ja-j][\).:\]][ \t]+")
_PLACEHOLDER = re.compile(r"(?mi)^[ \t]*(none|null|n/a)[ \t]*$")


def routing_text(prompt: str) -> str:
paras = [p for p in prompt.strip().split("\n\n") if p.strip()]
body = prompt.strip() if len(paras) < 3 else "\n\n".join(paras[1:-1]).strip()
text = _PLACEHOLDER.sub("", _OPTION.sub("", _LABEL.sub("", body)))
return re.sub(r"\n{2,}", "\n", text).strip()


class KDBRouter(BaseRouter):
def __init__(self, router_name: str):
super().__init__(router_name)
from sentence_transformers import SentenceTransformer

with open(_CFG) as f:
cfg = json.load(f)
self._embed = SentenceTransformer(
cfg["embed_model"], revision=cfg["embed_revision"]
)
self._classes = cfg["classes"]
self._coef = np.array(cfg["coef"])
self._intercept = np.array(cfg["intercept"])
self._policy = cfg["policy"]
self._default = cfg["default"]

def route_option(self, query: str) -> str:
x = self._embed.encode(
[routing_text(query)], normalize_embeddings=True, show_progress_bar=False
)[0]
cat = self._classes[int(np.argmax(self._coef @ x + self._intercept))]
return self._policy.get(cat, self._default)

def _get_prediction(self, query: str) -> str:
return self.route_option(query).split("@")[0]
4 changes: 4 additions & 0 deletions universal_model_names.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,10 @@
"deepseek-ai/DeepSeek-R1-0528-Qwen3-8B",
# KT-ModelRouter pool additions
"google/gemma-4-31b-it",
# KDB Router pool additions (OpenRouter / OpenAI-served)
"openai/gpt-6-luna",
"deepseek/deepseek-v4.1-flash",
"deepseek/deepseek-v4-flash-0731",
]


Expand Down
Loading