Transformers documentation

Serve CLI

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Serve CLI

transformers serve CLI, yerel veya kendi barındırılan sunucular için hafif bir seçenektir. vLLM gibi özel çıkarım motorlarının getirdiği ek çalışma zamanı ve operasyonel yükten kaçınır. Değerlendirme, deneysel çalışmalar ve orta düzey yük dağıtımları için kullanın. kesintisiz toplu işleme gibi özellikler, verimliliği artırır ve gecikmeyi düşürür.

Büyük ölçekli üretim dağıtımları için, arka uç olarak bir Transformer modeliyle birlikte vLLM veya SGLang kullanın. Daha fazla bilgi için Inference backends kılavuzuna göz atın.

transformers serve komutu, OpenAI SDK ile uyumlu yerel bir sunucu başlatır. Sunucu birçok üçüncü taraf uygulama ile çalışır ve aşağıdaki REST API'lerini destekler.

  • metin, görüntü, ses ve video istekleri için /v1/chat/completions
  • Serbest biçimli bir istemden gelen geleneksel metin tamamlamaları için /v1/completions
  • /v1/responses, Responses API destekler
  • ses transkripsiyonları için /v1/audio/transcriptions
  • /v1/systemone, izin verilen her cevap için bir olasılık vererek yazılı soruları (seçmeli, puanlı, evet/hayır) yanıtlar
  • /v1/models, üçüncü taraf entegrasyonları için kullanılabilir modelleri listeler
  • /load_model, model yükleme ilerlemesini SSE üzerinden iletir

Sunum bağımlılıklarını yükleyin.

pip install transformers[serving]

transformers serve komutunu çalıştırarak bir sunucu başlatın. Varsayılan sunucu adresi http://localhost:8000'dir.

transformers serve

v1/chat/completions

v1/chat/completions API'si, Chat Completions API üzerine kuruludur. LLM'ler, VLM'ler ve çok modlu modeller için metin, görüntü, ses ve video isteklerini destekler. curl, InferenceClient veya OpenAI istemcisiyle kullanabilirsiniz.

Metin tabanlı tamamlamalar

huggingface_hub
huggingface_hub (akış)
openai
openai (stream)
curl
curl (akış)
from huggingface_hub import InferenceClient

messages = [{"role": "user", "content": "What is the Transformers library known for?"}]
client = InferenceClient("http://localhost:8000")

result = client.chat_completion(messages, model="Qwen/Qwen2.5-0.5B-Instruct", max_tokens=256)
print(result.choices[0].message.content)

InferenceClient yazdırılmış bir dize döndürür.

The Transformers library is primarily known for its ability to create and manipulate large-scale language models [...]

Görüntü tabanlı tamamlamalar

huggingface_hub
huggingface_hub (akış)
openai
openai (stream)
curl
curl (akış)
from huggingface_hub import InferenceClient

messages = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "What's in this image?"},
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/astronaut.jpg",
                }
            },
        ],
    }
]
client = InferenceClient("http://localhost:8000")

result = client.chat_completion(messages, model="Qwen/Qwen2.5-VL-7B-Instruct", max_tokens=256)
print(result.choices[0].message.content)

InferenceClient yazdırılmış bir dize döndürür.

The image depicts an astronaut in a space suit standing on what appears to be the surface of the moon, given the barren, rocky landscape and the dark sky in the background. The astronaut is holding a large egg that has cracked open, revealing a small creature inside. The scene is imaginative and playful, combining elements of space exploration with a whimsical twist involving the egg and the creature.

Ses tabanlı tamamlamalar

Gemma 4 ve Qwen2.5-Omni gibi çok modlu modeller, OpenAI input_audio içerik türü üzerinden ses girdisi kabul eder. Sesi Base64 ile kodlayın ve biçimi (mp3 veya wav) belirtin.

huggingface_hub
huggingface_hub (akış)
openai
openai (stream)
curl
curl (akış)
import base64
from huggingface_hub.utils import httpx
from huggingface_hub import InferenceClient

audio_url = "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/obama_first_45_secs.mp3"
audio_b64 = base64.b64encode(httpx.get(audio_url, follow_redirects=True).content).decode()

messages = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "Transcribe this audio."},
            {"type": "input_audio", "input_audio": {"data": audio_b64, "format": "mp3"}},
        ],
    }
]
client = InferenceClient("http://localhost:8000")

result = client.chat_completion(messages, model="google/gemma-4-E2B-it", max_tokens=256)
print(result.choices[0].message.content)

InferenceClient yazdırılmış bir dize döndürür.

This week, I traveled to Chicago to deliver my final farewell address to the nation, following in the tradition of presidents before me. It was an opportunity to say thank you. Whether we've seen eye to eye or rarely agreed at all, my conversations with you, the American people, in living rooms and schools, at farms and on factory floors, at diners, and on distant military outposts, all these conversations are what have kept me honest.

audio_url içerik türü, OpenAI standardının bir parçası olmayan bir uzantıdır ve gelecekteki sürümlerde değişebilir.

Ayrıca, base64 kodlamayı atlamak için ses dosyasını audio_url içerik türüyle URL üzerinden de iletebilirsiniz.

completion = client.chat.completions.create(
    model="google/gemma-4-E2B-it",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Transcribe this audio."},
                {"type": "audio_url", "audio_url": {"url": "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/obama_first_45_secs.mp3"}},
            ],
        }
    ],
)

Video tabanlı tamamlamalar

video_url içerik türü, OpenAI standardının bir parçası olmayan bir uzantıdır ve gelecekteki sürümlerde değişebilir.

Video girişi için video_url içerik türünü kullanın. Model ses destekliyorsa (ör. Gemma 4, Qwen2.5-Omni), sunucu videodan ses kaydını çıkarır ve görsel karelerle birlikte işler.

Video işleme torchcodec gerektirir. pip install torchcodec komutuyla yükleyin.

huggingface_hub
huggingface_hub (akış)
openai
openai (stream)
curl
curl (akış)
from huggingface_hub import InferenceClient

messages = [
    {
        "role": "user",
        "content": [
            {"type": "video_url", "video_url": {"url": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/concert.mp4"}},
            {"type": "text", "text": "What is happening in the video and what is the song about?"},
        ],
    }
]
client = InferenceClient("http://localhost:8000")

result = client.chat_completion(messages, model="google/gemma-4-E2B-it", max_tokens=256)
print(result.choices[0].message.content)

InferenceClient yazdırılmış bir dize döndürür.

The video captures a live music performance at a music festival or a large concert. There are several musicians on stage, including a central figure playing an acoustic guitar and singing. The foreground is filled with the backs of the audience, indicating a large crowd watching the show. The stage is dramatically lit with bright spotlights and blue and white stage lighting, with haze and smoke creating an immersive atmosphere.

The lyrics of the song are: "I don't care 'bout street, from that fresh street, 'cause there's no problem, another one I want to be, in the storm..."

Çok turlu sohbetler

Çok turlu bir sohbet için, messages listesine user ve assistant rolleriyle sırayla değişen tam sohbet geçmişini ekleyin. Tüm OpenAI uyumlu sunucularda olduğu gibi API durumdan bağımsızdır (stateless), bu nedenle her istek tam sohbet geçmişini içermelidir.

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="<random_string>")

completion = client.chat.completions.create(
    model="Qwen/Qwen2.5-0.5B-Instruct",
    messages=[
        {"role": "user", "content": "What is the capital of France?"},
        {"role": "assistant", "content": "The capital of France is Paris."},
        {"role": "user", "content": "How many people live there?"},
    ],
)
print(completion.choices[0].message.content)

“Orada kaç kişi yaşıyor?” şeklindeki takip sorusu, önceki bağlama dayanır; bu nedenle model Paris hakkında yanıt verir.

As of 2021, the population of Paris is approximately 2.2 million people.

v1/completions

v1/completions API’si, eski Completions API’sine dayanır. /v1/chat/completions’ün aksine, sohbet mesajları yerine serbest biçimli bir prompt alır ve üretilen metni choices[].text içinde döndürür. Bu, sohbet şablonuna ihtiyaç duyulmayan temel (non-instruct) modeller ve metin tamamlama görevleri için faydalıdır. Ayrıca, ortadan doldurma (fill-in-the-middle) metin ekleme işlemleri için suffix parametresini de destekler.

curl
openai
curl -X POST http://localhost:8000/v1/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen2.5-0.5B",
    "prompt": "The capital of France is",
    "max_tokens": 20
  }'

Komut aşağıdaki yanıtı döndürür.

{
  "id": "chatcmpl-abc123",
  "object": "text_completion",
  "created": 1234567890,
  "model": "Qwen/Qwen2.5-0.5B@main",
  "choices": [
    {
      "text": " Paris, and the capital of the United States is Washington, D.C.",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 5,
    "completion_tokens": 16,
    "total_tokens": 21
  }
}

v1/responses

Responses API, OpenAI’nin üretim için en yeni API uç noktasıdır. Durumlu etkileşimleri destekler ve bir modelin yeteneklerini genişletmek için yerleşik araçları entegre eder. OpenAI, yeni projelerde Chat Completions API yerine Responses API kullanmayı önermektedir.

v1/responses API'si, curl komutu ve OpenAI istemcisi aracılığıyla metin, görüntü, ses ve video isteklerini destekler.

Metin tabanlı yanıtlar

openai
openai (stream)
curl
curl (akış)
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="<random_string>")

response = client.responses.create(
    model="Qwen/Qwen2.5-0.5B-Instruct",
    input="Tell me a three sentence bedtime story about a unicorn.",
    max_output_tokens=256,
    stream=False,
)
print(response.output[0].content[0].text)

OpenAI istemcisi yazdırılmış bir dize döndürür.

Once upon a time, in a faraway land, there lived a beautiful unicorn named Luna [...]

Görüntü tabanlı yanıtlar

Responses API ayrıca görüntü, ses ve video girdilerini de destekler.

openai
openai (stream)
curl
curl (akış)
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="<random_string>")

response = client.responses.create(
    model="Qwen/Qwen2.5-VL-7B-Instruct",
    input=[
        {"type": "input_text", "text": "What's in this image?"},
        {
            "type": "input_image",
            "image_url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/astronaut.jpg",
        },
    ],
    max_output_tokens=256,
    stream=False,
)
print(response.output[0].content[0].text)

OpenAI istemcisi yazdırılmış bir dize döndürür.

The image depicts an astronaut in a space suit standing on what appears to be the surface of the moon, given the barren, rocky landscape and the dark sky in the background. The astronaut is holding a large egg that has cracked open, revealing a small creature inside. The scene is imaginative and playful, combining elements of space exploration with a whimsical twist involving the egg and the creature.

Ses tabanlı yanıtlar

openai
openai (stream)
curl
curl (akış)
import base64
from huggingface_hub.utils import httpx
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="<random_string>")

audio_url = "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/obama_first_45_secs.mp3"
audio_b64 = base64.b64encode(httpx.get(audio_url, follow_redirects=True).content).decode()

response = client.responses.create(
    model="google/gemma-4-E2B-it",
    input=[
        {"type": "input_text", "text": "Transcribe this audio."},
        {"type": "input_audio", "input_audio": {"data": audio_b64, "format": "mp3"}},
    ],
    max_output_tokens=256,
    stream=False,
)
print(response.output[0].content[0].text)

OpenAI istemcisi yazdırılmış bir dize döndürür.

This week, I traveled to Chicago to deliver my final farewell address to the nation, following in the tradition of presidents before me. It was an opportunity to say thank you. Whether we've seen eye to eye or rarely agreed at all, my conversations with you, the American people, in living rooms and schools, at farms and on factory floors, at diners, and on distant military outposts, all these conversations are what have kept me honest.

audio_url içerik türü, OpenAI standardının bir parçası olmayan bir uzantıdır ve gelecekteki sürümlerde değişebilir.

Ayrıca, base64 kodlamayı atlamak için ses dosyasını audio_url içerik türüyle URL üzerinden de iletebilirsiniz.

response = client.responses.create(
    model="google/gemma-4-E2B-it",
    input=[
        {"type": "input_text", "text": "Transcribe this audio."},
        {"type": "audio_url", "audio_url": {"url": "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/obama_first_45_secs.mp3"}},
    ],
    max_output_tokens=256,
    stream=False,
)

Video tabanlı yanıtlar

video_url içerik türü, OpenAI standardının bir parçası olmayan bir uzantıdır ve gelecekteki sürümlerde değişebilir.

Video işleme torchcodec gerektirir. pip install torchcodec komutuyla yükleyin.

openai
openai (stream)
curl
curl (akış)
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="<random_string>")

response = client.responses.create(
    model="google/gemma-4-E2B-it",
    input=[
        {"type": "input_text", "text": "What is happening in the video and what is the song about?"},
        {"type": "video_url", "video_url": {"url": "https://huggingface.co/datasets/merve/vlm_test_images/resolve/main/concert.mp4"}},
    ],
    max_output_tokens=256,
    stream=False,
)
print(response.output[0].content[0].text)

OpenAI istemcisi yazdırılmış bir dize döndürür.

The video captures a live music performance at a music festival or a large concert. There are several musicians on stage, including a central figure playing an acoustic guitar and singing. The foreground is filled with the backs of the audience, indicating a large crowd watching the show. The stage is dramatically lit with bright spotlights and blue and white stage lighting, with haze and smoke creating an immersive atmosphere.

The lyrics of the song are: "I don't care 'bout street, from that fresh street, 'cause there's no problem, another one I want to be, in the storm..."

Çok turlu sohbetler

Çok turlu sohbetler için, input alanına role anahtarlarına sahip bir mesaj listesi iletin. Tüm OpenAI uyumlu sunucularda olduğu gibi API durumdan bağımsızdır (stateless), bu nedenle her istek tam sohbet geçmişini içermelidir.

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="<random_string>")

response = client.responses.create(
    model="Qwen/Qwen2.5-0.5B-Instruct",
    input=[
        {"role": "user", "content": "What is the capital of France?"},
        {"role": "assistant", "content": "The capital of France is Paris."},
        {"role": "user", "content": "How many people live there?"},
    ],
    max_output_tokens=256,
    stream=False,
)
print(response.output[0].content[0].text)

“Orada kaç kişi yaşıyor?” şeklindeki takip sorusu, önceki bağlama dayanır; bu nedenle model Paris hakkında yanıt verir.

As of 2021, Paris has a population of approximately 2.8 million people.

v1/systemone

v1/systemone uç noktası, TypeSafe’in System One API’sini izleyerek paylaşılan bir state hakkında tipli soruları yanıtlar. Destek biletini yönlendirme, aciliyet derecelendirme veya bir eylem seçme gibi kararlar için kullanın.

Model, metin üretmeden, izin verilen yanıtları tek bir toplu ileri geçişte puanlar. Bu uç nokta, sohbet şablonu olan otoregresif modelleri destekler;

Bir model, değerlendirilecek durumu ve isimle eşleştirilmiş soruları gönderin:

curl
TypeSafe (TypeScript)
curl http://localhost:8000/v1/systemone \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen2.5-1.5B-Instruct",
    "state": "Our integration has been failing for 3 days and we are losing sales!",
    "questions": {
      "team": {
        "type": "choice",
        "instructions": "Which team handles this?",
        "criteria": {"billing": null, "technical": "Bugs or integration problems"}
      },
      "urgency": {
        "type": "score",
        "instructions": "How urgent is this ticket?",
        "criteria": ["low", "medium", "high"]
      },
      "upset": {"type": "noul", "instructions": "Is the customer upset?"}
    }
  }'

Cevaplar aynı soru adlarını kullanır. Örneğin:

{
  "model": "Qwen/Qwen2.5-1.5B-Instruct",
  "answers": {
    "team": {"type": "choice", "choice": "technical", "probabilities": {"billing": 0.000006962256520637311, "technical": 0.999993085861206}, "confidence": 0.9999861717224121},
    "urgency": {"type": "score", "score": 1.6739138662815094, "legend": {"0": "low", "1": "medium", "2": "high"}, "probabilities": {"0": 0.0031353600788861513, "1": 0.31981542706489563, "2": 0.6770492196083069}, "confidence": 0.5108707791659981},
    "upset": {"type": "noul", "noul": 0.851952850818634}
  },
  "usage": {"input_tokens": 213, "output_tokens": 0}
}
Soru türücriteriaCevap
choicenull olabilecek açıklamalara eşlenen seçenek adları.En olası seçenek, seçenek olasılıkları ve güven düzeyi.
scoreEn düşükten en yükseğe sıralanmış seviye açıklamaları.Olasılık ağırlıklı seviye indeksi, olasılıklar, bir lejant ve güven düzeyi.
noultrue ve false için isteğe bağlı açıklamalar.true olasılığı.

state, isteğe bağlı instructions ve açıklamalar metin veya JSON nesneleri ve dizileri içerebilir. Her istek, soru başına 1–26 seçenek veya puan seviyesi ile en fazla 64 soru kabul eder.

Görüntü işleme yeteneğine sahip modeller için, en fazla dört data:image/...;base64,... URL'si içeren bir images dizisi ekleyin. Her soru aynı görüntüleri alır. Modelin işlemcisi ve sohbet şablonu görüntüleri desteklemelidir; uzak görüntü URL'leri kabul edilmez.

Karar yapılandırması

Karar modelleri henüz istemleri, yanıt etiketlerini ve kalibrasyon ayarlarını depolamak için ortak bir standarda sahip değildir. Bu ayarlar model uygulamaları arasında farklılık gösterdiğinden, --decision-config ile bunları açıkça belirleyebilirsiniz. Özel karar başlıklarına sahip modeller hâlâ uyumlu bir uygulama gerektirir; bu dosya yalnızca istem biçimlendirmesini ve sonraki token puanlamasını yapılandırır.

Varsayılan olarak, sorular yedek bir istem ve düşünme özelliği devre dışı bırakılmış model sohbet şablonunu kullanır. Seçenekler ve puanlar için etiketler A–Z, boole değerleri için ise Yes/No şeklindedir. Olasılıklar, bu etiketler üzerinde sıcaklık 1'de hesaplanan softmax'tır.

Bir model için bu varsayılanları geçersiz kılmak için --decision-config parametresini iletin:

transformers serve openjev/openjev --decision-config decision.json

JSON dosyası üç isteğe bağlı alanı destekler:

AlanAnlam
labelsSoru türüne göre, seçenek sırasına göre (noul için true, ardından false) cevap etiketlerini belirtin. Her biri ayrı, bilinen tek bir jeton olmalıdır.
temperatureSoru türüne göre pozitif sıcaklıklar, softmax(label_logits / temperature) olarak uygulanır.
chat_templateSohbet biçimlendirmesini ve asistan önekini de içeren, tam istemin yerini alan satır içi Jinja şablonu.

Örneğin, varsayılan istemciyi koruyarak etiketleri ve kalibrasyonu değiştirmek için:

{
  "labels": {"noul": ["A", "B"]},
  "temperature": {"choice": 0.85, "score": 0.85, "noul": 1.5547129}
}

Özel bir şablon, standart messages alanının yanı sıra ham state, images ve question alanlarını alır. Soru, name, type, instructions, options, labels, descriptions ve legend alanlarını açığa çıkarır; seçenekler, etiketler ve açıklamalar aynı sırayı paylaşır. Yedek ifadelerin yerini almak için bu alanları ve yapılandırılmış değerleri görüntülemek için tojson kullanın. Görsel girdiler için şablonlar, modelin görsel yer tutucularını içermelidir.

Dosya, başlangıçta yüklenir ve yalnızca /v1/systemone için geçerlidir. Atlanan ayarlar varsayılan değerlerini korur; karar yapılandırması, checkpoint'ten otomatik olarak okunmaz.

v1/audio/transcriptions

v1/audio/transcriptions uç noktası, konuşmadan metne modelleri kullanarak sesleri transkribe eder. Ses transkripsiyonu API'si biçimini izler.

curl -X POST http://localhost:8000/v1/audio/transcriptions \
  -H "Content-Type: multipart/form-data" \
  -F "file=@/path/to/audio.wav" \
  -F "model=openai/whisper-large-v3"

Komut aşağıdaki yanıtı döndürür.

{
  "text": "Transcribed text from the audio file",
}

v1/models

v1/models uç noktası, yerel Hugging Face önbelleğinizi tarar ve indirilen modellerin listesini OpenAI ile uyumlu biçimde döndürür. Üçüncü taraf araçlar, kullanılabilir modelleri keşfetmek için bu uç noktayı kullanır.

transformers serve komutunu çalıştırmadan önce bir model indirin.

transformers download Qwen/Qwen2.5-0.5B-Instruct

İndirme tamamlandıktan sonra model, /v1/models yanıtlarında görünür.

curl http://localhost:8000/v1/models

Uç nokta, kullanılabilir modelleri içeren bir JSON nesnesi döndürür.

Modellerin yüklenmesi

/load_model uç noktası bir modeli önceden yükler ve ilerlemeyi Server-Sent Events (SSE) üzerinden iletir. transformers chat CLI aracı bunu otomatik olarak kullanır; böylece kullanıcılar asılı kalan bir istem yerine indirme ve yükleme ilerlemesini görür. Çıkarım isteklerini göndermeden önce bir modeli ısıtmak için kullanın.

İstek

curl -N -X POST http://localhost:8000/load_model \
  -H "Content-Type: application/json" \
  -d '{"model": "Qwen/Qwen2.5-0.5B-Instruct"}'

model alanı, isteğe bağlı olarak @revision son ekine sahip bir Hugging Face model tanımlayıcısıdır (Qwen/Qwen2.5-0.5B-Instruct@main). Revizyon belirtilmezse varsayılan olarak main kullanılır.

Yanıt

Yanıt bir SSE akışıdır (Content-Type: text/event-stream). Her çerçeve, bir data: satırında JSON nesnesidir.

data: {"status": "loading", "model": "Qwen/Qwen2.5-0.5B-Instruct@main", "stage": "processor"}

Her olay en azından bir status ve model alanı içerir. Ek alanlar duruma bağlıdır.

AlanBulunurAçıklama
statusHer zamanloading, ready veya error
modelHer zamanKanonik model_id@revision
stagestatus == "loading"processor, config, download, weights (aşağıdaki aşamaları bkz.)
progressdownload ve weights aşamalarıcurrent ve total (tamsayı veya null) içeren nesne
cachedstatus == "ready"Model zaten bellekteyse true
messagestatus == "error"Hata açıklaması

Aşamalar

Yükleme, bu aşamalardan sırasıyla geçer. Bazıları atlanabilir (yerel olarak önbelleğe alınmışsa download atlanır).

Aşamaİlerleme var mı?Açıklama
processorHayırTokenizör/işleyiciyi yükleme
configHayırModel yapılandırmasını yükleme
downloadEvet (bayt)Model dosyalarını indirme
weightsEvet (öğeler)Ağırlık tensörlerini belleğe yükleme

Akış, tam olarak bir son olayla biter: ready (başarı) veya error (başarısızlık).

Zaman aşımı

transformers serve, herhangi bir model için gelen istekleri işler. Her model gerektikçe yüklenir ve GPU belleğinde kalır. GPU belleğini boşaltmak için modeller, 300 saniyelik bir hareketsizlikten sonra otomatik olarak boşaltılır. Farklı bir değer (saniye cinsinden) belirlemek için --model-timeout parametresini kullanın veya boşaltmayı devre dışı bırakmak için -1 değerini atayın.

transformers serve --model-timeout 400

Örnekler yükleniyor

Aşağıdaki örnekler, yeni indirilen bir modelin, yerel önbelleğinizden yüklenen bir modelin (indirme aşamasını atlar) ve zaten bellekte bulunan bir modelin yanıtlarını göstermektedir.

taze yükleme
önbelleğe alınmış dosyalar
bellek içi
data: {"status": "loading", "model": "org/model@main", "stage": "processor"}
data: {"status": "loading", "model": "org/model@main", "stage": "config"}
data: {"status": "loading", "model": "org/model@main", "stage": "download", "progress": {"current": 0, "total": 269100000}}
data: {"status": "loading", "model": "org/model@main", "stage": "download", "progress": {"current": 134600000, "total": 269100000}}
data: {"status": "loading", "model": "org/model@main", "stage": "download", "progress": {"current": 269100000, "total": 269100000}}
data: {"status": "loading", "model": "org/model@main", "stage": "weights", "progress": {"current": 1, "total": 272}}
data: {"status": "loading", "model": "org/model@main", "stage": "weights", "progress": {"current": 272, "total": 272}}
data: {"status": "ready", "model": "org/model@main", "cached": false}

Araç çağrısı

transformers serve sunucusu, OpenAI tarzı fonksiyon çağrılarını destekler. Araç kullanımı için eğitilen modeller, uygulamanızın çalıştırdığı yapılandırılmış fonksiyon çağrıları üretir.

Tool calling, tokenizer'ı tool call token'ları bildiren herhangi bir modelle çalışır. Qwen ve Gemma 4 hazır olarak çalışır. Belirli bir model için destek istemek için bir issue açın.

Araçları, OpenAI biçimini izleyen bir işlev spesifikasyonları listesi olarak tanımlayın.

import json
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="<KEY>")

tools = [
  {
    "type": "function",
    "function": {
      "name": "get_weather",
      "description": "Get the current weather in a location",
      "parameters": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "description": "The city name, e.g. San Francisco"
          },
          "unit": {
            "type": "string",
            "enum": ["celsius", "fahrenheit"],
            "description": "temperature unit"
          }
        },
        "required": ["location"]
      }
    }
  }
]

create içindeki extra_body argümanına GenerationConfig parametreleri geçirerek üretimi özelleştirin.

generation_config = {
  "max_new_tokens": 512,
  "temperature": 0.7,
  "top_p": 0.9,
  "top_k": 50,
  "do_sample": True,
  "repetition_penalty": 1.1,
  "no_repeat_ngram_size": 3,
}

response = client.responses.create(
  model="Qwen/Qwen2.5-7B-Instruct",
  instructions="You are a helpful weather assistant. Use the get_weather tool to answer questions.",
  input="What's the weather like in San Francisco?",
  tools=tools,
  stream=True,
  extra_body={"generation_config": json.dumps(generation_config)}
)

for event in response:
  print(event)

Çok turlu araç çağrısı

Model bir araç çağrısı döndürdükten sonra, işlevi yerel olarak çalıştırın ve ardından modelin nihai yanıtını almak için sonucu bir takip isteğinde geri gönderin. Bu desen, iki API arasında hafifçe farklılık gösterir. Tam kullanım kılavuzu için OpenAI function calling guide belgesine bakın.

Aşağıdaki örnekler, yukarıda tanımlanan tools listesini yeniden kullanır.

v1/chat/completions
v1/responses

Araç sonucunu, eşleşen tool_call_id ile role: "tool" mesajı olarak iletin.

# Model returns a tool call
messages = [{"role": "user", "content": "What's the weather like in San Francisco?"}]
response = client.chat.completions.create(
    model="Qwen/Qwen2.5-7B-Instruct",
    messages=messages,
    tools=tools,
)
assistant_message = response.choices[0].message

# Execute the tool locally
tool_call = assistant_message.tool_calls[0]
result = {"temperature": 22, "condition": "sunny"}  # your actual function call here

# Send the tool result back
messages.append(assistant_message)
messages.append({
    "role": "tool",
    "tool_call_id": tool_call.id,
    "content": json.dumps(result),
})
final_response = client.chat.completions.create(
    model="Qwen/Qwen2.5-7B-Instruct",
    messages=messages,
    tools=tools,
)
print(final_response.choices[0].message.content)

Mantık yürütme

Mantık yürütme modelleri, nihai cevaptan önce gizli bir düşünce zinciri üretir. Sunucu bu düşünce aralıklarını algılar, görünür cevaptan ayraçları kaldırır ve istemcilerin bu metni ayrı olarak görüntüleyebilmesi için mantık yürütme metnini ayrı bir alanda sunar.

  • Chat Completions, akıl yürütme çıktısını asistan mesajında reasoning_content olarak döndürür.
  • Responses API, message öğesinden önce gelen reasoning çıktı öğesi olarak akıl yürütmeyi döndürür.

Mantık yürütme algılama, sunucuya bir düşünme aralığının nerede başladığını ve nerede bittiğini bildiren bir yanıt şablonuna dayanır. Sunucu, sırasıyla iki yerde buna bakar.

  1. Model bir tane içeriyorsa, tokenizer'ın response_template özniteliği.
  2. Henüz bir şablon içermeyen tokenizörler için, model mimarisine göre eşleşen yerleşik bir yedekleme.

Hiçbiri olmayan modeller, yanıt ayrıştırması yapılmadan sunulur. Ham çözümlenmiş metin content olarak döndürülür ve model <think>...</think> etiketleri üretse bile bir akıl yürütme alanı gösterilmez.

Sunucuda akıl yürütmeyi etkinleştirin

Düşünme jetonlarının çıkıp çıkmayacağını kontrol etmek için --reasoning bayrağını kullanın.

DeğerDavranış
auto (varsayılan)Sohbet şablonunun varsayılanına bırakın.
onSohbet şablonu kwargs'larında enable_thinking=True olarak ayarlayarak düşünmeyi zorla etkinleştirin.
offenable_thinking=False olarak ayarlayarak düşünmeyi devre dışı bırakın.
transformers serve Qwen/Qwen3-1.7B --reasoning on

Tüm modeller akıl yürütme (reasoning) desteklemez. --reasoning yalnızca modelin sohbet şablonu enable_thinking değişkenini işlediğinde (veya tokenizer'ı düşünme ayraçları beyan ettiğinde) çalışır. Diğer modellerde bu bayrak sessizce yok sayılır.

--reasoning on ve --reasoning off, enable_thinking sohbet şablonu değişkenini ayarlayarak çalışır. Bazı sohbet şablonları düşünmeyi açmak/kapatmak için farklı bir değişken adı kullanır veya istemin nasıl işlendiğini değiştiren ek değişkenler kabul eder. Herhangi bir sohbet şablonu değişkenini --chat-template-kwargs ile JSON nesnesi olarak doğrudan iletebilirsiniz.

transformers serve Qwen/Qwen3-1.7B \
  --chat-template-kwargs '{"enable_thinking": true}'

İstemciler, sunucuyu yeniden başlatmadan tek bir istek için sunucu varsayılanlarını geçersiz kılmak amacıyla istek gövdesine chat_template_kwargs gönderebilir.

Chat Tamamlamaları

Akış dışı yanıtlar, asistan mesajında content ile birlikte reasoning_content alanını da içerir.

openai
openai (stream)
curl
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="<KEY>")

completion = client.chat.completions.create(
    model="Qwen/Qwen3-1.7B",
    messages=[{"role": "user", "content": "What is 17 * 23?"}],
)
message = completion.choices[0].message
print("reasoning:", message.reasoning_content)
print("answer:", message.content)

Responses API

Responses API, message öğesinden önce gelen ayrı bir reasoning çıktı öğesi olarak akıl yürütmeyi döndürür.

openai
openai (stream)
response = client.responses.create(
    model="Qwen/Qwen3-1.7B",
    input="What is 17 * 23?",
    stream=False,
)
reasoning_item = next(i for i in response.output if i.type == "reasoning")
message_item = next(i for i in response.output if i.type == "message")
print("reasoning:", reasoning_item.content[0].text)
print("answer:", message_item.content[0].text)

Çok turlu gidiş-dönüş

Çok turlu sohbetlerde, önceki yanıtın akıl yürütme metnini bir sonraki isteğe dahil edin. Sunucu bunu sohbet şablonuna iletir; şablon, bunu önceki asistan turunun bir parçası olarak işleyebilir, böylece model kendi önceki düşünce sürecini görür.

v1/chat/completions
v1/responses

Önceki asistan mesajına reasoning_content ekleyin.

first = client.chat.completions.create(
    model="Qwen/Qwen3-1.7B",
    messages=[{"role": "user", "content": "What is 17 * 23?"}],
).choices[0].message

second = client.chat.completions.create(
    model="Qwen/Qwen3-1.7B",
    messages=[
        {"role": "user", "content": "What is 17 * 23?"},
        {
            "role": "assistant",
            "content": first.content,
            "reasoning_content": first.reasoning_content,
        },
        {"role": "user", "content": "Now multiply that result by 2."},
    ],
)
print(second.choices[0].message.content)

Port yönlendirme

Port yönlendirme, modelleri uzak bir sunucudan sunmanızı sağlar. Sunucuya SSH erişiminiz olduğundan emin olun, ardından bu komutu yerel makinenizde çalıştırın.

ssh -N -f -L 8000:localhost:8000 your_server_account@your_server_IP -p port_to_ssh_into_your_server

Tekrarlanabilirlik

Her istekte model ipuçlarını önlemek ve kararlı, tekrarlanabilir çalıştırmalar elde etmek için bir modeli konumsal argüman olarak iletin.

transformers serve Qwen/Qwen2.5-0.5B-Instruct \
  --continuous-batching \
  --dtype "bfloat16"
Update on GitHub