danswer/backend/onyx/llm/llm_provider_options.py
2025-04-16 15:34:01 -07:00

224 lines
7.2 KiB
Python

from enum import Enum
import litellm # type: ignore
from pydantic import BaseModel
class CustomConfigKeyType(Enum):
# used for configuration values that require manual input
# i.e., textual API keys (e.g., "abcd1234")
TEXT_INPUT = "text_input"
# used for configuration values that require a file to be selected/drag-and-dropped
# i.e., file based credentials (e.g., "/path/to/credentials/file.json")
FILE_INPUT = "file_input"
class CustomConfigKey(BaseModel):
name: str
display_name: str
description: str | None = None
is_required: bool = True
is_secret: bool = False
key_type: CustomConfigKeyType = CustomConfigKeyType.TEXT_INPUT
class WellKnownLLMProviderDescriptor(BaseModel):
name: str
display_name: str
api_key_required: bool
api_base_required: bool
api_version_required: bool
custom_config_keys: list[CustomConfigKey] | None = None
llm_names: list[str]
default_model: str | None = None
default_fast_model: str | None = None
# set for providers like Azure, which require a deployment name.
deployment_name_required: bool = False
# set for providers like Azure, which support a single model per deployment.
single_model_supported: bool = False
OPENAI_PROVIDER_NAME = "openai"
OPEN_AI_MODEL_NAMES = [
"o3-mini",
"o1-mini",
"o1",
"gpt-4",
"gpt-4.1",
"gpt-4o",
"gpt-4o-mini",
"o1-preview",
"gpt-4-turbo",
"gpt-4-turbo-preview",
"gpt-4-1106-preview",
"gpt-4-vision-preview",
"gpt-4-0613",
"gpt-4o-2024-08-06",
"gpt-4-0314",
"gpt-4-32k-0314",
"gpt-3.5-turbo",
"gpt-3.5-turbo-0125",
"gpt-3.5-turbo-1106",
"gpt-3.5-turbo-16k",
"gpt-3.5-turbo-0613",
"gpt-3.5-turbo-16k-0613",
"gpt-3.5-turbo-0301",
]
BEDROCK_PROVIDER_NAME = "bedrock"
# need to remove all the weird "bedrock/eu-central-1/anthropic.claude-v1" named
# models
BEDROCK_MODEL_NAMES = [
model
# bedrock_converse_models are just extensions of the bedrock_models, not sure why
# litellm has split them into two lists :(
for model in litellm.bedrock_models + litellm.bedrock_converse_models
if "/" not in model and "embed" not in model
][::-1]
IGNORABLE_ANTHROPIC_MODELS = [
"claude-2",
"claude-instant-1",
"anthropic/claude-3-5-sonnet-20241022",
]
ANTHROPIC_PROVIDER_NAME = "anthropic"
ANTHROPIC_MODEL_NAMES = [
model
for model in litellm.anthropic_models
if model not in IGNORABLE_ANTHROPIC_MODELS
][::-1]
AZURE_PROVIDER_NAME = "azure"
VERTEXAI_PROVIDER_NAME = "vertex_ai"
VERTEXAI_DEFAULT_MODEL = "gemini-2.0-flash"
VERTEXAI_DEFAULT_FAST_MODEL = "gemini-2.0-flash-lite"
VERTEXAI_MODEL_NAMES = [
# 2.5 pro models
"gemini-2.5-pro-exp-03-25",
# 2.0 flash-lite models
VERTEXAI_DEFAULT_FAST_MODEL,
"gemini-2.0-flash-lite-001",
# "gemini-2.0-flash-lite-preview-02-05",
# 2.0 flash models
VERTEXAI_DEFAULT_MODEL,
"gemini-2.0-flash-001",
"gemini-2.0-flash-exp",
# "gemini-2.0-flash-exp-image-generation",
# "gemini-2.0-flash-thinking-exp-01-21",
# 1.5 pro models
"gemini-1.5-pro-latest",
"gemini-1.5-pro",
"gemini-1.5-pro-001",
"gemini-1.5-pro-002",
# 1.5 flash models
"gemini-1.5-flash-latest",
"gemini-1.5-flash",
"gemini-1.5-flash-001",
"gemini-1.5-flash-002",
]
_PROVIDER_TO_MODELS_MAP = {
OPENAI_PROVIDER_NAME: OPEN_AI_MODEL_NAMES,
BEDROCK_PROVIDER_NAME: BEDROCK_MODEL_NAMES,
ANTHROPIC_PROVIDER_NAME: ANTHROPIC_MODEL_NAMES,
VERTEXAI_PROVIDER_NAME: VERTEXAI_MODEL_NAMES,
}
CREDENTIALS_FILE_CUSTOM_CONFIG_KEY = "CREDENTIALS_FILE"
def fetch_available_well_known_llms() -> list[WellKnownLLMProviderDescriptor]:
return [
WellKnownLLMProviderDescriptor(
name=OPENAI_PROVIDER_NAME,
display_name="OpenAI",
api_key_required=True,
api_base_required=False,
api_version_required=False,
custom_config_keys=[],
llm_names=fetch_models_for_provider(OPENAI_PROVIDER_NAME),
default_model="gpt-4o",
default_fast_model="gpt-4o-mini",
),
WellKnownLLMProviderDescriptor(
name=ANTHROPIC_PROVIDER_NAME,
display_name="Anthropic",
api_key_required=True,
api_base_required=False,
api_version_required=False,
custom_config_keys=[],
llm_names=fetch_models_for_provider(ANTHROPIC_PROVIDER_NAME),
default_model="claude-3-7-sonnet-20250219",
default_fast_model="claude-3-5-sonnet-20241022",
),
WellKnownLLMProviderDescriptor(
name=AZURE_PROVIDER_NAME,
display_name="Azure OpenAI",
api_key_required=True,
api_base_required=True,
api_version_required=True,
custom_config_keys=[],
llm_names=fetch_models_for_provider(AZURE_PROVIDER_NAME),
deployment_name_required=True,
single_model_supported=True,
),
WellKnownLLMProviderDescriptor(
name=BEDROCK_PROVIDER_NAME,
display_name="AWS Bedrock",
api_key_required=False,
api_base_required=False,
api_version_required=False,
custom_config_keys=[
CustomConfigKey(
name="AWS_REGION_NAME",
display_name="AWS Region Name",
),
CustomConfigKey(
name="AWS_ACCESS_KEY_ID",
display_name="AWS Access Key ID",
is_required=False,
description="If using AWS IAM roles, AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY can be left blank.",
),
CustomConfigKey(
name="AWS_SECRET_ACCESS_KEY",
display_name="AWS Secret Access Key",
is_required=False,
is_secret=True,
description="If using AWS IAM roles, AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY can be left blank.",
),
],
llm_names=fetch_models_for_provider(BEDROCK_PROVIDER_NAME),
default_model="anthropic.claude-3-5-sonnet-20241022-v2:0",
default_fast_model="anthropic.claude-3-5-sonnet-20241022-v2:0",
),
WellKnownLLMProviderDescriptor(
name=VERTEXAI_PROVIDER_NAME,
display_name="GCP Vertex AI",
api_key_required=False,
api_base_required=False,
api_version_required=False,
llm_names=fetch_models_for_provider(VERTEXAI_PROVIDER_NAME),
custom_config_keys=[
CustomConfigKey(
name=CREDENTIALS_FILE_CUSTOM_CONFIG_KEY,
display_name="Credentials File",
description="This should be a JSON file containing some private credentials.",
is_required=True,
is_secret=False,
key_type=CustomConfigKeyType.FILE_INPUT,
),
],
default_model=VERTEXAI_DEFAULT_MODEL,
default_fast_model=VERTEXAI_DEFAULT_MODEL,
),
]
def fetch_models_for_provider(provider_name: str) -> list[str]:
return _PROVIDER_TO_MODELS_MAP.get(provider_name, [])