Jalankan Stanford STORM di endpoint OpenAI-compatible custom.
Updated 2026-07-29
STORM membangun setiap language model sebagai LitellmModel, dan litellm menerima api_base. Taruh https://api.apisrouter.com/v1 di openai_kwargs bersama Anda, beri prefix id model dengan openai/, dan kelima slot LM pipeline artikel merutekan melalui satu endpoint dan satu key.
Jawaban singkat: api_base di openai_kwargs, prefix openai/ di id.
LitellmModel STORM menyimpan kwargs apa pun yang Anda konstruksikan dan menggabungkannya ke setiap panggilan litellm.completion(). Parameter api_base litellm adalah cara Anda mengarahkan provider openai ke host berbeda, jadi menambahkan api_base ke dict openai_kwargs yang sudah dipakai contoh STORM sendiri adalah seluruh override-nya. Beri prefix setiap id model dengan openai/ agar litellm berbicara protokol chat-completions ke base itu, dan string setelah garis miring diteruskan ke gateway. Karena contohnya membangun satu dict openai_kwargs dan memakainya ulang untuk setiap model, satu key yang ditambahkan merutekan ulang seluruh pipeline. Tidak ada perubahan kode STORM, tidak ada fork; ini adalah perilaku knowledge_storm bawaan yang dilapisi di atas routing terdokumentasi litellm.
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)Bagaimana STORM membagi artikel ke lima slot LM.
STORM (stanford-oval di GitHub, sekitar 30K bintang) menulis laporan bergaya Wikipedia dari nol: ia meriset topik lewat percakapan multi-perspektif yang disimulasikan, membangun outline dari apa yang dipelajarinya, menghasilkan artikel penuh bagian demi bagian, dan kemudian memolesnya. STORMWikiLMConfigs mengekspos pipeline itu sebagai lima model yang bisa diatur independen: conv_simulator_lm dan question_asker_lm menggerakkan percakapan riset, outline_gen_lm menyusun struktur artikel, article_gen_lm menulisnya, dan article_polish_lm melakukan pass akhir. README upstream eksplisit soal ekonominya: simulator percakapan menjalankan volume panggilan tertinggi, jadi ia merekomendasikan model yang lebih cepat di sana dan model yang lebih kuat untuk generasi artikel. Panduan itu mengasumsikan memilih di antara model OpenAI; di balik endpoint multi-vendor itu digeneralisasi menjadi sesuatu yang lebih berguna. Setiap slot adalah LitellmModel-nya sendiri dengan string model sendiri, jadi obrolan riset bisa berjalan di id DeepSeek cepat sementara generasi outline dan artikel berjalan di Claude, dan polish di model apa pun yang Anda percaya untuk tone-nya, semuanya diautentikasi oleh key yang sama terhadap api_base yang sama. Sisi retrieval adalah mesin terpisah: runner STORM menerima modul RM (You.com, Bing, dan beberapa backend pencarian lain) dengan API key-nya sendiri. Mengubah ke mana language model mengarah tidak menyentuh bagaimana sumber diambil.
Setup lengkap: lima slot, satu dict kwargs.
Pola kerjanya mencerminkan run script repo itu sendiri: bangun kwargs bersama sekali, konstruksikan satu LitellmModel per peran, dan tetapkan lewat setter STORMWikiLMConfigs. api_key bisa berupa nama apa pun yang Anda suka karena Anda meneruskannya secara eksplisit; contohnya memakai variabelnya sendiri untuk memperjelas ini bukan kredensial akun OpenAI. litellm juga menghormati environment variable level-provider, dan provider openai membaca OPENAI_API_BASE, jadi override environment-saja itu mungkin. Jalur kwargs eksplisit tetap yang harus dipilih: ia terlihat di kode yang menghasilkan artikel tertentu, ia bertahan saat dijalankan di mesin dengan status environment berbeda, dan ia memungkinkan pengecualian per-slot jika Anda pernah ingin satu tahap di endpoint berbeda.
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")Memilih model per tahap pipeline.
Perlakukan kelima setter sebagai tuas budget, bukan boilerplate. Panduan upstream sudah bilang untuk membagi model cepat dan kuat lintas tahap; endpoint multi-vendor hanya melebarkan menu per tahap. Ubah satu slot pada satu waktu antar run pada topik yang sama dan diff outputnya, dengan log penggunaan per-key memberi harga setiap konfigurasi.
- conv_simulator_lm dan question_asker_lm adalah tahap volume: wawancara simulasi multi-giliran lintas beberapa perspektif per topik. deepseek-v4-flash atau id cepat lain menjaga fase riset agar tidak mendominasi pengeluaran, dan obrolan yang tidak sempurna bisa ditoleransi karena ia menyuapi catatan, bukan prosa.
- article_gen_lm adalah slot flagship. Ia menulis bagian panjang, terstruktur, bersitasi dari riset yang terakumulasi, yang merupakan kerja generasi berkelanjutan di mana claude-sonnet-4-6 atau gpt-5.5 jelas mengungguli id yang lebih kecil.
- outline_gen_lm sedikit panggilan dengan leverage yang tidak sebanding, bentuk yang sama seperti slot perencanaan: outline yang lemah membatasi artikel tidak peduli seberapa bagus penulisnya. Ini tempat alami untuk menguji claude-opus-4-7.
- article_polish_lm menulis ulang untuk alur dan menghapus duplikasi lintas artikel yang sudah dirakit, yang diuntungkan dari id long-context; gemini-3.1-pro-preview layak dibenchmark di sini.
Bayar sesuai pemakaian · di bawah harga resmi
Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.
| Model | Harga Resmi | Harga Kami |
|---|---|---|
| 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 |
Mode kegagalan spesifik STORM.
Id model polos merutekan lewat inferensi, bukan lewat api_base Anda. litellm membaca prefix untuk memilih provider, dan id Claude tanpa prefix disimpulkan sebagai panggilan native Anthropic, yang kemudian menginginkan ANTHROPIC_API_KEY dan sepenuhnya mengabaikan gateway Anda. Setiap id yang menuju gateway harus membawa prefix openai/; prefix-nya menamai protokol, bukan vendornya. Satu slot tertinggal. Setiap LitellmModel menangkap kwargs-nya saat konstruksi. Jika empat slot berbagi openai_kwargs dan slot kelima dibangun ad hoc tanpa api_base, slot itu diam-diam mengirim ke default vendor dan gagal di auth, dan traceback-nya menamai tahap pipeline alih-alih baris config. Bangun setiap slot dari dict yang sama dan kelas bug ini menghilang. Kegagalan retriever yang disalahkan ke endpoint. Fase riset butuh backend pencarian yang berfungsi; key retriever yang tidak valid atau habis (YDC_API_KEY, BING_SEARCH_API_KEY, atau RM apa pun yang Anda pilih) menggagalkan run saat pengumpulan informasi. Fase itu berselang-seling dengan panggilan LM, jadi baca traceback-nya untuk client mana yang melempar error sebelum menyentuh config LM. secrets.toml demo bukan config script Anda. Demo Streamlit membaca secrets.toml; run programatik membaca apa pun yang diteruskan script Anda. Mengedit satu sementara menjalankan yang lain adalah ketidakcocokan klasik. max_tokens juga per-slot. Contoh STORM menetapkan batas kecil di slot cepat (500) dan lebih besar di generasi (3000). Mengarahkan slot ke model long-form tanpa menaikkan max_tokens-nya diam-diam memotong bagian, yang terlihat seperti masalah kualitas model tapi sebenarnya angka config.
Siapa yang merutekan STORM melalui gateway.
- Tim yang menghasilkan laporan pengetahuan dalam volume (brief, dokumen internal bergaya wiki, primer topik), di mana pembagian lima-slot membuat penyetelan biaya per-tahap sepadan dengan uang sungguhan.
- Peneliti yang mempelajari komposisi pipeline: tahap mana yang diuntungkan dari model yang lebih kuat adalah pertanyaan empiris, dan satu endpoint membuat grid kombinasi slot-model sepele untuk dienumerasi.
- Builder yang menjalankan Claude atau Gemini di slot penulisan dari stack berbentuk OpenAI, tanpa menambahkan SDK vendor per keluarga model.
- Siapa pun yang menjalankan daftar topik batch, di mana volume fase-riset melipatgandakan lintas topik dan log penggunaan menjadi buku besar biaya per-topik.
- Developer tanpa akses ke billing vendor tertentu. Akses berbasis top-up tanpa syarat kartu menghilangkan ketergantungan sign-up per provider.
Verifikasi endpoint dan debug artikel pertama.
Daftar model gateway dulu: string setelah openai/ di setiap slot harus cocok persis dengan id yang dilayani. Kegagalan first-run mengikuti urutan pipeline. Error auth yang menyebut Anthropic atau Google berarti id tanpa prefix merutekan ke provider native; tambahkan openai/. 401 dari gateway berarti api_key di kwargs Anda bukan key gateway-nya. Error model-not-found menamai slot yang id-nya salah ketik. Kegagalan saat fase riset yang menyebut search backend Anda adalah kredensial retriever, bukan routing LM. Dan bagian artikel yang terpotong atau anehnya pendek biasanya adalah max_tokens yang pelit di slot generasi alih-alih apa pun di upstream. Run STORM penuh adalah burst besar: percakapan simulasi lintas perspektif, lalu outline, generasi, dan polish. Setelah satu selesai, konsol APIsRouter menunjukkan model per request, hitungan token, dan pengeluaran, yang terpetakan bersih ke kelima slot dan memberi tahu Anda persis tahap mana yang harus disetel ulang sebelum batch topik berikutnya.
curl -s https://api.apisrouter.com/v1/models \
-H "Authorization: Bearer $APISROUTER_API_KEY" | head -50Pertanyaan umum
Bagaimana STORM mendukung endpoint OpenAI-compatible custom?
Lewat litellm. STORM membangun setiap LM sebagai LitellmModel, yang menggabungkan kwargs konstruktornya ke setiap panggilan litellm.completion(), dan litellm menerima api_base untuk provider openai. Tambahkan api_base ke dict openai_kwargs dan setiap slot yang dibangun darinya merutekan ke gateway.
Mengapa id model butuh prefix openai/?
litellm memilih provider dari prefix-nya. openai/claude-sonnet-4-6 berarti "bicara protokol chat-completions OpenAI ke api_base saya dengan model claude-sonnet-4-6". Tanpa prefix, litellm menyimpulkan vendor dari namanya dan merutekan secara native, melewati endpoint Anda.
Bisakah tahap STORM berbeda memakai model vendor berbeda?
Ya. Setiap dari lima slot adalah LitellmModel independen, jadi simulator percakapan bisa menjalankan id DeepSeek sementara generasi artikel menjalankan Claude dan polish menjalankan GPT, semuanya melalui api_base dan key yang sama. Upstream sudah merekomendasikan membagi model cepat dan kuat lintas tahap.
Apakah retriever pencarian berubah saat saya mengubah api_base?
Tidak. Retrieval berjalan lewat modul RM yang Anda serahkan ke STORMWikiRunner (You.com, Bing, dan backend lain yang didukung) dengan key-nya sendiri. Routing LM dan retrieval sumber adalah sistem independen yang gagal di fase berbeda dari sebuah run.
Apakah ada jalur environment-variable selain kwargs?
litellm menghormati variabel level-provider, dan provider openai membaca OPENAI_API_BASE. Ini berfungsi, tapi kwarg api_base eksplisit lebih bisa direproduksi: ia ikut dengan script-nya, bertahan di mesin dengan status environment berbeda, dan mengizinkan pengecualian per-slot.
Berapa banyak token yang dikonsumsi satu artikel STORM?
Fase riset mendominasi: percakapan simulasi multi-perspektif melipatgandakan panggilan sebelum satu kata pun dari artikel ada, lalu generasi dan polish menambahkan output long-form di atasnya. Run penuh biasanya mendarat di ratusan ribu token, dan tampilan penggunaan per-key menunjukkan pemisahan per-tahap yang persis.