cai/tests/core/test_llm_api_base.py

123 lines
4.3 KiB
Python

"""Tests for ``cai.util.llm_api_base`` resolution."""
from __future__ import annotations
import pytest
from cai.util import llm_api_base as m
def test_mini_pattern() -> None:
assert m.cai_model_uses_alias_mini_url_pattern("alias2-mini") is True
assert m.cai_model_uses_alias_mini_url_pattern("Alias3.1-MINI") is True
assert m.cai_model_uses_alias_mini_url_pattern("alias1") is False
assert m.cai_model_uses_alias_mini_url_pattern("") is False
@pytest.mark.parametrize(
"model,expect",
[
("alias1", True),
("Alias2-mini", True),
("csi-local", True),
("CAI-test", True),
("openai/gpt-4o", False),
("gpt-4o", False),
("claude-3-5-sonnet", False),
("", False),
],
)
def test_model_qualifies_for_alias_api_url(model: str, expect: bool) -> None:
assert m.model_qualifies_for_alias_api_url(model) is expect
@pytest.mark.parametrize(
"model,csi_url,alias_url,openai_base,expect_substr",
[
(
"alias1",
"https://csi.example/v1",
"https://mini.example/v1",
"https://custom.example/",
"csi.example",
),
("alias1", "", "https://mini.example/v1", "https://custom.example/", "mini.example"),
("alias2-mini", "http://127.0.0.1:9999", "", "", "127.0.0.1:9999"),
("cai-dev", "", "https://cai-gw.example/", "https://ignored.example/", "cai-gw.example"),
(
"gpt-4o",
"https://ignored-csi.example/",
"https://ignored-alias.example/",
"https://openai-compat.example/",
"openai-compat.example",
),
(
"gpt-4o",
"https://csi-ignored.example/",
"https://alias-ignored.example/",
"",
"aliasrobotics.com",
),
("alias1", "", "", "https://custom.example/", "custom.example"),
("gpt-4o", "", "", "", "aliasrobotics.com"),
],
)
def test_resolve_base(
monkeypatch: pytest.MonkeyPatch,
model: str,
csi_url: str,
alias_url: str,
openai_base: str,
expect_substr: str,
) -> None:
monkeypatch.setenv("CAI_MODEL", model)
if csi_url:
monkeypatch.setenv("CSI_CUSTOM_ENDPOINT", csi_url)
else:
monkeypatch.delenv("CSI_CUSTOM_ENDPOINT", raising=False)
if alias_url:
monkeypatch.setenv("ALIAS_API_URL", alias_url)
else:
monkeypatch.delenv("ALIAS_API_URL", raising=False)
if openai_base:
monkeypatch.setenv("OPENAI_API_BASE", openai_base)
else:
monkeypatch.delenv("OPENAI_API_BASE", raising=False)
out = m.resolve_llm_openai_compatible_base(model)
assert expect_substr in out
def test_explicit_custom_alias_model_and_url(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.delenv("CSI_CUSTOM_ENDPOINT", raising=False)
monkeypatch.setenv("ALIAS_API_URL", "https://x/")
assert m.explicit_custom_llm_api_base_configured("alias1") is True
def test_explicit_custom_csi_only(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setenv("CSI_CUSTOM_ENDPOINT", "https://csi-only.example/")
monkeypatch.delenv("ALIAS_API_URL", raising=False)
monkeypatch.delenv("OPENAI_API_BASE", raising=False)
assert m.explicit_custom_llm_api_base_configured("alias1") is True
def test_explicit_custom_non_alias_model_alias_url_only(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setenv("ALIAS_API_URL", "https://x/")
monkeypatch.setenv("CSI_CUSTOM_ENDPOINT", "https://csi.example/")
monkeypatch.delenv("OPENAI_API_BASE", raising=False)
assert m.explicit_custom_llm_api_base_configured("gpt-4o") is False
def test_explicit_custom_openai_only(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.delenv("ALIAS_API_URL", raising=False)
monkeypatch.delenv("CSI_CUSTOM_ENDPOINT", raising=False)
monkeypatch.setenv("OPENAI_API_BASE", "https://y/")
assert m.explicit_custom_llm_api_base_configured("gpt-4o") is True
def test_no_explicit_custom_default(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setenv("CAI_MODEL", "alias3-mini")
monkeypatch.delenv("ALIAS_API_URL", raising=False)
monkeypatch.delenv("CSI_CUSTOM_ENDPOINT", raising=False)
monkeypatch.delenv("OPENAI_API_BASE", raising=False)
assert m.explicit_custom_llm_api_base_configured("alias1") is False