Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions genai_bench/auth/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from genai_bench.auth.oci.session import OCISessionAuth
from genai_bench.auth.oci.user_principal import OCIUserPrincipalAuth
from genai_bench.auth.openai.auth import OpenAIAuth
from genai_bench.auth.together.auth import TogetherAuth


class AuthFactory:
Expand All @@ -25,6 +26,18 @@ def create_openai_auth(api_key: str) -> OpenAIAuth:
"""
return OpenAIAuth(api_key=api_key)

@staticmethod
def create_together_auth(api_key: str) -> TogetherAuth:
"""Create Together authentication provider.

Args:
api_key (str): Together API key

Returns:
TogetherAuth: OpenAI auth provider
"""
return TogetherAuth(api_key=api_key)

@staticmethod
def create_oci_auth(
auth_type: str,
Expand Down
Empty file.
44 changes: 44 additions & 0 deletions genai_bench/auth/together/auth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import os
from typing import Any, Dict, Optional

from genai_bench.auth.auth_provider import AuthProvider


class TogetherAuth(AuthProvider):
"""Together.ai Authentication Provider."""

def __init__(self, api_key: Optional[str] = None):
"""Initialize Together Auth Provider.

Args:
api_key (Optional[str]): Together API key. If None, will try to get from
TOGETHER_API_KEY environment variable.

Raises:
ValueError: If no API key is provided or found in environment
"""
self.api_key = api_key or os.getenv("TOGETHER_API_KEY")
if not self.api_key or not self.api_key.strip():
raise ValueError(
"Together API key must be provided or set in "
"TOGETHER_API_KEY environment variable"
)

def get_config(self) -> Dict[str, Any]:
"""Get Together configuration.

Returns:
Dict[str, Any]: Empty configuration dictionary
as OpenAI doesn't need additional config
"""
return {}

def get_credentials(self) -> str:
"""Get Together API key.

Returns:
str: Together API key
"""
if not self.api_key:
raise ValueError("Together API key is not set")
return self.api_key
58 changes: 58 additions & 0 deletions genai_bench/auth/together/model_auth_adapter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
"""Together model authentication adapter for backward compatibility."""

from typing import Any, Dict

from genai_bench.auth.model_auth_provider import ModelAuthProvider
from genai_bench.auth.together.auth import TogetherAuth


class TogetherModelAuthAdapter(ModelAuthProvider):
"""Adapter to use existing Together auth as model auth provider."""

def __init__(self, together_auth: TogetherAuth):
"""Initialize Together model auth adapter.

Args:
together_auth: Existing Together auth instance
"""
self.together_auth = together_auth

def get_headers(self) -> Dict[str, str]:
"""Get authentication headers for Together API requests.

Returns:
Dict[str, str]: Headers with Authorization
"""
# Together uses Bearer token in Authorization header
if self.together_auth.api_key:
return {"Authorization": f"Bearer {self.together_auth.api_key}"}
return {}

def get_config(self) -> Dict[str, Any]:
"""Get Together model service configuration.

Returns:
Dict[str, Any]: Configuration dictionary
"""
return {
"auth_type": self.get_auth_type(),
"has_api_key": bool(self.together_auth.api_key),
}

def get_auth_type(self) -> str:
"""Get the authentication type identifier.

Returns:
'api_key'
"""
return "api_key"

def get_credentials(self) -> Dict[str, str]:
"""Get Together credentials.

Returns:
Dict with API key
"""
if self.together_auth.api_key:
return {"api_key": self.together_auth.api_key}
return {}
12 changes: 10 additions & 2 deletions genai_bench/auth/unified_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
from genai_bench.auth.openai.auth import OpenAIAuth
from genai_bench.auth.openai.model_auth_adapter import OpenAIModelAuthAdapter
from genai_bench.auth.storage_auth_provider import StorageAuthProvider
from genai_bench.auth.together.auth import TogetherAuth
from genai_bench.auth.together.model_auth_adapter import TogetherModelAuthAdapter


class UnifiedAuthFactory:
Expand All @@ -32,7 +34,7 @@ def create_model_auth(provider: str, **kwargs) -> ModelAuthProvider:

Args:
provider: Provider type ('openai', 'oci', 'aws-bedrock',
'azure-openai', 'gcp-vertex')
'azure-openai', 'gcp-vertex', 'together')
**kwargs: Provider-specific arguments

Returns:
Expand Down Expand Up @@ -84,10 +86,16 @@ def create_model_auth(provider: str, **kwargs) -> ModelAuthProvider:
api_key=kwargs.get("api_key"),
)

elif provider == "together":
api_key = kwargs.get("api_key")
together_auth = TogetherAuth(api_key=api_key)
return TogetherModelAuthAdapter(together_auth)

else:
raise ValueError(
f"Unsupported model provider: {provider}. "
f"Supported: openai, oci, aws-bedrock, azure-openai, gcp-vertex"
f"Supported: openai, oci, aws-bedrock, azure-openai, gcp-vertex, "
"together"
)

@staticmethod
Expand Down
4 changes: 4 additions & 0 deletions genai_bench/cli/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,10 @@ def benchmark(
}
)

elif api_backend == "together":
# Together uses API key for authentication
auth_kwargs["api_key"] = model_api_key or api_key

elif api_backend in ["vllm", "sglang"]:
# vLLM and SGLang use OpenAI-compatible API
auth_kwargs["api_key"] = model_api_key or api_key
Expand Down
1 change: 1 addition & 0 deletions genai_bench/cli/option_groups.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ def api_options(func):
"aws-bedrock",
"azure-openai",
"gcp-vertex",
"together",
"vllm",
"sglang",
],
Expand Down
2 changes: 2 additions & 0 deletions genai_bench/cli/validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from genai_bench.user.oci_cohere_user import OCICohereUser
from genai_bench.user.oci_genai_user import OCIGenAIUser
from genai_bench.user.openai_user import OpenAIUser
from genai_bench.user.together_user import TogetherUser

logger = init_logger(__name__)

Expand All @@ -27,6 +28,7 @@
AWSBedrockUser.BACKEND_NAME: AWSBedrockUser,
AzureOpenAIUser.BACKEND_NAME: AzureOpenAIUser,
GCPVertexUser.BACKEND_NAME: GCPVertexUser,
TogetherUser.BACKEND_NAME: TogetherUser,
"vllm": OpenAIUser, # vLLM uses OpenAI-compatible API
"sglang": OpenAIUser, # SGLang uses OpenAI-compatible API
}
Expand Down
Loading
Loading