Import AITURK IDE 1.0.0-beta.1 from Hermes 63279301; preserve MIT license
This commit is contained in:
@@ -0,0 +1,256 @@
|
||||
"""Focused tests for Nebius Token Factory provider wiring."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from hermes_cli.auth import (
|
||||
PROVIDER_REGISTRY,
|
||||
resolve_api_key_provider_credentials,
|
||||
resolve_provider,
|
||||
)
|
||||
from hermes_cli.model_normalize import normalize_model_for_provider
|
||||
from hermes_cli.models import (
|
||||
CANONICAL_PROVIDERS,
|
||||
_PROVIDER_ALIASES,
|
||||
_PROVIDER_LABELS,
|
||||
normalize_provider,
|
||||
provider_model_ids,
|
||||
)
|
||||
|
||||
|
||||
def test_nebius_provider_profile_loads():
|
||||
from providers import get_provider_profile
|
||||
|
||||
profile = get_provider_profile("nebius-token-factory")
|
||||
assert profile is not None
|
||||
assert profile.name == "nebius-token-factory"
|
||||
assert profile.display_name == "Nebius Token Factory"
|
||||
assert profile.base_url == "https://api.tokenfactory.nebius.com/v1"
|
||||
assert profile.models_url == "https://api.tokenfactory.nebius.com/v1/models?verbose=true"
|
||||
assert profile.env_vars[:2] == (
|
||||
"NEBIUS_API_KEY",
|
||||
"NEBIUS_TOKEN_FACTORY_API_KEY",
|
||||
)
|
||||
assert profile.default_aux_model == "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B"
|
||||
assert "Qwen/Qwen3.5-397B-A17B-fast" in profile.fallback_models
|
||||
|
||||
|
||||
def test_nebius_aliases_resolve(monkeypatch):
|
||||
monkeypatch.setenv("NEBIUS_API_KEY", "nebius-test-key")
|
||||
|
||||
for alias in (
|
||||
"nebius",
|
||||
"nebius-tokenfactory",
|
||||
"nebius-tf",
|
||||
"token-factory",
|
||||
"tokenfactory",
|
||||
):
|
||||
assert resolve_provider(alias) == "nebius-token-factory"
|
||||
assert normalize_provider(alias) == "nebius-token-factory"
|
||||
assert _PROVIDER_ALIASES[alias] == "nebius-token-factory"
|
||||
|
||||
|
||||
def test_nebius_provider_registry_and_credentials(monkeypatch):
|
||||
monkeypatch.setenv("NEBIUS_API_KEY", "nebius-secret")
|
||||
monkeypatch.setenv("NEBIUS_BASE_URL", "https://custom.nebius.example/v1")
|
||||
|
||||
pconfig = PROVIDER_REGISTRY["nebius-token-factory"]
|
||||
assert pconfig.id == "nebius-token-factory"
|
||||
assert pconfig.name == "Nebius Token Factory"
|
||||
assert pconfig.auth_type == "api_key"
|
||||
assert pconfig.inference_base_url == "https://api.tokenfactory.nebius.com/v1"
|
||||
assert pconfig.api_key_env_vars == (
|
||||
"NEBIUS_API_KEY",
|
||||
"NEBIUS_TOKEN_FACTORY_API_KEY",
|
||||
)
|
||||
assert pconfig.base_url_env_var == "NEBIUS_BASE_URL"
|
||||
|
||||
creds = resolve_api_key_provider_credentials("nebius-token-factory")
|
||||
assert creds["provider"] == "nebius-token-factory"
|
||||
assert creds["api_key"] == "nebius-secret"
|
||||
assert creds["base_url"] == "https://custom.nebius.example/v1"
|
||||
|
||||
|
||||
def test_nebius_canonical_provider_and_label():
|
||||
slugs = [p.slug for p in CANONICAL_PROVIDERS]
|
||||
assert "nebius-token-factory" in slugs
|
||||
assert _PROVIDER_LABELS["nebius-token-factory"] == "Nebius Token Factory"
|
||||
|
||||
|
||||
def test_nebius_provider_module_overlay():
|
||||
from hermes_cli.providers import (
|
||||
HERMES_OVERLAYS,
|
||||
determine_api_mode,
|
||||
get_label,
|
||||
get_provider,
|
||||
normalize_provider as normalize_provider_in_providers,
|
||||
)
|
||||
|
||||
overlay = HERMES_OVERLAYS["nebius-token-factory"]
|
||||
assert overlay.transport == "openai_chat"
|
||||
assert overlay.base_url_override == "https://api.tokenfactory.nebius.com/v1"
|
||||
assert overlay.base_url_env_var == "NEBIUS_BASE_URL"
|
||||
|
||||
provider = get_provider("nebius")
|
||||
assert provider is not None
|
||||
assert provider.id == "nebius-token-factory"
|
||||
assert provider.api_key_env_vars == (
|
||||
"NEBIUS_API_KEY",
|
||||
"NEBIUS_TOKEN_FACTORY_API_KEY",
|
||||
)
|
||||
assert provider.base_url == "https://api.tokenfactory.nebius.com/v1"
|
||||
assert normalize_provider_in_providers("token-factory") == "nebius-token-factory"
|
||||
assert get_label("nebius-token-factory") == "Nebius Token Factory"
|
||||
assert determine_api_mode(
|
||||
"nebius-token-factory",
|
||||
"https://api.tokenfactory.nebius.com/v1",
|
||||
) == "chat_completions"
|
||||
|
||||
|
||||
def test_nebius_model_catalog_prefers_live_profile_fetch(monkeypatch):
|
||||
from providers import get_provider_profile
|
||||
|
||||
profile = get_provider_profile("nebius-token-factory")
|
||||
assert profile is not None
|
||||
monkeypatch.setattr(
|
||||
"hermes_cli.auth.resolve_api_key_provider_credentials",
|
||||
lambda provider_id: {
|
||||
"provider": provider_id,
|
||||
"api_key": "nebius-live-key",
|
||||
"base_url": "https://api.tokenfactory.nebius.com/v1",
|
||||
"source": "NEBIUS_API_KEY",
|
||||
},
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
profile,
|
||||
"fetch_models",
|
||||
lambda *, api_key=None, base_url=None, timeout=8.0: [
|
||||
"deepseek-ai/DeepSeek-V4-Pro",
|
||||
"NousResearch/Hermes-4-70B",
|
||||
"some-brand-new/Live-Only-Model",
|
||||
],
|
||||
)
|
||||
|
||||
# Current merge policy (658ac1d86 / #46309): curated-first for single
|
||||
# providers — the profile's fallback_models lead the picker, live-only
|
||||
# entries are appended after, and live duplicates of curated entries
|
||||
# are deduped rather than repeated.
|
||||
result = provider_model_ids("nebius-token-factory")
|
||||
assert result[: len(profile.fallback_models)] == list(profile.fallback_models)
|
||||
assert result[len(profile.fallback_models) :] == ["some-brand-new/Live-Only-Model"]
|
||||
|
||||
|
||||
def test_nebius_model_catalog_falls_back_to_profile_models(monkeypatch):
|
||||
from providers import get_provider_profile
|
||||
|
||||
profile = get_provider_profile("nebius-token-factory")
|
||||
assert profile is not None
|
||||
monkeypatch.setattr(
|
||||
"hermes_cli.auth.resolve_api_key_provider_credentials",
|
||||
lambda provider_id: {
|
||||
"provider": provider_id,
|
||||
"api_key": "nebius-live-key",
|
||||
"base_url": "https://api.tokenfactory.nebius.com/v1",
|
||||
"source": "NEBIUS_API_KEY",
|
||||
},
|
||||
)
|
||||
monkeypatch.setattr(profile, "fetch_models", lambda *, api_key=None, base_url=None, timeout=8.0: None)
|
||||
|
||||
assert provider_model_ids("nebius") == list(profile.fallback_models)
|
||||
|
||||
|
||||
def test_nebius_reasoning_models_emit_top_level_reasoning_effort():
|
||||
from providers import get_provider_profile
|
||||
|
||||
profile = get_provider_profile("nebius-token-factory")
|
||||
assert profile is not None
|
||||
|
||||
extra_body, top_level = profile.build_api_kwargs_extras(
|
||||
reasoning_config={"enabled": True, "effort": "xhigh"},
|
||||
model="openai/gpt-oss-120b-fast",
|
||||
)
|
||||
assert extra_body == {}
|
||||
assert top_level == {"reasoning_effort": "high"}
|
||||
|
||||
|
||||
def test_nebius_effort_clamp_is_monotonic():
|
||||
"""Regression: the hand-rolled map sent ultra->medium while xhigh->high,
|
||||
inverting the ladder. The canonical clamp_effort keeps stronger requests
|
||||
at least as strong on the wire (all of xhigh/max/ultra clamp to high)."""
|
||||
from providers import get_provider_profile
|
||||
|
||||
profile = get_provider_profile("nebius-token-factory")
|
||||
assert profile is not None
|
||||
|
||||
def wire(effort):
|
||||
_, top = profile.build_api_kwargs_extras(
|
||||
reasoning_config={"enabled": True, "effort": effort},
|
||||
model="deepseek-ai/DeepSeek-V4-Pro",
|
||||
)
|
||||
return top.get("reasoning_effort")
|
||||
|
||||
assert wire("ultra") == "high"
|
||||
assert wire("max") == "high"
|
||||
assert wire("xhigh") == "high"
|
||||
assert wire("minimal") == "low"
|
||||
|
||||
|
||||
def test_nebius_reasoning_defaults_to_medium_for_known_reasoning_model():
|
||||
from providers import get_provider_profile
|
||||
|
||||
profile = get_provider_profile("nebius-token-factory")
|
||||
assert profile is not None
|
||||
|
||||
extra_body, top_level = profile.build_api_kwargs_extras(
|
||||
reasoning_config=None,
|
||||
model="deepseek-ai/DeepSeek-V4-Pro",
|
||||
)
|
||||
assert extra_body == {}
|
||||
assert top_level == {"reasoning_effort": "medium"}
|
||||
|
||||
|
||||
def test_nebius_reasoning_skips_disabled_and_non_reasoning_models():
|
||||
from providers import get_provider_profile
|
||||
|
||||
profile = get_provider_profile("nebius-token-factory")
|
||||
assert profile is not None
|
||||
|
||||
assert profile.build_api_kwargs_extras(
|
||||
reasoning_config={"enabled": False, "effort": "high"},
|
||||
model="deepseek-ai/DeepSeek-V4-Pro",
|
||||
) == ({}, {})
|
||||
assert profile.build_api_kwargs_extras(
|
||||
reasoning_config={"enabled": True, "effort": "high"},
|
||||
model="meta-llama/Llama-3.3-70B-Instruct",
|
||||
) == ({}, {})
|
||||
|
||||
|
||||
def test_nebius_transport_emits_top_level_reasoning_effort():
|
||||
from agent.transports.chat_completions import ChatCompletionsTransport
|
||||
from providers import get_provider_profile
|
||||
|
||||
profile = get_provider_profile("nebius-token-factory")
|
||||
assert profile is not None
|
||||
|
||||
kwargs = ChatCompletionsTransport().build_kwargs(
|
||||
model="deepseek-ai/DeepSeek-V4-Pro",
|
||||
messages=[{"role": "user", "content": "ping"}],
|
||||
tools=None,
|
||||
provider_profile=profile,
|
||||
reasoning_config={"enabled": True, "effort": "low"},
|
||||
base_url="https://api.tokenfactory.nebius.com/v1",
|
||||
provider_name="nebius-token-factory",
|
||||
)
|
||||
assert kwargs["reasoning_effort"] == "low"
|
||||
assert "extra_body" not in kwargs
|
||||
|
||||
|
||||
def test_nebius_model_normalization_strips_canonical_and_alias_prefixes():
|
||||
model = "Qwen/Qwen3.5-397B-A17B-fast"
|
||||
assert normalize_model_for_provider(
|
||||
f"nebius-token-factory/{model}", "nebius-token-factory"
|
||||
) == model
|
||||
assert normalize_model_for_provider(f"nebius/{model}", "nebius-token-factory") == model
|
||||
assert normalize_model_for_provider(f"nebius/{model}", "nebius") == model
|
||||
assert normalize_model_for_provider(
|
||||
"openai/gpt-oss-120b-fast", "nebius-token-factory"
|
||||
) == "openai/gpt-oss-120b-fast"
|
||||
Reference in New Issue
Block a user