「自社データを検索してコードも実行するAIアシスタント」が数十行で作れる時代です。OpenAI Assistants APIの仕組みと、2026年最新の実装方法を解説します。

AIを知りたい
OpenAIのAssistants APIって普通のChat Completions APIと何が違うんですか?

AIエンジニア
大きな違いは状態管理とツール実行をAPI側が行ってくれることです。会話の履歴管理やファイル検索、コード実行をOpenAI側で自動的に処理してくれます。

AIを知りたい
自分で管理しなくていいんですか?

AIエンジニア
そうです!Chat Completionsでは会話履歴やツール呼び出しを自分で管理する必要がありますが、Assistants APIではそれらをOpenAIのサーバーが管理してくれます。
Assistants APIとは
OpenAI Assistants APIとは、AIアシスタントの構築を簡素化するAPIです。スレッド(会話履歴)管理、ファイル検索(RAG)、コード実行、関数呼び出しなどの機能を提供し、開発者はビジネスロジックに集中できます。
Assistants APIの基本概念

AIを知りたい
Assistants APIの基本的な仕組みを教えてください!

AIエンジニア
4つの重要な概念があります。
| 概念 | 説明 | 役割 |
|---|---|---|
| Assistant | AIアシスタントの定義 | モデル・ツール・指示の設定 |
| Thread | 会話スレッド | メッセージ履歴の管理 |
| Message | 個別のメッセージ | ユーザーとAIの発言 |
| Run | 実行リクエスト | Assistantにスレッドを処理させる |
Assistants APIの実装方法

AIを知りたい
実際のコードを見せてください!

AIエンジニア
Python SDKを使った実装例です。
from openai import OpenAI
client = OpenAI()
# 1. Assistantの作成
assistant = client.beta.assistants.create(
name="データ分析アシスタント",
instructions="あなたはデータ分析の専門家です。",
model="gpt-4o",
tools=[
{"type": "code_interpreter"},
{"type": "file_search"}
]
)
# 2. スレッドの作成
thread = client.beta.threads.create()
# 3. メッセージの追加
message = client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="売上データを分析してトレンドを教えてください"
)
# 4. 実行(ストリーミング)
with client.beta.threads.runs.stream(
thread_id=thread.id,
assistant_id=assistant.id,
) as stream:
for text in stream.text_deltas:
print(text, end="", flush=True)
ファイル検索(RAG)の実装

AIを知りたい
ファイルを渡して質問に答えさせることもできるんですか?

AIエンジニア
はい!File Search機能でRAGが簡単に実装できます。PDFやテキストファイルをアップロードするだけです。
# ベクトルストアの作成
vector_store = client.beta.vector_stores.create(
name="社内ドキュメント"
)
# ファイルのアップロード
file = client.files.create(
file=open("manual.pdf", "rb"),
purpose="assistants"
)
# ベクトルストアにファイルを追加
client.beta.vector_stores.files.create(
vector_store_id=vector_store.id,
file_id=file.id
)
# Assistantにベクトルストアを紐付け
assistant = client.beta.assistants.update(
assistant.id,
tool_resources={
"file_search": {
"vector_store_ids": [vector_store.id]
}
}
)
Chat Completions API vs Assistants API

AIを知りたい
結局どっちを使えばいいんですか?

AIエンジニア
用途によって使い分けましょう。
| 観点 | Chat Completions | Assistants API |
|---|---|---|
| 会話管理 | 自前で実装 | API側で管理 |
| ファイル検索 | 自前でRAG構築 | File Search組み込み |
| コード実行 | 非対応 | Code Interpreter対応 |
| 柔軟性 | 高い | 中程度 |
| コスト | トークンのみ | トークン+ストレージ |
| おすすめ | シンプルなチャット | 複雑なアシスタント、RAG |

AIを知りたい
用途に合わせて選べばいいんですね!

AIエンジニア
その通りです。会話の状態管理やRAGが必要ならAssistants API、シンプルなAPI呼び出しならChat Completionsを選びましょう。まずはPlaygroundで試してみるのがおすすめですよ!
関連記事
- GPT-4o API入門:OpenAI最新モデルの使い方と料金体系
- ChatGPT Code Interpreter活用法:データ分析・可視化の自動化
- GPT Store活用法:カスタムGPTの作り方と業務活用テクニック
OpenAI Assistants APIの基本フロー:Assistant作成からThread・Run実行まで
Assistants APIを使ってステートフルな会話エージェントを構築する基本フローを実装します。Assistant定義 → Thread作成 → Message追加 → Run実行 → 結果取得という一連のステップを確認しましょう。
from openai import OpenAI
import time
client = OpenAI()
# ステップ1: Assistantの作成(ツール付き)
assistant = client.beta.assistants.create(
name="Data Analysis Helper",
instructions="""あなたはデータ分析の専門家です。
ユーザーの質問に対して、分かりやすく丁寧に回答してください。
必要に応じてCode Interpreterを使い、計算やグラフ生成を行ってください。
回答は日本語でお願いします。""",
model="gpt-4o",
tools=[{"type": "code_interpreter"}]
)
print(f"Assistant作成完了: {assistant.id}")
# ステップ2: Threadの作成(会話セッション)
thread = client.beta.threads.create()
print(f"Thread作成完了: {thread.id}")
# ステップ3: Messageの追加
message = client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="1から100までの素数を列挙し、その個数と合計を教えてください。"
)
print(f"Message追加完了: {message.id}")
# ステップ4: Runの実行
run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant.id
)
print(f"Run開始: {run.id} (status={run.status})")
# ステップ5: Run完了をポーリングで待機
while run.status in ["queued", "in_progress"]:
time.sleep(1)
run = client.beta.threads.runs.retrieve(
thread_id=thread.id,
run_id=run.id
)
print(f" status: {run.status}")
if run.status == "completed":
# ステップ6: Assistantの応答メッセージを取得
messages = client.beta.threads.messages.list(thread_id=thread.id)
for msg in reversed(messages.data):
role = msg.role
for block in msg.content:
if block.type == "text":
print(f"\n[{role}] {block.text.value}")
elif run.status == "failed":
print(f"Run失敗: {run.last_error}")
# 後続メッセージの追加(同一Thread内で会話継続)
follow_up = client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="その素数をヒストグラムで可視化してください。"
)
run2 = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant.id
)
while run2.status in ["queued", "in_progress"]:
time.sleep(1)
run2 = client.beta.threads.runs.retrieve(
thread_id=thread.id, run_id=run2.id
)
print(f"\nFollow-up完了: status={run2.status}")
# クリーンアップ(不要になったAssistantを削除)
client.beta.assistants.delete(assistant.id)
print("Assistant削除完了")
Assistants APIのポイントは3つあります。第一に、Threadが会話状態を保持するため、開発者側でメッセージ履歴を管理する必要がなく、follow-upメッセージを追加するだけで文脈を維持した会話が継続できます。第二に、Code Interpreterツールを有効にすることで、Assistantが自律的にPythonコードを実行して計算やグラフ生成を行えるため、データ分析ユースケースに強力です。第三に、Runは非同期で実行されるため、ポーリングまたはストリーミングで完了を検知する設計が必要です。本番環境ではclient.beta.threads.runs.create_and_poll()を使うとポーリングコードを簡略化できます。
