LLM API for Developers — Integration Guide 2026 | APIMaster.ai
LLM APIの開発者向けガイド:認証、ストリーミング、関数呼び出し、埋め込み、RAG、非同期パターン、コスト管理。APIMaster経由でClaude、GPT、DeepSeekに対応。
LLM API for Developers:完全統合ガイド
このガイドでは、開発者がLLM APIを本番アプリケーションに統合するために必要なすべての事項(認証、ストリーミング、ツール使用、埋め込み、RAGパターン、コスト管理)を網羅しています。すべての例はOpenAI互換フォーマットを使用し、APIMaster.aiで動作します。
セットアップ
from openai import OpenAI
client = OpenAI(
api_key="YOUR_APIMASTER_KEY",
base_url="https://apimaster.ai/v1",
)
コアパターン
1. 基本チャット補完
def ask(prompt: str, model: str = "claude-sonnet-4-6") -> str:
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
)
return response.choices[0].message.content
2. システムプロンプト + 会話
class Conversation:
def __init__(self, system: str, model: str = "claude-sonnet-4-6"):
self.model = model
self.messages = [{"role": "system", "content": system}]
def send(self, user_msg: str) -> str:
self.messages.append({"role": "user", "content": user_msg})
resp = client.chat.completions.create(
model=self.model,
messages=self.messages,
)
reply = resp.choices[0].message.content
self.messages.append({"role": "assistant", "content": reply})
return reply
bot = Conversation("あなたは熟練のPython開発者です。")
print(bot.send("GILとは何ですか?"))
print(bot.send("それを回避するにはどうすればよいですか?"))
3. ストリーミング
def stream(prompt: str, model: str = "gpt-5.4"):
with client.chat.completions.stream(
model=model,
messages=[{"role": "user", "content": prompt}],
) as s:
for text in s.text_stream:
yield text
for chunk in stream("Pythonのasync/awaitについて説明してください"):
print(chunk, end="", flush=True)
4. 構造化出力
from pydantic import BaseModel
from typing import List
class ExtractedData(BaseModel):
entities: List[str]
sentiment: str
summary: str
import json
response = client.chat.completions.create(
model="gpt-5.4",
messages=[
{"role": "system", "content": f"データを抽出し、このスキーマに一致するJSONを返してください:{ExtractedData.schema()}"},
{"role": "user", "content": "Appleは記録的な収益を報告しました。CEOのTim Cook氏はそれを例外的だと述べました。"},
],
response_format={"type": "json_object"},
)
data = ExtractedData(**json.loads(response.choices[0].message.content))
print(data.entities) # ["Apple", "Tim Cook"]
print(data.sentiment) # "positive"
5. ツール使用 / 関数呼び出し
import json
tools = [
{
"type": "function",
"function": {
"name": "execute_sql",
"description": "読み取り専用のSQLクエリを実行する",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string"},
"database": {"type": "string", "enum": ["users", "orders", "products"]},
},
"required": ["query", "database"],
},
},
}
]
def handle_tool_call(tool_name: str, args: dict) -> str:
# 実装
return json.dumps({"result": "モックデータ"})
def agent_loop(user_msg: str):
messages = [{"role": "user", "content": user_msg}]
while True:
resp = client.chat.completions.create(
model="gpt-5.4",
messages=messages,
tools=tools,
)
if resp.choices[0].finish_reason != "tool_calls":
return resp.choices[0].message.content
# ツール呼び出しを処理
messages.append(resp.choices[0].message)
for tc in resp.choices[0].message.tool_calls:
result = handle_tool_call(tc.function.name, json.loads(tc.function.arguments))
messages.append({"role": "tool", "tool_call_id": tc.id, "content": result})
6. 埋め込み
def embed(texts: list[str]) -> list[list[float]]:
response = client.embeddings.create(
model="text-embedding-3-small",
input=texts,
)
return [item.embedding for item in response.data]
# 意味的類似性
import numpy as np
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
vecs = embed(["Pythonは素晴らしい", "私はPythonが大好き", "Javaは冗長だ"])
print(cosine_similarity(vecs[0], vecs[1])) # 高い:~0.95
print(cosine_similarity(vecs[0], vecs[2])) # 低い:~0.70
7. RAG(検索拡張生成)
from typing import List
def rag_query(user_question: str, knowledge_base: List[str]) -> str:
# ステップ1:質問を埋め込む
q_embedding = embed([user_question])[0]
doc_embeddings = embed(knowledge_base)
# ステップ2:最も関連性の高いドキュメントを見つける
similarities = [cosine_similarity(q_embedding, d) for d in doc_embeddings]
top_indices = sorted(range(len(similarities)), key=lambda i: similarities[i], reverse=True)[:3]
context = "\n\n".join(knowledge_base[i] for i in top_indices)
# ステップ3:コンテキストを使用して回答を生成
response = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[
{"role": "system", "content": f"このコンテキストのみを使用して回答してください:\n\n{context}"},
{"role": "user", "content": user_question},
],
)
return response.choices[0].message.content
8. 高スループットのための非同期処理
import asyncio
from openai import AsyncOpenAI
async_client = AsyncOpenAI(
api_key="YOUR_APIMASTER_KEY",
base_url="https://apimaster.ai/v1",
)
async def process_batch(prompts: list[str]) -> list[str]:
tasks = [
async_client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": p}],
max_tokens=100,
)
for p in prompts
]
responses = await asyncio.gather(*tasks)
return [r.choices[0].message.content for r in responses]
# 50個のプロンプトを同時に処理
results = asyncio.run(process_batch(my_prompts))
本番環境チェックリスト
- APIキーはソースコードではなく環境変数に保存する
- 429/500エラーに対する指数バックオフ付きリトライロジック
- コスト暴走を防ぐために
max_tokensを設定する - ユーザー向け応答が2秒を超える場合はストリーミングを使用する
- コスト追跡のためにトークン数を含むリクエストログ
- プロバイダーの制限内に収めるためのレートリミッター
適切なモデルの選択
| ユースケース | モデル | コスト層 |
|---|---|---|
| プロトタイピング | deepseek-v4-flash または gpt-4o-mini | 非常に低い |
| 本番チャットボット | claude-haiku-4-5 | 低い |
| コードアシスタント | deepseek-v4-flash または claude-sonnet-4-6 | 低~中 |
| 複雑な分析 | claude-sonnet-4-6 | 中 |
| 研究/推論 | claude-opus-4-8 または o3 | 高い |
よくある質問
LLM APIとは何ですか?
LLM APIは、コードがテキストプロンプトを送信し、AI生成の応答を受け取ることを可能にするHTTPインターフェースです。messages配列を送信すると、APIが補完結果を返します。ほとんどのAPIはOpenAI Chat Completionsフォーマットを使用しています。
LLM APIプロバイダーはどのように選べばよいですか? モデルの能力(ベンチマーク)、トークンあたりのコスト、レイテンシー、信頼性を考慮してください。ほとんどのユースケースでは、DeepSeek V4 Flash(低コストコーディング)、Claude Sonnet(文章作成/分析)、またはGPT-4o(マルチモーダル)が一般的なパスをカバーします。APIMasterを使用すると、1行でプロバイダーを切り替えることができます。
OpenAI互換APIとは何ですか?
OpenAIと同じ/v1/chat/completionsフォーマットを実装するエンドポイントであり、openai PythonライブラリやOpenAI互換ツールを非OpenAIモデルでも使用できるようにするものです。
本番環境でLLM APIエラーをどのように処理すればよいですか?
RateLimitError(バックオフ付きリトライ)、APIConnectionError(リトライ)、InvalidRequestError(プロンプト修正)をキャッチします。本番環境の回復力のために、タイムアウトとサーキットブレーカーを使用してください。
複数のLLMプロバイダーに1つのAPIキーを使用できますか?
はい。APIMasterはGPT、Claude、DeepSeek、Gemini用の単一のキーとエンドポイントを提供します。modelパラメータを変更するだけでモデルを切り替えられます。プロバイダー固有のキーやSDKは必要ありません。