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

Alibaba Cloud Model Studio:コーディング機能 (Qwen-Coder)

最終更新日:Dec 06, 2025

Qwen-Coder は、コード関連のタスク向けに設計された言語モデルです。API を使用してモデルを呼び出し、コードの生成、コードの補完、関数呼び出しによる外部システムとの対話を行うことができます。

はじめに

前提条件

  • API キーを作成し、環境変数としてエクスポートしていること。

  • SDK を使用して呼び出しを行う場合は、SDK をインストールする必要があります。DashScope Python SDK のバージョンは 1.24.6 以降、DashScope Java SDK のバージョンは 2.21.10 以降である必要があります。

本トピックでは、Qwen-Coder モデルを呼び出して、素数を見つける Python 関数を作成する方法の例を説明します。

OpenAI 互換

Python

リクエスト例

import os
from openai import OpenAI

client = OpenAI(
    # シンガポールリージョンと北京リージョンの API キーは異なります。API キーを取得するには、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
    # 環境変数を設定していない場合は、次の行をお客様の Model Studio API キー (api_key="sk-xxx" など) に置き換えます。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 次の base_url はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えます。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
    # この例では qwen3-coder-plus を使用します。必要に応じて、別のモデル名に置き換えることができます。
    model="qwen3-coder-plus", 
    messages=[
        {'role': 'system', 'content': 'You are a helpful assistant.'},
        {'role': 'user', 'content': 'Write a Python function named find_prime_numbers that accepts an integer n as a parameter and returns a list of all prime numbers less than n. Do not output any content other than the code and do not use Markdown code blocks.'}],
)
print(completion.choices[0].message.content)

応答

def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes

Node.js

リクエスト例

import OpenAI from "openai";

const client = new OpenAI(
    {
        // シンガポールリージョンと北京リージョンでは API キーが異なります。API キーを取得するには、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください
        // 環境変数を設定していない場合は、次の行をお使いの Model Studio API キーに置き換えてください: apiKey: "sk-xxx",
        apiKey: process.env.DASHSCOPE_API_KEY,
        // 次の base_url はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください
        baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    }
);

async function main() {
    const completion = await client.chat.completions.create({
        model: "qwen3-coder-plus",  //この例では qwen3-coder-plus を使用しています。必要に応じて、別のモデル名に置き換えることができます。
        messages: [
            { role: "system", content: "You are a helpful assistant." },
            { role: "user", content: "Write a Python function named find_prime_numbers that accepts an integer n as a parameter and returns a list of all prime numbers less than n. Do not output any content other than the code and do not use Markdown code blocks." }
        ],
    });
    console.log(completion.choices[0].message.content);
}

main();

応答

def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes

curl

リクエスト例

次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions に置き換えてください。

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-coder-plus",
    "messages": [
        {
            "role": "system",
            "content": "あなたは役立つアシスタントです。"
        },
        {
            "role": "user", 
            "content": "整数 n をパラメーターとして受け取り、n 未満のすべての素数のリストを返す find_prime_numbers という名前の Python 関数を記述してください。コード以外のコンテンツは出力せず、Markdown のコードブロックは使用しないでください。"
        }
    ]
}'

応答

{
    "choices": [
        {
            "message": {
                "content": "def find_prime_numbers(n):\n    if n <= 2:\n        return []\n    \n    primes = []\n    \n    for num in range(2, n):\n        is_prime = True\n        for i in range(2, int(num ** 0.5) + 1):\n            if num % i == 0:\n                is_prime = False\n                break\n        if is_prime:\n            primes.append(num)\n    \n    return primes",
                "role": "assistant"
            },
            "finish_reason": "stop",
            "index": 0,
            "logprobs": null
        }
    ],
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 96,
        "completion_tokens": 90,
        "total_tokens": 186,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "created": 1761615592,
    "system_fingerprint": null,
    "model": "qwen3-coder-plus",
    "id": "chatcmpl-3de690bd-ae7f-461d-8eb6-d65b0577e803"
}

DashScope

Python

リクエスト例

import dashscope
import os

# 次の base_url はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/api/v1 に置き換えてください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

messages = [
    {
        "role": "system",
        "content": "You are a helpful assistant."
    },
    {
        "role": "user",
        "content": "Write a Python function named find_prime_numbers that accepts an integer n as a parameter and returns a list of all prime numbers less than n. Do not output any content other than the code and do not use Markdown code blocks."
    }
]

response = dashscope.Generation.call(
    # シンガポールリージョンと北京リージョンの API キーは異なります。API キーを取得するには、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
    # 環境変数を設定していない場合は、次の行をお使いの Model Studio API キー (api_key = "sk-xxx") に置き換えてください。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # この例では qwen3-coder-plus を使用します。必要に応じて、別のモデル名に置き換えることができます。
    model="qwen3-coder-plus",
    messages=messages,
    result_format="message"
)

if response.status_code == 200:
    print(response.output.choices[0].message.content)
else:
    print(f"HTTP status code: {response.status_code}")
    print(f"Error code: {response.code}")
    print(f"Error message: {response.message}")

結果

def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes

Java

リクエスト例

import java.util.Arrays;
import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.protocol.Protocol;


public class Main {
    public static GenerationResult callWithMessage()
            throws NoApiKeyException, ApiException, InputRequiredException {
        String apiKey = System.getenv("DASHSCOPE_API_KEY");
        // 次の base_url はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/api/v1 に置き換えてください。
        Generation gen = new Generation(Protocol.HTTP.getValue(), "https://dashscope-intl.aliyuncs.com/api/v1");
        Message sysMsg = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content("You are a helpful assistant.").build();
        Message userMsg = Message.builder()
                .role(Role.USER.getValue())
                .content("Write a Python function named find_prime_numbers that accepts an integer n as a parameter and returns a list of all prime numbers less than n. Do not output any content other than the code and do not use Markdown code blocks.").build();
        // この例では qwen3-coder-plus を使用します。必要に応じて、別のモデル名に置き換えることができます。
        GenerationParam param = GenerationParam.builder()
                .apiKey(apiKey)
                .model("qwen3-coder-plus")
                .messages(Arrays.asList(sysMsg, userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .build();
        return gen.call(param);
    }
    public static void main(String[] args){
        try {
            GenerationResult result = callWithMessage();
            System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent());
        } catch (ApiException | NoApiKeyException | InputRequiredException e) {
            System.err.println("Request exception: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

結果

def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes

curl

リクエスト例

次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を次のように置き換えてください: https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation

curl -X POST "https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation" \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3-coder-plus",
    "input":{
        "messages":[      
            {
                "role": "system",
                "content": "あなたは役に立つアシスタントです。"
            },
            {
                "role": "user",
                "content": "find_prime_numbers という名前の Python 関数を記述してください。この関数は、パラメーターとして整数 n を受け入れ、n 未満のすべての素数のリストを返します。コード以外のコンテンツは出力せず、Markdown のコードブロックも使用しないでください。"
            }
        ]
    },
    "parameters": {
        "result_format": "message"
    }
}'

応答

{
    "output": {
        "choices": [
            {
                "message": {
                    "content": "def find_prime_numbers(n):\n    if n <= 2:\n        return []\n    \n    primes = []\n    \n    for num in range(2, n):\n        is_prime = True\n        for i in range(2, int(num ** 0.5) + 1):\n            if num % i == 0:\n                is_prime = False\n                break\n        if is_prime:\n            primes.append(num)\n    \n    return primes",
                    "role": "assistant"
                },
                "finish_reason": "stop"
            }
        ]
    },
    "usage": {
        "total_tokens": 186,
        "output_tokens": 90,
        "input_tokens": 96,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "request_id": "b1b8d1f8-0d26-4651-a466-66eefa0e7c51"
}

モデルの選択

Qwen-Coder は Qwen3 シリーズにアップグレードされました。最大 100 万トークンのコンテキストウィンドウをサポートし、さまざまなシナリオにおけるパフォーマンス、応答速度、コストといった多様な要件に対応するため、複数のモデルを提供しています。

推奨事項

  • qwen3-coder-plus:このモデルは最も強力なコーディング能力を提供し、複雑なプロジェクトの生成や詳細なコードレビューなどの高品質なタスクに適しています。

  • qwen3-coder-flash:パフォーマンスとコストのバランスが取れた、コスト効率の高いモデルです。低価格でありながら高速な処理を実現し、応答速度が重視されるシナリオに適しています。

モデル名、コンテキストウィンドウ、価格、スナップショットバージョンの詳細については、「モデルリスト」をご参照ください。同時リクエスト数制限の詳細については、「レート制限」をご参照ください。

コア機能

ストリーミング

インタラクティブな体験を向上させ、長時間実行されるリクエストのタイムアウトのリスクを低減するために、ストリーミング出力を有効にするには、stream=True パラメーターを設定します。これにより、モデルは応答全体を一度に返すのを待つのではなく、生成されたコンテンツを作成しながらチャンクで返します。

OpenAI 互換

Python

リクエスト例

import os
from openai import OpenAI

client = OpenAI(
    # シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
    # 環境変数を設定していない場合は、次の行をご利用の Model Studio API キーに置き換えてください: api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)

completion = client.chat.completions.create(
    model="qwen3-coder-plus",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Write a Python function named find_prime_numbers that accepts an integer n as a parameter and returns a list of all prime numbers less than n. Do not output any content other than the code and do not use Markdown code blocks."}
    ],
    stream=True,
    # このリクエストのトークン使用量を最後のチャンクから取得します
    stream_options={"include_usage": True}
)

content_parts = []
print("="*20+"Response"+"="*20)

for chunk in completion:
    # 最後のチャンクには choices は含まれませんが、使用状況情報が含まれています。
    if chunk.choices:
        # delta.content は None の場合があります。連結中のエラーを避けるために 'or ""' を使用します。
        content = chunk.choices[0].delta.content or ""
        print(content, end="", flush=True)
        content_parts.append(content)
    elif chunk.usage:
        print("\n"+"="*20+"Token Usage"+"="*20)
        print(f"Input Tokens: {chunk.usage.prompt_tokens}")
        print(f"Output Tokens: {chunk.usage.completion_tokens}")
        print(f"Total Tokens: {chunk.usage.total_tokens}")

full_response = "".join(content_parts)
# 完全な応答文字列を取得するには、次の行のコメントを解除してください。
# print(f"\n--- Full Response ---\n{full_response}")

応答

====================Response====================
def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes
====================Token Usage====================
Input Tokens: 66
Output Tokens: 89
Total Tokens: 155

Node.js

リクエスト例

import OpenAI from "openai";

const client = new OpenAI(
    {
        // シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
        // 環境変数を設定していない場合は、次の行をご利用の Model Studio API キーに置き換えてください: apiKey: "sk-xxx",
        apiKey: process.env.DASHSCOPE_API_KEY,
        // 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください。
        baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    }
);

async function main() {
    const stream = await client.chat.completions.create({
        model: "qwen3-coder-plus",
        messages: [
            { role: "system", content: "You are a helpful assistant." },
            { role: "user", content: "Write a Python function named find_prime_numbers that accepts an integer n as a parameter and returns a list of all prime numbers less than n. Do not output any content other than the code and do not use Markdown code blocks." },
        ],
        stream: true,
        // このリクエストのトークン使用量を最後のチャンクから取得します
        stream_options: { include_usage: true },
    });

    const contentParts = [];
    console.log("=".repeat(20) + "Response" + "=".repeat(20));
    
    for await (const chunk of stream) {
        // 最後のチャンクには choices は含まれませんが、使用状況情報が含まれています。
        if (chunk.choices && chunk.choices.length > 0) {
            const content = chunk.choices[0]?.delta?.content || "";
            process.stdout.write(content);
            contentParts.push(content);
        } else if (chunk.usage) {
            // リクエストは完了しました。トークンの使用状況を出力します。
            console.log("\n"+"=".repeat(20) + "Token Usage" + "=".repeat(20));
            console.log(`Input Tokens: ${chunk.usage.prompt_tokens}`);
            console.log(`Output Tokens: ${chunk.usage.completion_tokens}`);
            console.log(`Total Tokens: ${chunk.usage.total_tokens}`);
        }
    }
    
    const fullResponse = contentParts.join("");
    // 完全な応答文字列を取得するには、次の行のコメントを解除してください。
    // console.log(`\n--- Full Response ---\n${fullResponse}`);
}

main();

応答

====================Response====================
def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes
====================Token Usage====================
Input Tokens: 66
Output Tokens: 89
Total Tokens: 155

curl

リクエスト例

次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions に置き換えてください。

curl -X POST https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
--no-buffer \
-d '{
    "model": "qwen3-coder-plus",
    "messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Write a Python function named find_prime_numbers that accepts an integer n as a parameter and returns a list of all prime numbers less than n. Do not output any content other than the code and do not use Markdown code blocks."}
    ],
    "stream": true,
    "stream_options": {"include_usage": true}
}'

応答

data: {"choices":[{"delta":{"content":"","role":"assistant"},"index":0,"logprobs":null,"finish_reason":null}],"object":"chat.completion.chunk","usage":null,"created":1763085409,"system_fingerprint":null,"model":"qwen3-coder-plus","id":"chatcmpl-61f94113-f29b-4f7d-9730-551749d40ef4"}

data: {"choices":[{"finish_reason":null,"logprobs":null,"delta":{"content":"def"},"index":0}],"object":"chat.completion.chunk","usage":null,"created":1763085409,"system_fingerprint":null,"model":"qwen3-coder-plus","id":"chatcmpl-61f94113-f29b-4f7d-9730-551749d40ef4"}

data: {"choices":[{"delta":{"content":" find_prime_numbers(n"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1763085409,"system_fingerprint":null,"model":"qwen3-coder-plus","id":"chatcmpl-61f94113-f29b-4f7d-9730-551749d40ef4"}

......

data: {"choices":[{"delta":{"content":" primes"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1763085409,"system_fingerprint":null,"model":"qwen3-coder-plus","id":"chatcmpl-61f94113-f29b-4f7d-9730-551749d40ef4"}

data: {"choices":[{"finish_reason":"stop","delta":{"content":""},"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1763085409,"system_fingerprint":null,"model":"qwen3-coder-plus","id":"chatcmpl-61f94113-f29b-4f7d-9730-551749d40ef4"}

data: {"choices":[],"object":"chat.completion.chunk","usage":{"prompt_tokens":66,"completion_tokens":89,"total_tokens":155,"prompt_tokens_details":{"cached_tokens":0}},"created":1763085409,"system_fingerprint":null,"model":"qwen3-coder-plus","id":"chatcmpl-61f94113-f29b-4f7d-9730-551749d40ef4"}

data: [DONE]

DashScope

Python

リクエスト例

import os
from http import HTTPStatus
import dashscope
from dashscope import Generation

# 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/api/v1 に置き換えてください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Write a Python function named find_prime_numbers that accepts an integer n as a parameter and returns a list of all prime numbers less than n. Do not output any content other than the code and do not use Markdown code blocks."},
]

responses = Generation.call(
    # シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
    # 環境変数を設定していない場合は、次の行をご利用の Model Studio API キーに置き換えてください: api_key="sk-xxx",
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model="qwen3-coder-plus",
    messages=messages,
    result_format="message",
    stream=True,
    # 増分出力。各データブロックには新しく生成されたコンテンツのみが含まれます。
    incremental_output=True,
)

content_parts = []
print("="*20+"Response"+"="*20+"\n", end="", flush=True)

for resp in responses:
    if resp.status_code == HTTPStatus.OK:
        content = resp.output.choices[0].message.content
        print(content, end="", flush=True)
        content_parts.append(content)

        if resp.output.choices[0].finish_reason == "stop":
            print("\n"+"=" * 20 + "Token Usage" + "=" * 20)
            print(f"Input Tokens: {resp.usage.input_tokens}")
            print(f"Output Tokens: {resp.usage.output_tokens}")
            print(f"Total Tokens: {resp.usage.total_tokens}")
    else:
        print(f"HTTP status code: {resp.status_code}")
        print(f"Error code: {resp.code}")
        print(f"Error message: {resp.message}")
full_response = "".join(content_parts)
# 完全な応答文字列を取得するには、次の行のコメントを解除してください。
# print(f"\n--- Full Response ---\n{full_response}")

応答

====================Response====================
def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes
====================Token Usage====================
Input Tokens: 66
Output Tokens: 89
Total Tokens: 155

Java

リクエスト例

import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import io.reactivex.Flowable;
import io.reactivex.schedulers.Schedulers;
import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import com.alibaba.dashscope.protocol.Protocol;

public class Main {
    public static void main(String[] args) {
        String apiKey = System.getenv("DASHSCOPE_API_KEY");

        // 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/api/v1 に置き換えてください。
        Generation gen = new Generation(Protocol.HTTP.getValue(), "https://dashscope-intl.aliyuncs.com/api/v1");
        CountDownLatch latch = new CountDownLatch(1);

        GenerationParam param = GenerationParam.builder()
                .apiKey(apiKey)
                .model("qwen3-coder-plus")
                .messages(Arrays.asList(
                        Message.builder()
                                .role(Role.USER.getValue())
                                .content("Write a Python function named find_prime_numbers that accepts an integer n as a parameter and returns a list of all prime numbers less than n. Do not output any content other than the code and do not use Markdown code blocks.")
                                .build()
                ))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .incrementalOutput(true) // ストリーミングの増分出力を有効にします。各データブロックには新しく生成されたコンテンツのみが含まれます。
                .build();
        try {
            Flowable<GenerationResult> result = gen.streamCall(param);
            StringBuilder fullContent = new StringBuilder();
            System.out.println("====================Response====================");
            result
                    .subscribeOn(Schedulers.io()) // I/O スレッドでリクエストを実行します。
                    .observeOn(Schedulers.computation()) // 計算スレッドで応答を処理します。
                    .subscribe(
                            // onNext: 各応答チャンクを処理します。
                            message -> {
                                String content = message.getOutput().getChoices().get(0).getMessage().getContent();
                                String finishReason = message.getOutput().getChoices().get(0).getFinishReason();
                                // コンテンツを出力します。
                                System.out.print(content);
                                fullContent.append(content);
                                // finishReason が null でない場合、最後のチャンクを示します。使用状況情報を出力します。
                                if (finishReason != null && !"null".equals(finishReason)) {
                                    System.out.println("\n====================Token Usage====================");
                                    System.out.println("Input Tokens: " + message.getUsage().getInputTokens());
                                    System.out.println("Output Tokens: " + message.getUsage().getOutputTokens());
                                    System.out.println("Total Tokens: " + message.getUsage().getTotalTokens());
                                }
                                System.out.flush(); // 出力をすぐにフラッシュします。
                            },
                            // onError: エラーを処理します。
                            error -> {
                                System.err.println("\nRequest failed: " + error.getMessage());
                                latch.countDown();
                            },
                            // onComplete: 完了コールバック。
                            () -> {
                                System.out.println(); // 新しい行を追加します。
                                // 完全な応答文字列を取得するには、次の行のコメントを解除してください。
                                // System.out.println("Full response: " + fullContent.toString());
                                latch.countDown();
                            }
                    );
            // メインスレッドで非同期タスクの完了を待ちます。
            latch.await();
        } catch (Exception e) {
            System.err.println("Request exception: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

応答

====================Response====================
def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes
====================Token Usage====================
Input Tokens: 66
Output Tokens: 89
Total Tokens: 155

curl

リクエスト例

次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation に置き換えてください。

curl -X POST https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-H "X-DashScope-SSE: enable" \
-d '{
    "model": "qwen3-coder-plus",
    "input":{
        "messages":[      
            {
                "role": "system",
                "content": "You are a helpful assistant."
            },
            {
                "role": "user",
                "content": "Write a Python function named find_prime_numbers that accepts an integer n as a parameter and returns a list of all prime numbers less than n. Do not output any content other than the code and do not use Markdown code blocks."
            }
        ]
    },
    "parameters": {
        "result_format": "message",
        "incremental_output":true
    }
}'

戻り値

id:1
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"def","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":67,"output_tokens":1,"input_tokens":66,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"fadfc21b-4411-40d5-b143-8c3573284c42"}

id:2
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":" find_prime_numbers(n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":71,"output_tokens":5,"input_tokens":66,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"fadfc21b-4411-40d5-b143-8c3573284c42"}

id:3
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"):\n    if n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":75,"output_tokens":9,"input_tokens":66,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"fadfc21b-4411-40d5-b143-8c3573284c42"}

...

id:26
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":" primes","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":155,"output_tokens":89,"input_tokens":66,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"fadfc21b-4411-40d5-b143-8c3573284c42"}

id:27
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"","role":"assistant"},"finish_reason":"stop"}]},"usage":{"total_tokens":155,"output_tokens":89,"input_tokens":66,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"fadfc21b-4411-40d5-b143-8c3573284c42"}

Function Calling

モデルが外部環境 (ファイルの読み書き、API の呼び出し、データベースとの対話など) と対話できるように、一連のツールを提供できます。モデルは、命令に基づいてこれらのツールを呼び出すかどうか、またどのように呼び出すかを決定します。詳細については、「Function Calling」をご参照ください。

ツール呼び出しの完全なプロセスには、次のステップが含まれます:

  1. ツールの定義とリクエストの作成:リクエストでツールリストを定義し、これらのツールを必要とするタスクを実行するようにモデルに依頼します。

  2. ツールの実行:モデルの応答から tool_calls を解析し、対応するローカルツール関数を呼び出してタスクを実行します。

  3. 実行結果の返却:ツールの実行結果を必要なフォーマットにパッケージ化し、モデルに返します。これにより、モデルは結果に基づいて最終的なタスクを完了できます。

次の例は、モデルをガイドしてコードを生成し、write_file ツールを使用してローカルファイルに保存する方法を示しています。

OpenAI 互換

Python

リクエスト例

import os
import json
from openai import OpenAI

client = OpenAI(
    # シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
    # 環境変数を設定していない場合は、次の行をご利用の Model Studio API キーに置き換えてください: api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)

tools = [
    {
        "type": "function",
        "function": {
            "name": "write_file",
            "description": "Writes content to the specified file. If the file does not exist, it is created.",
            "parameters": {
                "type": "object",
                "properties": {
                    "path": {
                        "type": "string",
                        "description": "The relative or absolute path of the target file."
                    },
                    "content": {
                        "type": "string",
                        "description": "The string content to write to the file."
                    }
                },
                "required": ["path", "content"]
            }
        }
    }
]

# ツール関数の実装
def write_file(path: str, content: str) -> str:
    """Write file content"""
    try:
        # ディレクトリが存在することを確認します
        os.makedirs(os.path.dirname(path),
                    exist_ok=True) if os.path.dirname(path) else None
        with open(path, 'w', encoding='utf-8') as f:
            f.write(content)
        return f"Success: The file '{path}' has been written."
    except Exception as e:
        return f"Error: An exception occurred while writing the file - {str(e)}"


messages = [{"role": "user", "content": "Write a Python script for quick sort and name it quick_sort.py."}]

completion = client.chat.completions.create(
    model="qwen3-coder-plus",
    messages=messages,
    tools=tools
)

assistant_output = completion.choices[0].message
if assistant_output.content is None:
    assistant_output.content = ""
messages.append(assistant_output)

# ツール呼び出しが不要な場合は、コンテンツを直接出力します。
if assistant_output.tool_calls is None:
    print(f"No tool call needed, responding directly: {assistant_output.content}")
else:
    # ツール呼び出しループに入ります
    while assistant_output.tool_calls is not None:
        for tool_call in assistant_output.tool_calls:
            tool_call_id = tool_call.id
            func_name = tool_call.function.name
            arguments = json.loads(tool_call.function.arguments)
            print(f"Calling tool [{func_name}] with arguments: {arguments}")
            # ツールを実行します
            tool_result = write_file(**arguments)
            # ツールリターンメッセージを構築します
            tool_message = {
                "role": "tool",
                "tool_call_id": tool_call_id,
                "content": tool_result,
            }
            print(f"Tool returned: {tool_message['content']}")
            messages.append(tool_message)
        # モデルを再度呼び出して、要約された自然言語応答を取得します
        response = client.chat.completions.create(
            model="qwen3-coder-plus",
            messages=messages,
            tools=tools
        )
        assistant_output = response.choices[0].message
        if assistant_output.content is None:
            assistant_output.content = ""
        messages.append(assistant_output)
    print(f"Model's final response: {assistant_output.content}")

応答

Calling tool [write_file] with arguments: {'content': 'def quick_sort(arr):\\n    if len(arr) <= 1:\\n        return arr\\n    pivot = arr[len(arr) // 2]\\n    left = [x for x in arr if x < pivot]\\n    middle = [x for x in arr if x == pivot]\\n    right = [x for x in arr if x > pivot]\\n    return quick_sort(left) + middle + quick_sort(right)\\n\\nif __name__ == \\"__main__\\":\\n    example_list = [3, 6, 8, 10, 1, 2, 1]\\n    print(\\"Original list:\\", example_list)\\n    sorted_list = quick_sort(example_list)\\n    print(\\"Sorted list:\\", sorted_list)', 'path': 'quick_sort.py'}
Tool returned: Success: The file 'quick_sort.py' has been written.
Model's final response: Okay, I have created the file named `quick_sort.py` for you, which contains the Python implementation of quick sort. You can run this file to see the example output. Let me know if you need any further modifications or explanations!

Node.js

リクエスト例

import OpenAI from "openai";
import fs from "fs/promises";
import path from "path";

const client = new OpenAI({
    // シンガポールリージョンと北京リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/model-studio/get-api-key をご参照ください。
    // 環境変数を設定していない場合は、次の行をご利用の Model Studio API キーに置き換えてください: apiKey: "sk-xxx",
    apiKey: process.env.DASHSCOPE_API_KEY,
    // 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください。
    baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
});

const tools = [
    {
        "type": "function",
        "function": {
            "name": "write_file",
            "description": "Writes content to the specified file. If the file does not exist, it is created.",
            "parameters": {
                "type": "object",
                "properties": {
                    "path": {
                        "type": "string",
                        "description": "The relative or absolute path of the target file."
                    },
                    "content": {
                        "type": "string",
                        "description": "The string content to write to the file."
                    }
                },
                "required": ["path", "content"]
            }
        }
    }
];

// ツール関数の実装
async function write_file(filePath, content) {
    try {
        // セキュリティ上の理由から、ファイル書き込み機能はデフォルトで無効になっています。使用するには、コードのコメントを解除し、パスが安全であることを確認してください。
        // const dir = path.dirname(filePath);
        // if (dir) {
        //     await fs.mkdir(dir, { recursive: true });
        // }
        // await fs.writeFile(filePath, content, "utf-8");
        return `Success: The file '${filePath}' has been written.`;
    } catch (error) {
        return `Error: An exception occurred while writing the file - ${error.message}`;
    }
}

const messages = [{"role": "user", "content": "Write a Python script for quick sort and name it quick_sort.py."}];

async function main() {
    const completion = await client.chat.completions.create({
        model: "qwen3-coder-plus",
        messages: messages,
        tools: tools
    });

    let assistant_output = completion.choices[0].message;
    // content が null でないことを確認します
    if (!assistant_output.content) assistant_output.content = "";
    messages.push(assistant_output);

    // ツール呼び出しが不要な場合は、コンテンツを直接出力します。
    if (!assistant_output.tool_calls) {
        console.log(`No tool call needed, responding directly: ${assistant_output.content}`);
    } else {
        // ツール呼び出しループに入ります
        while (assistant_output.tool_calls) {
            for (const tool_call of assistant_output.tool_calls) {
                const tool_call_id = tool_call.id;
                const func_name = tool_call.function.name;
                const args = JSON.parse(tool_call.function.arguments);
                console.log(`Calling tool [${func_name}] with arguments:`, args);
                // ツールを実行します
                const tool_result = await write_file(args.path, args.content);
                // ツールリターンメッセージを構築します
                const tool_message = {
                    "role": "tool",
                    "tool_call_id": tool_call_id,
                    "content": tool_result
                };
                console.log(`Tool returned: ${tool_message.content}`);
                messages.push(tool_message);
            }
            // モデルを再度呼び出して、要約された自然言語応答を取得します
            const response = await client.chat.completions.create({
                model: "qwen3-coder-plus",
                messages: messages,
                tools: tools
            });
            assistant_output = response.choices[0].message;
            if (!assistant_output.content) assistant_output.content = "";
            messages.push(assistant_output);
        }
        console.log(`Model's final response: ${assistant_output.content}`);
    }
}

main();

応答

Calling tool [write_file] with arguments: {
  content: 'def quick_sort(arr):\\n    if len(arr) <= 1:\\n        return arr\\n    pivot = arr[len(arr) // 2]\\n    left = [x for x in arr if x < pivot]\\n    middle = [x for x in arr if x == pivot]\\n    right = [x for x in arr if x > pivot]\\n    return quick_sort(left) + middle + quick_sort(right)\\n\\nif __name__ == \\"__main__\\":\\n    example_list = [3, 6, 8, 10, 1, 2, 1]\\n    print(\\"Original list:\\", example_list)\\n    sorted_list = quick_sort(example_list)\\n    print(\\"Sorted list:\\", sorted_list)',
  path: 'quick_sort.py'
}
Tool returned: Success: The file 'quick_sort.py' has been written.
Model's final response: The `quick_sort.py` file has been successfully created with the Python implementation of quick sort. You can run the file to see the sorting result for the example list. Let me know if you need any further modifications or explanations!

curl

リクエスト例

この例は、ツール呼び出しプロセスの最初のステップ、つまりリクエストを行い、ツールを呼び出すというモデルの意図を取得する方法を示しています。

次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions に置き換えてください。

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-coder-plus",
    "messages": [
        {
            "role": "user", 
            "content": "Write a Python script for quick sort and name it quick_sort.py."
        }
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "write_file",
                "description": "Writes content to the specified file. If the file does not exist, it is created.",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "path": {
                            "type": "string",
                            "description": "The relative or absolute path of the target file."
                        },
                        "content": {
                            "type": "string",
                            "description": "The string content to write to the file."
                        }
                    },
                    "required": ["path", "content"]
                }
            }
        }
    ]
}'

応答

{
    "choices": [
        {
            "message": {
                "content": "",
                "role": "assistant",
                "tool_calls": [
                    {
                        "index": 0,
                        "id": "call_0ca7505bb6e44471a40511e5",
                        "type": "function",
                        "function": {
                            "name": "write_file",
                            "arguments": "{\"content\": \"def quick_sort(arr):\\\\n    if len(arr) <= 1:\\\\n        return arr\\\\n    pivot = arr[len(arr) // 2]\\\\n    left = [x for x in arr if x < pivot]\\\\n    middle = [x for x in arr if x == pivot]\\\\n    right = [x for x in arr if x > pivot]\\\\n    return quick_sort(left) + middle + quick_sort(right)\\\\n\\\\nif __name__ == \\\\\\\"__main__\\\\\\\":\\\\n    example_list = [3, 6, 8, 10, 1, 2, 1]\\\\n    print(\\\\\\\"Original list:\\\\\\\", example_list)\\\\n    sorted_list = quick_sort(example_list)\\\\n    print(\\\\\\\"Sorted list:\\\\\\\", sorted_list)\", \"path\": \"quick_sort.py\"}"
                        }
                    }
                ]
            },
            "finish_reason": "tool_calls",
            "index": 0,
            "logprobs": null
        }
    ],
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 494,
        "completion_tokens": 193,
        "total_tokens": 687,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "created": 1761620025,
    "system_fingerprint": null,
    "model": "qwen3-coder-plus",
    "id": "chatcmpl-20e96159-beea-451f-b3a4-d13b218112b5"
}

DashScope

Python

リクエスト例

import os
import json
import dashscope

# 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/api/v1 に置き換えてください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

tools = [
    {
        "type": "function",
        "function": {
            "name": "write_file",
            "description": "Writes content to the specified file. If the file does not exist, it is created.",
            "parameters": {
                "type": "object",
                "properties": {
                    "path": {
                        "type": "string",
                        "description": "The relative or absolute path of the target file."
                    },
                    "content": {
                        "type": "string",
                        "description": "The string content to write to the file."
                    }
                },
                "required": ["path", "content"]
            }
        }
    }
]

# ツール関数の実装
def write_file(path: str, content: str) -> str:
    """Write file content"""
    try:
        # セキュリティ上の理由から、ファイル書き込み機能はデフォルトで無効になっています。使用するには、コードのコメントを解除し、パスが安全であることを確認してください。
        # os.makedirs(os.path.dirname(path),exist_ok=True) if os.path.dirname(path) else None
        # with open(path, 'w', encoding='utf-8') as f:
        #     f.write(content)
        return f"Success: The file '{path}' has been written."
    except Exception as e:
        return f"Error: An exception occurred while writing the file - {str(e)}"


messages = [{"role": "user", "content": "Write a Python script for quick sort and name it quick_sort.py."}]

response = dashscope.Generation.call(
    # 環境変数を設定していない場合は、次の行をご利用の Model Studio API キーに置き換えてください: api_key="sk-xxx",
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen3-coder-plus',
    messages=messages,
    tools=tools,
    result_format='message'
)

if response.status_code == 200:
    assistant_output = response.output.choices[0].message
    messages.append(assistant_output)

    # ツール呼び出しが不要な場合は、コンテンツを直接出力します。
    if "tool_calls" not in assistant_output or not assistant_output["tool_calls"]:
        print(f"No tool call needed, responding directly: {assistant_output['content']}")
    else:
        # ツール呼び出しループに入ります
        while "tool_calls" in assistant_output and assistant_output["tool_calls"]:
            for tool_call in assistant_output["tool_calls"]:
                func_name = tool_call["function"]["name"]
                arguments = json.loads(tool_call["function"]["arguments"])
                tool_call_id = tool_call.get("id")
                print(f"Calling tool [{func_name}] with arguments: {arguments}")
                # ツールを実行します
                tool_result = write_file(**arguments)
                # ツールリターンメッセージを構築します
                tool_message = {
                    "role": "tool",
                    "content": tool_result,
                    "tool_call_id": tool_call_id
                }
                print(f"Tool returned: {tool_message['content']}")
                messages.append(tool_message)
            # モデルを再度呼び出して、要約された自然言語応答を取得します
            response = dashscope.Generation.call(
                api_key=os.getenv('DASHSCOPE_API_KEY'),
                model='qwen3-coder-plus',
                messages=messages,
                tools=tools,
                result_format='message'
            )
            if response.status_code == 200:
                print(f"Model's final response: {response.output.choices[0].message.content}")
                assistant_output = response.output.choices[0].message
                messages.append(assistant_output)
            else:
                print(f"Error during summary response: {response}")
                break
else:
    print(f"Execution error: {response}")

レスポンス

ツール [write_file] を引数付きで呼び出し: {'content': 'def quick_sort(arr):\\n    if len(arr) <= 1:\\n        return arr\\n    pivot = arr[len(arr) // 2]\\n    left = [x for x in arr if x < pivot]\\n    middle = [x for x in arr if x == pivot]\\n    right = [x for x in arr if x > pivot]\\n    return quick_sort(left) + middle + quick_sort(right)\\n\\nif __name__ == \\"__main__\\":\\n    example_list = [3, 6, 8, 10, 1, 2, 1]\\n    print(\\"Original list:\\", example_list)\\n    sorted_list = quick_sort(example_list)\\n    print(\\"Sorted list:\\", sorted_list)', 'path': 'quick_sort.py'}
ツールからの応答: 成功: ファイル 'quick_sort.py' が書き込まれました。
モデルの最終応答: `quick_sort.py` ファイルは、クイックソートの Python 実装で正常に作成されました。ファイルを実行すると、サンプルリストのソート結果を確認できます。さらに変更や説明が必要な場合は、お知らせください。

Java

リクエスト例

import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.protocol.Protocol;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.tools.FunctionDefinition;
import com.alibaba.dashscope.tools.ToolCallBase;
import com.alibaba.dashscope.tools.ToolCallFunction;
import com.alibaba.dashscope.tools.ToolFunction;
import com.alibaba.dashscope.utils.JsonUtils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {

    /**
     * ファイルコンテンツを書き込みます
     * @param arguments モデルによって渡される JSON 文字列で、ツールに必要なパラメーターが含まれています。
     * @return ツールの実行結果を含む文字列。
     */
    public static String writeFile(String arguments) {
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode argsNode = objectMapper.readTree(arguments);
            String path = argsNode.get("path").asText();
            String content = argsNode.get("content").asText();

            // セキュリティ上の理由から、ファイル書き込み機能はデフォルトで無効になっています。使用するには、コードのコメントを解除し、パスが安全であることを確認してください。
            // File file = new File(path);
            // File parentDir = file.getParentFile();
            // if (parentDir != null && !parentDir.exists()) {
            //     parentDir.mkdirs();
            // }
            // Files.write(Paths.get(path), content.getBytes(StandardCharsets.UTF_8));
            return "Success: The file '" + path + "' has been written.";
        } catch (Exception e) {
            return "Error: An exception occurred while writing the file - " + e.getMessage();
        }
    }

    public static void main(String[] args) {
        try {
            // ツールパラメーターのスキーマを定義します
            String writePropertyParams =
                    "{\"type\":\"object\",\"properties\":{\"path\":{\"type\":\"string\",\"description\":\"The relative or absolute path of the target file.\"},\"content\":{\"type\":\"string\",\"description\":\"The string content to write to the file.\"}},\"required\":[\"path\",\"content\"]}";

            FunctionDefinition writeFileFunction = FunctionDefinition.builder()
                    .name("write_file")
                    .description("Writes content to the specified file. If the file does not exist, it is created.")
                    .parameters(JsonUtils.parseString(writePropertyParams).getAsJsonObject())
                    .build();

            // 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/api/v1 に置き換えてください。
            Generation gen = new Generation(Protocol.HTTP.getValue(), "https://dashscope-intl.aliyuncs.com/api/v1");

            String userInput = "Write a Python script for quick sort and name it quick_sort.py.";
            List<Message> messages = new ArrayList<>();
            messages.add(Message.builder().role(Role.USER.getValue()).content(userInput).build());

            // モデルへの最初の呼び出し
            GenerationParam param = GenerationParam.builder()
                    .model("qwen3-coder-plus")
                    .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                    .messages(messages)
                    .tools(Arrays.asList(ToolFunction.builder().function(writeFileFunction).build()))
                    .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                    .build();

            GenerationResult result = gen.call(param);
            Message assistantOutput = result.getOutput().getChoices().get(0).getMessage();
            messages.add(assistantOutput);

            // ツール呼び出しが不要な場合は、コンテンツを直接出力します。
            if (assistantOutput.getToolCalls() == null || assistantOutput.getToolCalls().isEmpty()) {
                System.out.println("No tool call needed, responding directly: " + assistantOutput.getContent());
            } else {
                // ツール呼び出しループに入ります
                while (assistantOutput.getToolCalls() != null && !assistantOutput.getToolCalls().isEmpty()) {
                    for (ToolCallBase toolCall : assistantOutput.getToolCalls()) {
                        ToolCallFunction functionCall = (ToolCallFunction) toolCall;
                        String funcName = functionCall.getFunction().getName();
                        String arguments = functionCall.getFunction().getArguments();
                        System.out.println("Calling tool [" + funcName + "] with arguments: " + arguments);

                        // ツールを実行します
                        String toolResult = writeFile(arguments);

                        // ツールリターンメッセージを構築します
                        Message toolMessage = Message.builder()
                                .role("tool")
                                .toolCallId(toolCall.getId())
                                .content(toolResult)
                                .build();
                        System.out.println("Tool returned: " + toolMessage.getContent());
                        messages.add(toolMessage);
                    }

                    // モデルを再度呼び出して、要約された自然言語応答を取得します
                    param.setMessages(messages);
                    result = gen.call(param);
                    assistantOutput = result.getOutput().getChoices().get(0).getMessage();
                    messages.add(assistantOutput);
                }
                System.out.println("Model's final response: " + assistantOutput.getContent());
            }

        } catch (NoApiKeyException | InputRequiredException e) {
            System.err.println("Error: " + e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

応答

Calling tool [write_file] with arguments: {"content": "def quick_sort(arr):\\n    if len(arr) <= 1:\\n        return arr\\n    pivot = arr[len(arr) // 2]\\n    left = [x for x in arr if x < pivot]\\n    middle = [x for x in arr if x == pivot]\\n    right = [x for x in arr if x > pivot]\\n    return quick_sort(left) + middle + quick_sort(right)\\n\\nif __name__ == \\\"__main__\\\":\\n    example_array = [3, 6, 8, 10, 1, 2, 1]\\n    print(\\\"Original array:\\\", example_array)\\n    sorted_array = quick_sort(example_array)\\n    print(\\\"Sorted array:\\\", sorted_array)", "path": "quick_sort.py"}
Tool returned: Success: The file 'quick_sort.py' has been written.
Model's final response: I have successfully created the Python code file `quick_sort.py` for you. This file contains a `quick_sort` function and an example of its usage. You can run it in your terminal or editor to test the quick sort functionality.

curl

リクエスト例

この例は、ツール呼び出しプロセスの最初のステップ、つまりリクエストを行い、ツールを呼び出すというモデルの意図を取得する方法を示しています。

次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation に置き換えてください。

curl --location "https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation" \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header "Content-Type: application/json" \
--data '{
    "model": "qwen3-coder-plus",
    "input": {
        "messages": [{
            "role": "user",
            "content": "Write a Python script for quick sort and name it quick_sort.py."
        }]
    },
    "parameters": {
        "result_format": "message",
        "tools": [
        {
            "type": "function",
            "function": {
                "name": "write_file",
                "description": "Writes content to the specified file. If the file does not exist, it is created.",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "path": {
                            "type": "string",
                            "description": "The relative or absolute path of the target file."
                        },
                        "content": {
                            "type": "string",
                            "description": "The string content to write to the file."
                        }
                    },
                    "required": ["path", "content"]
                }
            }
        }
    ]
    }
}'

応答

{
    "output": {
        "choices": [
            {
                "finish_reason": "tool_calls",
                "message": {
                    "role": "assistant",
                    "tool_calls": [
                        {
                            "function": {
                                "name": "write_file",
                                "arguments": "{\"content\": \"def quick_sort(arr):\\\\n    if len(arr) <= 1:\\\\n        return arr\\\\n    pivot = arr[len(arr) // 2]\\\\n    left = [x for x in arr if x < pivot]\\\\n    middle = [x for x in arr if x == pivot]\\\\n    right = [x for x in arr if x > pivot]\\\\n    return quick_sort(left) + middle + quick_sort(right)\\\\n\\\\nif __name__ == \\\\\\\"__main__\\\\\\\":\\\\n    example_list = [3, 6, 8, 10, 1, 2, 1]\\\\n    print(\\\\\\\"Original list:\\\\\\\", example_list)\\\\n    sorted_list = quick_sort(example_list)\\\\n    print(\\\\\\\"Sorted list:\\\\\\\", sorted_list), \"path\": \"quick_sort.py\"}"
                            },
                            "index": 0,
                            "id": "call_645b149bbd274e8bb3789aae",
                            "type": "function"
                        }
                    ],
                    "content": ""
                }
            }
        ]
    },
    "usage": {
        "total_tokens": 684,
        "output_tokens": 193,
        "input_tokens": 491,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "request_id": "d2386acd-fce3-9d0f-8015-c5f3a8bf9f5c"
}

コード補完

Qwen-Coder は、コード補完のために 2 つのメソッドをサポートしています。ニーズに応じていずれかを選択できます:

  • 部分モード:このメソッドを推奨します。実装が簡単で、プレフィックス補完をサポートし、すべての Qwen-Coder モデルとリージョンで利用できます。

  • Completions API:この API は、中国 (北京) リージョンの qwen2.5-coder モデルシリーズのみをサポートします。プレフィックス補完と中間補完をサポートします。

部分モード

この機能により、モデルは指定したプレフィックスに基づいてコードの残りの部分を自動的に補完できます。

messages リストに roleassistant に設定されたメッセージを追加し、partial: true を設定することで、この機能を有効にできます。assistant メッセージの content は、指定したコードプレフィックスです。詳細については、「部分モード」をご参照ください。

OpenAI 互換

Python

リクエスト例

import os
from openai import OpenAI


client = OpenAI(
    # 環境変数を設定していない場合は、次の行をご利用の Model Studio API キーに置き換えてください: api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
    model="qwen3-coder-plus",
    messages=[{
        "role": "user",
        "content": "Help me write a Python script to generate prime numbers up to 100. Do not output non-code content or Markdown code blocks."
    },
    {
        "role": "assistant",
        "content": "def generate_prime_number",
        "partial": True
    }]
    )
print(completion.choices[0].message.content)

応答

(n):
    primes = []
    for i in range(2, n+1):
        is_prime = True
        for j in range(2, int(i**0.5)+1):
            if i % j == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(i)
    return primes

prime_numbers = generate_prime_number(100)
print(prime_numbers)

Node.js

リクエスト例

import OpenAI from "openai";

const client = new OpenAI(
    {
        // 環境変数を設定していない場合は、次の行をご利用の Model Studio API キーに置き換えてください: apiKey: "sk-xxx",
        apiKey: process.env.DASHSCOPE_API_KEY,
        // 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください。
        baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    }
);

async function main() {
    const completion = await client.chat.completions.create({
        model: "qwen3-coder-plus",
        messages: [
            { role: "user", content: "Help me write a Python script to generate prime numbers up to 100. Do not output non-code content or Markdown code blocks." },
            { role: "assistant", content: "def generate_prime_number", partial: true}
        ],
    });
    console.log(completion.choices[0].message.content);
}

main();

結果

(n):
    primes = []
    for i in range(2, n+1):
        is_prime = True
        for j in range(2, int(i**0.5)+1):
            if i % j == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(i)
    return primes

prime_numbers = generate_prime_number(100)
print(prime_numbers)

curl

リクエスト例

次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions に置き換えてください。

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-coder-plus",
    "messages": [{
        "role": "user",
        "content": "Help me write a Python script to generate prime numbers up to 100. Do not output non-code content or Markdown code blocks."
    },
    {
        "role": "assistant",
        "content": "def generate_prime_number",
        "partial": true
    }]
}'

応答

{
    "choices": [
        {
            "message": {
                "content": "(n):\n    primes = []\n    for num in range(2, n + 1):\n        is_prime = True\n        for i in range(2, int(num ** 0.5) + 1):\n            if num % i == 0:\n                is_prime = False\n                break\n        if is_prime:\n            primes.append(num)\n    return primes\n\nprime_numbers = generate_prime_number(100)\nprint(prime_numbers)",
                "role": "assistant"
            },
            "finish_reason": "stop",
            "index": 0,
            "logprobs": null
        }
    ],
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 38,
        "completion_tokens": 93,
        "total_tokens": 131,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "created": 1761634556,
    "system_fingerprint": null,
    "model": "qwen3-coder-plus",
    "id": "chatcmpl-c108050a-bb6d-4423-9d36-f64aa6a32976"
}

DashScope

Python

リクエスト例

from http import HTTPStatus
import dashscope
import os

# 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/api/v1 に置き換えてください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

messages = [{
    "role": "user",
    "content": "Help me write a Python script to generate prime numbers up to 100. Do not output non-code content or Markdown code blocks."
},
{
    "role": "assistant",
    "content": "def generate_prime_number",
    "partial": True
}]
response = dashscope.Generation.call(
    # 環境変数を設定していない場合は、次の行をご利用の Model Studio API キーに置き換えてください: api_key="sk-xxx",
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen3-coder-plus',
    messages=messages,
    result_format='message',  
)
if response.status_code == HTTPStatus.OK:
    print(response.output.choices[0].message.content)
else:
    print(f"HTTP status code: {response.status_code}")
    print(f"Error code: {response.code}")
    print(f"Error message: {response.message}")

応答

(n):
    primes = []
    for i in range(2, n+1):
        is_prime = True
        for j in range(2, int(i**0.5)+1):
            if i % j == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(i)
    return primes

prime_numbers = generate_prime_number(100)
print(prime_numbers)

curl

リクエスト例

次の URL はシンガポールリージョン用です。北京リージョンのモデルを使用する場合は、URL を https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation に置き換えてください。

curl -X POST "https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation" \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3-coder-plus",
    "input":{
        "messages":[{
            "role": "user",
            "content": "Help me write a Python script to generate prime numbers up to 100. Do not output non-code content or Markdown code blocks."
        },
        {
            "role": "assistant",
            "content": "def generate_prime_number",
            "partial": true
        }]
    },
    "parameters": {
        "result_format": "message"
    }
}'

応答

{
    "output": {
        "choices": [
            {
                "message": {
                    "content": "(n):\n    prime_list = []\n    for i in range(2, n+1):\n        is_prime = True\n        for j in range(2, int(i**0.5)+1):\n            if i % j == 0:\n                is_prime = False\n                break\n        if is_prime:\n            prime_list.append(i)\n    return prime_list\n\nprime_numbers = generate_prime_number(100)\nprint(prime_numbers)",
                    "role": "assistant"
                },
                "finish_reason": "stop"
            }
        ]
    },
    "usage": {
        "total_tokens": 131,
        "output_tokens": 92,
        "input_tokens": 39,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "request_id": "9917f629-e819-4519-af44-b0e677e94b2c"
}

Completions API

重要

Completions API は中国 (北京) リージョンのモデルにのみ適用され、中国 (北京) リージョン用の API キー が必要です。

サポートされているモデル:

qwen2.5-coder-0.5b-instruct, qwen2.5-coder-1.5b-instruct, qwen2.5-coder-3b-instruct, qwen2.5-coder-7b-instruct, qwen2.5-coder-14b-instruct, qwen2.5-coder-32b-instruct, qwen-coder-turbo-0919, qwen-coder-turbo-latest, and qwen-coder-turbo

Completions API は、prompt 内で特殊な fim (Fill-in-the-Middle) タグを使用して、モデルに補完を実行するよう指示します。

プレフィックス補完

プロンプトテンプレート:

<|fim_prefix|>{prefix_content}<|fim_suffix|>
  • <|fim_prefix|><|fim_suffix|> は、モデルにテキスト補完を指示する特殊なトークンです。変更しないでください。

  • {prefix_content} を、関数名、入力パラメーター、使用方法などのプレフィックス情報に置き換えます。

import os
from openai import OpenAI

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

completion = client.completions.create(
  model="qwen2.5-coder-32b-instruct",
  prompt="<|fim_prefix|>def quick_sort(arr):<|fim_suffix|>",
)

print(completion.choices[0].text)
import OpenAI from "openai";

const client = new OpenAI(
    {
        // 環境変数を設定していない場合は、次の行をご利用の Model Studio API キーに置き換えてください: apiKey: "sk-xxx",
        apiKey: process.env.DASHSCOPE_API_KEY,
        baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1"
    }
);

async function main() {
    const completion = await client.completions.create({
        model: "qwen2.5-coder-32b-instruct",
        prompt: "<|fim_prefix|>def quick_sort(arr):<|fim_suffix|>",
    });
    console.log(completion.choices[0].text)
}

main();
curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen2.5-coder-32b-instruct",
    "prompt": "<|fim_prefix|>def quick_sort(arr):<|fim_suffix|>"
}'

プレフィックスとサフィックスの補完

プロンプトテンプレート

<|fim_prefix|>{prefix_content}<|fim_suffix|>{suffix_content}<|fim_middle|>
  • <|fim_prefix|><|fim_suffix|><|fim_middle|> は、モデルにテキスト補完を指示する特殊なトークンです。変更しないでください。

  • {prefix_content} を、関数名、入力パラメーター、使用方法などのプレフィックス情報に置き換えます。

  • {suffix_content} を、関数の戻り値パラメーターなどのサフィックス情報に置き換えます。

import os
from openai import OpenAI

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

prefix_content = """def reverse_words_with_special_chars(s):
'''
Reverses each word in a string while preserving the position of non-alphabetic characters and maintaining word order.
    Example:
    reverse_words_with_special_chars("Hello, world!") -> "olleH, dlrow!"
    Parameters:
        s (str): The input string, which may contain punctuation.
    Returns:
        str: The processed string with reversed words, where the positions of non-alphabetic characters are unchanged.
'''
"""

suffix_content = "return result"

completion = client.completions.create(
  model="qwen2.5-coder-32b-instruct",
  prompt=f"<|fim_prefix|>{prefix_content}<|fim_suffix|>{suffix_content}<|fim_middle|>",
)

print(completion.choices[0].text)
import OpenAI from 'openai';


const client = new OpenAI({
  baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1",
  apiKey: process.env.DASHSCOPE_API_KEY
});

const prefixContent = `def reverse_words_with_special_chars(s):
'''
Reverses each word in a string while preserving the position of non-alphabetic characters and maintaining word order.
    Example:
    reverse_words_with_special_chars("Hello, world!") -> "olleH, dlrow!"
    Parameters:
        s (str): The input string, which may contain punctuation.
    Returns:
        str: The processed string with reversed words, where the positions of non-alphabetic characters are unchanged.
'''
`;

const suffixContent = "return result";

async function main() {
  const completion = await client.completions.create({
    model: "qwen2.5-coder-32b-instruct",
    prompt: `<|fim_prefix|>${prefixContent}<|fim_suffix|>${suffixContent}<|fim_middle|>`
  });

  console.log(completion.choices[0].text);
}

main();
curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen2.5-coder-32b-instruct",
    "prompt": "<|fim_prefix|>def reverse_words_with_special_chars(s):\n\"\"\"\nReverses each word in a string while preserving the position of non-alphabetic characters and maintaining word order.\n    Example:\n    reverse_words_with_special_chars(\"Hello, world!\") -> \"olleH, dlrow!\"\n    Parameters:\n        s (str): The input string, which may contain punctuation.\n    Returns:\n        str: The processed string with reversed words, where the positions of non-alphabetic characters are unchanged.\n\"\"\"\n<|fim_suffix|>return result<|fim_middle|>"
}'

公開

Qwen-Coder の効率を最適化し、コストを削減するには、次の点を考慮してください。

  • ストリーミング出力を有効にするstream=True を設定して、中間結果をリアルタイムで返します。これにより、タイムアウトのリスクが軽減され、ユーザーエクスペリエンスが向上します。

  • 温度パラメーターを下げる:コード生成タスクでは通常、確定的で正確な結果が求められます。temperature パラメーターを 0.1 から 0.3 の間の値に設定して、生成結果のランダム性を低減します。

  • コンテキストキャッシュをサポートするモデルを使用する:コード補完やコードレビューなど、重複するプレフィックスが多いシナリオでは、qwen3-coder-plus や qwen3-coder-flash のような コンテキストキャッシュをサポートするモデルを使用して、オーバーヘッドを削減します。

  • ツール数を制御する:効率的でコスト効果の高いモデルの呼び出しを確保するために、一度に 20 を超える tools を渡さないでください。多数のツールの説明を渡すと、入力トークンを過剰に消費します。これにより、コストが増加し、応答速度が低下し、モデルが正しいツールを選択することが難しくなります。詳細については、「関数呼び出し」をご参照ください。

課金とレート制限

  • 基本的な課金:各リクエストは、入力トークンと出力トークンの数に基づいて課金されます。単価はモデルによって異なります。具体的な価格については、モデルリストをご参照ください。

  • 特別な課金項目

    • 段階的価格設定qwen3-coder シリーズのモデルは、段階的価格設定構造を採用しています。1 回のリクエストにおける入力トークン数が特定の段階に達した場合、そのリクエストのすべての入力トークンと出力トークンは、その段階の価格で課金されます。

    • コンテキストキャッシュqwen3-coder-plusqwen3-coder-flash など、コンテキストキャッシュをサポートするモデルの場合、コードレビュー時など、複数のリクエストに大量の繰り返し入力が含まれる場合に、キャッシュ機構によりコストを大幅に削減できます。暗黙的キャッシュにヒットした入力テキストは標準価格の 20% で、明示的キャッシュにヒットした入力テキストは標準価格の 10% で課金されます。詳細については、「コンテキストキャッシュ」をご参照ください。

    • Function calling:ツール呼び出し機能を使用する場合、tools パラメーターで定義したツールの説明は入力コンテンツとしてカウントされ、課金対象の合計 トークン 数に含まれます。

  • レート制限API 呼び出しには、1 分あたりのリクエスト数 (RPM) と 1 分あたりのトークン数 (TPM) の 2 つの制限が適用されます。詳細については、レート制限をご参照ください。

  • 無料クォータ (シンガポールリージョンのみ):有効期間は、Alibaba Cloud Model Studio を有効化した時点、またはモデルリクエストが承認された時点から開始されます。90 日間の有効期間内に、各 Qwen-Coder モデルは 100 万トークンの新規ユーザー向けの無料クォータを提供します。

API リファレンス

Qwen-Coder の入力パラメーターと出力パラメーターについては、Qwen をご参照ください。

よくある質問

Qwen Code や Claude Code などの開発ツールを使用すると、多くのトークンが消費されるのはなぜですか?

外部の開発ツールを使用して Qwen-Coder モデルを呼び出すと、ツールが複数の API 呼び出しを行う可能性があり、その結果、トークンの消費量が多くなることがあります。ルートディレクトリなどの起動ディレクトリにファイルが多すぎるとトークンの消費量が増加するため、特定のプロジェクトディレクトリでツールを起動してください。無料クォータを使い切った後に追加料金が発生しないように、無料クォータのみ 機能を有効にしてください。

モデル使用状況の確認方法

モデルを呼び出してから 1 時間後に、モデルのモニタリング (シンガポール または 中国 (北京)) ページに移動します。時間範囲やワークスペースなどのクエリ条件を設定します。次に、[モデル] エリアで対象のモデルを見つけ、[操作] 列の [モニター] をクリックして、モデルの呼び出し統計を表示します。詳細については、モデルのモニタリング ドキュメントをご参照ください。

データは 1 時間ごとに更新されます。ピーク時には、時間単位の遅延が発生する場合があります。

image

モデル出力を説明テキストなしのコードのみにする方法

以下の方法を使用できます:

  1. プロンプトの制約:プロンプトで明確な指示を与えます。例:「コードのみを返してください。説明、コメント、Markdown タグは含めないでください。」

  2. stop シーケンスの設定:モデルが説明テキストを生成し始めたときに早期に停止させるために、stop=["\n# Explanation:", "Description", "Explanation:", "Note:"] のようなフレーズを使用します。詳細については、Qwen API リファレンスをご参照ください。