OpenRouter, farklı yapay zekâ modellerine tek bir API adresi ve OpenRouter anahtarıyla erişmenizi sağlayan bir platformdur. Örneğin bir destek mesajını özetleyen Python kodunuz varsa aynı isteği iki modele ayrı ayrı gönderip yanıtları karşılaştırabilirsiniz. Aşağıdaki örnek, güncel katalogdan iki model kimliği seçmenizi, aynı Türkçe metni işlemenizi ve her çağrının token sayısıyla maliyetini görmenizi sağlar. [1][2][4]
OpenRouter nedir ve ne işe yarar?
OpenRouter’da model ile sağlayıcı farklı seçimlerdir. Model, yanıtı üreten sistemdir. Sağlayıcı ise o modelin çalıştığı hizmeti sunar. Bir modeli birden fazla sağlayıcı sunuyorsa OpenRouter isteği bunlardan birine yönlendirebilir. Uygulamanızda sağlayıcı tercihi belirleyebilir, parametreleri destekleyen uç noktalarla sınırlandırabilir veya sağlayıcı yedeğini kapatabilirsiniz. [5]
Bu ayrım testin sonucunu yorumlamayı değiştirir. Bir modelin iki farklı sağlayıcıdaki yanıt süresini ölçmek, iki farklı modeli aynı işte değerlendirmekten farklı bir deneydir. Ürün açıklamasından özellik çıkarmak gibi bir görevde önce iki modeli aynı girdilerle ayrı ayrı çağırın. Daha sonra seçtiğiniz modelin sağlayıcı seçeneklerini gecikme, erişilebilirlik ve veri politikası açısından değerlendirin. [3][5]
API ile entegrasyon için uygulamanızın isteği sunucudan göndermesi yeterlidir. Mevcut bir istemci kullanıyorsanız OpenRouter’ın OpenAI uyumlu Chat Completions uç noktasına bağlanabilirsiniz. Kütüphaneye göre temel adres ayarının adı değişebilir. Bu rehberde kullanılan Python örneği standart kütüphaneyle çalışır ve tam istek adresini gösterir. [1][3]
OpenRouter API anahtarı nasıl alınır?

OpenRouter hesabınızı açın ve API Keys sayfasından bir anahtar oluşturun. Anahtara işini belirten bir ad verin. Anahtar oluşturma ekranında kredi limiti seçeneği varsa ilk deneme için küçük bir limit tanımlayın. Ücretli bir uç nokta kullanacaksanız çağrıdan önce hesabınızdaki krediyi, anahtarın limitini ve seçtiğiniz modelin fiyatını kontrol edin. [6][7]
Örnek, anahtarı önce OPENROUTER_API_KEY ortam değişkeninde arar. Bu değişken yoksa terminalde anahtarı gizli olarak ister. Böylece anahtarı Python dosyasına yazmanız gerekmez. Bir web uygulamasına geçerseniz anahtarı sunucu tarafındaki gizli değişkenlerde saklayın. Anahtar açığa çıkarsa OpenRouter’da iptal edip yenisini kullanın. [6]
Model kimliği nasıl bulunur?
OpenRouter model kataloğunda metin girişi ve metin çıktısı destekleyen iki model açın. Model sayfasındaki tam API kimliğini kopyalayın. Aynı ailede farklı sürümler, ücretsiz varyantlar ve farklı bağlam sınırları bulunabildiği için sayfada görünen kısa model adı yerine API kimliğini kullanın. API üzerinden listeyi almak için GET /api/v1/models çağrılır. Yanıttaki data listesinin her kaydında id ve pricing gibi alanlar bulunur. [2][7]
İlk testte kısa bir metin kullanıyorsanız uzun bağlam sınırı tek başına seçim ölçütü değildir. Metin türüne uygunluk, modelin döndürdüğü yanıtı ne kadar düzenlemeniz gerektiği ve fiyat daha anlamlı ölçütlerdir. Ücretsiz bir varyant seçerseniz katalogdaki tam kimliğini kullanın ve kotayı kontrol edin. Ücretsiz uç noktada da hız sınırıyla karşılaşabilirsiniz. [2][7][8]
Python ile ilk istek ve iki modelin karşılaştırması
Aşağıdaki kodu openrouter-deneme.py adıyla kaydedin. İki model kimliğini komut satırında verin. Kod önce katalogda ikisini de arar. Kimliklerden biri bulunmazsa model çağrısı yapmadan durur. Ardından her modeli aynı Türkçe destek mesajıyla ve aynı çıktı sınırıyla birer kez çağırır. Ücretli model seçildiğinde örnek iki ayrı model çağrısı yapar. [2][3][7]
import getpass
import json
import os
import sys
from urllib.error import HTTPError, URLError
from urllib.request import Request, urlopen
BASE = "https://openrouter.ai/api/v1"
TASK = (
"Aşağıdaki kaydı Türkçe özetle. İki satır yaz: Durum ve "
"Sonraki adım. Kayıtta bulunmayan tarih veya taahhüt ekleme. "
"Kayıt: Kargo pazartesi dağıtıma çıktı ancak teslim edilmedi. "
"Alıcı salı günü adreste olacak. Kargo şirketi yeni teslimat "
"tarihini henüz bildirmedi."
)
def request(path, key, payload=None):
headers = {"Authorization": f"Bearer {key}"}
data = None
if payload is not None:
headers["Content-Type"] = "application/json"
data = json.dumps(payload, ensure_ascii=False).encode("utf-8")
req = Request(BASE + path, data=data, headers=headers)
try:
with urlopen(req, timeout=60) as response:
result = json.load(response)
except HTTPError as exc:
raise SystemExit(f"OpenRouter HTTP hatası: {exc.code}") from None
except (URLError, TimeoutError):
raise SystemExit("OpenRouter bağlantısı kurulamadı veya zaman aşımına uğradı.") from None
if result.get("error"):
raise SystemExit(f"OpenRouter yanıt hatası: {result['error'].get('code')}")
return result
def main(model_ids):
if len(model_ids) != 2 or model_ids[0] == model_ids[1]:
raise SystemExit("Katalogdan iki farklı model kimliği girin.")
key = os.environ.get("OPENROUTER_API_KEY") or getpass.getpass("OpenRouter anahtarı: ")
if not key.strip():
raise SystemExit("API anahtarı boş.")
catalog = {model["id"] for model in request("/models", key)["data"]}
missing = [model for model in model_ids if model not in catalog]
if missing:
raise SystemExit("Katalogda bulunamadı: " + ", ".join(missing))
for model in model_ids:
result = request("/chat/completions", key, {
"model": model,
"messages": [{"role": "user", "content": TASK}],
"max_tokens": 300,
"stream": False,
})
choices = result.get("choices") or []
choice = choices[0] if choices else {}
usage = result.get("usage") or {}
print(f"\nModel: {result.get('model', model)}")
print(choice.get("message", {}).get("content") or "[Metin yanıtı gelmedi]")
print("Bitiş nedeni:", choice.get("finish_reason"))
print("Girdi tokenı:", usage.get("prompt_tokens"))
print("Çıktı tokenı:", usage.get("completion_tokens"))
print("Maliyet (kredi):", usage.get("cost"))
if __name__ == "__main__":
main(sys.argv[1:])
Terminalde python openrouter-deneme.py "MODEL_KIMLIGI_A" "MODEL_KIMLIGI_B" komutunu çalıştırın. İki yer tutucuyu katalogdan kopyaladığınız gerçek kimliklerle değiştirin. Bilgisayarınızda Python 3 komutu python3 ise komutun başında onu kullanın. İlk çalıştırmada anahtarınız ortam değişkeninde yoksa terminal anahtarı ister. Bir modelin yanıtı boşsa ya da bitiş nedeni uzunluk sınırına işaret ediyorsa iki çıktıyı puanlamadan önce sınırı her ikisi için de aynı şekilde ayarlayın. [2][3]
Yanıtları nasıl puanlamalı?
Bu örnekte doğru yanıt, kargonun dağıtıma çıktığını ancak teslim edilmediğini belirtmeli. Alıcının salı günü adreste bulunması, salı günü teslimat yapılacağı anlamına gelmez. Sonraki adım satırı yeni tarihi doğrulamayı önerebilir. Modelin metinde bulunmayan bir teslimat sözünü ekleyip eklemediği, yanıtın akıcılığından daha ayırt edici bir testtir. [9]
| Ölçüt | Bu örnekte kontrol edilecek nokta |
|---|---|
| Olgular | Dağıtıma çıkma ve teslim edilmeme bilgileri doğru mu? |
| Dayanak | Salı günü kesin teslimat gibi metinde olmayan bilgi eklenmiş mi? |
| Biçim | Yanıt iki satır mı, istenen başlıkları kullanıyor mu? |
| Düzenleme | Yanıtı kullanmadan önce kaç düzeltme gerekiyor? |
| Maliyet | Başarılı yanıtın maliyeti usage.cost alanında kaç kredi? [4] |
Tek örnekle model sıralaması çıkarmak yerine aynı ölçütleri farklı kayıt türlerine uygulayın. Eksik bilgi içeren bir kayıt, birbirine benzeyen iki tarih içeren bir kayıt ve normal bir teslimat bildirimi, modelin hangi durumda ek kontrol gerektirdiğini ayırmanıza yardımcı olur. Gerçek müşteri mesajlarıyla başlamadan önce aynı yapıda kurgusal örnekler hazırlayın. [5][9]
OpenRouter maliyeti nasıl hesaplanır?
OpenRouter’ın kullanım kaydı, akışsız Chat Completions yanıtında usage nesnesiyle gelir. prompt_tokens girdiyi, completion_tokens çıktıyı, cost ise OpenRouter hesabına yansıyan tutarı kredi cinsinden gösterir. Model ve uç noktaya bağlı olarak önbellek veya muhakeme tokenı ayrıntıları da bulunabilir. Kullanım geçmişini Activity ekranında inceleyebilirsiniz. [4][7]
Başlamadan önce kaba bütçe hesabı yapmak için giriş ve çıkış fiyatlarını ayrı ele alın. Örneğin bir milyon giriş tokenı 1 USD, bir milyon çıkış tokenı 4 USD olsaydı 1.000 giriş ve 250 çıkış tokenı için hesap 0,001 + 0,001 = 0,002 USD olurdu. Bu rakamlar hesabı göstermek için seçildi. Bu varsayımla aynı boyuttaki 10.000 çağrı yaklaşık 20 USD eder. Güncel model ücretini katalogdan, gerçekleşen çağrı maliyetini kullanım kaydından kontrol edin. [2][4][7]
Toplam maliyeti hesaplarken işin yeniden yapılma sıklığını da kaydedin. Bir model 100 örneğin 90’ında ilk seferde kullanılabilir yanıt veriyorsa kalan 10 örneğin yeniden çağrı veya insan incelemesi gerektirip gerektirmediğini ayrı ölçün. Basit bir karşılaştırma için toplam model harcamasını kullanılabilir yanıt sayısına bölün. Böylece fiyat farkının günlük iş akışınıza nasıl yansıdığını görebilirsiniz. [4][9]
Token sayısı kelime sayısından farklıdır ve modelin kullandığı tokenlaştırıcıya göre değişebilir. Bir Türkçe metni iki modele gönderdiğinizde giriş tokenı sayıları farklı çıkabilir. Uzun bir sohbette uygulamanız her çağrıda önceki mesajları yeniden gönderiyorsa maliyet hesabına o mesajları da katın. Önbellekleme gibi ayrı fiyatlandırma kalemleri varsa katalogdaki tahmini gerçekleşen kullanım kaydıyla karşılaştırın. [2][3][4]
Sağlayıcı seçimi ve veri gizliliği
OpenRouter’a gönderdiğiniz bir metin, hizmet üzerinden seçilen sağlayıcı uç noktasında işlenir. Müşteri kayıtları veya kurum içi belgelerle çalışacaksanız hem OpenRouter’ın hem ilgili sağlayıcının veri politikasına bakın. Sağlayıcı yönlendirmesinde provider.data_collection ve provider.zdr gibi filtreler belgelenir. ZDR, sıfır veri saklama ilkesine göre yönlendirme sağlayan bir uç nokta filtresidir. Filtre kullanımı mevcut seçenekleri daraltabilir. [5]
Bir sağlayıcının kesintisinde aynı modeli başka bir sağlayıcıda çalıştırmak ile farklı bir modele geçmek ayrı kararlardır. Sağlayıcı yedeği aynı model için hizmet sağlayıcısını değiştirir. Bir model yedeği tanımlarsanız yanıtın biçimi, dili veya davranışı da değişebilir. Kontrollü karşılaştırmada her çağrıda yalnızca tek bir model kimliği verin. Üretimde yedek modeli etkinleştirmeden önce onu da örnek verilerinizle değerlendirin. [3][5]
Belgeyi kendi bilgisayarınızda işlemek işin temel gereksinimiyse Open WebUI ve Ollama kurulum rehberindeki yerel akışı inceleyin. Bulut tabanlı bir denemede mümkünse önce sentetik veriyle başlayın. Paylaşmadan önce kimlik bilgileri ve kayıt numaraları gibi hassas alanları kaldırmanız gerekiyorsa belgelerde veri maskeleme rehberi hangi kontrolleri yapacağınızı gösteriyor. [5][10][11]
OpenRouter hata kodları ve çözümü
| Kod | İlk kontrol |
|---|---|
| 400 | Model kimliğini, messages yapısını ve gönderdiğiniz parametreleri kontrol edin. [2][3][8] |
| 401 | Anahtarın etkin olduğunu ve istekte Authorization: Bearer ... başlığının gönderildiğini doğrulayın. [6][8] |
| 402 | Hesap kredisine ve anahtar için ayrılmış limite bakın. [6][8] |
| 429 | Hız sınırını kontrol edin. Yanıtta Retry-After varsa belirtilen süreyi bekleyin. [8] |
| 503 | Seçtiğiniz model için yönlendirme koşullarını sağlayan uygun bir sağlayıcı olup olmadığını kontrol edin. [5][8] |
Otomatik tekrar denemesi eklemeden önce hatanın nedenini ayırın. Yanlış anahtarla veya tükenmiş krediyle aynı isteği yeniden göndermek sorunu çözmez. Zaman aşımında ise önce Activity kaydına bakın. Yanıt istemciye ulaşmamış olsa bile çağrının işlendiği bir durum varsa yeni istek ek kullanıma yol açabilir. İlk deneme betiği bu yüzden hata aldığında durur. [4][7][8]
Sık sorulan sorular
OpenRouter ücretsiz kullanılabilir mi?
Katalogdaki ücretsiz seçeneklerle deneme yapabilirsiniz. Kullanılabilir modeller ve çağrı kotaları değişebildiği için otomasyon kurmadan önce kullanacağınız modelin sayfasını ve OpenRouter’ın güncel fiyatlandırma koşullarını kontrol edin. Ücretli bir modeli ikinci aday olarak seçerseniz onun çağrısı kendi fiyatı üzerinden hesaplanır. [2][7][12]
Anahtarın kalan limiti nereden görülür?
Kullandığınız anahtarla GET /api/v1/key çağrısı yapın. Bu uç nokta etkin anahtarın limit, limit_remaining ve usage gibi alanlarını döndürür. Anahtara ayrı bir kredi sınırı koyduysanız hesapta kredi görünse bile bu anahtarın harcayabileceği tutarı ayrıca kontrol edin. Anahtar bilgisi ile tek bir çağrının maliyetini ayrı takip etmek, bütçe hatasını model fiyatından kaynaklanan bir artıştan ayırmayı kolaylaştırır. [4][6][13]
Modeli değiştirmek için kodu yeniden yazmak gerekir mi?
Bu örnekte başka bir metin modelini denemek için komuttaki model kimliğini değiştirmeniz yeterli. Uygulamanız araç çağrısı, görsel girdi veya belirli bir yanıt biçimine ihtiyaç duyuyorsa önce yeni modelin ve sağlayıcının bu özelliği desteklediğini doğrulayın. Üretimde kullandığınız örnekleri yeniden çalıştırarak biçimin ve çıktı sınırlarının yeni modelde beklendiği gibi davrandığını kontrol edin. [2][3][5][9]
Kaynaklar
- OpenRouter, Quickstart. Bilginin alındığı tarih: 6 Kasım 2026.
- OpenRouter, List all models and their properties. Bilginin alındığı tarih: 6 Kasım 2026.
- OpenRouter, Create a chat completion. Bilginin alındığı tarih: 6 Kasım 2026.
- OpenRouter, Usage Accounting. Bilginin alındığı tarih: 6 Kasım 2026.
- OpenRouter, Provider Selection. Bilginin alındığı tarih: 6 Kasım 2026.
- OpenRouter, Authentication. Bilginin alındığı tarih: 6 Kasım 2026.
- OpenRouter, Pricing. Bilginin alındığı tarih: 6 Kasım 2026.
- OpenRouter, Errors and Debugging. Bilginin alındığı tarih: 6 Kasım 2026.
- OpenAI, Evaluation best practices. Bilginin alındığı tarih: 6 Kasım 2026.
- Dijipedya, Open WebUI ve Ollama rehberi. Bilginin alındığı tarih: 6 Kasım 2026.
- Dijipedya, Belgelerde veri maskeleme. Bilginin alındığı tarih: 6 Kasım 2026.
- OpenRouter, Frequently Asked Questions. Bilginin alındığı tarih: 6 Kasım 2026.
- OpenRouter, Get current API key. Bilginin alındığı tarih: 6 Kasım 2026.




