LLM API
Jako dodatkową usługę oferujemy możliwość korzystania z dużych modeli językowych.
Są one dostępne przez API częściowo kompatybilne z OpenAI API oraz
Anthropic Messages API, które widnieje pod adresem
https://llm.comtegra.cloud/v1.
Umożliwiamy korzystanie z następujących zasobów:
- /v1/chat/completions
- /v1/models
- /v1/embeddings
- /v1/audio/transcriptions
- /v1/messages — Anthropic Messages API
- /v1/responses — OpenAI Responses API
Uwierzytelnienie odbywa się za pomocą klucza. Aby rozpocząć korzystanie z API, wystarczy utworzyć klucz za pomocą klienta CGC.
Pole model w każdym zapytaniu określa używany model.
Nazwy modeli użyte poniżej są jedynie poglądowe — wywołaj /v1/models, aby
zobaczyć dostępne modele i użyj jednego ze zwróconych identyfikatorów.
Przykłady użycia
Chat
- Python
- curl
from openai import OpenAI
client = OpenAI(base_url="https://llm.comtegra.cloud/v1",
api_key="YOUR-API-SECRET")
res = client.chat.completions.create(model="llama3-8b", max_completion_tokens=100,
messages=[{"role": "user", "content": "Hi"}])
print(res)
curl \
-H 'Authorization: Bearer YOUR-API-SECRET' \
-d '{"model": "llama3-8b", "messages": [{"role": "user", "content": "Hi"}]}' \
'https://llm.comtegra.cloud/v1/chat/completions'
To polecenie jest przeznaczone do wykonania przez program curl. W Power Shellu curl to alias polecenia Invoke-WebRequest, które nie jest kompatybilne z curlem.
Embeddings
- Python
- curl
from openai import OpenAI
client = OpenAI(base_url="https://llm.comtegra.cloud/v1",
api_key="YOUR-API-SECRET")
res = client.embeddings.create(model="gte-qwen2-7b", input="Mary had a little lamb")
print(res)
curl \
-H 'Authorization: Bearer YOUR-API-SECRET' \
-d '{"model": "gte-qwen2-7b","input": "Mary had a little lamb", "pooling": "mean"}' \
'https://llm.comtegra.cloud/v1/embeddings'
To polecenie jest przeznaczone do wykonania przez program curl. W Power Shellu curl to alias polecenia Invoke-WebRequest, które nie jest kompatybilne z curlem.
Transcriptions
- Python
- curl
from openai import OpenAI
client = OpenAI(base_url="https://llm.comtegra.cloud/v1",
api_key="YOUR-API-SECRET")
with open("recording.mp3", "rb") as f:
res = client.audio.transcriptions.create(model="whisper-1", file=f)
print(res)
curl \
-H 'Authorization: Bearer YOUR-API-SECRET' \
-F file=@'recording.mp3' \
-F model='whisper-1' \
'https://llm.comtegra.cloud/v1/audio/transcriptions'
To polecenie jest przeznaczone do wykonania przez program curl. W Power Shellu curl to alias polecenia Invoke-WebRequest, które nie jest kompatybilne z curlem.
Proxy zawsze zwraca format verbose_json, który zawiera długość nagrania
wykorzystywaną do rozliczeń. Formaty text, srt oraz vtt nie są obsługiwane.
Messages
Zasób Anthropic Messages API umożliwia korzystanie z naszych modeli narzędziom agentowym, takim jak Claude Code oraz Anthropic SDK.
- Python
- curl
from anthropic import Anthropic
# Anthropic SDK samo dokleja "/v1/messages" do adresu bazowego, więc ustaw go na
# https://llm.comtegra.cloud (bez "/v1"). Uwierzytelniaj się przez auth_token,
# który wysyłany jest jako token bearer; argument api_key (x-api-key) nie jest
# obsługiwany.
client = Anthropic(base_url="https://llm.comtegra.cloud",
auth_token="YOUR-API-SECRET")
res = client.messages.create(model="llama3-8b", max_tokens=100,
messages=[{"role": "user", "content": "Hi"}])
print(res)
curl \
-H 'Authorization: Bearer YOUR-API-SECRET' \
-d '{"model": "llama3-8b", "max_tokens": 100, "messages": [{"role": "user", "content": "Hi"}]}' \
'https://llm.comtegra.cloud/v1/messages'
To polecenie jest przeznaczone do wykonania przez program curl. W Power Shellu curl to alias polecenia Invoke-WebRequest, które nie jest kompatybilne z curlem.
Anthropic SDK oraz narzędzia kompatybilne z Anthropic (takie jak Claude Code)
budują adres zapytania jako <adres bazowy>/v1/messages, dlatego ustaw ich adres
bazowy na https://llm.comtegra.cloud — bez /v1 używanego przez zasoby w stylu
OpenAI — i uwierzytelniaj się tokenem bearer (parametr auth_token w SDK).
Schemat x-api-key nie jest obsługiwany.
Responses
Zasób OpenAI Responses API obsługuje narzędzia agentowe, takie jak Codex CLI.
- Python
- curl
from openai import OpenAI
client = OpenAI(base_url="https://llm.comtegra.cloud/v1",
api_key="YOUR-API-SECRET")
res = client.responses.create(model="llama3-8b", input="Hi")
print(res)
curl \
-H 'Authorization: Bearer YOUR-API-SECRET' \
-d '{"model": "llama3-8b", "input": "Hi"}' \
'https://llm.comtegra.cloud/v1/responses'
To polecenie jest przeznaczone do wykonania przez program curl. W Power Shellu curl to alias polecenia Invoke-WebRequest, które nie jest kompatybilne z curlem.
Ten zasób jest bezstanowy: w każdym zapytaniu wysyłaj pełną historię rozmowy
w polu input. Stan rozmowy po stronie serwera (previous_response_id,
conversation oraz zapytania background) nie jest obsługiwany.
Klucze API
cgc api-keys create --level LLM
Wypisany zostanie klucz z etykietą API secret. Zapisz go w wygodnym i bezpiecznym miejscu. Nie ma możliwości podejrzeć go drugi raz, więc jeśli go stracisz, usuń go i stwórz nowy. Nie ujawniaj swojego klucza, gdyż może to powodować naliczenie opłat za użycie API przez osoby trzecie.
Do kluczy, przypisanych do Twojego konta można dodać komentarze. Ułatwia to ich identyfikację.
cgc api-keys create --level LLM --comment "Klucz Michała"
Wszystkie dostępne opcje można zobaczyć, wykonując polecenie
cgc api-keys --help.
Billing
Zapytania do API doliczane są do rachunku Twojej organizacji. Ich koszt zależy od liczby tokenów wejściowych i wyjściowych, modelu i GPU. Wyjątkiem jest transkrypcja audio, rozliczana za każdą sekundę przetworzonego nagrania. Cennik dostępny jest na stronie cgc.comtegra.cloud/pricing.
Zużycie tokenów i ich koszt można zobaczyć za pomocą polecenia
cgc billing status.
Przykład obliczenia kosztu zapytania:
Używasz modelu Meta-Llama 3.1-70B-Instruct-Q5_K_M, uruchomionego na GPU NVIDIA A100 GPU. Załóżmy, że tokeny wejściowe kosztują 19,78 zł / 1M tok. a tokeny wyjściowe -- 167,66 zł / 1M tok. Twoje zapytanie to: Write a haiku about ChatGPT. Jest ono długości 18 tokenów. Dostajesz następującą odpowiedź: Silicon whispers. ChatGPT's gentle responses. Knowledge at my door, której długość to 16 tokenów. To zapytanie będzie kosztować 19,78 zł * 18 / 1000000 + 167,66 zł * 16 / 1000000 = 0,003039 zł.
Własna instancja LLM API
Jeśli używasz jednocześnie kilku modeli w swoim własnym namespace, możesz uruchomić własną instancję LLM API. Umożliwia ona kontrolę dostępu do modeli i gromadzenie informacji o użyciu tokenów przez każdego z użytkowników.
Działania administracyjne takie, jak zarządzanie użytkownikami i monitorowanie użycia wymagają dostępu SSH do własnego kontenera LLM API. Instrukcja konfiguracji dostępu SSH znajduje się tutaj.
Tworzenie własnej instancji
Najpierw utwórz wolumen, który będzie służył do przechowywania pliku konfiguracyjnego i bazy danych.
cgc volume create -s 1 llm-api-data
Nastepnie uruchom swoją instancję LLM API.
cgc compute create -n llm-api -c 1 -m 2 -v llm-api-data llm-api
Domyślnie wolumen zostanie zamontowany pod ścieżką /media/api.
Kiedy aplikacja uruchomi się po raz pierwszy, utworzy ona plik konfiguracyjny
w /media/api/config.toml i zainicjalizuje bazę danych w /media/api/db.sqlite.
Domyślny plik konfiguracyjny zawiera komentarze, które tłumaczą dostepne opcje
i przykładowe fragmenty konfiguracji.
Do edycji pliku konfiguracyjnego polecamy użycie
File Browser.
Aby po edycji i zapisaniu pliku aplikacja przeładowała konfigurację można
zrestartować ją poleceniem cgc resource restart.
Alternatywną opcją jest wysłanie do aplikacji sygnału HUP, który spowoduje
przeładowanie konfiguracji backendów bez restartu aplikacji.
W tym celu należy zalogować się do kontenera aplikacji LLM API wykonać polecenie
kill -1 1.
Do polecenia cgc compute create llm-api można dodać argument
--config=/ścieżka/do/pliku, aby wskazać niestandardową lokalizację pliku
konfiguracyjnego.
Zarządzanie użytkownikami
Dodanie nowego użytkownika sprowadza się do wygenerowania nowego klucza API. Zaloguj się przez SSH do swojego kontenera LLM API i wykonaj następujące polecenie.
llmproxyctl user create --comment 'John Smith' --expires '2030-01-01 13:37'
# z argumentami w krótszej postaci
llmproxyctl user create -t 'John Smith' -e '2030-01-01 13:37'
Program wypisze informacje o nowym użytkowniku i wygenerowany losowo klucz.
User created
Expires: 2030-01-01 12:37:00+00:00
Comment: John Smith
Hash: dd2a60b77cb2
Plain API key: 3FpwuzyXdU-u3bm8hg9ipA3ZB7JFWSqYHPRw1EMeQsB-XuV5cJ_...
Warto zauważyć, że nie ma możliwości ponownego wypisania klucza do API w tej postaci. Jest to spowodowane faktem, że klucze są przechowywane w bazie danych w postaci skróconej (hasz).
Listę wszystkich użytkowników można uzyskać następującym poleceniem.
llmproxyctl user list
Jest również możliwość edycji komentarza lub daty wygaśnięcia dostępu użytkownika. Zwróć uwagę na pierwszą kolumnę listy użytkowników (Hash). Wybór użytkownika do edycji odbywa się na podstawie kilku pierwszych znaków tego hasza, na przykład (tutaj: da):
llmproxyctl user list
Hash Expires Status Comment
------------ -------------------- ------- -------
dd2a60b77cb2 2030-01-01 12:37:00 active John Smith
a26a23f52cd8 - active Sam Altman
da7534bd88a0 2022-10-26 22:00:00 expired Jack Dorosey
llmproxyctl user update -t "Elon Musk" -e '2030-01-01 00:00' da
User updated
llmproxyctl user list
Hash Expires Status Comment
------------ -------------------- ------- -------
dd2a60b77cb2 2030-01-01 12:37:00 active John Smith
a26a23f52cd8 - active Sam Altman
da7534bd88a0 2030-01-01 00:00:00 active Elon Musk
Wyłączenie danego klucza odbywa się poprzez ustawienie jego daty wygaśnięcia na specjalną wartość now.
llmproxyctl user update -e now da