Jalankan Stanford STORM pada endpoint serasi OpenAI custom.

Updated 2026-07-29

STORM membina setiap language model sebagai LitellmModel, dan litellm menerima api_base. Masukkan https://api.apisrouter.com/v1 dalam openai_kwargs dikongsi anda, awalkan id model dengan openai/, dan kelima-lima slot LM pipeline artikel menghalakan melalui satu endpoint dan satu kunci.

Jawapan pantas: api_base dalam openai_kwargs, awalan openai/ pada id.

LitellmModel STORM menyimpan apa sahaja kwargs yang anda bina bersamanya dan menggabungkannya ke dalam setiap panggilan litellm.completion(). Parameter api_base litellm ialah cara anda mengarahkan penyedia openai ke hos berbeza, jadi menambah api_base ke dict openai_kwargs yang sudah digunakan contoh STORM sendiri adalah keseluruhan override. Awalkan setiap id model dengan openai/ supaya litellm bertutur protokol chat-completions kepada base itu, dan rentetan selepas garis miring diteruskan kepada gateway. Kerana contoh itu membina satu dict openai_kwargs dan menggunakannya semula untuk setiap model, satu kunci yang ditambah menghalakan semula seluruh pipeline. Tiada perubahan kod STORM, tiada fork; ini adalah tingkah laku knowledge_storm stok yang berlapis atas penghalaan litellm yang didokumentasikan.

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 membahagikan artikel merentasi lima slot LM.

STORM (stanford-oval di GitHub, lebih kurang 30K bintang) menulis laporan gaya Wikipedia dari kosong: ia menyelidik topik melalui perbualan simulasi berbilang perspektif, membina outline daripada apa yang dipelajarinya, menjana artikel penuh seksyen demi seksyen, dan kemudian menggilapnya. STORMWikiLMConfigs mendedahkan pipeline itu sebagai lima model yang boleh ditetapkan secara bebas: conv_simulator_lm dan question_asker_lm menggerakkan perbualan penyelidikan, outline_gen_lm menstruktur artikel, article_gen_lm menulisnya, dan article_polish_lm melakukan larian akhir. README upstream jelas tentang ekonominya: simulator perbualan menjalankan volum panggilan tertinggi, jadi ia mengesyorkan model lebih pantas di sana dan model lebih berkuasa untuk penjanaan artikel. Panduan itu menganggap memilih antara model OpenAI; di sebalik endpoint multi-vendor ia menggeneralisasikan kepada sesuatu yang lebih berguna. Setiap slot adalah LitellmModel sendiri dengan rentetan model sendiri, jadi bebelan penyelidikan boleh berjalan pada id DeepSeek pantas manakala penjanaan outline dan artikel berjalan pada Claude, dan gilapan pada mana-mana model yang anda percayai untuk nada, kesemuanya disahkan oleh kunci yang sama terhadap api_base yang sama. Sisi retrieval adalah mesin berasingan: runner STORM mengambil modul RM (You.com, Bing, dan beberapa backend carian lain) dengan API key sendiri. Menukar ke mana language model menunjuk tidak menyentuh cara sumber diambil.

Persediaan penuh: lima slot, satu dict kwargs.

Corak yang berfungsi mencerminkan skrip larian repo itu sendiri: bina kwargs dikongsi sekali, bina satu LitellmModel per peranan, dan tetapkannya melalui setter STORMWikiLMConfigs. api_key boleh menjadi apa sahaja nama yang anda suka kerana anda menghantarnya secara eksplisit; contoh itu menggunakan pembolehubah sendiri untuk menjelaskan ini bukan kelayakan akaun OpenAI. litellm juga menghormati pembolehubah environment peringkat-penyedia, dan penyedia openai membaca OPENAI_API_BASE, jadi override environment-sahaja adalah mungkin. Laluan kwargs eksplisit masih yang patut diutamakan: ia kelihatan dalam kod yang menghasilkan sesuatu artikel, ia bertahan apabila dijalankan pada mesin dengan keadaan environment berbeza, dan ia menjadikan pengecualian per-slot mungkin jika anda pernah mahu satu peringkat pada endpoint berbeza.

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 peringkat pipeline.

Anggap kelima-lima setter sebagai dail belanjawan, bukan boilerplate. Panduan upstream sudah menyatakan untuk membahagikan model pantas dan kuat merentasi peringkat; endpoint multi-vendor hanya meluaskan menu per peringkat. Tukar satu slot pada satu masa antara larian pada topik yang sama dan diff output, dengan log penggunaan per-kunci menilai harga setiap konfigurasi.

  • conv_simulator_lm dan question_asker_lm adalah peringkat volum: temu bual simulasi berbilang-giliran merentasi beberapa perspektif per topik. deepseek-v4-flash atau id pantas lain mengelakkan fasa penyelidikan mendominasi perbelanjaan, dan bebelan tidak sempurna boleh diterima kerana ia memberi makan nota, bukan prosa.
  • article_gen_lm ialah slot flagship. Ia menulis seksyen panjang, berstruktur, dipetik daripada penyelidikan terkumpul, kerja penjanaan-berterusan di mana claude-sonnet-4-6 atau gpt-5.5 jelas mengatasi id yang lebih kecil.
  • outline_gen_lm adalah sedikit panggilan dengan leverage yang luar biasa, bentuk yang sama seperti slot perancangan: outline yang lemah mengehadkan artikel tidak kira sebaik mana penulisnya. Ia adalah tempat semula jadi untuk menguji claude-opus-4-7.
  • article_polish_lm menulis semula untuk aliran dan membuang pertindihan merentasi artikel yang dihimpun, yang mendapat manfaat daripada id konteks-panjang; gemini-3.1-pro-preview berbaloi ditanda aras di sini.

Bayar mengikut penggunaan · bawah harga rasmi

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

ModelHarga RasmiHarga 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

Mod kegagalan khusus STORM.

Id model kosong menghalakan mengikut inferens, bukan mengikut api_base anda. litellm membaca awalan untuk memilih penyedia, dan id Claude tanpa awalan disimpulkan sebagai panggilan Anthropic-native, yang kemudian mahukan ANTHROPIC_API_KEY dan mengabaikan gateway anda sepenuhnya. Setiap id yang menuju gateway mesti membawa awalan openai/; awalan itu menamakan protokol, bukan vendor. Satu slot tertinggal. Setiap LitellmModel menangkap kwargs-nya semasa pembinaan. Jika empat slot berkongsi openai_kwargs dan yang kelima dibina ad hoc tanpa api_base, slot itu secara senyap menghantar ke lalai vendor dan gagal pada auth, dan traceback menamakan peringkat pipeline dan bukan baris config. Bina setiap slot daripada dict yang sama dan kelas pepijat ini hilang. Kegagalan retriever disalahkan pada endpoint. Fasa penyelidikan memerlukan backend carian yang berfungsi; kunci retriever yang tidak sah atau habis (YDC_API_KEY, BING_SEARCH_API_KEY, atau mana-mana RM yang anda pilih) menggagalkan larian semasa pengumpulan maklumat. Fasa itu berselang-seli dengan panggilan LM, jadi baca traceback untuk klien mana yang menaikkan ralat sebelum menyentuh config LM. secrets.toml demo bukan config skrip anda. Demo Streamlit membaca secrets.toml; larian pengaturcaraan membaca apa sahaja yang dihantar skrip anda. Menyunting satu sambil menjalankan yang lain adalah ketidakpadanan klasik. max_tokens juga per-slot. Contoh STORM menetapkan had kecil pada slot pantas (500) dan lebih besar pada penjanaan (3000). Mengarahkan slot ke model bentuk-panjang tanpa menaikkan max_tokens-nya secara senyap memotong seksyen, yang kelihatan seperti masalah kualiti model tetapi adalah nombor config.

Siapa yang menghalakan STORM melalui gateway.

  • Pasukan yang menjana laporan pengetahuan pada volum (brief, dokumen dalaman gaya wiki, primer topik), di mana pemisahan lima-slot menjadikan penalaan kos per-peringkat berbaloi wang sebenar.
  • Penyelidik yang mengkaji komposisi pipeline: peringkat mana yang mendapat manfaat daripada model lebih kuat adalah soalan empirikal, dan satu endpoint menjadikan grid kombinasi slot-model remeh untuk disenaraikan.
  • Pembina yang menjalankan Claude atau Gemini dalam slot penulisan stack berbentuk OpenAI, tanpa menambah SDK vendor setiap keluarga model.
  • Sesiapa yang menjalankan senarai topik pukal, di mana volum fasa-penyelidikan menggandakan merentasi topik dan log penggunaan menjadi lejar kos per-topik.
  • Pembangun tanpa akses kepada pengebilan vendor tertentu. Akses berasaskan top-up tanpa keperluan kad menghapuskan kebergantungan pendaftaran setiap penyedia.

Sahkan endpoint dan nyahpepijat artikel pertama.

Senaraikan model gateway dahulu: rentetan selepas openai/ dalam setiap slot mesti sepadan tepat dengan id yang dilayani. Kegagalan larian-pertama mengikut susunan pipeline. Ralat auth yang menyebut Anthropic atau Google bermaksud id tanpa awalan dihalakan ke penyedia natif; tambah openai/. 401 daripada gateway bermaksud api_key dalam kwargs anda bukan kunci gateway. Ralat model-not-found menamakan slot yang id-nya mempunyai kesilapan taip. Kegagalan semasa fasa penyelidikan yang menyebut backend carian anda adalah kelayakan retriever, bukan penghalaan LM. Dan seksyen artikel yang terpotong atau pendek secara janggal biasanya max_tokens yang kedekut pada slot penjanaan dan bukan apa-apa di hulu. Larian STORM penuh adalah letusan besar: perbualan simulasi merentasi perspektif, kemudian outline, penjanaan, dan gilapan. Sebaik sahaja satu selesai, konsol APIsRouter menunjukkan model per permintaan, kiraan token, dan perbelanjaan, yang memetakan dengan bersih kepada lima slot dan memberitahu anda tepat peringkat mana untuk ditala semula sebelum kelompok topik seterusnya.

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

Soalan lazim

Bagaimana STORM menyokong endpoint serasi OpenAI custom?

Melalui litellm. STORM membina setiap LM sebagai LitellmModel, yang menggabungkan kwargs konstruktornya ke dalam setiap panggilan litellm.completion(), dan litellm menerima api_base untuk penyedia openai. Tambah api_base ke dict openai_kwargs dan setiap slot yang dibina daripadanya menghalakan ke gateway.

Mengapa id model memerlukan awalan openai/?

litellm memilih penyedia daripada awalan. openai/claude-sonnet-4-6 bermaksud "bertutur protokol chat-completions OpenAI kepada api_base saya dengan model claude-sonnet-4-6". Tanpa awalan, litellm menyimpulkan vendor daripada nama itu dan menghalakan secara natif, memintas endpoint anda.

Bolehkah peringkat STORM berbeza menggunakan model vendor berbeza?

Ya. Setiap satu daripada lima slot adalah LitellmModel bebas, jadi simulator perbualan boleh menjalankan id DeepSeek manakala penjanaan artikel menjalankan Claude dan gilapan menjalankan GPT, kesemuanya melalui api_base dan kunci yang sama. Upstream sudah mengesyorkan membahagikan model pantas dan kuat merentasi peringkat.

Adakah retriever carian berubah apabila saya menukar api_base?

Tidak. Retrieval berjalan melalui modul RM yang anda hantar ke STORMWikiRunner (You.com, Bing, dan backend lain yang disokong) dengan kunci sendiri. Penghalaan LM dan retrieval sumber adalah sistem bebas yang gagal pada fasa larian yang berbeza.

Adakah terdapat laluan pembolehubah-environment selain kwargs?

litellm menghormati pembolehubah peringkat-penyedia, dan penyedia openai membaca OPENAI_API_BASE. Ia berfungsi, tetapi kwarg api_base eksplisit lebih boleh dihasilkan semula: ia bergerak bersama skrip, bertahan pada mesin dengan keadaan environment berbeza, dan membenarkan pengecualian per-slot.

Berapa banyak token yang digunakan satu artikel STORM?

Fasa penyelidikan mendominasi: perbualan simulasi berbilang-perspektif menggandakan panggilan sebelum sepatah kata artikel wujud, kemudian penjanaan dan gilapan menambah output bentuk-panjang di atasnya. Larian penuh biasanya mendarat pada ratusan ribu token, dan pandangan penggunaan per-kunci menunjukkan pecahan per-peringkat yang tepat.