Rebase onto upstream (a4d95fd)
#12
@@ -1,7 +1,45 @@
|
|||||||
"""LLM provider abstraction module."""
|
"""Provider module exports."""
|
||||||
|
|
||||||
from nanobot.providers.base import LLMProvider, LLMResponse
|
from nanobot.providers.base import LLMProvider, LLMResponse, ToolCallRequest
|
||||||
from nanobot.providers.litellm_provider import LiteLLMProvider
|
from nanobot.providers.litellm_provider import LiteLLMProvider
|
||||||
from nanobot.providers.openai_codex_provider import OpenAICodexProvider
|
from nanobot.providers.openai_codex_provider import OpenAICodexProvider
|
||||||
|
from nanobot.providers.anthropic_oauth import AnthropicOAuthProvider
|
||||||
|
from nanobot.providers.registry import should_use_oauth_provider
|
||||||
|
|
||||||
__all__ = ["LLMProvider", "LLMResponse", "LiteLLMProvider", "OpenAICodexProvider"]
|
__all__ = [
|
||||||
|
"LLMProvider",
|
||||||
|
"LLMResponse",
|
||||||
|
"ToolCallRequest",
|
||||||
|
"LiteLLMProvider",
|
||||||
|
"OpenAICodexProvider",
|
||||||
|
"AnthropicOAuthProvider",
|
||||||
|
"create_provider",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def create_provider(
|
||||||
|
api_key: str,
|
||||||
|
model: str,
|
||||||
|
api_base: str | None = None,
|
||||||
|
extra_headers: dict[str, str] | None = None,
|
||||||
|
provider_name: str | None = None,
|
||||||
|
) -> LLMProvider:
|
||||||
|
"""Factory function to create appropriate provider.
|
||||||
|
|
||||||
|
Automatically selects AnthropicOAuthProvider for OAuth tokens,
|
||||||
|
LiteLLMProvider for everything else.
|
||||||
|
"""
|
||||||
|
if should_use_oauth_provider(api_key, model):
|
||||||
|
return AnthropicOAuthProvider(
|
||||||
|
oauth_token=api_key,
|
||||||
|
default_model=model,
|
||||||
|
api_base=api_base,
|
||||||
|
)
|
||||||
|
|
||||||
|
return LiteLLMProvider(
|
||||||
|
api_key=api_key,
|
||||||
|
api_base=api_base,
|
||||||
|
default_model=model,
|
||||||
|
extra_headers=extra_headers,
|
||||||
|
provider_name=provider_name,
|
||||||
|
)
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
"""Test provider factory with OAuth support."""
|
||||||
|
import pytest
|
||||||
|
from nanobot.providers import create_provider
|
||||||
|
from nanobot.providers.anthropic_oauth import AnthropicOAuthProvider
|
||||||
|
from nanobot.providers.litellm_provider import LiteLLMProvider
|
||||||
|
|
||||||
|
|
||||||
|
def test_create_provider_oauth_token():
|
||||||
|
"""OAuth tokens should create AnthropicOAuthProvider."""
|
||||||
|
provider = create_provider(
|
||||||
|
api_key="sk-ant-oat01-test-token",
|
||||||
|
model="anthropic/claude-opus-4-5"
|
||||||
|
)
|
||||||
|
assert isinstance(provider, AnthropicOAuthProvider)
|
||||||
|
|
||||||
|
|
||||||
|
def test_create_provider_regular_key():
|
||||||
|
"""Regular API keys should create LiteLLMProvider."""
|
||||||
|
provider = create_provider(
|
||||||
|
api_key="sk-ant-api03-regular-key",
|
||||||
|
model="anthropic/claude-opus-4-5"
|
||||||
|
)
|
||||||
|
assert isinstance(provider, LiteLLMProvider)
|
||||||
|
|
||||||
|
|
||||||
|
def test_create_provider_openrouter():
|
||||||
|
"""OpenRouter keys should create LiteLLMProvider."""
|
||||||
|
provider = create_provider(
|
||||||
|
api_key="sk-or-v1-xxx",
|
||||||
|
model="anthropic/claude-opus-4-5"
|
||||||
|
)
|
||||||
|
assert isinstance(provider, LiteLLMProvider)
|
||||||
Reference in New Issue
Block a user