diff --git a/GIDs b/GIDs --- a/GIDs +++ b/GIDs @@ -325,7 +325,7 @@ _tlsrpt:*:382: cascade:*:383: omada:*:384: -# free: 385 +litellm:*:305: # free: 386 # free: 387 # free: 388 diff --git a/UIDs b/UIDs --- a/UIDs +++ b/UIDs @@ -331,7 +331,7 @@ _tlsrpt:*:382:382::0:0:TLSRPT Daemon:/nonexistent:/usr/sbin/nologin cascade:*:383:383::0:0:Cascade Daemon:/var/db/cascade:/usr/sbin/nologin omada:*:384:384::0:0:Omada Wireless Controller:/nonexistent:/usr/sbin/nologin -# free: 385 +litellm:*:385:385::0:0:LiteLLM Daemon:/nonexistent:/usr/sbin/nologin # free: 386 # free: 387 # free: 388 diff --git a/misc/py-litellm/Makefile b/misc/py-litellm/Makefile --- a/misc/py-litellm/Makefile +++ b/misc/py-litellm/Makefile @@ -1,5 +1,6 @@ PORTNAME= litellm -DISTVERSION= 1.79.1 +DISTVERSION= 1.79.2 +PORTREVISION= 4 CATEGORIES= misc python MASTER_SITES= PYPI PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX} @@ -13,22 +14,25 @@ BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}poetry-core>0:devel/py-poetry-core@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}wheel>0:devel/py-wheel@${PY_FLAVOR} -RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}fastuuid>=0.13.0:devel/py-fastuuid@${PY_FLAVOR} \ +RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}aiohttp>=3.10:www/py-aiohttp@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}click>0:devel/py-click@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}fastuuid>=0.13.0:devel/py-fastuuid@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}httpx>=0.23.0:www/py-httpx@${PY_FLAVOR} \ - ${PYTHON_PKGNAMEPREFIX}openai>=1.99.5:misc/py-openai@${PY_FLAVOR} \ - ${PYTHON_PKGNAMEPREFIX}python-dotenv>=0.2.0:www/py-python-dotenv@${PY_FLAVOR} \ - ${PYTHON_PKGNAMEPREFIX}tiktoken>=0.7.0:textproc/py-tiktoken@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}importlib-metadata>=6.8.0:devel/py-importlib-metadata@${PY_FLAVOR} \ - ${PYTHON_PKGNAMEPREFIX}tokenizers>0:textproc/py-tokenizers@${PY_FLAVOR} \ - ${PYTHON_PKGNAMEPREFIX}click>0:devel/py-click@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}Jinja2>=3.1.2<4.0.0:devel/py-Jinja2@${PY_FLAVOR} \ - ${PYTHON_PKGNAMEPREFIX}aiohttp>=3.10:www/py-aiohttp@${PY_FLAVOR} \ - ${PYTHON_PKGNAMEPREFIX}pydantic2>=2.5.0<3.0.0:devel/py-pydantic2@${PY_FLAVOR} \ ${PYTHON_PKGNAMEPREFIX}jsonschema>=4.22.0<5.0.0:devel/py-jsonschema@${PY_FLAVOR} \ - ${PYTHON_PKGNAMEPREFIX}numpydoc>0:textproc/py-numpydoc@${PY_FLAVOR} + ${PYTHON_PKGNAMEPREFIX}litellm-proxy-extras>=0.4.1:misc/py-litellm-proxy-extras@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}numpydoc>0:textproc/py-numpydoc@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}openai>=1.99.5:misc/py-openai@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}pydantic2>=2.5.0<3.0.0:devel/py-pydantic2@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}pynacl>=1.5.0:security/py-pynacl@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}python-dotenv>=0.2.0:www/py-python-dotenv@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}tiktoken>=0.7.0:textproc/py-tiktoken@${PY_FLAVOR} \ + ${PYTHON_PKGNAMEPREFIX}tokenizers>0:textproc/py-tokenizers@${PY_FLAVOR} USES= python shebangfix USE_PYTHON= autoplist concurrent pep517 +USE_RC_SUBR= litellm SHEBANG_FILES= litellm/proxy/start.sh bash_CMD= ${SH} @@ -36,9 +40,33 @@ REINPLACE_ARGS= -i '' NO_ARCH= yes +SUB_FILES= envvars envvars_prisma litellm litellm.yaml pkg-message +SUB_LIST= LITELLM_DIR=${LITELLM_DIR} \ + PYTHON_SITELIBDIR=${PYTHON_SITELIBDIR} + +USERS= ${LITELLM_USER} +GROUPS= ${LITELLM_GROUP} + +PLIST_SUB+= LITELLM_GROUP=${LITELLM_GROUP} \ + LITELLM_USER=${LITELLM_USER} + PORTDOCS= README.md -OPTIONS_DEFINE= DOCS +OPTIONS_DEFINE= DOCS GUNICORN HYPERCORN REDIS + +GUNICORN_DESC= Allow to run under gunicorn +HYPERCORN_DESC= Allow to run under hypercorn + +GUNICORN_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}gunicorn>0:www/py-gunicorn@${PY_FLAVOR} +HYPERCORN_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}hypercorn>0:www/py-hypercorn@${PY_FLAVOR} + +REDIS_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}redis>0:databases/py-redis@${PY_FLAVOR} + +LITELLM_USER?= litellm +LITELLM_GROUP?= ${LITELLM_USER} +LITELLM_UID?= 385 +LITELLM_GID?= ${LITELLM_UID} +LITELLM_DIR?= /var/db/litellm post-patch: @${REINPLACE_CMD} -e 's|python3|${PYTHON_CMD}|' \ @@ -48,4 +76,18 @@ @${MKDIR} ${STAGEDIR}${DOCSDIR} ${INSTALL_MAN} ${PORTDOCS:S|^|${WRKSRC}/|} ${STAGEDIR}${DOCSDIR} +post-stage: + @${MKDIR} ${STAGEDIR}${LITELLM_DIR} + @${MKDIR} ${STAGEDIR}${LITELLM_DIR}/migrations + @${MKDIR} ${STAGEDIR}${PREFIX}/etc/litellm + @${ECHO} "@dir(${LITELLM_USER},${LITELLM_GROUP},0700) ${LITELLM_DIR}" >> ${TMPPLIST} + @${ECHO} "@dir(${LITELLM_USER},${LITELLM_GROUP},0700) ${LITELLM_DIR}/migrations" >> ${TMPPLIST} + @${ECHO} "@dir(${LITELLM_USER},${LITELLM_GROUP},0700) etc/${PORTNAME}" >> ${TMPPLIST} + ${INSTALL_DATA} ${WRKDIR}/envvars ${STAGEDIR}${PREFIX}/etc/litellm/envvars.sample + @${ECHO} "@sample(${LITELLM_USER},${LITELLM_GROUP},0600) etc/litellm/envvars.sample" >> ${TMPPLIST} + ${INSTALL_DATA} ${WRKDIR}/envvars_prisma ${STAGEDIR}${PREFIX}/etc/litellm/envvars_prisma.sample + @${ECHO} "@sample(${LITELLM_USER},${LITELLM_GROUP},0600) etc/litellm/envvars_prisma.sample" >> ${TMPPLIST} + ${INSTALL_DATA} ${WRKDIR}/litellm.yaml ${STAGEDIR}${PREFIX}/etc/litellm/litellm.yaml.sample + @${ECHO} "@sample(${LITELLM_USER},${LITELLM_GROUP},0600) etc/litellm/litellm.yaml.sample" >> ${TMPPLIST} + .include diff --git a/misc/py-litellm/distinfo b/misc/py-litellm/distinfo --- a/misc/py-litellm/distinfo +++ b/misc/py-litellm/distinfo @@ -1,3 +1,3 @@ -TIMESTAMP = 1762311223 -SHA256 (litellm-1.79.1.tar.gz) = c1cf0232c01e7ad4b8442d2cdd78973ce74dfda37ad1d9f0ec3c911510e26523 -SIZE (litellm-1.79.1.tar.gz) = 11216675 +TIMESTAMP = 1762687971 +SHA256 (litellm-1.79.2.tar.gz) = af0127ca6ff4ec1397b5aa203cbf63d4e2a660899cab56d332061a11dc38436e +SIZE (litellm-1.79.2.tar.gz) = 11303434 diff --git a/misc/py-litellm/files/envvars.in b/misc/py-litellm/files/envvars.in new file mode 100644 --- /dev/null +++ b/misc/py-litellm/files/envvars.in @@ -0,0 +1,21 @@ +# +# Environment variables for LiteLLM +# +# PRISMA_EXPECTED_ENGINE_VERSION is a full commit hash belonging to the tag +# used in PRISMA_VERSION. Normally this have to match the version of +# databases/prisma-engines (but not necessarily). +# +# As of 20251108, these are known: +# +# 6.19.0 2ba551f319ab1df4bc874a89965d8b3641056773 +# +# The rest can be found on github in Prisma's repository https://github.com/prisma/prisma/ +# or via git rev-parse +# + +export DATABASE_URL="postgresql://user:password@dbhost:5432/dbname" + +export LITELLM_MIGRATION_DIR="%%LITELLM_DIR%%/migrations" +export LITELLM_SALT_KEY="sk-SALTKEY" + +export STORE_MODEL_IN_DB="True" diff --git a/misc/py-litellm/files/envvars_prisma.in b/misc/py-litellm/files/envvars_prisma.in new file mode 100644 --- /dev/null +++ b/misc/py-litellm/files/envvars_prisma.in @@ -0,0 +1,24 @@ +# +# Environment variables for Prisma +# +# PRISMA_EXPECTED_ENGINE_VERSION is a full commit hash belonging to the tag +# used in PRISMA_VERSION +# +# As of 20251108, these are known: +# +# 6.19.0 2ba551f319ab1df4bc874a89965d8b3641056773 +# +# The rest can be found on github in Prisma's repository https://github.com/prisma/prisma/ +# or via git rev-parse +# +# For LiteLLM-specific variables, see %%LOCALBASE%%/etc/litellm/envvars +# + +export PRISMA_CLI_QUERY_ENGINE_TYPE="binary" +export PRISMA_CLIENT_ENGINE_TYPE="binary" +export PRISMA_ENGINES_CHECKSUM_IGNORE_MISSING="True" +export PRISMA_EXPECTED_ENGINE_VERSION="2ba551f319ab1df4bc874a89965d8b3641056773" +export PRISMA_FMT_BINARY="%%LOCALBASE%%/libexec/prisma-engines/prisma-fmt" +export PRISMA_QUERY_ENGINE_BINARY="%%LOCALBASE%%/libexec/prisma-engines/query-engine" +export PRISMA_SCHEMA_ENGINE_BINARY="%%LOCALBASE%%/libexec/prisma-engines/schema-engine" +export PRISMA_VERSION="6.19.0" diff --git a/misc/py-litellm/files/litellm.in b/misc/py-litellm/files/litellm.in new file mode 100644 --- /dev/null +++ b/misc/py-litellm/files/litellm.in @@ -0,0 +1,139 @@ +#!/bin/sh +# +# PROVIDE: litellm +# REQUIRE: DAEMON +# BEFORE: LOGIN +# KEYWORD: shutdown +# +# Add the following lines to /etc/rc.conf to enable litellm: +# litellm_enable (bool): Set to "NO" by default. +# Set it to "YES" to enable litellm. +# +# litellm_config (str): Path to litellm config file. +# +# litellm_user (str): User to run litellm as. +# +# litellm_group (str): Group to run litellm as. +# +# litellm_profiles (str): Set to "" by default. +# Define your profiles here. +# +# litellm_chdir (str): Set the directory to run the litellm +# instance in. +# Default: /var/db/litellm +# +# litellm_extra_args (str): Optional parameters and arguments to +# pass to litellm. +# +# litellm_envvars (str): Environment variables file to read and pass +# to litellm +# + +. /etc/rc.subr + +name=litellm +rcvar=litellm_enable + +# set defaults + +load_rc_config $name + +: ${litellm_enable:=NO} +: ${litellm_config:=%%PREFIX%%/etc/litellm/litellm.yaml} +: ${litellm_user:=litellm} +: ${litellm_group:=litellm} +: ${litellm_chdir:=/var/db/litellm} +: ${litellm_extra_args:=""} +: ${litellm_envvars:="%%PREFIX%%/etc/litellm/envvars"} +: ${litellm_svcj_options:="net_basic"} + +extra_commands="prismagen" + +_pidprefix="/var/run/litellm" +pidfile="${_pidprefix}/${name}.pid" +cpidfile="${_pidprefix}/${name}-worker.pid" +command=/usr/sbin/daemon +command_args="-P ${pidfile} -p ${cpidfile} -f -ST ${name} -t ${name} \ + /usr/bin/env HOME=${litellm_chdir} \ + PRISMA_HOME_DIR=${litellm_chdir} \ + %%LOCALBASE%%/bin/litellm -c ${litellm_config} ${litellm_extra_args}" +required_files="${litellm_config}" +start_precmd="litellm_start_precmd" +prismagen_precmd="litellm_prismagen_precmd" +prismagen_cmd="litellm_prismagen" + +_read_envvars() +{ + if [ -f "%%PREFIX%%/etc/litellm/envvars_prisma" ]; then + . "%%PREFIX%%/etc/litellm/envvars_prisma" + fi + + if [ -f "${litellm_envvars}" ]; then + . "${litellm_envvars}" + fi +} + +if [ -n "$2" ]; then + profile="$2" + if [ "x${litellm_profiles}" != "x" ]; then + pidfile="${_pidprefix}/litellm-${profile}.pid" + cpidfile="${_pidprefix}/litellm-${profile}-worker.pid" + eval litellm_config="\${litellm_${profile}_config:-}" + eval litellm_chdir="\${litellm_${profile}_chdir:-/var/db/litellm}" + eval litellm_envvars="\${litellm_${profile}_envvars:-%%PREFIX%%/etc/litellm/envvars-${profile}}" + eval litellm_extra_args="\${litellm_${profile}_extra_args:-}" + eval litellm_svcj_options="\${litellm_${profile}_svcj_options:-net_basic}" + if [ "x${litellm_config}" = "x" ]; then + echo "You must define a configuration file (litellm_${profile}_config)" + exit 1 + fi + + _read_envvars + + required_files="${litellm_config}" + command_args="-P ${pidfile} -p ${cpidfile} -f -ST ${name}-${profile} -t ${name}-${profile} \ + /usr/bin/env HOME=${litellm_chdir} \ + PRISMA_HOME_DIR=${litellm_chdir} \ + %%LOCALBASE%%/bin/litellm -c ${litellm_config} ${litellm_extra_args}" + eval litellm_enable="\${litellm_${profile}_enable:-${litellm_enable}}" + else + echo "$0: extra argument ignored" + fi +else + if [ "x${litellm_profiles}" != "x" -a "x$1" != "x" ]; then + for profile in ${litellm_profiles}; do + echo "===> litellm profile: ${profile}" + %%LOCALBASE%%/etc/rc.d/litellm $1 ${profile} + retcode="$?" + if [ "0${retcode}" -ne 0 ]; then + failed="${profile} (${retcode}) ${failed:-}" + else + success="${profile} ${success:-}" + fi + done + exit 0 + fi +fi + +litellm_start_precmd() +{ + install -d -m 0755 ${_pidprefix} + install -o ${litellm_user} /dev/null ${pidfile} + install -o ${litellm_user} /dev/null ${cpidfile} + + _read_envvars +} + +litellm_prismagen_precmd() +{ + _read_envvars +} + +litellm_prismagen() +{ + %%LOCALBASE%%/bin/prisma generate --schema %%PYTHON_SITELIBDIR%%/litellm_proxy_extras/schema.prisma +} + + +run_rc_command "$1" + diff --git a/misc/py-litellm/files/litellm.yaml.in b/misc/py-litellm/files/litellm.yaml.in new file mode 100644 --- /dev/null +++ b/misc/py-litellm/files/litellm.yaml.in @@ -0,0 +1,22 @@ +--- +# +# This is the sample configuration file for litellm +# For full description, read: +# https://docs.litellm.ai/docs/proxy/config_settings +# + +general_settings: + master_key: "sk-00112233445566778899" + +litellm_settings: + modify_params: true + transform_response: true + reasoning_format: "hidden" +# To use redis cache, uncomment the following: +# cache: true +# cache_params: +# type: "redis" +# url can also contain the database number (after a slash) +# url: "redis://redisuer:redispassword@redishost:6379" +# namespace is an redis namespace name +# namespace: "llmproxy.redis.cache" diff --git a/misc/py-litellm/files/pkg-message.in b/misc/py-litellm/files/pkg-message.in new file mode 100644 --- /dev/null +++ b/misc/py-litellm/files/pkg-message.in @@ -0,0 +1,14 @@ +[ +{ +type: install +message: <