test_openclaw_model_auth.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. from __future__ import annotations
  2. import pytest
  3. from agency_swarm.integrations import openclaw as openclaw_mod
  4. from agency_swarm.integrations.openclaw import build_openclaw_responses_model
  5. from agency_swarm.utils.model_utils import get_default_settings_model_name, get_usage_tracking_model_name
  6. from tests.integration.fastapi._openclaw_test_support import reset_openclaw_current_app_defaults
  7. def test_build_openclaw_responses_model_uses_app_token_when_proxy_key_is_missing(
  8. monkeypatch: pytest.MonkeyPatch,
  9. ) -> None:
  10. monkeypatch.delenv("OPENCLAW_PROXY_API_KEY", raising=False)
  11. monkeypatch.setenv("APP_TOKEN", "app-token")
  12. model = build_openclaw_responses_model()
  13. assert model._client.api_key == "app-token"
  14. def test_build_openclaw_responses_model_prefers_app_token_over_proxy_key_for_current_app_proxy(
  15. monkeypatch: pytest.MonkeyPatch,
  16. ) -> None:
  17. monkeypatch.setenv("OPENCLAW_PROXY_API_KEY", "proxy-token")
  18. monkeypatch.setenv("APP_TOKEN", "app-token")
  19. model = build_openclaw_responses_model()
  20. assert model._client.api_key == "app-token"
  21. def test_build_openclaw_responses_model_prefers_openclaw_proxy_key_for_external_proxy_urls(
  22. monkeypatch: pytest.MonkeyPatch,
  23. ) -> None:
  24. monkeypatch.setenv("OPENCLAW_PROXY_API_KEY", "proxy-token")
  25. monkeypatch.setenv("APP_TOKEN", "app-token")
  26. model = build_openclaw_responses_model(base_url="https://example.com/openclaw/v1")
  27. assert model._client.api_key == "proxy-token"
  28. def test_build_openclaw_responses_model_uses_gateway_token_when_proxy_and_app_tokens_are_missing(
  29. monkeypatch: pytest.MonkeyPatch,
  30. ) -> None:
  31. monkeypatch.delenv("OPENCLAW_PROXY_API_KEY", raising=False)
  32. monkeypatch.delenv("APP_TOKEN", raising=False)
  33. monkeypatch.setenv("OPENCLAW_GATEWAY_TOKEN", "gateway-token")
  34. model = build_openclaw_responses_model()
  35. assert model._client.api_key == "gateway-token"
  36. def test_build_openclaw_responses_model_uses_gateway_token_before_app_token_for_direct_gateway_urls(
  37. monkeypatch: pytest.MonkeyPatch,
  38. ) -> None:
  39. monkeypatch.setenv("OPENCLAW_PROXY_API_KEY", "proxy-token")
  40. monkeypatch.setenv("APP_TOKEN", "app-token")
  41. monkeypatch.setenv("OPENCLAW_GATEWAY_TOKEN", "gateway-token")
  42. model = build_openclaw_responses_model(base_url="http://127.0.0.1:18789/v1")
  43. assert model._client.api_key == "gateway-token"
  44. def test_build_openclaw_responses_model_uses_openclaw_default_model_env_when_model_unspecified(
  45. monkeypatch: pytest.MonkeyPatch,
  46. ) -> None:
  47. monkeypatch.delenv("OPENCLAW_PROXY_BASE_URL", raising=False)
  48. monkeypatch.delenv("OPENCLAW_PROXY_HOST", raising=False)
  49. monkeypatch.delenv("OPENCLAW_PROXY_PORT", raising=False)
  50. monkeypatch.delenv("PORT", raising=False)
  51. monkeypatch.setenv("OPENCLAW_DEFAULT_MODEL", "openclaw:beta")
  52. reset_openclaw_current_app_defaults(monkeypatch)
  53. model = build_openclaw_responses_model()
  54. assert model.model == "openclaw:beta"
  55. def test_build_openclaw_responses_model_ignores_openclaw_alias_defaults_for_direct_gateway_urls(
  56. monkeypatch: pytest.MonkeyPatch,
  57. ) -> None:
  58. monkeypatch.setenv("OPENCLAW_DEFAULT_MODEL", "openclaw:main")
  59. monkeypatch.setenv("OPENCLAW_PROVIDER_MODEL", "anthropic/claude-sonnet-4-5")
  60. model = build_openclaw_responses_model(base_url="http://127.0.0.1:18789/v1", api_key="external-token")
  61. assert model.model == "anthropic/claude-sonnet-4-5"
  62. def test_build_openclaw_responses_model_defaults_external_v1_to_provider_model(
  63. monkeypatch: pytest.MonkeyPatch,
  64. ) -> None:
  65. monkeypatch.setenv("OPENCLAW_PROVIDER_MODEL", "anthropic/claude-sonnet-4-5")
  66. model = build_openclaw_responses_model(base_url="http://127.0.0.1:18789/v1", api_key="external-token")
  67. assert model.model == "anthropic/claude-sonnet-4-5"
  68. def test_build_openclaw_responses_model_preserves_openclaw_aliases_for_direct_gateway_urls() -> None:
  69. model = build_openclaw_responses_model(
  70. model="openclaw:custom",
  71. base_url="http://127.0.0.1:18789/v1",
  72. api_key="external-token",
  73. )
  74. assert model.model == "openclaw:custom"
  75. assert get_usage_tracking_model_name(model) == "openclaw:custom"
  76. assert get_default_settings_model_name(model) == "openclaw:custom"
  77. def test_build_openclaw_responses_model_preserves_explicit_nondefault_alias_metadata_for_current_app_proxy(
  78. monkeypatch: pytest.MonkeyPatch,
  79. ) -> None:
  80. reset_openclaw_current_app_defaults(monkeypatch)
  81. openclaw_mod.openclaw_model.register_current_app_openclaw_defaults(
  82. default_model="openclaw:main",
  83. provider_model="openai/gpt-5.4-mini",
  84. base_url="https://app.example/openclaw/v1",
  85. )
  86. model = build_openclaw_responses_model(
  87. model="openclaw:alt",
  88. base_url="https://app.example/openclaw/v1",
  89. api_key="app-token",
  90. )
  91. assert model.model == "openclaw:alt"
  92. assert get_usage_tracking_model_name(model) == "openclaw:alt"
  93. assert get_default_settings_model_name(model) == "openclaw:alt"