|
""" |
|
Transformation logic from OpenAI /v1/embeddings format to Jina AI's `/v1/embeddings` format. |
|
|
|
Why separate file? Make it easy to see how transformation works |
|
|
|
Docs - https://jina.ai/embeddings/ |
|
""" |
|
|
|
import types |
|
from typing import List, Optional, Tuple |
|
|
|
from litellm import LlmProviders |
|
from litellm.secret_managers.main import get_secret_str |
|
|
|
|
|
class JinaAIEmbeddingConfig: |
|
""" |
|
Reference: https://jina.ai/embeddings/ |
|
""" |
|
|
|
def __init__( |
|
self, |
|
) -> None: |
|
locals_ = locals() |
|
for key, value in locals_.items(): |
|
if key != "self" and value is not None: |
|
setattr(self.__class__, key, value) |
|
|
|
@classmethod |
|
def get_config(cls): |
|
return { |
|
k: v |
|
for k, v in cls.__dict__.items() |
|
if not k.startswith("__") |
|
and not isinstance( |
|
v, |
|
( |
|
types.FunctionType, |
|
types.BuiltinFunctionType, |
|
classmethod, |
|
staticmethod, |
|
), |
|
) |
|
and v is not None |
|
} |
|
|
|
def get_supported_openai_params(self) -> List[str]: |
|
return ["dimensions"] |
|
|
|
def map_openai_params( |
|
self, non_default_params: dict, optional_params: dict |
|
) -> dict: |
|
if "dimensions" in non_default_params: |
|
optional_params["dimensions"] = non_default_params["dimensions"] |
|
return optional_params |
|
|
|
def _get_openai_compatible_provider_info( |
|
self, |
|
api_base: Optional[str], |
|
api_key: Optional[str], |
|
) -> Tuple[str, Optional[str], Optional[str]]: |
|
""" |
|
Returns: |
|
Tuple[str, Optional[str], Optional[str]]: |
|
- custom_llm_provider: str |
|
- api_base: str |
|
- dynamic_api_key: str |
|
""" |
|
api_base = ( |
|
api_base or get_secret_str("JINA_AI_API_BASE") or "https://api.jina.ai/v1" |
|
) |
|
dynamic_api_key = api_key or ( |
|
get_secret_str("JINA_AI_API_KEY") |
|
or get_secret_str("JINA_AI_API_KEY") |
|
or get_secret_str("JINA_AI_API_KEY") |
|
or get_secret_str("JINA_AI_TOKEN") |
|
) |
|
return LlmProviders.JINA_AI.value, api_base, dynamic_api_key |
|
|