Stanford STORM'u özel bir OpenAI uyumlu endpoint üzerinde çalıştırın.

Updated 2026-07-29

STORM her dil modelini bir LitellmModel olarak inşa eder ve litellm api_base kabul eder. Paylaşılan openai_kwargs'ınıza https://api.apisrouter.com/v1 adresini koyun, model id'lerinin önüne openai/ ekleyin ve makale pipeline'ının beş LM slotunun tümü tek bir endpoint ve tek bir anahtar üzerinden yönlendirilsin.

Hızlı yanıt: openai_kwargs içinde api_base, id'lerde openai/ ön eki.

STORM'un LitellmModel'i, onu hangi kwargs'larla inşa ederseniz onları saklar ve bunları her litellm.completion() çağrısına birleştirir. litellm'in api_base parametresi, openai provider'ı farklı bir host'a yönlendirmenin yoludur, bu yüzden STORM'un kendi örneklerinin zaten kullandığı openai_kwargs dict'ine api_base eklemek, override'ın tamamıdır. litellm'in o base'e chat-completions protokolüyle konuşması için her model id'sinin önüne openai/ ekleyin; eğik çizgiden sonraki string gateway'e olduğu gibi iletilir. Örnekler tek bir openai_kwargs dict'i inşa edip her model için yeniden kullandığından, eklenen tek bir anahtar tüm pipeline'ı yeniden yönlendirir. STORM kodunda değişiklik yok, fork yok; bu, litellm'in belgelenmiş yönlendirmesi üzerine katmanlanmış standart knowledge_storm davranışıdır.

openai_kwargs = {
    "api_key": os.getenv("APISROUTER_API_KEY"),
    "api_base": "https://api.apisrouter.com/v1",
    "temperature": 1.0,
    "top_p": 0.9,
}
fast = LitellmModel(model="openai/deepseek-v4-flash", max_tokens=500, **openai_kwargs)
strong = LitellmModel(model="openai/claude-sonnet-4-6", max_tokens=3000, **openai_kwargs)

STORM bir makaleyi beş LM slotuna nasıl böler.

STORM (GitHub'da stanford-oval, yaklaşık 30K yıldız), Wikipedia tarzı raporları sıfırdan yazar: simüle edilmiş çok perspektifli konuşmalar aracılığıyla bir konuyu araştırır, öğrendiklerinden bir taslak oluşturur, tam makaleyi bölüm bölüm üretir ve ardından cilalar. STORMWikiLMConfigs bu pipeline'ı bağımsız olarak ayarlanabilir beş model olarak sunar: conv_simulator_lm ve question_asker_lm araştırma konuşmalarını yürütür, outline_gen_lm makaleyi yapılandırır, article_gen_lm onu yazar ve article_polish_lm son geçişi yapar. Üst akış README'si ekonomi konusunda açıktır: konuşma simülatörü en yüksek çağrı hacmini çalıştırır, bu yüzden orada daha hızlı bir model ve makale üretimi için daha güçlü bir model önerir. Bu rehberlik OpenAI modelleri arasında seçim yapmayı varsaymıştı; çok satıcılı bir endpoint arkasında bu, daha kullanışlı bir şeye genelleşir. Her slot kendi model string'ine sahip kendi LitellmModel'idir, bu yüzden araştırma sohbeti hızlı bir DeepSeek id'sinde çalışırken taslak ve makale üretimi Claude'da, cilalama ise ton için güvendiğiniz herhangi bir modelde çalışabilir; hepsi aynı anahtarla aynı api_base'e karşı kimlik doğrulanır. Retrieval tarafı ayrı bir makinedir: STORM'un runner'ı, kendi API anahtarına sahip bir RM modülü (You.com, Bing ve birkaç başka arama backend'i) alır. Dil modellerinin nereye yöneldiğini değiştirmek, kaynakların nasıl getirildiğine dokunmaz.

Tam kurulum: beş slot, tek bir kwargs dict'i.

Çalışan desen, repo'nun kendi run script'lerini yansıtır: paylaşılan kwargs'ı bir kez inşa edin, rol başına bir LitellmModel oluşturun ve bunları STORMWikiLMConfigs setter'ları aracılığıyla atayın. api_key, onu açıkça ilettiğiniz için istediğiniz herhangi bir isim olabilir; örnek, bunun bir OpenAI hesap kimlik bilgisi olmadığını netleştirmek için kendi değişkenini kullanır. litellm ayrıca provider seviyesindeki ortam değişkenlerine uyar ve openai provider'ı OPENAI_API_BASE'i okur, bu yüzden yalnızca ortam üzerinden bir override mümkündür. Açık kwargs yolu yine de tercih edilmesi gerekendir: belirli bir makaleyi üreten kodda görünürdür, farklı ortam durumuna sahip bir makinede çalıştırılmaya dayanır ve bir aşamayı farklı bir endpoint'te istediğinizde slot başına istisnalar mümkün kılar.

import os
from knowledge_storm import STORMWikiRunnerArguments, STORMWikiRunner, STORMWikiLMConfigs
from knowledge_storm.lm import LitellmModel
from knowledge_storm.rm import YouRM

openai_kwargs = {
    "api_key": os.getenv("APISROUTER_API_KEY"),
    "api_base": "https://api.apisrouter.com/v1",
    "temperature": 1.0,
    "top_p": 0.9,
}
fast = LitellmModel(model="openai/deepseek-v4-flash", max_tokens=500, **openai_kwargs)
strong = LitellmModel(model="openai/claude-sonnet-4-6", max_tokens=3000, **openai_kwargs)

lm_configs = STORMWikiLMConfigs()
lm_configs.set_conv_simulator_lm(fast)
lm_configs.set_question_asker_lm(fast)
lm_configs.set_outline_gen_lm(strong)
lm_configs.set_article_gen_lm(strong)
lm_configs.set_article_polish_lm(strong)

engine_args = STORMWikiRunnerArguments(output_dir="./results")
rm = YouRM(ydc_api_key=os.getenv("YDC_API_KEY"), k=engine_args.search_top_k)
runner = STORMWikiRunner(engine_args, lm_configs, rm)
runner.run(topic="Small modular reactors")

Pipeline aşaması başına model seçmek.

Beş setter'ı standart kod değil, bir bütçe kadranı olarak ele alın. Üst akış rehberliği zaten hızlı ve güçlü modelleri aşamalara bölmeyi söylüyor; çok satıcılı bir endpoint yalnızca aşama başına menüyü genişletir. Aynı konu üzerindeki çalıştırmalar arasında her seferinde bir slotu değiştirin ve çıktıları karşılaştırın; anahtar başına kullanım günlüğü her yapılandırmayı fiyatlandırsın.

  • conv_simulator_lm ve question_asker_lm hacim aşamalarıdır: konu başına birkaç perspektif boyunca çok turlu simüle edilmiş görüşmeler. deepseek-v4-flash veya başka hızlı bir id, araştırma aşamasının harcamaya hakim olmasını engeller ve kusurlu sohbet tolere edilebilir çünkü düzyazıyı değil, notları besler.
  • article_gen_lm amiral gemisi slotudur. Birikmiş araştırmadan uzun, yapılandırılmış, atıflı bölümler yazar; bu, claude-sonnet-4-6 veya gpt-5.5'in daha küçük id'leri görünür şekilde geride bıraktığı sürdürülen üretim işidir.
  • outline_gen_lm, bir planlama slotuyla aynı şekle sahip, orantısız kaldıraçlı az sayıda çağrıdır: zayıf bir taslak, yazar ne kadar iyi olursa olsun makaleyi sınırlar. claude-opus-4-7'yi test etmek için doğal yerdir.
  • article_polish_lm, akış için yeniden yazar ve derlenen makale genelinde tekrarı kaldırır; bu, uzun bağlamlı bir id'den fayda görür; gemini-3.1-pro-preview burada benchmark yapmaya değer.

Kullandıkça öde · resmi fiyatların altında

Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.

ModelResmi FiyatBizim Fiyatımız
DeepSeek V4 Flash$0.14 / $0.28 per M$0.10 / $0.30 per M
Claude Sonnet 4.6$3.00 / $15.00 per M$2.40 / $12.00 per M
Claude Opus 4.7$5.00 / $25.00 per M$4.00 / $20.00 per M
GPT-5.5$5.00 / $30.00 per M$4.00 / $24.00 per M
Gemini 3.1 Pro Preview$2.00 / $12.00 per M$1.60 / $9.60 per M

STORM'a özgü hata modları.

Çıplak bir model id'si, api_base'iniz üzerinden değil, çıkarım yoluyla yönlendirilir. litellm bir provider seçmek için ön eki okur ve ön eksiz bir Claude id'si Anthropic-native bir çağrı olarak çıkarılır; bu da ANTHROPIC_API_KEY ister ve gateway'inizi tamamen yok sayar. Gateway'e giden her id, openai/ ön ekini taşımalıdır; ön ek satıcıyı değil, protokolü adlandırır. Geride bırakılan bir slot. Her LitellmModel, kwargs'ını inşa anında yakalar. Dört slot openai_kwargs'ı paylaşıyorsa ve beşincisi api_base olmadan gelişigüzel inşa edildiyse, o slot sessizce satıcı varsayılanına gönderi yapar ve auth'ta başarısız olur; traceback bir config satırı yerine bir pipeline aşamasını adlandırır. Her slotu aynı dict'ten inşa edin, bu hata sınıfı ortadan kalkar. Endpoint'e yüklenen retriever hataları. Araştırma aşaması çalışan bir arama backend'i gerektirir; geçersiz veya tükenmiş bir retriever anahtarı (YDC_API_KEY, BING_SEARCH_API_KEY veya seçtiğiniz hangi RM ise) bilgi toplama sırasında çalıştırmaları başarısız kılar. Bu aşama LM çağrılarıyla iç içe geçer, bu yüzden LM yapılandırmasına dokunmadan önce hangi client'ın hata verdiğini traceback'te okuyun. Demonun secrets.toml'u, script'inizin yapılandırması değildir. Streamlit demosu secrets.toml'u okur; programatik çalıştırmalar script'inizin ilettiği her neyse onu okur. Birini düzenlerken diğerini çalıştırmak klasik bir uyumsuzluktur. max_tokens da slot başınadır. STORM'un örnekleri hızlı slotlarda küçük limitler (500) ve üretimde daha büyük limitler (3000) ayarlar. Bir slotu, max_tokens'ını yükseltmeden uzun biçimli bir modele yöneltmek bölümleri sessizce keser; bu bir model kalite sorunu gibi görünür ama bir yapılandırma sayısıdır.

STORM'u bir gateway üzerinden kim yönlendirir.

  • Hacimli bilgi raporları üreten ekipler (brifingler, wiki tarzı dahili dokümanlar, konu özetleri); burada beş slotlu ayrım, aşama başına maliyet ayarını gerçek paraya değer kılar.
  • Pipeline kompozisyonunu inceleyen araştırmacılar: hangi aşamanın daha güçlü bir modelden fayda gördüğü ampirik bir sorudur ve tek bir endpoint, slot-model kombinasyonları ızgarasını sıralamayı önemsiz kılar.
  • Model ailesi başına bir satıcı SDK'sı eklemeden, OpenAI şeklindeki bir yığının yazım slotlarında Claude veya Gemini çalıştıran builderlar.
  • Toplu konu listeleri çalıştıran herkes; burada araştırma aşaması hacmi konular arasında çarpılır ve kullanım günlüğü konu başına maliyet defterine dönüşür.
  • Belirli bir satıcının faturalandırmasına erişimi olmayan geliştiriciler. Kart gerektirmeyen yükleme tabanlı erişim, sağlayıcı başına kayıt bağımlılığını ortadan kaldırır.

Endpoint'i doğrulayın ve ilk makaleyi hata ayıklayın.

Önce gateway'in modellerini listeleyin: her slottaki openai/'den sonraki string, sunulan bir id ile tam olarak eşleşmelidir. İlk çalıştırma başarısızlıkları pipeline sırasını izler. Anthropic veya Google'ı adlandıran bir auth hatası, ön eksiz bir id'nin yerel bir provider'a yönlendirildiği anlamına gelir; openai/ ekleyin. Gateway'den gelen bir 401, kwargs'ınızdaki api_key'in gateway anahtarı olmadığı anlamına gelir. Model-not-found hatası, id'sinde yazım hatası olan slotu adlandırır. Arama backend'inizden bahseden araştırma aşamasındaki başarısızlıklar, LM yönlendirmesi değil retriever kimlik bilgileridir. Ve kesilen veya tuhaf şekilde kısa makale bölümleri, genellikle üst akışta bir şeyden çok, üretim slotundaki cimri bir max_tokens'tandır. Tam bir STORM çalıştırması büyük bir patlamadır: perspektifler arasında simüle edilmiş konuşmalar, ardından taslak, üretim ve cilalama. Biri tamamlandığında, APIsRouter konsolu istek başına modeli, token sayılarını ve harcamayı gösterir; bu, beş slota temiz bir şekilde eşlenir ve bir sonraki konu grubundan önce tam olarak hangi aşamayı yeniden ayarlamanız gerektiğini söyler.

curl -s https://api.apisrouter.com/v1/models \
  -H "Authorization: Bearer $APISROUTER_API_KEY" | head -50

Sık sorulan sorular

STORM özel bir OpenAI uyumlu endpoint'i nasıl destekler?

litellm aracılığıyla. STORM her LM'i, constructor kwargs'ını her litellm.completion() çağrısına birleştiren bir LitellmModel olarak inşa eder ve litellm, openai provider'ı için api_base'i kabul eder. openai_kwargs dict'ine api_base ekleyin ve ondan inşa edilen her slot gateway'e yönlendirilir.

Model id'lerinin neden openai/ ön ekine ihtiyacı var?

litellm provider'ı ön ekten seçer. openai/claude-sonnet-4-6, "api_base'ime model claude-sonnet-4-6 ile OpenAI chat-completions protokolünü konuş" anlamına gelir. Ön ek olmadan, litellm satıcıyı isimden çıkarır ve yerel olarak yönlendirir, endpoint'inizi atlar.

STORM'un farklı aşamaları farklı satıcıların modellerini kullanabilir mi?

Evet. Beş slotun her biri bağımsız bir LitellmModel'dir, bu yüzden konuşma simülatörü bir DeepSeek id'sinde çalışırken makale üretimi Claude'da ve cilalama GPT'de çalışabilir; hepsi aynı api_base ve anahtar üzerinden. Üst akış zaten hızlı ve güçlü modelleri aşamalara bölmeyi önerir.

api_base'i değiştirdiğimde arama retriever'ı değişir mi?

Hayır. Retrieval, STORMWikiRunner'a ilettiğiniz RM modülü (You.com, Bing ve diğer desteklenen backend'ler) üzerinden kendi anahtarıyla çalışır. LM yönlendirmesi ve kaynak retrieval'ı, bir çalıştırmanın farklı aşamalarında başarısız olan bağımsız sistemlerdir.

kwargs yerine bir ortam değişkeni yolu var mı?

litellm provider seviyesindeki değişkenlere uyar ve openai provider'ı OPENAI_API_BASE'i okur. Bu işe yarar, ama açık api_base kwarg'ı daha tekrarlanabilirdir: script ile birlikte taşınır, farklı ortam durumuna sahip makinelerde hayatta kalır ve slot başına istisnalara izin verir.

Bir STORM makalesi kaç token tüketir?

Araştırma aşaması baskındır: makalenin bir kelimesi bile var olmadan önce çok perspektifli simüle edilmiş konuşmalar çağrıları çarpar, ardından üretim ve cilalama üzerine uzun biçimli çıktı ekler. Tam çalıştırmalar genellikle yüz binlerce token'a ulaşır ve anahtar başına kullanım görünümü tam olarak aşama başına ayrımı gösterir.