Skip to content
Open
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
2 changes: 2 additions & 0 deletions litellm/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,7 @@
"https://api.libertai.io/v1",
"https://pinstripes.io/v1",
"https://api.meta.ai/v1",
"https://api.openinfer.ai/v1",
]


Expand Down Expand Up @@ -793,6 +794,7 @@
"docker_model_runner",
"ragflow",
"pinstripes", # Pinstripes - JSON-configured provider
"openinfer", # OpenInfer - JSON-configured provider
"darkbloom",
"meta", # Meta Model API (Muse Spark) - JSON-configured provider
]
Expand Down
3 changes: 3 additions & 0 deletions litellm/litellm_core_utils/get_llm_provider_logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,9 @@ def get_llm_provider(
elif endpoint == "https://pinstripes.io/v1":
custom_llm_provider = "pinstripes"
dynamic_api_key = get_secret_str("PINSTRIPES_API_KEY")
elif endpoint == "https://api.openinfer.ai/v1":
custom_llm_provider = "openinfer"
dynamic_api_key = get_secret_str("OPENINFER_API_KEY")
elif endpoint == "https://api.meta.ai/v1":
custom_llm_provider = "meta"
dynamic_api_key = get_secret_str("META_API_KEY")
Expand Down
10 changes: 10 additions & 0 deletions litellm/llms/openai_like/providers.json
Original file line number Diff line number Diff line change
Expand Up @@ -183,5 +183,15 @@
"max_completion_tokens": "max_tokens"
},
"supported_endpoints": ["/v1/chat/completions", "/v1/responses", "/v1/embeddings"]
},
"openinfer": {
"base_url": "https://api.openinfer.ai/v1",
"api_key_env": "OPENINFER_API_KEY",
"api_base_env": "OPENINFER_API_BASE",
"base_class": "openai_gpt",
"param_mappings": {
"max_completion_tokens": "max_tokens"
},
"supported_endpoints": ["/v1/chat/completions"]
}
}
11 changes: 11 additions & 0 deletions litellm/model_prices_and_context_window_backup.json
Original file line number Diff line number Diff line change
Expand Up @@ -46190,5 +46190,16 @@
}
}
]
},
"openinfer/llama-3.1-8b-instruct": {
"max_tokens": 8192,
"max_input_tokens": 128000,
"max_output_tokens": 8192,
"input_cost_per_token": 0.0,
"output_cost_per_token": 0.0,
"litellm_provider": "openinfer",
"mode": "chat",
"supports_function_calling": true,
"source": "https://api.openinfer.ai/v1/models"
}
}
1 change: 1 addition & 0 deletions litellm/types/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3508,6 +3508,7 @@ class LlmProviders(str, Enum):
TENSORMESH = "tensormesh"
LIBERTAI = "libertai"
PINSTRIPES = "pinstripes"
OPENINFER = "openinfer"
DARKBLOOM = "darkbloom"
META = "meta"
LITELLM_AGENT = "litellm_agent"
Expand Down
11 changes: 11 additions & 0 deletions model_prices_and_context_window.json
Original file line number Diff line number Diff line change
Expand Up @@ -46312,5 +46312,16 @@
}
}
]
},
"openinfer/llama-3.1-8b-instruct": {
"max_tokens": 8192,
"max_input_tokens": 128000,
"max_output_tokens": 8192,
"input_cost_per_token": 0.0,
"output_cost_per_token": 0.0,
"litellm_provider": "openinfer",
"mode": "chat",
"supports_function_calling": true,
"source": "https://api.openinfer.ai/v1/models"
}
}
17 changes: 17 additions & 0 deletions provider_endpoints_support.json
Original file line number Diff line number Diff line change
Expand Up @@ -2018,6 +2018,23 @@
"a2a": false
}
},
"openinfer": {
"display_name": "OpenInfer (`openinfer`)",
"url": "https://openinfer.io",
"endpoints": {
"chat_completions": true,
"messages": false,
"responses": false,
"embeddings": false,
"image_generations": false,
"audio_transcriptions": false,
"audio_speech": false,
"moderations": false,
"batches": false,
"rerank": false,
"a2a": false
}
},
"poe": {
"display_name": "Poe (`poe`)",
"endpoints": {
Expand Down
91 changes: 91 additions & 0 deletions tests/test_litellm/llms/openai_like/test_openinfer_provider.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
"""
Tests for the OpenInfer LLM provider configuration and integration.
"""

import litellm


class TestOpenInferProviderConfig:
def test_openinfer_in_provider_list(self):
from litellm import LlmProviders

assert LlmProviders.OPENINFER.value == "openinfer"
assert "openinfer" in litellm.provider_list

def test_openinfer_json_config(self):
from litellm.llms.openai_like.json_loader import JSONProviderRegistry

provider = JSONProviderRegistry.get("openinfer")
assert provider is not None
assert provider.base_url == "https://api.openinfer.ai/v1"
assert provider.api_key_env == "OPENINFER_API_KEY"
assert provider.api_base_env == "OPENINFER_API_BASE"
assert not JSONProviderRegistry.supports_responses_api("openinfer")

def test_openinfer_in_openai_compatible_providers(self):
from litellm.constants import openai_compatible_providers

assert "openinfer" in openai_compatible_providers

def test_provider_prefixed_model_routes_to_openinfer(self):
from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider

model, provider, api_key, api_base = get_llm_provider(
model="openinfer/llama-3.1-8b-instruct",
custom_llm_provider=None,
api_base=None,
api_key="sk-test",
)

assert model == "llama-3.1-8b-instruct"
assert provider == "openinfer"
assert api_key == "sk-test"
assert api_base == "https://api.openinfer.ai/v1"

def test_api_key_and_base_resolved_from_env(self, monkeypatch):
from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider

monkeypatch.setenv("OPENINFER_API_KEY", "sk-env-key")
monkeypatch.setenv("OPENINFER_API_BASE", "https://proxy.internal/v1")

_, provider, api_key, api_base = get_llm_provider(
model="openinfer/llama-3.1-8b-instruct",
custom_llm_provider=None,
api_base=None,
api_key=None,
)

assert provider == "openinfer"
assert api_key == "sk-env-key"
assert api_base == "https://proxy.internal/v1"

def test_url_autodetection_from_api_base(self, monkeypatch):
from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider

monkeypatch.setenv("OPENINFER_API_KEY", "sk-env-key")

_, provider, api_key, api_base = get_llm_provider(
model="llama-3.1-8b-instruct",
custom_llm_provider=None,
api_base="https://api.openinfer.ai/v1",
api_key=None,
)

assert provider == "openinfer"
assert api_key == "sk-env-key"

def test_chat_completions_url(self):
config = litellm.ProviderConfigManager.get_provider_chat_config(
model="llama-3.1-8b-instruct", provider=litellm.LlmProviders.OPENINFER
)
assert config is not None
assert (
config.get_complete_url(
api_base=None,
api_key="sk-test",
model="llama-3.1-8b-instruct",
optional_params={},
litellm_params={},
)
== "https://api.openinfer.ai/v1/chat/completions"
)
Loading