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: """