@SeeM Napisano 8 godzin temu Zgłoszenie Share Napisano 8 godzin temu LiteLLM to jest takie jakby HAProxy dla klientów modeli językowych. Żeby nie łączyły się od razu do API Ollamy, ani do chmury, ale żeby było coś po drodze. Pełni rolę ogranicznika oraz wystawia swoje własne klucze, dzięki czemu ryzyko wklejenia wrażliwego klucza API przez użytkownika maleje do zera. Potrzebuje to bazy na Postgresie. Trzeba utworzyć bazę, rolę i nadać poniższe uprawnienia. # \c litellm You are now connected to database "litellm" as user "postgres". # grant all ON database litellm to litellm; # grant CONNECT on database litellm to litellm; # GRANT ALL PRIVILEGES ON SCHEMA public TO litellm; # ALTER ROLE "litellm" WITH LOGIN; Na razie testuję to sobie na venv w Pythonie 3.12 i takich oto zależnościach: aiohappyeyeballs==2.7.1 aiohttp==3.14.3 aiosignal==1.4.0 annotated-doc==0.0.5 annotated-types==0.8.0 anyio==4.15.1 APScheduler==3.11.3 attrs==26.1.0 azure-core==1.41.0 azure-identity==1.25.3 azure-storage-blob==12.30.1 backoff==2.2.1 boto3==1.43.89 botocore==1.43.89 certifi==2026.7.22 cffi==2.1.1 charset-normalizer==3.5.1 click==8.5.0 croniter==6.2.4 cryptography==50.0.1 distro==1.9.0 dnspython==2.8.0 email-validator==2.3.0 Expression==5.7.0 fastapi==0.141.1 fastapi-sso==0.22.0 fastuuid==0.14.0 filelock==3.32.5 frozenlist==1.8.0 fsspec==2026.7.0 granian==2.8.2 gunicorn==23.0.0 h11==0.16.0 hf-xet==1.6.0 hiredis==3.4.1 httpcore==1.0.9 httpx==0.28.1 httpx-sse==0.4.3 huggingface_hub==1.30.0 idna==3.19 importlib_metadata==8.9.0 inquirerpy==0.3.4 isodate==0.7.2 Jinja2==3.1.6 jiter==0.16.0 jmespath==1.1.0 jsonschema==4.26.0 jsonschema-specifications==2025.9.1 litellm==1.99.0 litellm-enterprise==0.1.59 litellm-proxy-extras==0.4.89 markdown-it-py==4.2.0 MarkupSafe==3.0.3 mcp==1.29.1 mdurl==0.1.2 msal==1.38.0 msal-extensions==1.3.1 multidict==6.7.1 nodeenv==1.10.0 numpy==2.5.2 oauthlib==3.3.1 openai==2.54.0 orjson==3.12.0 packaging==26.3 pfzy==0.3.4 polars==1.44.1 polars-runtime-32==1.44.1 prisma==0.13.0 prompt_toolkit==3.0.53 propcache==0.5.2 pycparser==3.0 pydantic==2.13.5 pydantic-settings==2.15.0 pydantic_core==2.46.5 Pygments==2.21.0 PyJWT==2.13.0 PyNaCl==1.6.2 pyroscope-io==0.8.16 python-dateutil==2.9.0.post0 python-dotenv==1.2.3 python-multipart==0.0.32 PyYAML==6.0.3 redis==8.1.0 referencing==0.37.0 regex==2026.9.3 requests==2.34.2 RestrictedPython==8.5 rich==13.9.4 rpds-py==2026.6.3 rq==2.12.0 s3transfer==0.19.2 six==1.17.0 sniffio==1.3.1 soundfile==0.14.0 sse-starlette==3.4.11 starlette==1.6.0 tiktoken==0.14.0 tokenizers==0.23.2 tomlkit==0.15.1 tqdm==4.70.0 typing-inspection==0.4.4 typing_extensions==4.16.0 tzlocal==5.4.4 urllib3==2.7.0 uvicorn==0.52.4 uvloop==0.22.1 wcwidth==0.8.3 websockets==15.0.1 yarl==1.24.5 zipp==4.1.0 Co potem? Konfiguracja jest trochę zakręcona. Trzeba sobie najpierw zorganizować Ollamę z jakimiś modelami. Potem trzeba napisać plik konfiguracyjny litellm_config.yaml dla LiteLLM: model_list: - model_name: granite litellm_params: model: ollama/granite4.2:8b api_base: http://host.local:11434 - model_name: gemma litellm_params: model: ollama/gemma4:12b api_base: http://host.local:11434 - model_name: qwen litellm_params: model: ollama/qwen3.5:9b api_base: http://host.local:11434 - model_name: bielik litellm_params: model: ollama/bielik-11b:Q5_K_M api_base: http://host.local:11434 router_settings: routing_strategy: latency-based-routing num_retries: 2 timeout: 601 fallbacks: - granite: ["qwen"] - bielik: ["gemma"] general_settings: master_key: admin store_prompts_in_spend_logs: true ###disable_env_credential_login: true database_url: "postgresql://litellm:[haslo_uzytkownika]@[host.bazodanowy.local]:5432/litellm" Teraz trzeba - ręcznie, bo LiteLLM sam tego nie robi - utworzyć tabele w bazie danych: prisma generate --schema lib/python3.12/site-packages/litellm/proxy/schema.prisma Zajmuje to zadziwiająco dużo czasu. Wygląda, jakby coś się zawiesiło, ale w końcu przejdzie. Uruchomienie LiteLLM: litellm --config litellm_config.yaml --port 4040 To również zajmuje bardzo dużo czasu. W końcu przejdzie. W przeglądarce trzeba wejść na stronę http://127.0.0.1:4040/ui/login/ i zalogować się: użytkownik: admin hasło: admin Hasło wynika z ustawienia general_settings.master_key z pliku litellm_config.yaml . Najważniejsze ustawienia są na stronie http://127.0.0.1:4040/ui/api-keys/ , gdzie można dodać nowy klucz, przypisać go do użytkowników, modeli i ustawić różne ograniczenia. Potem ten właśnie klucz podaje się na kliencie. Poniżej przykład uruchomienia aider: AIDER_ANALYTICS_DISABLE=true AIDER_CHECK_UPDATE=false AIDER_YES_ALWAYS=true AIDER_DARK_MODE=true LITELLM_PROXY_API_BASE=http://127.0.0.1:4040 LITELLM_PROXY_API_KEY=sk-[token_w_litellm] aider --model=litellm_proxy/granite Najlepiej byłoby uruchomić LiterLLM na zdalnym hoście, którym nie jest host z Ollamą. Wówczas można ładnie odseparować sieciowo klientów od Ollamy i zwyczajnie zmusić użytkowników do przechodzenia przez proxy. Pracuję jeszcze nad ukonteneryzowaniem tego LiteLLM na bazie CentOS, czy innym RHEL. Z jednej strony wydaje się to żadnym problemem, ale procedura przechodzenia przez migrację bazy danych oraz ustawienie master_key, a później jego odwołanie za pomocą ustawienia disable_env_credential_login: true i późniejsza konieczność zrestartowania aplikacji nie pomagają. Dodatkowo wszystkie ustawienia z pliku konfiguracyjnego są jakby "zamrożone" i nie można ich zmienić, klikając po panelu administracyjnym. Z jednej strony fajne, bo nikt niechcący nie zepsuje. Gorzej, kiedy na hoście z Ollamą aktualizuje się modele i wówczas trzeba poprawić plik konfiguracyjny LiteLLM i oczywiście restartować aplikację. --------------------------------------------------------------------------------------- Podsumowując. Bardzo mi się to podoba, ale widać, że projekt nie wyszedł z bety. Wersja z powyższego requirements.txt mi działa, ale na poprzedniej nie mogłem zrobić migracji bazy, z powodu jakiegoś błędu nawet nie w LiteLLM, tylko w prisma. Czuć trochę, że autorzy LiteLLM do Postgresa wolą się nie dotykać. Nawet u siebie w mieszkaniu ustawię to sobie na domowym serwerku chociażby po to, żeby mieć w logach aplikacji wszystkie prompty. Powodzenia! Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
prymula Napisano 6 godzin temu Zgłoszenie Share Napisano 6 godzin temu Być może zadam pytanie, godne najbardziej niekumatego lamera. Ale czy aby TO odpalić potrzeba czegoś takiego jak NPU czy GPU z CUDA ? w pliku konfiguracyjnym widzę odniesienie do mi. Bielika, więc wnioskuję że ... chyba tak Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się