Zum Inhalt springen

Queued Requests (Queue API)

Die /queue-Endpunkte funktionieren wie die /v2-Endpunkte, mit einem Unterschied: Wenn Sie Ihr Rate-Limit überschreiten, antwortet /v2 sofort mit 429 Too Many Requests, während /queue bis zu zwei Minuten wartet, bis Ihr Limit wieder frei ist, und die Anfrage dann ausführt.

  • Innerhalb Ihres Limits: Die Anfrage wird sofort ausgeführt.
  • Über Ihrem Limit: Die Anfrage wartet. Limits werden jede Minute zurückgesetzt, daher wird sie zu Beginn jeder Minute erneut geprüft.
  • Nach zwei Minuten noch über Ihrem Limit: Die Wartezeit ist begrenzt. Die Anfrage wartet nicht länger, und Sie erhalten 429 Too Many Requests mit einem Retry-After-Header, der angibt, nach wie vielen Sekunden Sie es erneut versuchen können. Der Body enthält Queue wait limit of 120 seconds reached. Diese Obergrenze sorgt dafür, dass ein ausgehungertes Projekt eine klare Antwort erhält statt eines undurchsichtigen 504 Gateway Timeout aus der Netzwerkschicht.

Die Obergrenze richtet sich nach der Kalenderminute, nicht nach dem Zeitpunkt, zu dem Ihre Anfrage eintrifft: Die Anfrage wird beim Eintreffen geprüft und erneut bei den nächsten beiden Minutenwechseln; nach dem zweiten gibt sie auf. Die tatsächliche Wartezeit liegt daher zwischen einer und zwei Minuten, je nachdem, wann innerhalb der Minute Sie die Anfrage gesendet haben.

Stellen Sie das Client-Timeout auf mindestens zwei Minuten plus die erwartete Antwortzeit ein, sonst gibt Ihr Client möglicherweise auf, bevor die Queue es tut. Wenn Sie die Verbindung während des Wartens schließen, wird die Anfrage abgebrochen.

Ein 429 von /queue bedeutet, dass Sie dauerhaft mehr senden, als Ihr Limit erlaubt, nicht nur eine kurze Spitze. Eine einzelne Anfrage mit mehr Input-Tokens als Ihr Token-Limit pro Minute passt nie und läuft daher immer nach zwei Minuten in den Timeout. Senden Sie langsamer oder beantragen Sie ein höheres Limit.

  • Verwenden Sie /queue für Batch-Jobs, die gelegentlich über dem Limit liegen, damit kurze Spitzen warten statt fehlzuschlagen.
  • Verwenden Sie /v2 für interaktive Anwendungen, bei denen ein sofortiger 429 besser ist als Warten, und für lang laufende Anfragen (nutzen Sie Streaming).

Jeder Standard-Endpunkt hat ein /queue-Aequivalent:

Standard-EndpunktQueue-EndpunktBeschreibung
POST /v2/chat/completionsPOST /queue/chat/completionsChat Completion
POST /v2/completionsPOST /queue/completionsText Completion
POST /v2/embeddingsPOST /queue/embeddingsEmbeddings
POST /v2/audio/transcriptionsPOST /queue/audio/transcriptionsAudio Transcription
POST /v2/audio/translationsPOST /queue/audio/translationsAudio Translation
POST /v2/images/generationsPOST /queue/images/generationsImage Generation
POST /v2/images/editsPOST /queue/images/editsImage Edit
GET /v2/modelsGET /queue/modelsModelle auflisten

Der Request-Body fuer jeden Queue-Endpunkt ist identisch mit seinem Standard-Gegenstueck — aendern Sie einfach den Basispfad von /v2 zu /queue.

Senden Sie eine Chat Completion an die Warteschlange:

Terminal-Fenster
curl -X POST "https://llm-server.llmhub.t-systems.net/queue/chat/completions" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-oss-120b",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Write a detailed analysis of renewable energy trends in Europe."}
],
"max_tokens": 2000
}'

Verarbeiten Sie mehrere Prompts effizient ueber die Warteschlange:

import asyncio
from openai import AsyncOpenAI
client = AsyncOpenAI(
base_url="https://llm-server.llmhub.t-systems.net/queue",
)
prompts = [
"Summarize the benefits of solar energy.",
"Explain how wind turbines generate electricity.",
"Describe the future of hydrogen fuel cells.",
]
async def process_prompt(prompt):
response = await client.chat.completions.create(
model="gpt-oss-120b",
messages=[{"role": "user", "content": prompt}],
max_tokens=500,
)
return response.choices[0].message.content
async def main():
tasks = [process_prompt(p) for p in prompts]
results = await asyncio.gather(*tasks)
for prompt, result in zip(prompts, results):
print(f"Prompt: {prompt[:50]}...")
print(f"Result: {result[:100]}...\n")
asyncio.run(main())
from openai import OpenAI
client = OpenAI(
base_url="https://llm-server.llmhub.t-systems.net/queue",
)
response = client.embeddings.create(
model="text-embedding-bge-m3",
input="The benefits of renewable energy in Europe",
)
print(f"Embedding dimension: {len(response.data[0].embedding)}")
from openai import OpenAI
client = OpenAI(
base_url="https://llm-server.llmhub.t-systems.net/queue",
)
with open("meeting_recording.mp3", "rb") as audio_file:
transcript = client.audio.transcriptions.create(
model="whisper-large-v3",
file=audio_file,
)
print(transcript.text)
from openai import OpenAI
client = OpenAI(
base_url="https://llm-server.llmhub.t-systems.net/queue",
)
result = client.images.generate(
model="gpt-image-2",
prompt="A futuristic data center powered by renewable energy",
)
print(result.data[0].b64_json[:50] + "...")