OpenAIã®GPTã·ãªãŒãºãGoogleã®GeminiãAnthropicã®Claudeãšå瀟ããçæAIã䜿ãAPIããªãªãŒã¹ãããŠããèªåã®ã¢ããªã«çµã¿èŸŒãããšãã§ããããã ãããããã®ã¢ãã«ã䜿ãã«ã¯ãããããã®ã¢ã«ãŠã³ããäœãå¿ èŠãããããšãŠãé¢åã ãããã§è©Šãããã®ãOpenRouterã ããªããš60瀟600以äžã®AIã¢ãã«ã䜿ãããšãã§ãããä»åã¯ãOpenRouterã䜿ã£ãŠããããããªAIã®æèŠãèãããŒã«ãäœã£ãŠã¿ããã
OpenRouterãšã¯
åé ã§èª¬æããããã«ãå瀟ãå ¬éããŠããAIã®APIã䜿ãã«ã¯ãããããã®äŒç€Ÿããšã«ã¢ã«ãŠã³ããäœæããã¯ã¬ãžããã«ãŒããç»é²ããŠãAPIããŒãååŸããå¿ èŠãããããã®äœæ¥ãæå€ãšé¢åã ãããããã¡ãã£ãšè©Šãããã ããªã®ã«ãOpenAIãAnthropicã®APIã䜿ãã«ã¯ã5ãã«åã®ã¯ã¬ãžãããè³Œå ¥ããªããšãããªãããã®ãããè€æ°ã®ã¢ãã«ã詊ããããšããå Žåã¯ãã©ãããŠãç¡é§ãå€ããªã£ãŠããŸãã
ããã§ãå©çšãããã®ãOpenRouterã ããã®ãµãŒãã¹ãå©çšãããšãè€æ°ã®AIã¢ãã«ãäžã€ã®ã¢ã«ãŠã³ãã§å©çšã§ããããããŠãOpenRouterã¯ã60瀟300以äžã®AIã¢ãã«ãæäŸããŠããã®ãå¬ãããšããã ãOpenAIã®GPTã·ãªãŒãºãGoogleã®GeminiãAnthropicã®Claudeãªã©ã®æåãªã¢ãã«ãå©çšã§ãããããã®ä»ã«ãæ§ã ãªã¢ãã«ãæäŸãããŠããã
ãã ããåç€Ÿã®ææã¢ãã«ã䜿ãå Žåã«ã¯ããªãªãžãã«ã®ã¢ãã«ãããè¥å¹²ææ°æåã ãé«ããªããããã§ããè€æ°ã®ã¢ãã«ãäžã€ã®APIã§å©çšã§ããã¡ãªããã¯å€§ããã
ãªããæ¬çš¿å·çæç¹ã§ã¯ãç¡ææ ãçšæãããŠããã1ãã«ãè¶ ãããŸã§ã¯ãç¡æã§è©Šãããšãã§ããããã ãããã§ãæ¬çš¿ã§ãç¡ææ ã®ç¯å²ã§éãã§ã¿ããã
OpenRouterã§ã¢ã«ãŠã³ããäœãã
ããã§ã¯ãOpenRouterã§ã¢ã«ãŠã³ããäœã£ãŠã¿ããããŸãã¯ãOpenRouterã®Webãµã€ãã«ã¢ã¯ã»ã¹ããŠãå³äžã®ãSign Upããã¿ã³ãã¯ãªãã¯ãããããããŠãã¡ãŒã«ã¢ãã¬ã¹ãšãã¹ã¯ãŒããå ¥åããŠãã¢ã«ãŠã³ããäœæããããã¢ã«ãŠã³ããäœæãããããã°ã€ã³ããŠã¿ããããªããGitHubãGoogleãWeb3 Walletã®ã¢ã«ãŠã³ãã§ããã°ã€ã³ã§ããã
ãããŠããã°ã€ã³ãããããã¡ãã®URLã«ãŠã[Create]ãã¿ã³ãæŒããŠãAPIããŒãäœæãããããã®éãAPIããŒãèå¥ããåå(Name)ã«å ããŠããŠããŒã¯ãªç¹ãšããŠãAPIããŒã®ãªã»ããã¿ã€ãã³ã°(Reset limit every...)ããAPIããŒã®æå¹æé(Expiration)ãã¯ã¬ãžããã®å¶é(Credit limit)ãèšå®ããããšãã§ããã
APIããŒã®æå¹æéã¯ãç¡å¶é(No expiration)ã1æéã1æ¥ã7æ¥ã30æ¥ã90æ¥ã1幎(1 year)ãªã©ãéžã¶ããšãã§ããããã®ç¹ã§ããã¹ãçšã®APIããŒã§ããã°ã1æ¥ãã7æ¥ã§ç¡å¹ã«ãªãããã«ãããšå®å¿ããŠäœ¿ãããšãã§ããã ããããã®ç¹ãããèããããŠãããšæããã
APIããŒã¯äœæããæã ã衚瀺ãããã®ã§ãã³ããŒããŠå€§åã«ä¿åããŠãããããããAPIããŒãçŽå€±ããŠããŸã£ãå Žåã¯ãå床ãŒãããAPIããŒãäœæããå¿ èŠãããããªããAPIããŒã¯è€æ°äœæããããšãã§ããã®ã§ãçšéã«å¿ããŠäœ¿ãåããããã
ãªããAPIããŒã¯ã»ãã¥ãªãã£äžã®çç±ãããããã°ã©ã ã®ã³ãŒãå ã«æžããªãããã«æ°ãã€ãããã
APIããŒãç°å¢å€æ°ã«ç»é²ããã
ååŸããAPIããŒã¯ãç°å¢å€æ°ã«ç»é²ãããã
macOSãªãã°ã~/.zshrcãã«ä»¥äžã®èšå®ã远èšããããUbuntuãªã©ã®Linuxãªãã°ã~/.bashrcãã«ä»¥äžã®èšå®ã远èšãããããããŠãã¿ãŒããã«ãéããŠãsource (远èšãããã¡ã€ã«å)ããå®è¡ããããããã§ãç°å¢å€æ°ã«APIããŒãç»é²ãããã
export OPENROUTER_API_KEY="sk-or-xxxxxxxxx"
Windowsã®å Žåã¯ãã³ã³ãããŒã«ããã«ãããã·ã¹ãã ãšã»ãã¥ãªãã£ãâãã·ã¹ãã ãâãã·ã¹ãã ã®è©³çްèšå®ãâãç°å¢å€æ°ããšé²ã¿ããæ°èŠããã¿ã³ãã¯ãªãã¯ããŠã倿°åã«ãOPENROUTER_API_KEYãã倿°å€ã«APIããŒãå ¥åããŠä¿åãããã
OpenRouterã®APIã詊ããŠã¿ãã
OpenRouterã®APIã詊ãããã«ãã¿ãŒããã«ã§ä»¥äžã®ã³ãã³ããå®è¡ããŠãLiteLLMã©ã€ãã©ãªãã€ã³ã¹ããŒã«ãããã
pip install litellm
ãããŠã次ã®ãããªããã°ã©ã ãäœã£ãŠè©ŠããŠã¿ãããOpenAIãAnthropicãGoogleã®å®äŸ¡ã¢ãã«ãæå®ããŠã質åã«å¯Ÿããåçã衚瀺ããããã°ã©ã ã ã
import os
from litellm import completion
# è€æ°ã®ã¢ãã«ãæå® --- (*1)
models = [
"openrouter/openai/gpt-5-mini",
"openrouter/anthropic/claude-3-haiku",
"openrouter/google/gemini-2.5-flash"
]
# 質åãããããšãæå® --- (*2)
question = "ããã«ã¡ã¯ã奜ããªé£ã¹ç©ãäžèšã§çããŠã"
print(f"質å: {question}")
# äžèšã§æå®ããã¢ãã«ãäžã€ãã€å®è¡ --- (*3)
for model in models:
response = completion(
model=model,
messages=[
{"role": "user", "content": question}
],
api_key=os.getenv("OPENROUTER_API_KEY"),
max_tokens=1000, # â ä»åããã®æå®ãéèŠ --- (*4)
)
msg = response.choices[0].message.content
print(f"{model}ã®åç: {msg}")
äžèšã®ããã°ã©ã ããhello3.pyããšããååã§ä¿åãããããããŠãã¿ãŒããã«ã§ä»¥äžã®ã³ãã³ããå ¥åããŠãããã°ã©ã ãå®è¡ããŠã¿ããã
python hello3.py
æ£ããå®è¡ã§ãããšã以äžã®ããã«ã質åã«å¯Ÿããåã¢ãã«ã®åçã衚瀺ãããã¯ãã ã
ãªããæ¬¡ã®ãããªãšã©ãŒãåºãŠããŸã£ãå Žåãæ¢ã«ãç¡ææ ãè¶ããŠããŸã£ãŠããããšãæå³ããããã®ãããOpenRouterã®Webãµã€ãã§ã¯ã¬ãžããã«ãŒããç»é²ããŠãã¯ã¬ãžãããè³Œå ¥ãããã
litellm.exceptions.APIError: litellm.APIError:
APIError: OpenrouterException - {"error":
{"message":"This request requires more credits,
or fewer max_tokens.
You requested up to 65536 tokens,
but can only afford 20000.
To increase, visit https://openrouter.ai/settings/credits
and upgrade to a paid account",
"code":402,"metadata":{"provider_name":null}},
"user_id":"user_xxxxx"}
ããŸãå®è¡ã§ããããããã°ã©ã ã確èªãããããã®ããã°ã©ã ã¯ãLiteLLM ãšããã©ã€ãã©ãªã䜿ã£ãŠãè€æ°ã®AIã¢ãã«ã«åã質åãé çªã«éããããããã®è¿çã衚瀺ãããã®ã ãããã€ãã®ã¢ãã«ã«ãŸãšããŠåã質åãããŠãåçã®éããèŠæ¯ã¹ããããšããããã€ã³ããšãªãã
ããã°ã©ã ã®(ïŒ1)ã§ã¯ã䜿ãããã¢ãã«ã®ååããªã¹ãã«ãŸãšããŠæå®ããŠãããããã§ã¯ãOpenRouterçµç±ã§ãOpenAIãAnthropicãGoogleã®å®äŸ¡ã¢ãã«ãæå®ããã
(ïŒ2)ã§ã¯ãåã¢ãã«ã«éã質åæã倿°questionã«ä»£å ¥ããããã®å€æ°ã1ãæå€ããã ãã§ãå šã¢ãã«ã«å¯ŸããŠç°ãªã質åãå¯èœã ã
(ïŒ3)ã§ã¯ãå ã»ã©çšæããã¢ãã«äžèЧãé çªã«åãåºããŠãã²ãšã€ãã€APIãåŒã³åºããŠããããã®äžã®completion(...)ãå®éã®åãåããåŠçãšãªãã
ãŸããapi_key=os.getenv("OPENROUTER_API_KEY")ãšæå®ããããšã§ãç°å¢å€æ°ããAPIããŒãèªã¿åã£ãŠãAPIã«äžããŠããã®ããã€ã³ãã ãããã«ãã£ãŠãAPIããŒãã³ãŒãå ã«çŽæ¥æžããã«æžãã®ã§ãã»ãã¥ãªãã£äžã®ãªã¹ã¯ãæžããããšãã§ããã
LLMã®APIã«ã¢ã¯ã»ã¹ããåŸã§ããresponse.choices[0].message.contentããšæžããŠããããããã«ãã£ãŠãã¢ãã«ã®è¿çæ¬æãåãåºããŠããã
(ïŒ4)ã§ã¯ãmax_tokens=1000ãæå®ããŠãããããã¯ä»åã®ã³ãŒãã®äžã§ãç¹ã«éèŠãªéšåã ãmax_tokensã¯ãã¢ãã«ãè¿ããŠããæå€§ã®åºåéãæ±ºããããã®èšå®ã ãä»åãç¡ææ ã®äžã§ããããéã¶ããã«ã¯ããã®å€ã1000以äžã«èšå®ããã®ãå®å šã ã
APIã«å°ããGUIãäœã£ãŠã¿ãã
ããã§ã¯ãGUIãäœã£ãŠãåçš®AIã®è¿çãåŸãããã°ã©ã ãäœã£ãŠã¿ãããããã§ã¯ãTkEasyGUIã䜿ã£ãŠãç°¡åãªGUIãäœã£ãŠã¿ãããTkEasyGUIã¯ãTkinterãããŒã¹ã«ããPythonã®GUIã©ã€ãã©ãªã§ãç°¡åã«GUIãäœãããšãã§ããã以äžã®ããã°ã©ã ã¯ããã¡ãã«ãã¢ããããŠããã
import os
from queue import Queue
import TkEasyGUI as eg
from litellm import completion
# è€æ°ã®ã¢ãã«ãæå® --- (*1)
models = [
"openrouter/openai/gpt-5-mini",
"openrouter/anthropic/claude-3-haiku",
"openrouter/google/gemini-2.5-flash"
]
def ask_llm(question, model):
"""LLMã«è³ªåãã颿°""" # --- (*2)
response = completion(
model=model,
messages=[
{"role": "user", "content": question}
],
api_key=os.getenv("OPENROUTER_API_KEY"),
max_tokens=1000, # â ä»åããã®æå®ãéèŠ
)
return response.choices[0].message.content
# GUIã§ãããšãããããã®ãã¥ãŒ --- (*3)
ui_queue = Queue()
# GUIãäœæ --- (*4)
def main():
layout = [
[eg.Text("質åãå
¥åããŠãã ãã:")],
[
eg.Input(key="question", expand_x=True, size=(40,1)),
eg.Button("質å")
],
[eg.Text("åç:")],
[eg.Multiline(key="answer", expand_x=True, expand_y=True)],
]
font = ("Arial", 20 if eg.is_mac() else 12)
window = eg.Window("LLMã«è³ªå", layout, size=(800, 600), font=font)
while window.is_running():
event, values = window.read(timeout=300)
if event == "質å":
question = values["question"]
window.start_thread(ask_proc, question, window)
if not ui_queue.empty():
model, answer = ui_queue.get()
window["answer"].print(f"{model}ã®åç:", text_color="white", background_color="red")
window["answer"].print(f"{answer}\n\n", text_color="black", background_color="white")
window.close()
def ask_proc(question, window):
"""質åãåŠçãã颿°""" # --- (*5)
for model in models:
window.start_thread(ask_llm_proc, question, model)
def ask_llm_proc(question, model):
"""LLMã«è³ªåãã颿°""" # --- (*6)
answer = ask_llm(question, model)
ui_queue.put((model, answer))
if __name__ == "__main__":
main()
äžèšã®ããã°ã©ã ããask_llm.pyããšããååã§ä¿åãããããããŠãã¿ãŒããã«ã§ä»¥äžã®ã³ãã³ããå ¥åããŠãããã°ã©ã ãå®è¡ããŠã¿ããã
# TkEasyGUIãšLiteLLMãã€ã³ã¹ããŒã«
python -m pip install TkEasyGUI litellm
# ããã°ã©ã ãå®è¡
python ask_llm.py
ããã°ã©ã ãå®è¡ãããšã次ã®ããã«è¡šç€ºããããæ¬¡ã®ç»é¢ã¯ãWindowsã§å®è¡ããå Žåã®ç»é¢ã ã
macOSã§å®è¡ããŠãå瀟ã®LLMã«å¥œããªå¯¿åžãã¿ãèããŠã¿ããšã次ã®ãããªç»é¢ã衚瀺ããããã¡ãªã¿ã«ãå®è¡ãããã³ã«ç°ãªã寿åžãã¿ã衚瀺ãããã
ããã°ã©ã ãç°¡åã«ç¢ºèªãããã
(ïŒ1)ã§ã¯ã質åãéã察象ãšãªãè€æ°ã®ã¢ãã«ããªã¹ãã«ãŸãšããŠããããã¡ãã®OpenRouterã®ã¢ãã«äžèЧããŒãžã«äœ¿ããã¢ãã«ãåæãããŠããã®ã§ã奜ããªã¢ãã«ãéžãã§æå®ããŠã¿ãããäŸãã°ããx-ai/grok-4.1-fastããæå®ããã«ã¯ããopenrouter/x-ai/grok-4.1-fastãã远å ããã°è¯ãã
(ïŒ2)ã®é¢æ°ask_llmã¯ãå®éã«1ã€ã®ã¢ãã«ãžè³ªåãéã£ãŠåçãåãåãããã®ãã®ã ããŸããããã§ããapi_key=os.getenv("OPENROUTER_API_KEY")ãã䜿ã£ãŠç°å¢å€æ°ããAPIããŒãèªãã§ããã
(ïŒ3)ã§ã¯ãGUIã§ãããšãããããã®ãã¥ãŒãäœã£ãŠãããä»åã®ããã°ã©ã ã§ã¯ãLLMãžã®åãåããã¯å¥ã¹ã¬ããã§åãããGUIã®éšåãã®ãã®ã¯åºæ¬çã«ã¡ã€ã³ã®GUIåŽããå®å šã«æŽæ°ãããå Žé¢ãå€ããããã§ãAIããè¿ã£ãŠããçµæããã£ãã倿°ui_queueã«å ¥ããGUIã®ã¡ã€ã³ã«ãŒãããããåãåºããŠç»é¢ãžè¡šç€ºããããšããæµãã«ããŠããã
(ïŒ4)ã§ã¯ãGUIå šäœãäœãmain颿°ãå®çŸ©ããŠããããŸã倿°layoutã§ãç»é¢ã«ã©ããªéšåã䞊ã¹ãããæ±ºããŠããã質åå ¥åæ¬ã質åãã¿ã³ããããŠåç衚瀺æ¬ãšããã·ã³ãã«ãªç»é¢æ§æã«ããããexpand_x=Trueãããexpand_y=Trueããšæžãããšã§ããŠã£ã³ããŠãµã€ãºã«åãããŠå ¥åæ¬ã衚瀺æ¬ãåºããããã«ãªã£ãŠããã
ãã®ããšã§ãwindow = eg.Window(...)ããšæžãããšã§ãå®éã®ãŠã£ã³ããŠãäœã£ãŠãã€ãã³ãã«ãŒããå®è¡ããããã®ã«ãŒãã¯ãGUIã¢ããªãåããŠããéãã£ãšåãç¶ãããããã§ãã¿ã³ãæŒãããããå ¥åå 容ãã©ããªã£ãŠãããããã¥ãŒã«æ°ããåçãå±ãããããšãã£ãããšãç¹°ãè¿ã確èªããŠããã
ãªããã質åããã¿ã³ãæŒããããšãã«ã¯ãå ¥åæ¬ãã質åæãåãåºããå¥ã¹ã¬ããã§LLMãžã®åãåããåŠçãå§ãããããã§å¥ã¹ã¬ããã«ããŠããçç±ã¯ãAPIåŒã³åºãã«æéããããããã§ããããããã®ãŸãŸã¡ã€ã³ã®GUIåŠçã®äžã§åãåãããããŠããŸããšãå¿çãè¿ããŸã§ç»é¢ãåºãŸãããã¿ã³ãæŒãããèŠãç®ã«ããæ¢ãŸã£ãã¢ããªãã®ããã«ãªã£ãŠããŸãããã®ãããéãåŠçãå¥ã§åãããGUIã¯GUIãšããŠåãç¶ããããã«ããŠããã
(ïŒ5)ã®é¢æ°ask_procã§ã¯ãã質åããã¿ã³ãæŒããæãå®éã«ãè€æ°ã®ã¢ãã«ãžåãåãããæããåŠçãå®è£ ããŠããã
ãããŠã(ïŒ6)ã®é¢æ°ask_llm_procã¯ã颿°ask_llm(question, model)ãåŒãã§åçãååŸãããã®ããšã倿°ui_queueã«ã¢ãã«åãšåçã远å ããåŠçã«ããŠããã
ãŸãšã - OpenRouterã¯äŸ¿å©ã ã£ã
以äžãä»åã¯ãOpenRouterã䜿ã£ãŠããããããªAIã®æèŠãèãããŒã«ãäœã£ãŠã¿ããOpenRouterã䜿ããšãæ°è»œã«è€æ°ã®AIã¢ãã«ãäžã€ã®APIã§å©çšã§ããããšãåãã£ãããããããªAIã®æèŠãèãããšãã§ããã®ã¯é¢çœããä»ãªããç¡ææ ãçšæãããŠããã®ã§ãæ°è»œã«è©ŠããŠã¿ããã
ãªããããã§ç޹ä»ããããã°ã©ã ã§ã¯ãå®äŸ¡ãªã¢ãã«ãæå®ããŠããããšããããæ¬çš¿å·çãçµãã£ãæç¹ã§ãã0.01ãã«(1.6å)çšåºŠã®ã³ã¹ãããæ¶è²»ããŠããªãã£ããç¡ææ ã1ãã«ã§ãããªãç¡æã§éã¹ãããšãåããã
æ¬å®¶ã®APIããããOpenRouterã®æ¹ãææ°æåã³ã¹ããé«ããšããããšã ããããã»ã©å€§ããªå·®ã¯ãªãã詊ãã«ãOpenAIã®ãGPT-5 Miniãã確èªããŠã¿ããšãããæ¬å®¶ãšOpenRouterã§åäŸ¡æ Œ(å ¥å0.25/åºå2ãã«)ã ã£ã(å·çæç¹)ãä»äºãªã©ã§å€§éã®APIãæ¶è²»ããå Žåã«ã¯ç¢ºèªããæ¹ãè¯ãããã¡ãã£ãšè©ŠãçšåºŠã§ããã°ãããã»ã©æ°ã«ãã䜿ãããšãã§ãããã ã
èªç±åããã°ã©ããŒããããã¯ãã©ã«ãŠãããã°ã©ãã³ã°ã®æ¥œãããäŒããæŽ»åãããŠããã代衚äœã«ãæ¥æ¬èªããã°ã©ãã³ã°èšèªããªã§ããã ãããã¹ã鳿¥œããµã¯ã©ããªã©ã2001幎ãªã³ã©ã€ã³ãœãã倧è³å ¥è³ã2004幎床æªèžãŠãŒã¹ ã¹ãŒããŒã¯ãªãšãŒã¿èªå®ã2010幎 OSSè²¢ç®è ç« åè³ããããŸã§50å以äžã®æè¡æžãå·çãããçŽè¿ã§ã¯ããå€§èŠæš¡èšèªã¢ãã«ã䜿ãããªãããã®ããã³ãããšã³ãžãã¢ãªã³ã°ã®æç§æž(ãã€ããåºç)ããPythonã§ã€ãããã¹ã¯ãããã¢ããª(ãœã·ã )ããå®è·µåã身ã«ã€ãã Pythonã®æç§æž 第2çããã·ãŽããã¯ãã©ã PythonèªååŠçã®æç§æž(ãã€ããåºç)ããªã©ã







