mirror of
https://github.com/BerriAI/litellm.git
synced 2025-04-27 03:34:10 +00:00
* fix(proxy_server.py): fix azure key vault logic to not require client id/secret * feat(cost_calculator.py): support fireworks ai cost tracking * build(docker-compose.yml): add lines for mounting config.yaml to docker compose Closes https://github.com/BerriAI/litellm/issues/5739 * fix(input.md): update docs to clarify litellm supports content as a list of dictionaries Fixes https://github.com/BerriAI/litellm/issues/5755 * fix(input.md): update input.md to include all message values * fix(image_handling.py): follow image url redirects Fixes https://github.com/BerriAI/litellm/issues/5763 * fix(router.py): Fix model key/base leak in error message Fixes https://github.com/BerriAI/litellm/issues/5762 * fix(http_handler.py): fix linting error * fix(azure.py): fix logging to show azure_ad_token being used Fixes https://github.com/BerriAI/litellm/issues/5767 * fix(_redis.py): add redis sentinel support Closes https://github.com/BerriAI/litellm/issues/4381 * feat(_redis.py): add redis sentinel support Closes https://github.com/BerriAI/litellm/issues/4381 * test(test_completion_cost.py): fix test * Databricks Integration: Integrate Databricks SDK as optional mechanism for fetching API base and token, if unspecified (#5746) * LiteLLM Minor Fixes & Improvements (09/16/2024) (#5723) * coverage (#5713) Signed-off-by: dbczumar <corey.zumar@databricks.com> * Move (#5714) Signed-off-by: dbczumar <corey.zumar@databricks.com> * fix(litellm_logging.py): fix logging client re-init (#5710) Fixes https://github.com/BerriAI/litellm/issues/5695 * fix(presidio.py): Fix logging_hook response and add support for additional presidio variables in guardrails config Fixes https://github.com/BerriAI/litellm/issues/5682 * feat(o1_handler.py): fake streaming for openai o1 models Fixes https://github.com/BerriAI/litellm/issues/5694 * docs: deprecated traceloop integration in favor of native otel (#5249) * fix: fix linting errors * fix: fix linting errors * fix(main.py): fix o1 import --------- Signed-off-by: dbczumar <corey.zumar@databricks.com> Co-authored-by: Corey Zumar <39497902+dbczumar@users.noreply.github.com> Co-authored-by: Nir Gazit <nirga@users.noreply.github.com> * feat(spend_management_endpoints.py): expose `/global/spend/refresh` endpoint for updating material view (#5730) * feat(spend_management_endpoints.py): expose `/global/spend/refresh` endpoint for updating material view Supports having `MonthlyGlobalSpend` view be a material view, and exposes an endpoint to refresh it * fix(custom_logger.py): reset calltype * fix: fix linting errors * fix: fix linting error * fix Signed-off-by: dbczumar <corey.zumar@databricks.com> * fix: fix import * Fix Signed-off-by: dbczumar <corey.zumar@databricks.com> * fix Signed-off-by: dbczumar <corey.zumar@databricks.com> * DB test Signed-off-by: dbczumar <corey.zumar@databricks.com> * Coverage Signed-off-by: dbczumar <corey.zumar@databricks.com> * progress Signed-off-by: dbczumar <corey.zumar@databricks.com> * fix Signed-off-by: dbczumar <corey.zumar@databricks.com> * fix Signed-off-by: dbczumar <corey.zumar@databricks.com> * fix Signed-off-by: dbczumar <corey.zumar@databricks.com> * fix test name Signed-off-by: dbczumar <corey.zumar@databricks.com> --------- Signed-off-by: dbczumar <corey.zumar@databricks.com> Co-authored-by: Krish Dholakia <krrishdholakia@gmail.com> Co-authored-by: Nir Gazit <nirga@users.noreply.github.com> * test: fix test * test(test_databricks.py): fix test * fix(databricks/chat.py): handle custom endpoint (e.g. sagemaker) * Apply code scanning fix for clear-text logging of sensitive information Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> * fix(__init__.py): fix known fireworks ai models --------- Signed-off-by: dbczumar <corey.zumar@databricks.com> Co-authored-by: Corey Zumar <39497902+dbczumar@users.noreply.github.com> Co-authored-by: Nir Gazit <nirga@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
87 lines
2.5 KiB
Python
87 lines
2.5 KiB
Python
"""
|
|
Helper functions to handle images passed in messages
|
|
"""
|
|
|
|
import base64
|
|
|
|
from httpx import Response
|
|
|
|
import litellm
|
|
from litellm import verbose_logger
|
|
from litellm.caching import InMemoryCache
|
|
from litellm.llms.custom_httpx.http_handler import (
|
|
_get_httpx_client,
|
|
get_async_httpx_client,
|
|
)
|
|
|
|
MAX_IMGS_IN_MEMORY = 10
|
|
|
|
in_memory_cache = InMemoryCache(max_size_in_memory=MAX_IMGS_IN_MEMORY)
|
|
|
|
|
|
def _process_image_response(response: Response, url: str) -> str:
|
|
if response.status_code != 200:
|
|
raise Exception(
|
|
f"Error: Unable to fetch image from URL. Status code: {response.status_code}, url={url}"
|
|
)
|
|
|
|
image_bytes = response.content
|
|
base64_image = base64.b64encode(image_bytes).decode("utf-8")
|
|
|
|
image_type = response.headers.get("Content-Type")
|
|
if image_type is None:
|
|
img_type = url.split(".")[-1].lower()
|
|
_img_type = {
|
|
"jpg": "image/jpeg",
|
|
"jpeg": "image/jpeg",
|
|
"png": "image/png",
|
|
"gif": "image/gif",
|
|
"webp": "image/webp",
|
|
}.get(img_type)
|
|
if _img_type is None:
|
|
raise Exception(
|
|
f"Error: Unsupported image format. Format={_img_type}. Supported types = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']"
|
|
)
|
|
img_type = _img_type
|
|
else:
|
|
img_type = image_type
|
|
|
|
result = f"data:{img_type};base64,{base64_image}"
|
|
in_memory_cache.set_cache(url, result)
|
|
return result
|
|
|
|
|
|
async def async_convert_url_to_base64(url: str) -> str:
|
|
cached_result = in_memory_cache.get_cache(url)
|
|
if cached_result:
|
|
return cached_result
|
|
|
|
client = litellm.module_level_aclient
|
|
for _ in range(3):
|
|
try:
|
|
response = await client.get(url, follow_redirects=True)
|
|
return _process_image_response(response, url)
|
|
except:
|
|
pass
|
|
raise Exception(
|
|
f"Error: Unable to fetch image from URL after 3 attempts. url={url}"
|
|
)
|
|
|
|
|
|
def convert_url_to_base64(url: str) -> str:
|
|
cached_result = in_memory_cache.get_cache(url)
|
|
if cached_result:
|
|
return cached_result
|
|
|
|
client = litellm.module_level_client
|
|
for _ in range(3):
|
|
try:
|
|
response = client.get(url, follow_redirects=True)
|
|
return _process_image_response(response, url)
|
|
except Exception as e:
|
|
verbose_logger.exception(e)
|
|
# print(e)
|
|
pass
|
|
raise Exception(
|
|
f"Error: Unable to fetch image from URL after 3 attempts. url={url}"
|
|
)
|