Skip to content
Open
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
4 changes: 4 additions & 0 deletions llm_inference/model_inference.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,10 @@ 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",
"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
}
}
15 changes: 15 additions & 0 deletions router_inference/config/ainative-router.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"pipeline_params": {
"router_name": "ainative-router",
"router_cls_name": "AINativeRouter",
"models": [
"google/gemma-4-31b-it",
"openai/gpt-6-luna",
"google/gemini-3-flash-preview",
"deepseek/deepseek-v4.1-flash",
"qwen/qwen3-235b-a22b-2507",
"deepseek/deepseek-v4-flash-0731"
],
"description": "AINative Router: content-only routing. The question body (first/last paragraph dropped, field labels and option letters stripped generically) is embedded with all-MiniLM-L6-v2 and classified into 11 content categories by a logistic regression trained only on an external 6,409-query calibration set (same public sources, all RouterArena items removed); each category maps to the model with the best accuracy-cost trade-off on that set (sources weighted equally). No RouterArena template strings, config files, labels or proportions are used. Classifier/policy hash-frozen before routing. Per-row provenance (requested_model, model_used, provider, request_id, invoked_at) recorded."
}
}
3,782 changes: 3,782 additions & 0 deletions router_inference/predictions/ainative-router-robustness.json

Large diffs are not rendered by default.

352,732 changes: 352,732 additions & 0 deletions router_inference/predictions/ainative-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.ainative_router import AINativeRouter

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

"""AINative Router adapter.

Content-only routing: the question body (first/last paragraph dropped, field labels and option letters stripped) is
classified into a content category by a classifier trained only on external calibration data, and each category maps
to a model chosen on that data. The router reads no RouterArena files; policy and classifier are hash-frozen
(artifacts/FREEZE.json) and verified at load.
"""

import os
import sys

from router_inference.router.base_router import BaseRouter

_PROJECT_ROOT = os.environ.get(
"ARENA_ROUTER_ROOT",
os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..")),
)
if _PROJECT_ROOT not in sys.path:
sys.path.insert(0, _PROJECT_ROOT)


class AINativeRouter(BaseRouter):
def __init__(self, router_name: str):
super().__init__(router_name)
from arena_router.router import ArenaRouter as _Impl

self._impl = _Impl()
# 정책 선택지는 "model" 또는 "model@<reasoning>" (추론 강도 변형). 예측 파일에는 기본 모델명만 기록하고,
# 추론 설정은 각 행의 generated_result.request_params 에 기록된다.
unknown = {m.split("@")[0] for m in self._impl.policy.models} - set(self.models)
if unknown:
raise ValueError(f"policy models not in config: {unknown}")

def _get_prediction(self, query: str) -> str:
return self._impl.route(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",
# AINative Router pool additions (OpenRouter-served)
"openai/gpt-6-luna",
"deepseek/deepseek-v4.1-flash",
"deepseek/deepseek-v4-flash-0731",
]


Expand Down
Loading