すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Model Studio:OpenAI 互換 - 応答 API

最終更新日:Mar 28, 2026

Alibaba Cloud Model Studio の Qwen モデルは、OpenAI 互換の応答 API(Responses API)をサポートしています。チャット完了 API(Chat Completions API)の進化版として、応答 API はより簡潔かつ直感的な方法でネイティブなエージェント機能を提供します。

OpenAI Chat Completions API に対する利点:

  • 組み込みツール: Web 検索、Web スクレイピング、コードインタープリター、テキストによる画像検索、画像による画像検索などの組み込みツールが含まれます。これらのツールは、複雑なタスクの結果を改善します。詳細については、「組み込みツールの呼び出し」をご参照ください。

  • より柔軟な入力: モデル入力として、プレーン文字列またはチャット形式のメッセージの配列のいずれかを受け入れます。

  • コンテキスト管理の簡素化: 完全なメッセージ履歴配列を手動で構築する代わりに、以前の応答から previous_response_id を渡します。

入力および出力パラメーターの詳細については、「OpenAI Responses API リファレンス」をご参照ください。

前提条件

まず、API キーを取得し、API キーを環境変数として設定してください。OpenAI SDK を使用して API を呼び出す場合は、SDK をインストールする必要があります。

サポートされるモデル

qwen3-maxqwen3-max-2026-01-23qwen3.5-plusqwen3.5-plus-2026-02-15qwen3.5-flashqwen3.5-flash-2026-02-23qwen3.5-397b-a17bqwen3.5-122b-a10bqwen3.5-27bqwen3.5-35b-a3bqwen-plusqwen-flashqwen3-coder-plusqwen3-coder-flash、。

サービスエンドポイント

シンガポール

SDK 向け base_urlhttps://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1

HTTP リクエストエンドポイント:POST https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1/responses

China (Beijing)

SDK 向け base_urlhttps://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1

HTTP リクエストエンドポイント:POST https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1/responses

コード例

基本的な呼び出し

メッセージを送信し、モデルの応答を取得することで、API を呼び出せます。

Python

import os
from openai import OpenAI

client = OpenAI(
    # 環境変数を設定していない場合は、次の行を「api_key="sk-xxx"」に置き換えてください。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1",
)

response = client.responses.create(
    model="qwen3.5-plus",
    input="何ができますか?"
)

# モデルの応答を取得
# print(response.model_dump_json())
print(response.output_text)

Node.js

import OpenAI from "openai";

const openai = new OpenAI({
    // 環境変数を設定していない場合は、次の行を「apiKey: "sk-xxx"」に置き換えてください。
    apiKey: process.env.DASHSCOPE_API_KEY,
    baseURL: "https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1"
});

async function main() {
    const response = await openai.responses.create({
        model: "qwen3.5-plus",
        input: "何ができますか?"
    });

    // モデルの応答を取得
    console.log(response.output_text);
}

main();

curl

curl -X POST https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1/responses \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3.5-plus",
    "input": "何ができますか?"
}'

応答の例

API は以下の完全な応答を返します。
{ 
    "created_at": 1771226624, 
    "id": "bf0d5c2e-f14b-9ad7-bc0d-ee0c8c9ee2d8", 
    "model": "qwen3-max-2026-01-23", 
    "object": "response", 
    "output": [ 
        { 
            "content": [ 
                { 
                    "annotations": [], 
                    "text": "こんにちは! 実際にはかなり……", 
                    "type": "output_text" 
                } 
            ], 
            "id": "msg_1e17fdb2-5fc3-4c78-a9e9-cbd78eb043f0", 
            "role": "assistant", 
            "status": "completed", 
            "type": "message" 
        } 
    ], 
    "parallel_tool_calls": false, 
    "status": "completed", 
    "tool_choice": "auto", 
    "tools": [], 
    "usage": { 
        "input_tokens": 37, 
        "input_tokens_details": { 
            "cached_tokens": 0 
        }, 
        "output_tokens": 220, 
        "output_tokens_details": { 
            "reasoning_tokens": 0 
        }, 
        "total_tokens": 257, 
        "x_details": [ 
            { 
                "input_tokens": 37, 
                "output_tokens": 220, 
                "total_tokens": 257, 
                "x_billing_type": "response_api" 
            } 
        ] 
    } 
}

マルチターン対話

previous_response_id パラメーターを使用すると、メッセージ履歴を手動で構築することなく、コンテキストを自動的にリンクできます。現在の応答の id は 7 日間有効です。

ID を前の応答から取得し(例:UUID 形式の f0dbb153-117f-9bbf-8176-5284b47f3xxx)、previous_response_id の値として使用します。ただし、IDoutput 配列内のメッセージの msg_56c860c4-3ad8-4a96-8553-d2f94c259xxx などは使用しないでください。

Python

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1",
)

# 最初のターン
response1 = client.responses.create(
    model="qwen3.5-plus",
    input="私の名前はジョン・スミスです。覚えておいてください。"
)
print(f"最初の応答: {response1.output_text}")

# 2 回目のターン — previous_response_id を使用してコンテキストをリンクします。\n# 応答 ID は 7 日間有効です。
response2 = client.responses.create(
    model="qwen3.5-plus",
    input="私の名前を覚えていますか?",
    previous_response_id=response1.id
)
print(f"2 回目の応答: {response2.output_text}")

Node.js

import OpenAI from "openai";

const openai = new OpenAI({
    apiKey: process.env.DASHSCOPE_API_KEY,
    baseURL: "https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1"
});

async function main() {
    // 最初のターン
    const response1 = await openai.responses.create({
        model: "qwen3.5-plus",
        input: "私の名前はジョン・スミスです。覚えておいてください。"
    });
    console.log(`最初の応答: ${response1.output_text}`);

    // 2 回目のターン — previous_response_id を使用してコンテキストをリンクします。\n# 応答 ID は 7 日間有効です。
    const response2 = await openai.responses.create({
        model: "qwen3.5-plus",
        input: "私の名前を覚えていますか?",
        previous_response_id: response1.id
    });
    console.log(`2 回目の応答: ${response2.output_text}`);
}

main();

curl

# 最初のターン
curl -X POST https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1/responses \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3.5-plus",
    "input": "私の名前はジョン・スミスです。覚えておいてください。"
}'

# 2 回目のターン — 最初の応答の ID を previous_response_id として使用します。
curl -X POST https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1/responses \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3.5-plus",
    "input": "私の名前を覚えていますか?",
    "previous_response_id": "response_id_from_first_round"
}'

2 回目のターンの応答例

{ 
  "id": "f0dbb153-117f-9bbf-8176-5284b47f3xxx", 
  "created_at": 1769173209.0, 
  "model": "qwen3.5-plus", 
  "object": "response", 
  "status": "completed", 
  "output": [ 
    { 
      "id": "msg_56c860c4-3ad8-4a96-8553-d2f94c259xxx", 
      "type": "message", 
      "role": "assistant", 
      "status": "completed", 
      "content": [ 
        { 
          "type": "output_text", 
          "text": "はい、ジョンさん! あなたの名前を覚えています。今日は何をお手伝いしましょうか?", 
          "annotations": [] 
        } 
      ] 
    } 
  ], 
  "usage": { 
    "input_tokens": 78, 
    "output_tokens": 16, 
    "total_tokens": 94, 
    "input_tokens_details": { 
      "cached_tokens": 0 
    }, 
    "output_tokens_details": { 
      "reasoning_tokens": 0 
    } 
  } 
}

注:2 回目のターンの input_tokens は 78 であり、これは最初のターンからのコンテキストを含んでいます。モデルは「ジョン」という名前を正常に記憶しています。

ストリーミング出力

ストリーミング出力を使用すると、モデルが生成したコンテンツをリアルタイムで受信できます。これは長文生成のシナリオに最適です。

Python

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1",
)

stream = client.responses.create(
    model="qwen3.5-plus",
    input="人工知能について簡単に紹介してください。",
    stream=True
)

print("ストリーミング出力を受信中:")
for event in stream:
    # print(event.model_dump_json())  # 生のイベント応答を表示する場合はコメントを解除
    if event.type == 'response.output_text.delta':
        print(event.delta, end='', flush=True)
    elif event.type == 'response.completed':
        print("\nストリーミング完了")
        print(f"合計トークン数: {event.response.usage.total_tokens}")

Node.js

import OpenAI from "openai";

const openai = new OpenAI({
    apiKey: process.env.DASHSCOPE_API_KEY,
    baseURL: "https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1"
});

async function main() {
    const stream = await openai.responses.create({
        model: "qwen3.5-plus",
        input: "人工知能について簡単に紹介してください。",
        stream: true
    });

    console.log("ストリーミング出力を受信中:");
    for await (const event of stream) {
        // console.log(JSON.stringify(event));  # 生のイベント応答を表示する場合はコメントを解除
        if (event.type === 'response.output_text.delta') {
            process.stdout.write(event.delta);
        } else if (event.type === 'response.completed') {
            console.log("\nストリーミング完了");
            console.log(`合計トークン数: ${event.response.usage.total_tokens}`);
        }
    }
}

main();

curl

curl -X POST https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1/responses \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3.5-plus",
    "input": "人工知能について簡単に紹介してください。",
    "stream": true
}'

応答の例

{"response":{"id":"47a71e7d-868c-4204-9693-ef8ff9058xxx","created_at":1769417481.0,"error":null,"incomplete_details":null,"instructions":null,"metadata":null,"model":"","object":"response","output":[],"parallel_tool_calls":false,"temperature":null,"tool_choice":"auto","tools":[],"top_p":null,"background":null,"completed_at":null,"conversation":null,"max_output_tokens":null,"max_tool_calls":null,"previous_response_id":null,"prompt":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":null,"safety_identifier":null,"service_tier":null,"status":"queued","text":null,"top_logprobs":null,"truncation":null,"usage":null,"user":null},"sequence_number":0,"type":"response.created"}
{"response":{"id":"47a71e7d-868c-4204-9693-ef8ff9058xxx","created_at":1769417481.0,"error":null,"incomplete_details":null,"instructions":null,"metadata":null,"model":"","object":"response","output":[],"parallel_tool_calls":false,"temperature":null,"tool_choice":"auto","tools":[],"top_p":null,"background":null,"completed_at":null,"conversation":null,"max_output_tokens":null,"max_tool_calls":null,"previous_response_id":null,"prompt":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":null,"safety_identifier":null,"service_tier":null,"status":"in_progress","text":null,"top_logprobs":null,"truncation":null,"usage":null,"user":null},"sequence_number":1,"type":"response.in_progress"}
{"item":{"id":"msg_16db29d6-c1d3-47d7-9177-0fba81964xxx","content":[],"role":"assistant","status":"in_progress","type":"message"},"output_index":0,"sequence_number":2,"type":"response.output_item.added"}
{"content_index":0,"item_id":"msg_16db29d6-c1d3-47d7-9177-0fba81964xxx","output_index":0,"part":{"annotations":[],"text":"","type":"output_text","logprobs":null},"sequence_number":3,"type":"response.content_part.added"}
{"content_index":0,"delta":"人工知能","item_id":"msg_16db29d6-c1d3-47d7-9177-0fba81964xxx","logprobs":[],"output_index":0,"sequence_number":4,"type":"response.output_text.delta"}
{"content_index":0,"delta":"(人工知能、","item_id":"msg_16db29d6-c1d3-47d7-9177-0fba81964xxx","logprobs":[],"output_index":0,"sequence_number":5,"type":"response.output_text.delta"}
{"content_index":0,"delta":"AI)とは、コンピューターシステムを用いて人間の知的行動を模倣・拡張・発展させる技術および科学です。","item_id":"msg_16db29d6-c1d3-47d7-9177-0fba81964xxx","logprobs":[],"output_index":0,"sequence_number":6,"type":"response.output_text.delta"}
{"content_index":0,"delta":"。","item_id":"msg_16db29d6-c1d3-47d7-9177-0fba81964xxx","logprobs":[],"output_index":0,"sequence_number":7,"type":"response.output_text.delta"}
...(中間イベントは省略)...
{"content_index":0,"delta":"分野に広く応用されており、私たちの生活や働き方に大きな変化をもたらしています。","item_id":"msg_16db29d6-c1d3-47d7-9177-0fba81964xxx","logprobs":[],"output_index":0,"sequence_number":38,"type":"response.output_text.delta"}
{"content_index":0,"delta":"。","item_id":"msg_16db29d6-c1d3-47d7-9177-0fba81964xxx","logprobs":[],"output_index":0,"sequence_number":39,"type":"response.output_text.delta"}
{"content_index":0,"delta":"。","item_id":"msg_16db29d6-c1d3-47d7-9177-0fba81964xxx","logprobs":[],"output_index":0,"sequence_number":40,"type":"response.output_text.delta"}
{"content_index":0,"item_id":"msg_16db29d6-c1d3-47d7-9177-0fba81964xxx","logprobs":[],"output_index":0,"sequence_number":41,"text":"人工知能(AI)とは、コンピューターシステムを用いて人間の知的行動を模倣・拡張・発展させる技術および科学です。xxxx","type":"response.output_text.done"}
{"content_index":0,"item_id":"msg_16db29d6-c1d3-47d7-9177-0fba81964xxx","output_index":0,"part":{"annotations":[],"text":"人工知能(AI)とは、コンピューターシステムを用いて人間の知的行動を模倣・拡張・発展させる技術および科学です。xxxx","type":"output_text","logprobs":null},"sequence_number":42,"type":"response.content_part.done"}
{"item":{"id":"msg_16db29d6-c1d3-47d7-9177-0fba81964xxx","content":[{"annotations":[],"text":"人工知能(AI)とは、コンピューターシステムを用いて人間の知的行動を模倣・拡張・発展させる技術および科学です。その目的は、機械に人間の知能を必要とするタスク(例:学習、推論、認識、言語理解、意思決定など)を実行させることです。\n\n人工知能は、特定のタスクに特化した「弱い AI」(例:音声アシスタント、レコメンデーションシステム)と、人間と同程度の汎用的知能を持つ「強い AI」(現時点では実現されていません)に大別されます。\n\n現在、人工知能は医療、金融、交通、教育、エンターテインメントなど多くの分野に広く応用されており、私たちの生活や働き方に大きな変化をもたらしています。","type":"output_text","logprobs":null}],"role":"assistant","status":"completed","type":"message"},"output_index":0,"sequence_number":43,"type":"response.output_item.done"}
{"response":{"id":"47a71e7d-868c-4204-9693-ef8ff9058xxx","created_at":1769417481.0,"error":null,"incomplete_details":null,"instructions":null,"metadata":null,"model":"qwen3.5-plus","object":"response","output":[{"id":"msg_16db29d6-c1d3-47d7-9177-0fba81964xxx","content":[{"annotations":[],"text":"人工知能(AI)とは、コンピューターシステムを用いて人間の知的行動を模倣・拡張・発展させる技術および科学です。xxxx","type":"output_text","logprobs":null}],"role":"assistant","status":"completed","type":"message"}],"parallel_tool_calls":false,"temperature":null,"tool_choice":"auto","tools":[],"top_p":null,"background":null,"completed_at":null,"conversation":null,"max_output_tokens":null,"max_tool_calls":null,"previous_response_id":null,"prompt":null,"prompt_cache_key":null,"prompt_cache_retention":null,"reasoning":null,"safety_identifier":null,"service_tier":null,"status":"completed","text":null,"top_logprobs":null,"truncation":null,"usage":{"input_tokens":37,"input_tokens_details":{"cached_tokens":0},"output_tokens":166,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":203},"user":null},"sequence_number":44,"type":"response.completed"}

深層思考モード

深層思考モードを有効にすると、モデルは応答前に思考を行います。この思考プロセスは、reasoning 型の出力項目に表示されます。これは、複雑な推論を要する問題に適しています。

思考の最大長を制御するための thinking_budget パラメーターはサポートされていません。

Python

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1",
)

response = client.responses.create(
    model="qwen3.5-plus",
    input="9.9 と 9.11 のどちらが大きいですか?",
    extra_body={"enable_thinking": True}
)

# 出力の処理
for item in response.output:
    if item.type == "reasoning":
        print("=== 思考プロセス ===")
        for summary in item.summary:
            print(summary.text)
    elif item.type == "message":
        print("\n=== 最終的な回答 ===")
        print(item.content[0].text)

# 思考トークン数を確認
print(f"\n思考トークン数: {response.usage.output_tokens_details.reasoning_tokens}")

Node.js

import OpenAI from "openai";

const openai = new OpenAI({
    apiKey: process.env.DASHSCOPE_API_KEY,
    baseURL: "https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1"
});

async function main() {
    const response = await openai.responses.create({
        model: "qwen3.5-plus",
        input: "9.9 と 9.11 のどちらが大きいですか?",
        enable_thinking: true
    });

    for (const item of response.output) {
        if (item.type === "reasoning") {
            console.log("=== 思考プロセス ===");
            for (const summary of item.summary) {
                console.log(summary.text);
            }
        } else if (item.type === "message") {
            console.log("\n=== 最終的な回答 ===");
            console.log(item.content[0].text);
        }
    }

    // 思考トークン数を確認
    console.log(`\n思考トークン数: ${response.usage.output_tokens_details.reasoning_tokens}`);
}

main();

curl

curl -X POST https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1/responses \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3.5-plus",
    "input": "9.9 と 9.11 のどちらが大きいですか?",
    "enable_thinking": true
}'

応答の例

{
    "created_at": 1774498317,
    "id": "resp_xxx",
    "model": "qwen3.5-plus",
    "object": "response",
    "output": [
        {
            "id": "msg_xxx",
            "summary": [
                {
                    "text": "思考プロセス:\n\n1.  **リクエストの分析:**\n    *   問題: \"9.9 と 9.11 のどちらが大きいですか?\"\n    *   文脈: ユーザーは単純な数学的比較の質問をしています。\n    *   現在日付: 2026 年 3 月 26 日(木曜日)(システムプロンプトで提供)。\n    *   知識のカットオフ: 2026 年(システムプロンプトで提供)。\n\n2.  **数値の評価:**\n    *   数 A: 9.9\n    *   数 B: 9.11\n    *   これらは小数です。\n    *   整数部を比較: どちらも 9 です。\n    *   十分位(小数点第 1 位)を比較:\n        *   9.9 の十分位は 9 です。\n        *   9.11 の十分位は 1 です。\n    *   9 > 1 なので、9.9 > 9.11 です。\n\n3.  **潜在的な曖昧さの検討:**\n    *   これはバージョン番号(例:ソフトウェアのバージョン)でしょうか?(例:バージョン 9.11 はバージョン 9.9 より「新しい」または「高い」ことが多い)。しかし、数学的には 9.9 > 9.11 です。\n    *   これは日付でしょうか?(9 月 9 日 vs 9 月 11 日)。11 日の方が後です。\n    *   標準的な解釈: 文脈がない場合、小数は数学的値として扱われます。\n    *   常見の誤解: 一部の人々は、小数を整数のように扱い(11 > 9 なので、9.11 > 9.9 だと考える)ことがあります。これは初等数学における認知バイアスまたは誤解として知られています。\n    *   決定: 明確な数学的答えを提示し、関連する場合に限りバージョンの文脈にも言及します(ただし、この特定の質問では、数学テストである可能性が高いため、数学的真実を優先します)。シンプルさを重視し、数学的答えを第一にします。\n\n4.  **回答の作成:**\n    *   直接的な答え: 9.9 の方が大きいです。\n    *   解説: 桁の値で比較します。9.9 = 9.90、9.11 = 9.11 です。90 百分位 > 11 百分位です。\n    *   トーン: 助けになる、明確なトーン。\n\n5.  **応答の草案(内部独白/下書き):**\n    *   OK、数学的には 9.9 の方が大きいです。9.9 は 9 と 9/10、9.11 は 9 と 11/100(または 1/10 と 1/100)です。9/10 は 1/10 より大きいです。\n    *   よって、9.9 > 9.11 です。\n    *   質問が日本語なので、回答も日本語で行います。\n    *   「9.9 の方が大きいです。」\n    *   混乱を避けるため、簡単な解説を追加します。「9.9 は 9.90 に等しく、9.90 は 9.11 より大きいです。」\n\n6.  **「バージョン番号」の可能性に基づく精査:**\n    *   これはソフトウェアバージョンに関するトリック質問かもしれません。semver では、9.11 > 9.9 です。\n    *   しかし、単に「どちらが大きい?」と尋ねられた場合、通常は数値としての大きさを意味します。\n    *   主に数学的な答えを提示し、関連する場合はバージョンの文脈にも言及しますが、過剰な説明は混乱を招く可能性があるため、シンプルさを優先します。おそらく、これは小数の比較ロジックをテストする質問です。\n    *   数学的値をデフォルトとして採用します。\n\n7.  **最終的な洗練:**\n    *   回答: 9.9 の方が大きいです。\n    *   理由: 小数を比較する際には、まず整数部(どちらも 9)を、次に十分位を調べます。9.9 の十分位の数字は 9、9.11 の十分位の数字は 1 です。9 > 1 なので、9.9 > 9.11 です。\n\n8.  **出力生成:**(思考プロセスに一致)\n    *   どちらが大きいのかを明確に述べる。\n    *   その理由を説明する。\n\n    *日付/時刻に関する自己修正*: システムプロンプトには現在日付が 2026 年とあります。これは数学の質問には影響しませんが、文脈を追加する際に 2026 年以降の内容を参照しないよう注意が必要です(ここでは不要です)。\n\n    *最終的な判断*: 単純な数学の質問に直接答えます。\n\n    「数値として、9.9 の方が大きいです。」\n    解説: 9.9 = 9.90、9.11 = 9.11 です。90 > 11 です。\n\n    他に解釈はありますか?\n    - 日付? 9/9 vs 9/11。11 日の方が後です。\n    - バージョン? 9.11 の方が新しいです。\n    - しかし、「どちらが大きい?」(=「誰が大きい?」)は、通常、大きさ(マグニチュード)を意味します。\n    - 数値としての大きさを基準に回答しますが、バージョンの文脈についても役立つ情報を提供します。ただし、混乱を避けるため、明確に区別します。\n    実際には、単純な質問に対して過剰に説明するのは避け、数学的回答を優先します。\n\n    改訂後の計画:\n    1. 数学的な答えを直接提示します。\n    2. 桁の値による比較を説明します。\n    3. (役立つ場合のみ)バージョンの文脈について言及します。\n\n    簡潔にまとめましょう。\n\n    「数値として、9.9 の方が大きいです。」\n    「小数を比較する際には、まず整数部(どちらも 9)を、次に十分位を調べます。9.9 の十分位の数字は 9、9.11 の十分位の数字は 1 です。9 > 1 なので、9.9 > 9.11 です。」\n    「ただし、これがソフトウェアのバージョン番号であれば、バージョン 9.11 は通常バージョン 9.9 より新しい(高い)と見なされます。」\n    これで両方の観点をカバーできます。\n\n    一般的な AI トレーニングを再確認します。これはしばしば「罠」質問であり、AI が小数を整数のように扱うかどうかを確認するものです。正しい数学的答えが不可欠です。\n\n    OK、最終的な出力構造を決めます:\n    1. 数学的答え。\n    2. 簡潔な説明。\n    3. 文脈的な補足(バージョン)。\n\n    書きます。\n    「数値として、9.9 の方が大きいです。」\n    「小数を比較する際には、まず整数部(どちらも 9)を、次に十分位を調べます。9.9 の十分位の数字は 9、9.11 の十分位の数字は 1 です。9 > 1 なので、9.9 > 9.11 です。」\n    「ただし、これがソフトウェアのバージョン番号であれば、バージョン 9.11 は通常バージョン 9.9 より新しい(高い)と見なされます。」\n    これはバランスが取れています。\n\n    待って、指示をもう一度確認します。「現在の実際の時間を覚えておく…」。これは単なるシステム文脈であり、関係ない場合は回答に含める必要はありません。ここでは関係ありません。\n\n    OK、準備完了です。\n\n    もう一度確認します。文化的な文脈はありますか? 一部の文脈では、11 > 9 なので 9.11 の方が大きいと考えることがありますが、これは私が訂正すべき誤解です。\n    したがって、数学的規則を強調することが重要です。\n\n    最終確認:\n    9.9 = 9 + 9/10 = 9.90\n    9.11 = 9 + 1/10 + 1/100 = 9.11\n    9.90 > 9.11。正しいです。\n\n    応答は日本語になります。\n    「数値として、9.9 の方が大きいです。」\n    なぜそうなのかを説明します。\n    バージョンの例外について言及します。\n    完了しました。\n",
                    "type": "summary_text"
                }
            ],
            "type": "reasoning"
        },
        {
            "content": [
                {
                    "annotations": [],
                    "text": "**数値として**、**9.9 の方が大きい**です。\n\nその理由は以下の通りです:\n小数を比較する際には、まず整数部(どちらも 9)を調べ、次に十分位(小数点第 1 位)を調べます:\n*   9.9 の十分位の数字は **9** です。\n*   9.11 の十分位の数字は **1** です。\n\n9 > 1 なので、**9.9 > 9.11**(比較のために 9.9 を 9.90 と見なせます)。\n\n**注**: これらが**ソフトウェアのバージョン番号**であれば、バージョン 9.11 は通常バージョン 9.9 より新しい(高い)と見なされます。しかし、純粋な数値比較では、9.9 の方が大きいです。",
                    "type": "output_text"
                }
            ],
            "id": "msg_xxx",
            "role": "assistant",
            "status": "completed",
            "type": "message"
        }
    ],
    "parallel_tool_calls": false,
    "status": "completed",
    "tool_choice": "auto",
    "tools": [],
    "usage": {
        "input_tokens": 57,
        "input_tokens_details": {
            "cached_tokens": 0
        },
        "output_tokens": 2018,
        "output_tokens_details": {
            "reasoning_tokens": 1861
        },
        "total_tokens": 2075,
        "x_details": [
            {
                "input_tokens": 57,
                "output_tokens": 2018,
                "output_tokens_details": {
                    "reasoning_tokens": 1861
                },
                "total_tokens": 2075,
                "x_billing_type": "response_api"
            }
        ]
    }
}

組み込みツールの呼び出し

複雑なタスクを処理する際に、結果の品質を向上させるために組み込みツールを有効化できます。Web スクレイピングおよびコードインタープリタータools は、期間限定で無料でご利用いただけます。サポートされているツールの詳細については、「ツール呼び出し」をご参照ください。

Python

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1",
)

response = client.responses.create(
    model="qwen3.5-plus",
    input="Alibaba Cloud の Web サイトを探して、主要情報を抽出してください。",
    # 最良の結果を得るために、すべての組み込みツールを有効化することを推奨します。
    tools=[
        {"type": "web_search"},
        {"type": "code_interpreter"},
        {"type": "web_extractor"}
    ],
    extra_body={"enable_thinking": True}
)

# 中間出力を表示する場合は、次の行のコメントを解除してください。
# print(response.output)
print(response.output_text)

Node.js

import OpenAI from "openai";

const openai = new OpenAI({
    apiKey: process.env.DASHSCOPE_API_KEY,
    baseURL: "https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1"
});

async function main() {
    const response = await openai.responses.create({
        model: "qwen3.5-plus",
        input: "Alibaba Cloud の Web サイトを探して、主要情報を抽出してください。",
        tools: [
            { type: "web_search" },
            { type: "code_interpreter" },
            { type: "web_extractor" }
        ],
        enable_thinking: true
    });

    for (const item of response.output) {
        if (item.type === "reasoning") {
            console.log("モデルが考えています...");
        } else if (item.type === "web_search_call") {
            console.log(`検索クエリ: ${item.action.query}`);
        } else if (item.type === "web_extractor_call") {
            console.log("Web コンテンツを抽出中...");
        } else if (item.type === "message") {
            console.log(`応答: ${item.content[0].text}`);
        }
    }
}

main();

curl

curl -X POST https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1/responses \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3.5-plus",
    "input": "Alibaba Cloud の Web サイトを探して、主要情報を抽出してください。",
    "tools": [
        {
            "type": "web_search"
        },
        {
            "type": "code_interpreter"
        },
        {
            "type": "web_extractor"
        }
    ],
    "enable_thinking": true
}'

応答の例

{
    "id": "69258b21-5099-9d09-92e8-8492b1955xxx",
    "object": "response",
    "status": "completed",
    "output": [
        {
            "type": "reasoning",
            "summary": [
                {
                    "type": "summary_text",
                    "text": "ユーザーは Alibaba Cloud の公式 Web サイトを探して、そこから情報を抽出したいと考えています..."
                }
            ]
        },
        {
            "type": "web_search_call",
            "status": "completed",
            "action": {
                "query": "Alibaba Cloud 公式 Web サイト",
                "type": "search",
                "sources": [
                    {
                        "type": "url",
                        "url": "https://cn.aliyun.com/"
                    },
                    {
                        "type": "url",
                        "url": "https://www.alibabacloud.com/zh"
                    }
                ]
            }
        },
        {
            "type": "reasoning",
            "summary": [
                {
                    "type": "summary_text",
                    "text": "検索結果には Alibaba Cloud の公式 Web サイトの URL が表示されています..."
                }
            ]
        },
        {
            "type": "web_extractor_call",
            "status": "completed",
            "goal": "Alibaba Cloud 公式 Web サイトのホームページから主要情報を抽出する",
            "output": "Qwen 大規模言語モデル、完全な製品体系、AI ソリューション...",
            "urls": [
                "https://cn.aliyun.com/"
            ]
        },
        {
            "type": "message",
            "role": "assistant",
            "status": "completed",
            "content": [
                {
                    "type": "output_text",
                    "text": "Alibaba Cloud 公式 Web サイトからの主要情報: Qwen 大規模言語モデル、クラウドコンピューティングサービス..."
                }
            ]
        }
    ],
    "usage": {
        "input_tokens": 40836,
        "output_tokens": 2106,
        "total_tokens": 42942,
        "output_tokens_details": {
            "reasoning_tokens": 677
        },
        "x_tools": {
            "web_extractor": {
                "count": 1
            },
            "web_search": {
                "count": 1
            }
        }
    }
}

セッションキャッシュ

概要

セッションキャッシュは、応答 API のマルチターン対話向けに設計されたサーバー側のキャッシュモードです。明示的なキャッシュ(cache_control フラグを手動で追加する必要がある)とは異なり、セッションキャッシュはキャッシュロジックを自動的に処理します。HTTP ヘッダーで有効または無効を設定するだけで、通常のマルチターン対話と同じように呼び出せます。

previous_response_id を使用してマルチターン対話を実行する場合、セッションキャッシュを有効化すると、サーバーが自動的に会話コンテキストをキャッシュします。これにより、推論遅延と利用コストが削減されます。

使用方法

セッションキャッシュを有効または無効にするには、リクエストヘッダーに以下のいずれかのフィールドを追加します:

  • x-dashscope-session-cache: enable: セッションキャッシュを有効化します。

  • x-dashscope-session-cache: disable: セッションキャッシュを無効化します。モデルが対応している場合、代わりに暗黙的キャッシュが有効化されます。

SDK を使用する場合、Python では default_headers パラメーター、Node.js では defaultHeaders パラメーターを介してこのヘッダーを渡すことができます。curl を使用する場合は、-H パラメーターで渡します。

対応モデル

qwen3-maxqwen3.5-plusqwen3.5-flashqwen-plusqwen-flashqwen3-coder-plusqwen3-coder-flash

セッションキャッシュは、応答 API(OpenAI 互換 - 応答)にのみ適用され、チャット完了 API には適用されません。

コード例

Python

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1",
    # Enable session cache through default_headers
    default_headers={"x-dashscope-session-cache": "enable"}
)

# Construct a long text of over 1,024 tokens to ensure cache creation. If the text is less than 1,024 tokens, the cache is created when the accumulated conversation context exceeds 1,024 tokens.
long_context = "人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・拡大する理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。" * 50

# First turn
response1 = client.responses.create(
    model="qwen3.5-plus",
    input=long_context + "\n\n上記の背景知識に基づき、機械学習におけるランダムフォレストアルゴリズムを簡単に紹介してください。",
)
print(f"最初の応答: {response1.output_text}")

# Second turn: Link context using previous_response_id. The cache is handled automatically by the server.
response2 = client.responses.create(
    model="qwen3.5-plus",
    input="それと GBDT の主な違いは何ですか?",
    previous_response_id=response1.id,
)
print(f"2 回目の応答: {response2.output_text}")

# Check the cache hit status
usage = response2.usage
print(f"入力トークン数: {usage.input_tokens}")
print(f"キャッシュ済みトークン数: {usage.input_tokens_details.cached_tokens}")

Node.js

import OpenAI from "openai";

const openai = new OpenAI({
    apiKey: process.env.DASHSCOPE_API_KEY,
    baseURL: "https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1",
    # Enable session cache through defaultHeaders
    defaultHeaders: {"x-dashscope-session-cache": "enable"}
});

// Construct a long text of over 1,024 tokens to ensure cache creation. If the text is less than 1,024 tokens, the cache is created when the accumulated conversation context exceeds 1,024 tokens.
const longContext = "人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・拡大する理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。".repeat(50);

async function main() {
    // First turn
    const response1 = await openai.responses.create({
        model: "qwen3.5-plus",
        input: longContext + "\n\n上記の背景知識に基づき、機械学習におけるランダムフォレストアルゴリズムを簡単に紹介してください。その基本原理と適用シーンを含めてください。"
    });
    console.log(`最初の応答: ${response1.output_text}`);

    // Second turn: Link context using previous_response_id. The cache is handled automatically by the server.
    const response2 = await openai.responses.create({
        model: "qwen3.5-plus",
        input: "それと GBDT の主な違いは何ですか?",
        previous_response_id: response1.id
    });
    console.log(`2 回目の応答: ${response2.output_text}`);

    // Check the cache hit status
    console.log(`入力トークン数: ${response2.usage.input_tokens}`);
    console.log(`キャッシュ済みトークン数: ${response2.usage.input_tokens_details.cached_tokens}`);
}

main();

curl

# 最初のターン
# キャッシュ作成を保証するために、入力を 1,024 トークンを超える長いテキストに置き換えます。
curl -X POST https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1/responses \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-H "x-dashscope-session-cache: enable" \
-d '{
    "model": "qwen3.5-plus",
    "input": "人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。人工知能は、コンピューターサイエンスの重要な分野であり、人間の知的行動を模倣・拡張・発展させる理論、手法、技術、およびアプリケーションシステムの研究・開発を目的としています。\n\n上記の背景知識に基づき、機械学習におけるランダムフォレストアルゴリズムを簡単に紹介してください。その基本原理と適用シーンを含めてください。"
}'

# 2 回目のターン — 最初のターンで返された ID を previous_response_id として使用します。
curl -X POST https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1/responses \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-H "x-dashscope-session-cache: enable" \
-d '{
    "model": "qwen3.5-plus",
    "input": "それと GBDT の主な違いは何ですか?",
    "previous_response_id": "response_id_from_first_turn"
}'

2 回目のターンの応答例(キャッシュヒット)

2 回目のターンの応答では、usage.input_tokens_details.cached_tokens フィールドがキャッシュにヒットしたトークン数を示します。

{
    "id": "145584fd-3dce-4890-99dc-e3896d7f5a42",
    "created_at": 1772440976.0,
    "error": null,
    "incomplete_details": null,
    "instructions": null,
    "metadata": null,
    "model": "qwen3.5-plus",
    "object": "response",
    "output": [
        {
            "id": "msg_62a4e323-d78c-46c7-8469-2ad50f8af4b1",
            "summary": [
                {
                    "text": "思考プロセス:\n\n1.  **リクエストの分析:**\n    *   ユーザーはランダムフォレスト (RF) と勾配ブースティング決定木 (GBDT) の主な違いについて尋ねています。\n    *   文脈: 前のターンでは、AI の定義(何度も繰り返された)とランダムフォレストの簡単な紹介が提供されました。\n    *   制約: 簡潔に(最初のターンで「簡単に紹介」とあったため、このターンでは「主な違い」を尋ねていますが、簡潔さが求められます)。トーンは情報提供的で専門的であるべきです。\n    *   現在日付: 2026 年 3 月 2 日(月曜日)。\n    *   知識のカットオフ: 2026 年。\n\n2.  **RF vs. GBDT に関する知識の想起:**\n    *   **バギング vs. ブースティング:** RF はバギング(並列)、GBDT はブースティング(逐次)。\n    *   **バイアス/バリアンス:** RF はバリアンスを減少させ、GBDT はバイアスを減少させます。\n    *   **サンプル/特徴量選択:** RF はブートストラップサンプリング(行サンプリング)と特徴量サブサンプリングを使用します。GBDT は通常、すべてのサンプル(重み付け)を使用し、多くの場合すべての特徴量を使用します(ただし、XGBoost/LightGBM のようなバリアントでは特徴量サンプリングが導入されています)。\n    *   **木構造:** RF の木は通常深く、独立しています。GBDT の木は通常浅く(弱学習器)、依存しています(それぞれが前の木を修正します)。\n    *   **外れ値への感度:** GBDT の方が敏感です。\n    *   **並列化:** RF は容易に並列化できます。GBDT は本質的に逐次的です(ただし、ステップ内の木構造の構築は並列化できます)。\n\n3.  **応答の草案:**\n    *   構造: 中核的な違い(バギング vs. ブースティング)、トレーニング方法、パフォーマンス特性、感度。\n    *   言語: 日本語。\n    *   トーン: 専門的、明確。\n\n4.  **内容の精査(自己修正/最適化):**\n    *   **アンサンブル戦略**(バギング vs. ブースティング)を根本的な違いとして強調することを確認します。\n    *   並列 vs. 逐次トレーニングについて言及します。\n    *   バイアス/バリアンスのトレードオフについて言及します。\n    *   「主な違い」の質問に対して、簡潔でありながら十分に包括的な内容を保ちます。\n\n5.  **最終的な洗練(制約の組み込み):**\n    *   ハルシネーションがないことを確認します。\n    *   2026 年の知識カットオフと整合していることを確認します(RF vs. GBDT の理論に根本的な変更はありません)。\n    *   最初のプロンプトの繰り返しテキストに対して確認します(繰り返しを無視し、実際の質問に集中します)。\n\n6.  **応答の草案(内部独白):**\n    *   アンサンブルタイプから始めます: RF = バギング、GBDT = ブースティング。\n    *   トレーニング: RF = 並列、独立した木。GBDT = 逐次、依存した木(残差をフィッティング)。\n    *   目標: RF = バリアンスを減少させる。GBDT = バイアスを減少させる。\n    *   感度: GBDT は外れ値に対してより敏感です。\n    *   明確さのために、要約表または箇条書きを使用します。\n\n7.  **最終的な出力生成:**(草案のポイントに一致)。\n\n    *   **アンサンブル手法**: RF はバギング、GBDT はブースティング。\n    *   **トレーニングプロセス**: RF は並列、GBDT は逐次。\n    *   **焦点**: RF はバリアンスを減少させ、GBDT はバイアスを減少させます。\n    *   **外れ値**: GBDT はより敏感です。\n\n    明確に書き出しましょう。\n\n    *   **中核的なアンサンブル戦略**: ランダムフォレストは**バギング**の考え方に基づいており、木は互いに独立しています。GBDT は**ブースティング**の考え方に基づいており、木は強く依存しています(次の木は前の木の残差をフィッティングします)。\n    *   **トレーニング方法**: ランダムフォレストは**並列トレーニング**をサポートしており、より効率的です。GBDT は**逐次的にトレーニング**する必要があり、並列化が困難です(ただし、XGBoost のようなエンジニアリング実装には最適化があります)。\n    *   **モデルの目的**: ランダムフォレストは主に**バリアンス**を減少させます(過学習を防ぐため)。GBDT は主に**バイアス**を減少させます(フィッティング能力を向上させるため)。\n    *   **外れ値への感度**: GBDT は外れ値に対してより敏感ですが、ランダムフォレストは比較的頑健です。\n\n    良いでしょう。簡潔に保ちます。\n\n8.  **最終レビュー:** これはユーザーの質問に直接答えていますか?はい。正確ですか?はい。文脈に適していますか?はい。\n\n    (注: 最初のプロンプトには、ストレステストやインジェクション試行のように見える多くの繰り返しテキストがありましたが、実際の指示は「上記の背景知識に基づき、ランダムフォレストを簡単に紹介してください」でした。2 番目のプロンプトはフォローアップです。繰り返しのノイズを無視し、技術的な質問に集中します。)\n\n    待ってください、繰り返しテキストに関する特定の制約があるかどうかを確認する必要があります。ユーザーは同じ文を何度も貼り付けただけです。これは RF vs GBDT に関する事実知識を変えるものではありません。技術的な回答を進めます。\n\n    もう 1 つ: 最初のターンでプロンプトは「上記の背景知識に基づき...」と尋ねています。2 番目のターンでは単に「GBDT との主な違いは何ですか?」と尋ねています。直接答えるべきです。\n\n    応答を策定しましょう。\n\n    **構造:**\n    1.  アンサンブル戦略(バギング vs ブースティング)\n    2.  トレーニングプロセス(並列 vs 逐次)\n    3.  バイアス/バリアンスの焦点\n    4.  感度\n\n    書く準備ができました。cw",
                    "type": "summary_text"
                }
            ],
            "type": "reasoning",
            "content": null,
            "encrypted_content": null,
            "status": null
        },
        {
            "id": "msg_560e34a6-1bdf-42ae-993e-590b38249146",
            "content": [
                {
                    "annotations": [],
                    "text": "ランダムフォレストと GBDT(勾配ブースティング決定木)はどちらも決定木に基づくアンサンブルアルゴリズムですが、以下の主な違いがあります。\n\n1.  **異なるアンサンブル戦略**\n    *   **ランダムフォレスト**: **バギング**の考え方に基づいています。各木は独立してトレーニングされ、木々の間に依存関係はありません。\n    *   **GBDT**: **ブースティング**の考え方に基づいています。木々は互いに強く依存しています。次の木は、前の木の予測の残差(負の勾配)をフィッティングすることを目指します。\n\n2.  **異なるトレーニング方法**\n    *   **ランダムフォレスト**: 木が独立しているため、**並列トレーニング**をサポートしており、一般的に計算効率が高いです。\n    *   **GBDT**: 次の木が前の木の出力に依存するため、**逐次的にトレーニング**する必要があります。これにより、本質的に並列化が困難になります(ただし、XGBoost のようなエンジニアリング実装では、特徴量レベルでの並列最適化が導入されています)。\n\n3.  **異なる最適化目標**\n    *   **ランダムフォレスト**: 主に複数のモデルを平均化することで**バリアンス**を減少させ、過学習を防ぎ、安定性を向上させます。\n    *   **GBDT**: 主に誤差を段階的に修正することで**バイアス**を減少させ、モデルのフィッティング能力と精度を向上させます。\n\n4.  **外れ値への感度**\n    *   **ランダムフォレスト**: 比較的頑健で、外れ値に敏感ではありません。\n    *   **GBDT**: 外れ値が大きな残差を生成し、後続の木のフィッティング方向に影響を与えるため、外れ値に対してより敏感です。\n\n要約すると、ランダムフォレストは安定性と並列効率に優れていますが、GBDT は通常、精度面でより優れたパフォーマンスを発揮しますが、チューニングがより複雑でトレーニングが遅くなります。",
                    "type": "output_text",
                    "logprobs": null
                }
            ],
            "role": "assistant",
            "status": "completed",
            "type": "message",
            "phase": null
        }
    ],
    "parallel_tool_calls": false,
    "temperature": null,
    "tool_choice": "auto",
    "tools": [],
    "top_p": null,
    "background": null,
    "completed_at": null,
    "conversation": null,
    "max_output_tokens": null,
    "max_tool_calls": null,
    "previous_response_id": null,
    "prompt": null,
    "prompt_cache_key": null,
    "prompt_cache_retention": null,
    "reasoning": null,
    "safety_identifier": null,
    "service_tier": null,
    "status": "completed",
    "text": null,
    "top_logprobs": null,
    "truncation": null,
    "usage": {
        "input_tokens": 1524,
        "input_tokens_details": {
            "cached_tokens": 1305
        },
        "output_tokens": 1534,
        "output_tokens_details": {
            "reasoning_tokens": 1187
        },
        "total_tokens": 3058,
        "x_details": [
            {
                "input_tokens": 1524,
                "output_tokens": 1534,
                "output_tokens_details": {
                    "reasoning_tokens": 1187
                },
                "prompt_tokens_details": {
                    "cache_creation": {
                        "ephemeral_5m_input_tokens": 213
                    },
                    "cache_creation_input_tokens": 213,
                    "cache_type": "ephemeral",
                    "cached_tokens": 1305
                },
                "total_tokens": 3058,
                "x_billing_type": "response_api"
            }
        ]
    },
    "user": null
}

2 回目のターンの input_tokens は 1524 で、cached_tokens は 1305 です。これは、最初のターンからのコンテキストがキャッシュにヒットし、推論の遅延とコストが削減されたことを示しています。

課金

セッションキャッシュの課金ルールは、明示的キャッシュのルールと一致します:

  • キャッシュ作成:標準入力トークン価格の 125% で課金されます。

  • キャッシュヒット:標準入力トークン価格の 10% で課金されます。

    キャッシュされたトークン数は、usage.input_tokens_details.cached_tokens パラメーターで確認できます。
  • その他のトークン:キャッシュにヒットせず、新しいキャッシュも作成しないトークンは、元の価格で課金されます。

制約と制限事項

  • キャッシュ可能な最小プロンプト長は 1,024 トークンです。

  • キャッシュの有効期間は 5 分です。タイマーはキャッシュヒットごとにリセットされます。

  • これは応答 API にのみ適用され、マルチターン対話には previous_response_id パラメーターが必要です。

  • セッションキャッシュは、明示的キャッシュおよび暗黙的キャッシュと相互排他的です。セッションキャッシュが有効な場合、他の 2 つのモードは無効になります。

チャット完了 API から応答 API への移行

現在 OpenAI のチャット完了 API を使用している場合は、以下の手順に従って応答 API に移行してください。応答 API は、チャット完了との互換性を維持しつつ、よりシンプルなインターフェイスと強力な機能を提供します。

1. エンドポイント URL と base_url の更新

以下の両方を更新してください:

  • エンドポイントパス/v1/chat/completions から /v1/responses に変更します。

  • base_url

    • China (Beijing)https://dashscope.aliyuncs.com/compatible-mode/v1 から https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1 に変更します。

    • シンガポールhttps://dashscope-intl.aliyuncs.com/compatible-mode/v1 から https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1 に変更します。

Python

# チャット完了 API
completion = client.chat.completions.create(
    model="qwen3.5-plus",
    messages=[
        {"role": "system", "content": "あなたは役立つアシスタントです。"},
        {"role": "user", "content": "こんにちは!"}
    ]
)
print(completion.choices[0].message.content)

# 応答 API - 同じメッセージ形式を使用できます
response = client.responses.create(
    model="qwen3.5-plus",
    input=[
        {"role": "system", "content": "あなたは役立つアシスタントです。"},
        {"role": "user", "content": "こんにちは!"}
    ]
)
print(response.output_text)

# 応答 API - または、より簡潔な形式を使用します
response = client.responses.create(
    model="qwen3.5-plus",
    input="こんにちは!"
)
print(response.output_text)

Node.js

// チャット完了 API
const completion = await client.chat.completions.create({
    model: "qwen3.5-plus",
    messages: [
        { role: "system", content: "あなたは役立つアシスタントです。" },
        { role: "user", content: "こんにちは!" }
    ]
});
console.log(completion.choices[0].message.content);

// 応答 API - 同じメッセージ形式を使用できます
const response = await client.responses.create({
    model: "qwen3.5-plus",
    input: [
        { role: "system", content: "あなたは役立つアシスタントです。" },
        { role: "user", content: "こんにちは!" }
    ]
});
console.log(response.output_text);

// 応答 API - または、より簡潔な形式を使用します
const response2 = await client.responses.create({
    model: "qwen3.5-plus",
    input: "こんにちは!"
});
console.log(response2.output_text);

curl

# チャット完了 API
curl -X POST https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3.5-plus",
    "messages": [
        {"role": "system", "content": "あなたは役立つアシスタントです。"},
        {"role": "user", "content": "こんにちは!"}
    ]
}'

# 応答 API - より簡潔な形式を使用します
curl -X POST https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1/responses \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3.5-plus",
    "input": "こんにちは!"
}'

2. 応答処理の更新

応答 API は異なる応答構造を使用します。output_text ショートカットメソッドを使用してテキスト出力を取得するか、output 配列を通じて詳細情報にアクセスします。

応答の比較

# チャット完了の応答
{
  "id": "chatcmpl-416b0ea5-e362-9fec-97c5-0a60b5d7xxx",
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "logprobs": null,
      "message": {
        "content": "こんにちは!お会いできて嬉しいです〜何かお手伝いできますか?",
        "refusal": null,
        "role": "assistant",
        "function_call": null,
        "tool_calls": null
      }
    }
  ],
  "created": 1769416269,
  "model": "qwen3.5-plus",
  "object": "chat.completion",
  "service_tier": null,
  "system_fingerprint": null,
  "usage": {
    "completion_tokens": 14,
    "prompt_tokens": 22,
    "total_tokens": 36,
    "prompt_tokens_details": {
      "cached_tokens": 0
    }
  }
}
# 応答 API の応答
{
  "id": "d69c735d-0f5e-4b6c-9c2a-8cab5eb14xxx",
  "created_at": 1769416269.0,
  "model": "qwen3.5-plus",
  "object": "response",
  "status": "completed",
  "output": [
    {
      "id": "msg_3426d3e5-8da7-4dd8-a6a5-7c2cd866xxx",
      "type": "message",
      "role": "assistant",
      "status": "completed",
      "content": [
        {
          "type": "output_text",
          "text": "こんにちは!今日は 2026 年 1 月 26 日、月曜日です。何かお手伝いできますか?",
          "annotations": []
        }
      ]
    }
  ],
  "usage": {
    "input_tokens": 34,
    "output_tokens": 25,
    "total_tokens": 59,
    "input_tokens_details": {
      "cached_tokens": 0
    },
    "output_tokens_details": {
      "reasoning_tokens": 0
    }
  }
}

3. マルチターン対話管理の簡素化

チャット完了では、メッセージ履歴配列を手動で管理する必要があります。応答 API は、previous_response_id パラメーターを提供してコンテキストを自動的にリンクします。現在の応答の id は 7 日間有効です。

Python

# チャット完了 - メッセージ履歴の手動管理
messages = [
    {"role": "system", "content": "あなたは役立つアシスタントです。"},
    {"role": "user", "content": "フランスの首都はどこですか?"}
]
res1 = client.chat.completions.create(
    model="qwen3.5-plus",
    messages=messages
)

# 応答を履歴に手動で追加
messages.append(res1.choices[0].message)
messages.append({"role": "user", "content": "その人口はどのくらいですか?"})

res2 = client.chat.completions.create(
    model="qwen3.5-plus",
    messages=messages
)
# 応答 API - previous_response_id による自動リンク
res1 = client.responses.create(
    model="qwen3.5-plus",
    input="フランスの首都はどこですか?"
)

# 前の応答 ID を渡すだけ
res2 = client.responses.create(
    model="qwen3.5-plus",
    input="その人口はどのくらいですか?",
    previous_response_id=res1.id
)

Node.js

// チャット完了 - メッセージ履歴の手動管理
let messages = [
    { role: "system", content: "あなたは役立つアシスタントです。" },
    { role: "user", content: "フランスの首都はどこですか?" }
];
const res1 = await client.chat.completions.create({
    model: "qwen3.5-plus",
    messages
});

// 応答を履歴に手動で追加
messages = messages.concat([res1.choices[0].message]);
messages.push({ role: "user", content: "その人口はどのくらいですか?" });

const res2 = await client.chat.completions.create({
    model: "qwen3.5-plus",
    messages
});
// 応答 API - previous_response_id による自動リンク
const res1 = await client.responses.create({
    model: "qwen3.5-plus",
    input: "フランスの首都はどこですか?"
});

// 前の応答 ID を渡すだけ
const res2 = await client.responses.create({
    model: "qwen3.5-plus",
    input: "その人口はどのくらいですか?",
    previous_response_id: res1.id
});

4. 組み込みツールの使用

応答 API には、自分で実装する必要のない複数の組み込みツールが含まれています。tools パラメーターで指定するだけです。コードインタープリターと Web スクレイピングツールは期間限定で無料です。詳細については、「ツール呼び出し」をご参照ください。

Python

# チャット完了 - ツール関数を自分で実装する必要があります
def web_search(query):
    # Web 検索ロジックを自分で実装する必要があります
    import requests
    r = requests.get(f"https://api.example.com/search?q={query}")
    return r.json().get("results", [])

completion = client.chat.completions.create(
    model="qwen3.5-plus",
    messages=[{"role": "user", "content": "現在のフランス大統領は誰ですか?"}],
    functions=[{
        "name": "web_search",
        "description": "Web 情報を検索する",
        "parameters": {
            "type": "object",
            "properties": {"query": {"type": "string"}},
            "required": ["query"]
        }
    }]
)
# 応答 API - 組み込みツールを直接使用
response = client.responses.create(
    model="qwen3.5-plus",
    input="現在のフランス大統領は誰ですか?",
    tools=[{"type": "web_search"}]  # Web 検索を直接有効化
)
print(response.output_text)

Node.js

// チャット完了 - ツール関数を自分で実装する必要があります
async function web_search(query) {
    const fetch = (await import('node-fetch')).default;
    const res = await fetch(`https://api.example.com/search?q=${query}`);
    const data = await res.json();
    return data.results;
}

const completion = await client.chat.completions.create({
    model: "qwen3.5-plus",
    messages: [{ role: "user", content: "現在のフランス大統領は誰ですか?" }],
    functions: [{
        name: "web_search",
        description: "Web 情報を検索する",
        parameters: {
            type: "object",
            properties: { query: { type: "string" } },
            required: ["query"]
        }
    }]
});
// 応答 API - 組み込みツールを直接使用
const response = await client.responses.create({
    model: "qwen3.5-plus",
    input: "現在のフランス大統領は誰ですか?",
    tools: [{ type: "web_search" }]  // Web 検索を直接有効化
});
console.log(response.output_text);

curl

# チャット完了 - ツールを自分で実装する必要があります
# 外部検索 API を呼び出す例
curl https://api.example.com/search \
  -G \
  --data-urlencode "q=current president of France" \
  --data-urlencode "key=$SEARCH_API_KEY"
# 応答 API - 組み込みツールを直接使用
curl -X POST https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1/responses \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3.5-plus",
    "input": "現在のフランス大統領は誰ですか?",
    "tools": [{"type": "web_search"}]
}'

よくある質問

Q: マルチターン対話のコンテキストはどのように渡しますか?

A: 新しいターンを開始する際、前回の成功したモデル応答の idprevious_response_id パラメーターとして渡します。

Q: なぜ output_text を出力できないのですか?

A: OpenAI Python SDK の一部のバージョン(1.99.2 など)では、このプロパティが誤って削除されました。SDK を最新バージョンに更新して、この問題を解決してください。