refactor(llm): route all tiers via OpenRouter, drop Anthropic SDK

Tutti i tier (S/A/B/C/D) ora passano per OpenRouter via OpenAI SDK.
Modelli Anthropic raggiungibili via prefisso `anthropic/...`.

- pyproject: rimosso `anthropic>=0.39` da deps + uv.lock
- config: rimosso `anthropic_api_key` field
- LLMClient: dispatch unico, single client OpenAI con base_url OpenRouter
- defaults S/A/B → `anthropic/claude-{opus-4-7,sonnet-4-6}`
- retry exceptions: solo openai.* (drop anthropic.*)
- test rinominati e adattati: tier S/A/B mockano OpenAI con prefisso `anthropic/`
- rimosso test `tier_S_without_anthropic_key_raises` (non più rilevante)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-10 09:39:23 +02:00
parent 70b8bc3d6c
commit 4dad8be36b
8 changed files with 84 additions and 177 deletions
+6 -7
View File
@@ -4,17 +4,16 @@ CERBERO_TESTNET_TOKEN=
CERBERO_MAINNET_TOKEN= CERBERO_MAINNET_TOKEN=
CERBERO_BOT_TAG=swarm-poc-phase1 CERBERO_BOT_TAG=swarm-poc-phase1
# LLM providers # LLM provider (single endpoint via OpenRouter — supports anthropic/openai/qwen/llama models)
OPENROUTER_API_KEY= OPENROUTER_API_KEY=
ANTHROPIC_API_KEY= OPENROUTER_BASE_URL=https://openrouter.ai/api/v1
# LLM models (override Phase 1 defaults if needed) # Models per tier (override Phase 1 defaults if needed)
LLM_MODEL_TIER_S=claude-opus-4-7 LLM_MODEL_TIER_S=anthropic/claude-opus-4-7
LLM_MODEL_TIER_A=claude-sonnet-4-6 LLM_MODEL_TIER_A=anthropic/claude-sonnet-4-6
LLM_MODEL_TIER_B=claude-sonnet-4-6 LLM_MODEL_TIER_B=anthropic/claude-sonnet-4-6
LLM_MODEL_TIER_C=qwen/qwen-2.5-72b-instruct LLM_MODEL_TIER_C=qwen/qwen-2.5-72b-instruct
LLM_MODEL_TIER_D=meta-llama/llama-3.3-70b-instruct LLM_MODEL_TIER_D=meta-llama/llama-3.3-70b-instruct
OPENROUTER_BASE_URL=https://openrouter.ai/api/v1
# Run config # Run config
RUN_NAME=phase1-spike-001 RUN_NAME=phase1-spike-001
-1
View File
@@ -13,7 +13,6 @@ dependencies = [
"pydantic-settings>=2.6", "pydantic-settings>=2.6",
"sqlmodel>=0.0.22", "sqlmodel>=0.0.22",
"sexpdata>=1.0.2", "sexpdata>=1.0.2",
"anthropic>=0.39",
"openai>=1.55", "openai>=1.55",
"httpx>=0.28", "httpx>=0.28",
"requests>=2.32", "requests>=2.32",
-4
View File
@@ -44,10 +44,6 @@ def main() -> None:
llm = LLMClient( llm = LLMClient(
openrouter_api_key=settings.openrouter_api_key.get_secret_value(), openrouter_api_key=settings.openrouter_api_key.get_secret_value(),
anthropic_api_key=(
settings.anthropic_api_key.get_secret_value()
if settings.anthropic_api_key else None
),
model_tier_s=settings.llm_model_tier_s, model_tier_s=settings.llm_model_tier_s,
model_tier_a=settings.llm_model_tier_a, model_tier_a=settings.llm_model_tier_a,
model_tier_b=settings.llm_model_tier_b, model_tier_b=settings.llm_model_tier_b,
+3 -4
View File
@@ -24,11 +24,10 @@ class Settings(BaseSettings):
cerbero_bot_tag: str = "swarm-poc-phase1" cerbero_bot_tag: str = "swarm-poc-phase1"
openrouter_api_key: SecretStr openrouter_api_key: SecretStr
anthropic_api_key: SecretStr | None = None
llm_model_tier_s: str = "claude-opus-4-7" llm_model_tier_s: str = "anthropic/claude-opus-4-7"
llm_model_tier_a: str = "claude-sonnet-4-6" llm_model_tier_a: str = "anthropic/claude-sonnet-4-6"
llm_model_tier_b: str = "claude-sonnet-4-6" llm_model_tier_b: str = "anthropic/claude-sonnet-4-6"
llm_model_tier_c: str = "qwen/qwen-2.5-72b-instruct" llm_model_tier_c: str = "qwen/qwen-2.5-72b-instruct"
llm_model_tier_d: str = "meta-llama/llama-3.3-70b-instruct" llm_model_tier_d: str = "meta-llama/llama-3.3-70b-instruct"
openrouter_base_url: str = "https://openrouter.ai/api/v1" openrouter_base_url: str = "https://openrouter.ai/api/v1"
+8 -59
View File
@@ -2,9 +2,7 @@ from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
import anthropic
import openai import openai
from anthropic import Anthropic
from openai import OpenAI from openai import OpenAI
from tenacity import ( from tenacity import (
retry, retry,
@@ -15,12 +13,12 @@ from tenacity import (
from ..genome.hypothesis import HypothesisAgentGenome, ModelTier from ..genome.hypothesis import HypothesisAgentGenome, ModelTier
# Modelli configurati per Phase 1 # Modelli configurati per Phase 1 — tutti via OpenRouter
MODEL_TIER_S = "claude-opus-4-7" # via Anthropic MODEL_TIER_S = "anthropic/claude-opus-4-7"
MODEL_TIER_A = "claude-sonnet-4-6" # via Anthropic (premium override) MODEL_TIER_A = "anthropic/claude-sonnet-4-6"
MODEL_TIER_B = "claude-sonnet-4-6" # via Anthropic MODEL_TIER_B = "anthropic/claude-sonnet-4-6"
MODEL_TIER_C = "qwen/qwen-2.5-72b-instruct" # via OpenRouter MODEL_TIER_C = "qwen/qwen-2.5-72b-instruct"
MODEL_TIER_D = "meta-llama/llama-3.3-70b-instruct" # via OpenRouter MODEL_TIER_D = "meta-llama/llama-3.3-70b-instruct"
OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1" OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1"
# Errori transient: retry. RateLimit/Auth/InvalidRequest: NO retry. # Errori transient: retry. RateLimit/Auth/InvalidRequest: NO retry.
@@ -28,9 +26,6 @@ _RETRYABLE_EXCEPTIONS: tuple[type[BaseException], ...] = (
openai.APIConnectionError, openai.APIConnectionError,
openai.APITimeoutError, openai.APITimeoutError,
openai.InternalServerError, openai.InternalServerError,
anthropic.APIConnectionError,
anthropic.APITimeoutError,
anthropic.InternalServerError,
) )
@@ -44,13 +39,9 @@ class CompletionResult:
class LLMClient: class LLMClient:
_ANTHROPIC_TIERS: tuple[ModelTier, ...] = (ModelTier.S, ModelTier.A, ModelTier.B)
_OPENROUTER_TIERS: tuple[ModelTier, ...] = (ModelTier.C, ModelTier.D)
def __init__( def __init__(
self, self,
openrouter_api_key: str, openrouter_api_key: str,
anthropic_api_key: str | None = None,
model_tier_s: str = MODEL_TIER_S, model_tier_s: str = MODEL_TIER_S,
model_tier_a: str = MODEL_TIER_A, model_tier_a: str = MODEL_TIER_A,
model_tier_b: str = MODEL_TIER_B, model_tier_b: str = MODEL_TIER_B,
@@ -71,8 +62,7 @@ class LLMClient:
ModelTier.C: model_tier_c, ModelTier.C: model_tier_c,
ModelTier.D: model_tier_d, ModelTier.D: model_tier_d,
} }
self._openrouter = OpenAI(api_key=openrouter_api_key, base_url=openrouter_base_url) self._client = OpenAI(api_key=openrouter_api_key, base_url=openrouter_base_url)
self._anthropic = Anthropic(api_key=anthropic_api_key) if anthropic_api_key else None
@retry( @retry(
stop=stop_after_attempt(3), stop=stop_after_attempt(3),
@@ -88,19 +78,7 @@ class LLMClient:
max_tokens: int = 2000, max_tokens: int = 2000,
) -> CompletionResult: ) -> CompletionResult:
model = self._tier_models[genome.model_tier] model = self._tier_models[genome.model_tier]
if genome.model_tier in self._ANTHROPIC_TIERS: resp = self._client.chat.completions.create(
return self._call_anthropic(genome, system, user, max_tokens, model)
return self._call_openrouter(genome, system, user, max_tokens, model)
def _call_openrouter(
self,
genome: HypothesisAgentGenome,
system: str,
user: str,
max_tokens: int,
model: str,
) -> CompletionResult:
resp = self._openrouter.chat.completions.create(
model=model, model=model,
messages=[ messages=[
{"role": "system", "content": system}, {"role": "system", "content": system},
@@ -119,32 +97,3 @@ class LLMClient:
tier=genome.model_tier, tier=genome.model_tier,
model=model, model=model,
) )
def _call_anthropic(
self,
genome: HypothesisAgentGenome,
system: str,
user: str,
max_tokens: int,
model: str,
) -> CompletionResult:
if self._anthropic is None:
raise RuntimeError(
f"ANTHROPIC_API_KEY required for tier {genome.model_tier.value} genomes"
)
msg = self._anthropic.messages.create(
model=model,
system=system,
messages=[{"role": "user", "content": user}],
temperature=genome.temperature,
top_p=genome.top_p,
max_tokens=max_tokens,
)
text = "".join(block.text for block in msg.content if hasattr(block, "text"))
return CompletionResult(
text=text,
input_tokens=msg.usage.input_tokens,
output_tokens=msg.usage.output_tokens,
tier=genome.model_tier,
model=model,
)
+3 -4
View File
@@ -19,7 +19,6 @@ def test_settings_loads_from_env(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setenv("CERBERO_MAINNET_TOKEN", "tok-main") monkeypatch.setenv("CERBERO_MAINNET_TOKEN", "tok-main")
monkeypatch.setenv("CERBERO_BOT_TAG", "swarm-poc-phase1") monkeypatch.setenv("CERBERO_BOT_TAG", "swarm-poc-phase1")
monkeypatch.setenv("OPENROUTER_API_KEY", "or-key") monkeypatch.setenv("OPENROUTER_API_KEY", "or-key")
monkeypatch.setenv("ANTHROPIC_API_KEY", "an-key")
monkeypatch.setenv("RUN_NAME", "test-run") monkeypatch.setenv("RUN_NAME", "test-run")
s = Settings() # type: ignore[call-arg] s = Settings() # type: ignore[call-arg]
@@ -74,9 +73,9 @@ def test_settings_llm_model_defaults(monkeypatch: pytest.MonkeyPatch) -> None:
s = Settings(_env_file=None) # type: ignore[call-arg] s = Settings(_env_file=None) # type: ignore[call-arg]
assert s.llm_model_tier_s == "claude-opus-4-7" assert s.llm_model_tier_s == "anthropic/claude-opus-4-7"
assert s.llm_model_tier_a == "claude-sonnet-4-6" assert s.llm_model_tier_a == "anthropic/claude-sonnet-4-6"
assert s.llm_model_tier_b == "claude-sonnet-4-6" assert s.llm_model_tier_b == "anthropic/claude-sonnet-4-6"
assert s.llm_model_tier_c == "qwen/qwen-2.5-72b-instruct" assert s.llm_model_tier_c == "qwen/qwen-2.5-72b-instruct"
assert s.llm_model_tier_d == "meta-llama/llama-3.3-70b-instruct" assert s.llm_model_tier_d == "meta-llama/llama-3.3-70b-instruct"
assert s.openrouter_base_url == "https://openrouter.ai/api/v1" assert s.openrouter_base_url == "https://openrouter.ai/api/v1"
+64 -68
View File
@@ -25,7 +25,7 @@ def test_completion_tier_c_uses_openrouter(mocker):
mocker.patch("multi_swarm.llm.client.OpenAI", return_value=fake_openai) mocker.patch("multi_swarm.llm.client.OpenAI", return_value=fake_openai)
client = LLMClient(openrouter_api_key="or-x", anthropic_api_key=None) client = LLMClient(openrouter_api_key="or-x")
g = make_genome(ModelTier.C) g = make_genome(ModelTier.C)
out = client.complete(g, system="sys", user="usr") out = client.complete(g, system="sys", user="usr")
@@ -37,15 +37,15 @@ def test_completion_tier_c_uses_openrouter(mocker):
fake_openai.chat.completions.create.assert_called_once() fake_openai.chat.completions.create.assert_called_once()
def test_completion_tier_b_uses_anthropic(mocker): def test_completion_tier_b_uses_openrouter_with_anthropic_model(mocker):
fake_anthropic = mocker.MagicMock() fake_openai = mocker.MagicMock()
fake_msg = mocker.MagicMock() fake_response = mocker.MagicMock()
fake_msg.content = [mocker.MagicMock(text="(strategy ...)")] fake_response.choices = [mocker.MagicMock(message=mocker.MagicMock(content="(strategy ...)"))]
fake_msg.usage = mocker.MagicMock(input_tokens=80, output_tokens=150) fake_response.usage = mocker.MagicMock(prompt_tokens=80, completion_tokens=150)
fake_anthropic.messages.create.return_value = fake_msg fake_openai.chat.completions.create.return_value = fake_response
mocker.patch("multi_swarm.llm.client.Anthropic", return_value=fake_anthropic) mocker.patch("multi_swarm.llm.client.OpenAI", return_value=fake_openai)
client = LLMClient(openrouter_api_key="or-x", anthropic_api_key="an-x") client = LLMClient(openrouter_api_key="or-x")
g = make_genome(ModelTier.B) g = make_genome(ModelTier.B)
out = client.complete(g, system="sys", user="usr") out = client.complete(g, system="sys", user="usr")
@@ -53,6 +53,9 @@ def test_completion_tier_b_uses_anthropic(mocker):
assert out.input_tokens == 80 assert out.input_tokens == 80
assert out.output_tokens == 150 assert out.output_tokens == 150
assert out.tier == ModelTier.B assert out.tier == ModelTier.B
call_kwargs = fake_openai.chat.completions.create.call_args.kwargs
assert call_kwargs["model"] == "anthropic/claude-sonnet-4-6"
assert out.model == "anthropic/claude-sonnet-4-6"
@pytest.mark.slow @pytest.mark.slow
@@ -66,7 +69,7 @@ def test_completion_retries_on_connection_error(mocker):
) )
mocker.patch("multi_swarm.llm.client.OpenAI", return_value=fake_openai) mocker.patch("multi_swarm.llm.client.OpenAI", return_value=fake_openai)
client = LLMClient(openrouter_api_key="or-x", anthropic_api_key=None) client = LLMClient(openrouter_api_key="or-x")
g = make_genome(ModelTier.C) g = make_genome(ModelTier.C)
with pytest.raises(openai.APIConnectionError): with pytest.raises(openai.APIConnectionError):
@@ -87,7 +90,6 @@ def test_completion_uses_custom_model_tier_c(mocker):
client = LLMClient( client = LLMClient(
openrouter_api_key="or-x", openrouter_api_key="or-x",
anthropic_api_key=None,
model_tier_c="deepseek/deepseek-chat", model_tier_c="deepseek/deepseek-chat",
) )
g = make_genome(ModelTier.C) g = make_genome(ModelTier.C)
@@ -100,63 +102,64 @@ def test_completion_uses_custom_model_tier_c(mocker):
def test_completion_uses_custom_model_tier_b(mocker): def test_completion_uses_custom_model_tier_b(mocker):
fake_anthropic = mocker.MagicMock() fake_openai = mocker.MagicMock()
fake_msg = mocker.MagicMock() fake_response = mocker.MagicMock()
fake_msg.content = [mocker.MagicMock(text="(strategy ...)")] fake_response.choices = [
fake_msg.usage = mocker.MagicMock(input_tokens=10, output_tokens=20) mocker.MagicMock(message=mocker.MagicMock(content="(strategy ...)"))
fake_anthropic.messages.create.return_value = fake_msg ]
mocker.patch("multi_swarm.llm.client.Anthropic", return_value=fake_anthropic) fake_response.usage = mocker.MagicMock(prompt_tokens=10, completion_tokens=20)
fake_openai.chat.completions.create.return_value = fake_response
mocker.patch("multi_swarm.llm.client.OpenAI", return_value=fake_openai)
client = LLMClient( client = LLMClient(
openrouter_api_key="or-x", openrouter_api_key="or-x",
anthropic_api_key="an-x", model_tier_b="anthropic/claude-opus-4-7",
model_tier_b="claude-opus-4-7",
) )
g = make_genome(ModelTier.B) g = make_genome(ModelTier.B)
out = client.complete(g, system="sys", user="usr") out = client.complete(g, system="sys", user="usr")
fake_anthropic.messages.create.assert_called_once() fake_openai.chat.completions.create.assert_called_once()
call_kwargs = fake_anthropic.messages.create.call_args.kwargs call_kwargs = fake_openai.chat.completions.create.call_args.kwargs
assert call_kwargs["model"] == "claude-opus-4-7" assert call_kwargs["model"] == "anthropic/claude-opus-4-7"
assert out.model == "claude-opus-4-7" assert out.model == "anthropic/claude-opus-4-7"
def test_completion_tier_s_uses_anthropic_with_opus(mocker): def test_completion_tier_s_uses_openrouter_with_anthropic_model(mocker):
fake_anthropic = mocker.MagicMock() fake_openai = mocker.MagicMock()
fake_msg = mocker.MagicMock() fake_response = mocker.MagicMock()
fake_msg.content = [mocker.MagicMock(text="(strategy s)")] fake_response.choices = [mocker.MagicMock(message=mocker.MagicMock(content="(strategy s)"))]
fake_msg.usage = mocker.MagicMock(input_tokens=50, output_tokens=100) fake_response.usage = mocker.MagicMock(prompt_tokens=50, completion_tokens=100)
fake_anthropic.messages.create.return_value = fake_msg fake_openai.chat.completions.create.return_value = fake_response
mocker.patch("multi_swarm.llm.client.Anthropic", return_value=fake_anthropic) mocker.patch("multi_swarm.llm.client.OpenAI", return_value=fake_openai)
client = LLMClient(openrouter_api_key="or-x", anthropic_api_key="an-x") client = LLMClient(openrouter_api_key="or-x")
g = make_genome(ModelTier.S) g = make_genome(ModelTier.S)
out = client.complete(g, system="sys", user="usr") out = client.complete(g, system="sys", user="usr")
fake_anthropic.messages.create.assert_called_once() fake_openai.chat.completions.create.assert_called_once()
call_kwargs = fake_anthropic.messages.create.call_args.kwargs call_kwargs = fake_openai.chat.completions.create.call_args.kwargs
assert call_kwargs["model"] == "claude-opus-4-7" assert call_kwargs["model"] == "anthropic/claude-opus-4-7"
assert out.tier == ModelTier.S assert out.tier == ModelTier.S
assert out.model == "claude-opus-4-7" assert out.model == "anthropic/claude-opus-4-7"
def test_completion_tier_a_uses_anthropic_with_sonnet(mocker): def test_completion_tier_a_uses_openrouter_with_anthropic_model(mocker):
fake_anthropic = mocker.MagicMock() fake_openai = mocker.MagicMock()
fake_msg = mocker.MagicMock() fake_response = mocker.MagicMock()
fake_msg.content = [mocker.MagicMock(text="(strategy a)")] fake_response.choices = [mocker.MagicMock(message=mocker.MagicMock(content="(strategy a)"))]
fake_msg.usage = mocker.MagicMock(input_tokens=40, output_tokens=80) fake_response.usage = mocker.MagicMock(prompt_tokens=40, completion_tokens=80)
fake_anthropic.messages.create.return_value = fake_msg fake_openai.chat.completions.create.return_value = fake_response
mocker.patch("multi_swarm.llm.client.Anthropic", return_value=fake_anthropic) mocker.patch("multi_swarm.llm.client.OpenAI", return_value=fake_openai)
client = LLMClient(openrouter_api_key="or-x", anthropic_api_key="an-x") client = LLMClient(openrouter_api_key="or-x")
g = make_genome(ModelTier.A) g = make_genome(ModelTier.A)
out = client.complete(g, system="sys", user="usr") out = client.complete(g, system="sys", user="usr")
fake_anthropic.messages.create.assert_called_once() fake_openai.chat.completions.create.assert_called_once()
call_kwargs = fake_anthropic.messages.create.call_args.kwargs call_kwargs = fake_openai.chat.completions.create.call_args.kwargs
assert call_kwargs["model"] == "claude-sonnet-4-6" assert call_kwargs["model"] == "anthropic/claude-sonnet-4-6"
assert out.tier == ModelTier.A assert out.tier == ModelTier.A
assert out.model == "claude-sonnet-4-6" assert out.model == "anthropic/claude-sonnet-4-6"
def test_completion_tier_d_uses_openrouter_with_llama(mocker): def test_completion_tier_d_uses_openrouter_with_llama(mocker):
@@ -169,7 +172,7 @@ def test_completion_tier_d_uses_openrouter_with_llama(mocker):
fake_openai.chat.completions.create.return_value = fake_response fake_openai.chat.completions.create.return_value = fake_response
mocker.patch("multi_swarm.llm.client.OpenAI", return_value=fake_openai) mocker.patch("multi_swarm.llm.client.OpenAI", return_value=fake_openai)
client = LLMClient(openrouter_api_key="or-x", anthropic_api_key=None) client = LLMClient(openrouter_api_key="or-x")
g = make_genome(ModelTier.D) g = make_genome(ModelTier.D)
out = client.complete(g, system="sys", user="usr") out = client.complete(g, system="sys", user="usr")
@@ -181,32 +184,25 @@ def test_completion_tier_d_uses_openrouter_with_llama(mocker):
def test_completion_uses_custom_model_tier_s(mocker): def test_completion_uses_custom_model_tier_s(mocker):
fake_anthropic = mocker.MagicMock() fake_openai = mocker.MagicMock()
fake_msg = mocker.MagicMock() fake_response = mocker.MagicMock()
fake_msg.content = [mocker.MagicMock(text="(strategy custom-s)")] fake_response.choices = [
fake_msg.usage = mocker.MagicMock(input_tokens=10, output_tokens=20) mocker.MagicMock(message=mocker.MagicMock(content="(strategy custom-s)"))
fake_anthropic.messages.create.return_value = fake_msg ]
mocker.patch("multi_swarm.llm.client.Anthropic", return_value=fake_anthropic) fake_response.usage = mocker.MagicMock(prompt_tokens=10, completion_tokens=20)
fake_openai.chat.completions.create.return_value = fake_response
mocker.patch("multi_swarm.llm.client.OpenAI", return_value=fake_openai)
client = LLMClient( client = LLMClient(
openrouter_api_key="or-x", openrouter_api_key="or-x",
anthropic_api_key="an-x", model_tier_s="anthropic/claude-future-mega",
model_tier_s="claude-future-mega",
) )
g = make_genome(ModelTier.S) g = make_genome(ModelTier.S)
out = client.complete(g, system="sys", user="usr") out = client.complete(g, system="sys", user="usr")
call_kwargs = fake_anthropic.messages.create.call_args.kwargs call_kwargs = fake_openai.chat.completions.create.call_args.kwargs
assert call_kwargs["model"] == "claude-future-mega" assert call_kwargs["model"] == "anthropic/claude-future-mega"
assert out.model == "claude-future-mega" assert out.model == "anthropic/claude-future-mega"
def test_completion_tier_s_without_anthropic_key_raises(mocker):
mocker.patch("multi_swarm.llm.client.OpenAI", return_value=mocker.MagicMock())
client = LLMClient(openrouter_api_key="or-x", anthropic_api_key=None)
g = make_genome(ModelTier.S)
with pytest.raises(RuntimeError, match="tier S"):
client.complete(g, system="sys", user="usr")
@pytest.mark.slow @pytest.mark.slow
@@ -227,7 +223,7 @@ def test_completion_succeeds_after_one_retry(mocker):
] ]
mocker.patch("multi_swarm.llm.client.OpenAI", return_value=fake_openai) mocker.patch("multi_swarm.llm.client.OpenAI", return_value=fake_openai)
client = LLMClient(openrouter_api_key="or-x", anthropic_api_key=None) client = LLMClient(openrouter_api_key="or-x")
g = make_genome(ModelTier.C) g = make_genome(ModelTier.C)
out = client.complete(g, system="sys", user="usr") out = client.complete(g, system="sys", user="usr")
Generated
-30
View File
@@ -139,25 +139,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" },
] ]
[[package]]
name = "anthropic"
version = "0.100.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
{ name = "distro" },
{ name = "docstring-parser" },
{ name = "httpx" },
{ name = "jiter" },
{ name = "pydantic" },
{ name = "sniffio" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/9c/2d/24caf0ff727cba2ed863925017c8f93463a2ea6224a0efe5626e672bc3d2/anthropic-0.100.0.tar.gz", hash = "sha256:650dee9e023afb16395939ee4104bbc21f966b380210119fb91122c12099c79a", size = 758255, upload-time = "2026-05-06T15:07:13.578Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/5d/a0/c775c59ab9445ecabb57ef3d5c24027de060139189a9e312ef9ef889a665/anthropic-0.100.0-py3-none-any.whl", hash = "sha256:1c15769efa15d8fd5c1ebf900e25c57e3ee540f8554a29aa56e4edefffe2951d", size = 753596, upload-time = "2026-05-06T15:07:12.106Z" },
]
[[package]] [[package]]
name = "anyio" name = "anyio"
version = "4.13.0" version = "4.13.0"
@@ -467,15 +448,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" },
] ]
[[package]]
name = "docstring-parser"
version = "0.18.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/e0/4d/f332313098c1de1b2d2ff91cf2674415cc7cddab2ca1b01ae29774bd5fdf/docstring_parser-0.18.0.tar.gz", hash = "sha256:292510982205c12b1248696f44959db3cdd1740237a968ea1e2e7a900eeb2015", size = 29341, upload-time = "2026-04-14T04:09:19.867Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a7/5f/ed01f9a3cdffbd5a008556fc7b2a08ddb1cc6ace7effa7340604b1d16699/docstring_parser-0.18.0-py3-none-any.whl", hash = "sha256:b3fcbed555c47d8479be0796ef7e19c2670d428d72e96da63f3a40122860374b", size = 22484, upload-time = "2026-04-14T04:09:18.638Z" },
]
[[package]] [[package]]
name = "frozenlist" name = "frozenlist"
version = "1.8.0" version = "1.8.0"
@@ -887,7 +859,6 @@ name = "multi-swarm"
version = "0.1.0" version = "0.1.0"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "anthropic" },
{ name = "ccxt" }, { name = "ccxt" },
{ name = "httpx" }, { name = "httpx" },
{ name = "numpy" }, { name = "numpy" },
@@ -919,7 +890,6 @@ dev = [
[package.metadata] [package.metadata]
requires-dist = [ requires-dist = [
{ name = "anthropic", specifier = ">=0.39" },
{ name = "ccxt", specifier = ">=4.4" }, { name = "ccxt", specifier = ">=4.4" },
{ name = "httpx", specifier = ">=0.28" }, { name = "httpx", specifier = ">=0.28" },
{ name = "numpy", specifier = ">=2.1" }, { name = "numpy", specifier = ">=2.1" },