mirror of
https://github.com/Sea-Haven-Industries/open-swe.git
synced 2026-10-07 16:19:09 +00:00
Migrate off direct provider APIs: AWS Bedrock for Anthropic/Claude via the cross-region inference profile us.anthropic.claude-opus-4-8, Fireworks AI for all non-Claude models. Drop OpenAI (gpt-5.5) and Google (gemini-3.5-flash) entirely. DEFAULT_MODEL_ID is now Bedrock Claude; all Fireworks models stay freely selectable for the agent and reviewer graphs and via team/profile defaults. - pyproject: add langchain-aws (ChatBedrockConverse + boto3) - options.py: Bedrock Claude entry + default; remove openai/google entries - model.py: bedrock_converse provider_model_kwargs (effort -> thinking budget), region pin in make_model, bedrock<->fireworks fallback pairing, AWS_REGION/ FIREWORKS_API_KEY local-dev validation - server.py: provider-aware fallback kwargs build - sanitize_thinking_blocks: also sanitize ChatBedrockConverse thinking blocks - model_fallback: treat transient botocore ClientError codes as fallback-worthy - eval_jobs: repoint hardcoded eval model id to Bedrock Claude - tests: repoint dropped model ids; drop obsolete google test module
75 lines
2.5 KiB
Python
75 lines
2.5 KiB
Python
import pytest
|
|
|
|
from agent.dashboard.options import SUPPORTED_MODELS
|
|
from agent.utils.model import (
|
|
fallback_model_id_for,
|
|
fireworks_reasoning_effort_for,
|
|
provider_model_kwargs,
|
|
)
|
|
|
|
|
|
def test_fireworks_reasoning_effort_maps_effort() -> None:
|
|
for effort in ("none", "low", "medium", "high", "xhigh", "max"):
|
|
assert fireworks_reasoning_effort_for(effort) == effort
|
|
assert fireworks_reasoning_effort_for("bogus") is None
|
|
assert fireworks_reasoning_effort_for(None) is None
|
|
|
|
|
|
def test_provider_model_kwargs_for_fireworks() -> None:
|
|
kwargs = provider_model_kwargs(
|
|
"fireworks:accounts/fireworks/models/kimi-k2p7-code",
|
|
"high",
|
|
max_tokens=16_000,
|
|
)
|
|
assert kwargs["max_tokens"] == 16_000
|
|
assert kwargs["model_kwargs"] == {"reasoning_effort": "high"}
|
|
|
|
|
|
def test_kimi_k2p7_is_supported() -> None:
|
|
kimi_k2p7 = next(
|
|
(m for m in SUPPORTED_MODELS if m["id"].endswith("kimi-k2p7-code")),
|
|
None,
|
|
)
|
|
assert kimi_k2p7 is not None
|
|
assert kimi_k2p7["efforts"] == ["low", "medium", "high"]
|
|
assert "none" not in kimi_k2p7["efforts"]
|
|
assert kimi_k2p7["default_effort"] == "high"
|
|
kwargs = provider_model_kwargs(kimi_k2p7["id"], "high", max_tokens=16_000)
|
|
assert kwargs["model_kwargs"] == {"reasoning_effort": "high"}
|
|
|
|
|
|
def test_provider_model_kwargs_for_fireworks_none_disables_reasoning() -> None:
|
|
kwargs = provider_model_kwargs(
|
|
"fireworks:accounts/fireworks/models/deepseek-v4-pro",
|
|
"none",
|
|
max_tokens=16_000,
|
|
)
|
|
assert kwargs["model_kwargs"] == {"reasoning_effort": "none"}
|
|
|
|
|
|
def test_provider_model_kwargs_for_fireworks_unknown_effort_omits_reasoning() -> None:
|
|
kwargs = provider_model_kwargs(
|
|
"fireworks:accounts/fireworks/models/glm-5p1",
|
|
"bogus",
|
|
max_tokens=16_000,
|
|
)
|
|
assert "model_kwargs" not in kwargs
|
|
|
|
|
|
def test_fireworks_falls_back_to_bedrock() -> None:
|
|
assert (
|
|
fallback_model_id_for("fireworks:accounts/fireworks/models/deepseek-v4-pro")
|
|
== "bedrock_converse:us.anthropic.claude-opus-4-8"
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("model_id", "effort"),
|
|
[(m["id"], effort) for m in SUPPORTED_MODELS for effort in m["efforts"]],
|
|
)
|
|
def test_every_supported_effort_translates_to_a_reasoning_kwarg(model_id: str, effort: str) -> None:
|
|
"""Each effort surfaced in the UI must map to a provider reasoning param."""
|
|
kwargs = provider_model_kwargs(model_id, effort, max_tokens=16_000)
|
|
assert set(kwargs) - {"max_tokens"}, (
|
|
f"{model_id} effort {effort!r} did not produce a reasoning kwarg"
|
|
)
|