diff --git a/litellm/llms/ollama/completion/transformation.py b/litellm/llms/ollama/completion/transformation.py
index c619fd8cfb..b2557a53e9 100644
--- a/litellm/llms/ollama/completion/transformation.py
+++ b/litellm/llms/ollama/completion/transformation.py
@@ -150,6 +150,7 @@ class OllamaConfig(BaseConfig):
"frequency_penalty",
"stop",
"response_format",
+ "max_completion_tokens",
]
def map_openai_params(
@@ -160,7 +161,7 @@ class OllamaConfig(BaseConfig):
drop_params: bool,
) -> dict:
for param, value in non_default_params.items():
- if param == "max_tokens":
+ if param == "max_tokens" or param == "max_completion_tokens":
optional_params["num_predict"] = value
if param == "stream":
optional_params["stream"] = value
@@ -257,9 +258,13 @@ class OllamaConfig(BaseConfig):
model_response.choices[0].finish_reason = "stop"
if request_data.get("format", "") == "json":
response_content = json.loads(response_json["response"])
-
+
# Check if this is a function call format with name/arguments structure
- if isinstance(response_content, dict) and "name" in response_content and "arguments" in response_content:
+ if (
+ isinstance(response_content, dict)
+ and "name" in response_content
+ and "arguments" in response_content
+ ):
# Handle as function call (original behavior)
function_call = response_content
message = litellm.Message(
diff --git a/litellm/proxy/_experimental/out/onboarding.html b/litellm/proxy/_experimental/out/onboarding.html
deleted file mode 100644
index dedc191cf5..0000000000
--- a/litellm/proxy/_experimental/out/onboarding.html
+++ /dev/null
@@ -1 +0,0 @@
-
LiteLLM Dashboard
\ No newline at end of file
diff --git a/litellm/proxy/_new_secret_config.yaml b/litellm/proxy/_new_secret_config.yaml
index e1a444a6d9..1106945209 100644
--- a/litellm/proxy/_new_secret_config.yaml
+++ b/litellm/proxy/_new_secret_config.yaml
@@ -60,16 +60,9 @@ model_list:
- model_name: gemini/gemini-2.0-flash
litellm_params:
model: gemini/gemini-2.0-flash
-
-litellm_settings:
- num_retries: 0
- check_provider_endpoint: true
- cache: true
- callbacks: ["otel"]
-
-files_settings:
- - custom_llm_provider: gemini
- api_key: os.environ/GEMINI_API_KEY
-
-general_settings:
- store_prompts_in_spend_logs: true
\ No newline at end of file
+ - model_name: llama-qwen
+ litellm_params:
+ model: ollama/qwen2:0.5b
+ model_info:
+ input_cost_per_token: 0.75
+ output_cost_per_token: 3
diff --git a/litellm/utils.py b/litellm/utils.py
index 9b8d11cfd5..8217a1860a 100644
--- a/litellm/utils.py
+++ b/litellm/utils.py
@@ -523,9 +523,9 @@ def function_setup( # noqa: PLR0915
function_id: Optional[str] = kwargs["id"] if "id" in kwargs else None
## DYNAMIC CALLBACKS ##
- dynamic_callbacks: Optional[List[Union[str, Callable, CustomLogger]]] = (
- kwargs.pop("callbacks", None)
- )
+ dynamic_callbacks: Optional[
+ List[Union[str, Callable, CustomLogger]]
+ ] = kwargs.pop("callbacks", None)
all_callbacks = get_dynamic_callbacks(dynamic_callbacks=dynamic_callbacks)
if len(all_callbacks) > 0:
@@ -1209,9 +1209,9 @@ def client(original_function): # noqa: PLR0915
exception=e,
retry_policy=kwargs.get("retry_policy"),
)
- kwargs["retry_policy"] = (
- reset_retry_policy()
- ) # prevent infinite loops
+ kwargs[
+ "retry_policy"
+ ] = reset_retry_policy() # prevent infinite loops
litellm.num_retries = (
None # set retries to None to prevent infinite loops
)
@@ -2754,16 +2754,16 @@ def get_optional_params( # noqa: PLR0915
True # so that main.py adds the function call to the prompt
)
if "tools" in non_default_params:
- optional_params["functions_unsupported_model"] = (
- non_default_params.pop("tools")
- )
+ optional_params[
+ "functions_unsupported_model"
+ ] = non_default_params.pop("tools")
non_default_params.pop(
"tool_choice", None
) # causes ollama requests to hang
elif "functions" in non_default_params:
- optional_params["functions_unsupported_model"] = (
- non_default_params.pop("functions")
- )
+ optional_params[
+ "functions_unsupported_model"
+ ] = non_default_params.pop("functions")
elif (
litellm.add_function_to_prompt
): # if user opts to add it to prompt instead
@@ -2786,10 +2786,10 @@ def get_optional_params( # noqa: PLR0915
if "response_format" in non_default_params:
if provider_config is not None:
- non_default_params["response_format"] = (
- provider_config.get_json_schema_from_pydantic_object(
- response_format=non_default_params["response_format"]
- )
+ non_default_params[
+ "response_format"
+ ] = provider_config.get_json_schema_from_pydantic_object(
+ response_format=non_default_params["response_format"]
)
else:
non_default_params["response_format"] = type_to_response_format_param(
@@ -3805,9 +3805,9 @@ def _count_characters(text: str) -> int:
def get_response_string(response_obj: Union[ModelResponse, ModelResponseStream]) -> str:
- _choices: Union[List[Union[Choices, StreamingChoices]], List[StreamingChoices]] = (
- response_obj.choices
- )
+ _choices: Union[
+ List[Union[Choices, StreamingChoices]], List[StreamingChoices]
+ ] = response_obj.choices
response_str = ""
for choice in _choices:
@@ -4127,6 +4127,18 @@ def get_provider_info(
return model_info
+def _is_potential_model_name_in_model_cost(
+ potential_model_names: PotentialModelNamesAndCustomLLMProvider,
+) -> bool:
+ """
+ Check if the potential model name is in the model cost.
+ """
+ return any(
+ potential_model_name in litellm.model_cost
+ for potential_model_name in potential_model_names.values()
+ )
+
+
def _get_model_info_helper( # noqa: PLR0915
model: str, custom_llm_provider: Optional[str] = None
) -> ModelInfoBase:
@@ -4182,7 +4194,9 @@ def _get_model_info_helper( # noqa: PLR0915
supports_prompt_caching=None,
supports_pdf_input=None,
)
- elif custom_llm_provider == "ollama" or custom_llm_provider == "ollama_chat":
+ elif (
+ custom_llm_provider == "ollama" or custom_llm_provider == "ollama_chat"
+ ) and not _is_potential_model_name_in_model_cost(potential_model_names):
return litellm.OllamaConfig().get_model_info(model)
else:
"""