このAPIはClient SDKキー(osk_プレフィックス)で認証します。
REST APIチャット(OpenAI互換)とは別のエンドポイントです。
メッセージ送信
POST /v1/chat/{persona_id}
ペルソナにメッセージを送信します。thread_idを省略すると新しいスレッドが作成され、含めると既存のスレッドを続行します。
利用可能なモデルはGET /v1/modelsで確認できます。
リクエスト
新規スレッド(model必須):
{
"model": "shopping-assistant",
"messages": [
{
"role": "user",
"content": "今晩のメニューは何がいいかな?"
}
]
}
スレッド続行(model不要):
{
"thread_id": "thr_a1b2c3d4e5f6",
"messages": [
{
"role": "user",
"content": "カレーの材料を教えて"
}
]
}
| フィールド | タイプ | 必須 | 説明 |
|---|
model | string | 新規スレッド時必須 | モデル名(GET /v1/modelsから取得) |
thread_id | string | X | 既存スレッドID(省略時は新規スレッド作成) |
messages | array | O | メッセージ配列 |
messages[].role | string | O | user |
messages[].content | string | O | メッセージ内容 |
新規スレッド作成時に指定したモデルはそのスレッドに固定されます。以降の会話ではmodelフィールドを省略しても同じモデルが使用されます。
レスポンス
{
"success": true,
"data": {
"thread_id": "thr_a1b2c3d4e5f6",
"is_new_thread": true,
"user_message": {
"message_id": "msg_u1v2w3x4y5z6",
"role": "user",
"content": "今晩のメニューは何がいいかな?",
"created_at": "2026-04-16T10:00:00Z"
},
"assistant_message": {
"message_id": "msg_a7b8c9d0e1f2",
"role": "assistant",
"blocks": [
{
"type": "text",
"content": "雨の日にはあたたかいビーフカレーはいかがですか?"
},
{
"type": "product_list",
"title": "ピリ辛ビーフカレーの材料",
"badge": "AI おすすめ",
"items": [
{ "id": "p_001", "name": "和牛ロース (300g)", "section": "精肉コーナー", "price": 24500 },
{ "id": "p_002", "name": "有機じゃがいも/にんじんセット", "section": "新鮮野菜", "price": 4800 }
],
"actions": [
{ "id": "view_recipe", "label": "詳細を見る", "style": "primary" },
{ "id": "show_alternates", "label": "他のおすすめを見る", "style": "secondary" }
]
},
{
"type": "suggestion",
"content": "カレーに合う赤ワインもおすすめしましょうか?",
"actions": [
{ "id": "wine_yes", "label": "おすすめして", "style": "primary" },
{ "id": "wine_no", "label": "大丈夫です", "style": "secondary" }
]
}
],
"created_at": "2026-04-16T10:00:01Z"
}
}
}
ブロックタイプ
assistantレスポンスは構造化されたblocks配列で返されます。
| タイプ | 説明 | 主なフィールド |
|---|
text | テキストメッセージ | content |
image | 画像 | url |
product_list | 商品リスト | title, items[], actions[] |
suggestion | AIおすすめ/提案 | content, actions[] |
アクション
ブロックに含まれるactionsは、クライアントでユーザーインタラクションを処理するための情報です。
| フィールド | 説明 |
|---|
id | アクション識別子 |
label | ボタンテキスト |
style | primary / secondary / text |
スレッド情報取得
GET /v1/chat/{persona_id}/threads/{thread_id}
スレッドのメタ情報を取得します(メッセージ本文は含まれません)。
レスポンス
{
"success": true,
"data": {
"thread_id": "thr_a1b2c3d4e5f6",
"title": "今晩のメニューおすすめ",
"status": "ACTIVE",
"message_count": 4,
"started_at": "2026-04-16T10:00:00Z",
"last_active_at": "2026-04-16T10:30:00Z"
}
}
| ステータス | 説明 |
|---|
ACTIVE | 進行中 |
CLOSED | 終了済み |
スレッド終了
POST /v1/chat/{persona_id}/threads/{thread_id}/close
スレッドを終了します。ペルソナのステータスがCHAT → READYに遷移します。
レスポンス
{
"success": true,
"data": {
"thread_id": "thr_a1b2c3d4e5f6",
"thread_status": "CLOSED",
"persona_status": "READY",
"closed_at": "2026-04-16T10:35:00Z"
}
}
既に終了したスレッドにリクエストすると409 Conflictが返されます:
{
"success": false,
"error": {
"code": "ALREADY_CLOSED",
"message": "thread is already closed"
}
}
メッセージ一覧取得
GET /v1/chat/{persona_id}/threads/{thread_id}/messages
スレッドのメッセージ一覧を取得します(古い順)。カーソルベースのページネーションに対応しています。
クエリパラメータ
| パラメータ | タイプ | デフォルト | 説明 |
|---|
limit | integer | 50 | 返すメッセージ数(最大100) |
before | string | - | このmessage_idより前のメッセージを読み込み(逆方向ページング) |
レスポンス
{
"success": true,
"data": {
"thread_id": "thr_a1b2c3d4e5f6",
"messages": [
{
"message_id": "msg_u1v2w3x4y5z6",
"role": "user",
"content": "今晩のメニューは何がいいかな?",
"created_at": "2026-04-16T10:00:00Z"
},
{
"message_id": "msg_a7b8c9d0e1f2",
"role": "assistant",
"blocks": [
{ "type": "text", "content": "ビーフカレーはいかがですか?" }
],
"created_at": "2026-04-16T10:00:01Z"
}
],
"has_more": false,
"next_before": null
}
}
has_moreがtrueの場合、next_beforeの値をbeforeパラメータに渡して次のページを読み込みます。
全体フロー例
# 1. ペルソナ作成
PERSONA_ID=$(curl -s -X POST https://api.ones1ght.com/v1/persona \
-H "Authorization: Bearer $SDK_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "田中太郎", "locale": "ja"}' | jq -r '.data.persona_id')
# 2. 利用可能なモデルを確認
curl -s https://api.ones1ght.com/v1/models \
-H "Authorization: Bearer $SDK_KEY"
# 3. チャット開始(新規スレッド自動作成、model必須)
THREAD_ID=$(curl -s -X POST https://api.ones1ght.com/v1/chat/$PERSONA_ID \
-H "Authorization: Bearer $SDK_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "shopping-assistant", "messages": [{"role": "user", "content": "今晩何食べようかな?"}]}' | jq -r '.data.thread_id')
# 4. 会話を続ける(model不要、スレッドに固定済み)
curl -X POST https://api.ones1ght.com/v1/chat/$PERSONA_ID \
-H "Authorization: Bearer $SDK_KEY" \
-H "Content-Type: application/json" \
-d "{\"thread_id\": \"$THREAD_ID\", \"messages\": [{\"role\": \"user\", \"content\": \"カレーの材料を教えて\"}]}"
# 5. メッセージ履歴を取得
curl https://api.ones1ght.com/v1/chat/$PERSONA_ID/threads/$THREAD_ID/messages \
-H "Authorization: Bearer $SDK_KEY"
# 6. スレッド終了
curl -X POST https://api.ones1ght.com/v1/chat/$PERSONA_ID/threads/$THREAD_ID/close \
-H "Authorization: Bearer $SDK_KEY"