アシスタント API は、会話メッセージやツールの呼び出しを簡単に管理できる一連の開発ツールを提供します。このトピックでは、お絵かきアシスタントをゼロから構築する例を通して、アシスタント API の基本的なエンコーディングメソッドを素早く習得できるよう支援します。
アシスタント API は非推奨です。代替として Responses API への移行を検討してください。Responses API には、複数の組み込みツールが含まれており、マルチターンのコンテキスト管理をサポートしています。
一般的なプロセス
以下は、エージェントアプリケーション (アシスタント) を構築するための一般的なプロセスです。
アシスタントの作成:アシスタントを作成する際に、モデルを選択し、命令を提供し、コードインタープリター関数呼び出しなどのツールを追加します。
スレッドの作成:ユーザーが会話を開始する際に、会話履歴を追跡するためのセッションスレッドを作成します。
スレッドへのメッセージの送信:ユーザーのメッセージを会話に追加します。
Run の開始:セッションスレッドでアシスタントを実行します。アシスタントはメッセージを解析し、適切なツールやサービスを呼び出し、応答を生成して返します。
シナリオ例
テキスト生成モデルは、単独で画像を生成することはできません。通常、テキストを画像に変換するには、特定の Text-to-Image モデルが必要です。アシスタント API で作成されたエージェントアプリケーションは、ユーザーが提供した説明的な言葉を自動的に最適化し、Text-to-Image ツールを呼び出して高品質な画像を生成できます。例えば、ペットの猫のリアルな画像を生成するために、基本的な説明を提供するだけで済みます。お絵かきアシスタントは自動的にプロンプトを洗練させ、それを直接 Text-to-Image ツールに渡して、画像作成タスクを効率的に完了します。
操作手順
以下の手順では、非ストリーミング出力モードでの Python を使用したプロセスを説明します。ストリーミング出力と非ストリーミング出力の両方に対応した完全な Python および Java SDK のコードについては、このトピックの最後にある完全なコードをご参照ください。

ステップ 1:開発環境の準備
| |
ステップ 2:アシスタントの作成Dashscope SDK をインポートした後、Assistant クラスの create メソッドを使用してアシスタントエージェントを作成します。このプロセスでは、以下の主要なパラメーターを設定します。
この例では、お絵かきに特化したアシスタントを構築することが目標です。Text-to-Image ツールは言語理解に対する要求が高いため、アシスタントの意味理解とテキスト生成能力を向上させるために、推論モデルとして Qwen-Max を選択します。 エージェントの名前、機能説明、命令などの構成詳細は、添付のコードスニペットに明確に示されています。 エージェントの機能性と実用性を高めるために、公式の構築済みプラグインである画像生成を統合します。これにより、アシスタントが受け取ったテキスト記述に基づいて、対応する画像コンテンツを自動的に生成できるようになります。 アシスタントは無制限に作成できます。ただし、単一モデルへの頻繁な呼び出しは、レート制限を引き起こす可能性があります。ユースケースに基づいて、アシスタントに異なるモデルを構成することを推奨します。 API の使用方法の詳細については、「アシスタント API」をご参照ください。 | |
ステップ 3:スレッドの作成スレッドは、アシスタント API における重要な概念であり、継続的な会話コンテキストを表します。 スレッドを使用すると、ユーザーが新しい会話を開始したときにセッション管理スレッドを作成できます。アシスタントはスレッドを使用して会話全体のコンテキストを理解し、より一貫性のある関連性の高い応答を提供できます。 以下を推奨します。
お絵かきアシスタントのシナリオでは、スレッドはユーザーの最初の要求、アシスタントの予備的な提案、ユーザーのフィードバック、そして最終的なお絵かき結果を追跡し、完全な作成プロセスを形成します。これにより、作成プロセス全体の一貫性と追跡可能性が保証されます。 API の使用方法の詳細については、「スレッド API」をご参照ください。 | |
ステップ 4:スレッドへのメッセージの追加入力は Message オブジェクトを介して渡されます。アシスタント API は、単一のスレッドに 1 つ以上のメッセージを送信することをサポートしています。Message を作成する際には、以下のパラメーターを考慮してください。
スレッドが受信できるトークンの数に厳密な制限はありませんが、実際に LLM に渡されるトークンの数は、モデルの最大入力長制限に準拠する必要があります。詳細については、各 Qwen シリーズモデルの公式ドキュメントでコンテキスト長に関する情報をご参照ください。 このシナリオでは、スレッド内の最初のメッセージとして「ラグドールの絵を描いてください。」を送信します。Message クラスを作成する必要があります。詳細なパラメーター設定は、添付のコードスニペットで提供されています。 API の使用方法の詳細については、「メッセージ」をご参照ください。 説明 Messages.create() メソッドが実行されると、メッセージは自動的にスレッドに追加され、スプーリングがトリガーされます。これは、メッセージの作成と送信の両方の操作を同時に完了することに相当し、API のデフォルトの動作です。 | |
ステップ 5:Run の作成と実行ユーザーが特定の Thread にメッセージを割り当てた後、Run を開始して、事前に設定されたアシスタントをアクティブにすることができます。アシスタントは、スレッド内のすべてのメッセージをコンテキストとして使用し、指定されたモデルと利用可能なプラグインを活用して、ユーザーの質問にインテリジェントに応答し、生成された回答をスレッドのメッセージシーケンスに挿入します。 このシナリオでは、以下の手順を実行します。
この一連の操作により、アシスタントが質問を受け取ってから結果を出力するまでの一連の自動処理フローが保証されます。 API の使用方法の詳細については、「Runs API」をご参照ください。 説明 多くのユーザーが同時にモデルを使用している場合があり、処理時間が長くなることがあります。スムーズなプロセスを確保するために、ステータスが「complete」と表示されるまで待ってから次の操作を実行することを推奨します。 | |
完全なコード
非ストリーミング出力
import dashscope
from http import HTTPStatus
import json
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
def check_status(component, operation):
if component.status_code == HTTPStatus.OK:
print(f"{operation} に成功しました。")
return True
else:
print(f"{operation} に失敗しました。ステータスコード: {component.status_code}、エラーコード: {component.code}、エラーメッセージ: {component.message}")
return False
# 1. 絵画アシスタントを作成
painting_assistant = dashscope.Assistants.create(
# モデルリスト: https://www.alibabacloud.com/help/model-studio/getting-started/models
model='qwen-max',
name='Art Maestro',
description='AI assistant for painting and art knowledge',
instructions='''Provide information on painting techniques, art history, and creative guidance.
Use tools for research and image generation.''',
tools=[
{'type': 'text_to_image', 'description': 'For creating visual examples'}
]
)
if not check_status(painting_assistant, "アシスタントの作成"):
exit()
# 2. 新しいスレッドを作成
thread = dashscope.Threads.create()
if not check_status(thread, "スレッドの作成"):
exit()
# 3. スレッドにメッセージを送信
message = dashscope.Messages.create(thread.id, content='ラグドール猫の絵を描くのを手伝ってください。')
if not check_status(message, "メッセージの作成"):
exit()
# 4. スレッドでアシスタントを実行
run = dashscope.Runs.create(thread.id, assistant_id=painting_assistant.id)
if not check_status(run, "Run の作成"):
exit()
# 5. Run の完了を待機
print("アシスタントがリクエストを処理するのを待機しています...")
run = dashscope.Runs.wait(run.id, thread_id=thread.id)
if check_status(run, "Run の完了"):
print(f"Run が完了しました。ステータス: {run.status}")
else:
print("Run は完了しませんでした。")
exit()
# 6. アシスタントの応答を取得して表示
messages = dashscope.Messages.list(thread.id)
if check_status(messages, "メッセージの取得"):
if messages.data:
# 最後のメッセージ (アシスタントの応答) のコンテンツを表示
last_message = messages.data[0]
print("\nアシスタントの応答:")
print(json.dumps(last_message, ensure_ascii=False, default=lambda o: o.__dict__, sort_keys=True, indent=4))
else:
print("スレッドにメッセージが見つかりません。")
else:
print("アシスタントの応答の取得に失敗しました。")
# ヒント: このコードは、絵画アシスタントを作成し、ラグドール猫の絵の描き方に関する会話を開始し、アシスタントの回答を表示します。package com.example;
import java.util.Arrays;
import com.alibaba.dashscope.protocol.Protocol;
import com.alibaba.dashscope.assistants.Assistant;
import com.alibaba.dashscope.assistants.AssistantParam;
import com.alibaba.dashscope.assistants.Assistants;
import com.alibaba.dashscope.common.GeneralListParam;
import com.alibaba.dashscope.common.ListResult;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.InvalidateParameter;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.threads.AssistantThread;
import com.alibaba.dashscope.threads.ThreadParam;
import com.alibaba.dashscope.threads.Threads;
import com.alibaba.dashscope.threads.messages.Messages;
import com.alibaba.dashscope.threads.messages.TextMessageParam;
import com.alibaba.dashscope.threads.messages.ThreadMessage;
import com.alibaba.dashscope.threads.runs.Run;
import com.alibaba.dashscope.threads.runs.RunParam;
import com.alibaba.dashscope.threads.runs.Runs;
import com.alibaba.dashscope.tools.T2Image.Text2Image;
import com.alibaba.dashscope.tools.search.ToolQuarkSearch;
import com.alibaba.dashscope.utils.Constants;
public class PaintingAssistant {
static {
Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
}
private static boolean checkStatus(Object response, String operation) {
if (response != null) {
System.out.println(operation + " に成功しました。");
return true;
} else {
System.out.println(operation + " に失敗しました。");
return false;
}
}
public static void main(String[] args) {
try {
// 1. 絵画アシスタントを作成
Assistants assistants = new Assistants();
AssistantParam assistantParam = AssistantParam.builder()
// モデルリスト: https://www.alibabacloud.com/help/model-studio/getting-started/models
.model("qwen-max")
.name("Art Maestro")
.description("AI assistant for painting and art knowledge")
.instructions("Provide information on painting techniques, art history, and creative guidance. Use tools for research and image generation.")
.tools(Arrays.asList(ToolQuarkSearch.builder().build(),Text2Image.builder().build()))
.build();
Assistant paintingAssistant = assistants.create(assistantParam);
if (!checkStatus(paintingAssistant, "アシスタントの作成")) {
System.exit(1);
}
// 2. 新しいスレッドを作成
Threads threads = new Threads();
AssistantThread thread = threads.create(ThreadParam.builder().build());
if (!checkStatus(thread, "スレッドの作成")) {
System.exit(1);
}
// 3. スレッドにメッセージを送信
Messages messages = new Messages();
ThreadMessage message = messages.create(thread.getId(),
TextMessageParam.builder()
.role("user")
.content("ラグドール猫の絵を描くのを手伝ってください。")
.build());
if (!checkStatus(message, "メッセージの作成")) {
System.exit(1);
}
// 4. スレッドでアシスタントを実行
Runs runs = new Runs();
RunParam runParam = RunParam.builder().assistantId(paintingAssistant.getId()).build();
Run run = runs.create(thread.getId(), runParam);
if (!checkStatus(run, "Run の作成")) {
System.exit(1);
}
// 5. Run の完了を待機
System.out.println("アシスタントがリクエストを処理するのを待機しています...");
while (true) {
if (run.getStatus().equals(Run.Status.COMPLETED) ||
run.getStatus().equals(Run.Status.FAILED) ||
run.getStatus().equals(Run.Status.CANCELLED) ||
run.getStatus().equals(Run.Status.REQUIRES_ACTION) ||
run.getStatus().equals(Run.Status.EXPIRED)) {
break;
}
Thread.sleep(1000);
run = runs.retrieve(thread.getId(), run.getId());
}
if (checkStatus(run, "Run の完了")) {
System.out.println("Run が完了しました。ステータス: " + run.getStatus());
} else {
System.out.println("Run は完了しませんでした。");
System.exit(1);
}
// 6. アシスタントの応答を取得して表示
ListResult<ThreadMessage> messagesList = messages.list(thread.getId(), GeneralListParam.builder().build());
if (checkStatus(messagesList, "メッセージの取得")) {
if (!messagesList.getData().isEmpty()) {
// 最後のメッセージ (アシスタントの応答) を表示
ThreadMessage lastMessage = messagesList.getData().get(0);
System.out.println("\nアシスタントの応答:");
System.out.println(lastMessage.getContent());
} else {
System.out.println("スレッドにメッセージが見つかりません。");
}
} else {
System.out.println("アシスタントの応答の取得に失敗しました。");
}
} catch (ApiException | NoApiKeyException | InputRequiredException | InvalidateParameter | InterruptedException e) {
e.printStackTrace();
}
}
}
ストリーミング出力
現在、Java SDK は画像生成ツールのストリーミング呼び出しをサポートしていません。
import dashscope
from http import HTTPStatus
import json
import sys
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
def check_status(response, operation):
if response.status_code == HTTPStatus.OK:
print(f"{operation} に成功しました。")
return True
else:
print(f"{operation} に失敗しました。ステータスコード: {response.status_code}、エラーコード: {response.code}、エラーメッセージ: {response.message}")
sys.exit(response.status_code)
# 1. 絵画アシスタントを作成
def create_painting_assistant():
return dashscope.Assistants.create(
# モデルリスト: https://www.alibabacloud.com/help/model-studio/getting-started/models
model='qwen-max',
name='Art Maestro',
description='AI assistant for painting and art knowledge',
instructions='''Provide information on painting techniques, art history, and creative guidance.
Use tools for research and image generation.''',
tools=[
{'type': 'text_to_image', 'description': 'For creating visual examples'}
]
)
if __name__ == '__main__':
# 絵画アシスタントを作成
painting_assistant = create_painting_assistant()
print(painting_assistant)
check_status(painting_assistant, "アシスタントの作成")
# 初期メッセージを含む新しいスレッドを作成
thread = dashscope.Threads.create(
messages=[{
'role': 'user',
'content': 'ラグドール猫の絵を描くのを手伝ってください。'
}]
)
print(thread)
check_status(thread, "スレッドの作成")
# ストリーミング出力で Run を作成
run_iterator = dashscope.Runs.create(
thread.id,
assistant_id=painting_assistant.id,
stream=True
)
# イベントとメッセージを反復処理
print("リクエストを処理中...")
for event, msg in run_iterator:
print(event)
print(msg)
# アシスタントの応答を取得して表示
messages = dashscope.Messages.list(thread.id)
check_status(messages, "メッセージの取得")
print("\nアシスタントの応答:")
print(json.dumps(messages, ensure_ascii=False, default=lambda o: o.__dict__, sort_keys=True, indent=4))
# ヒント: このスクリプトは、ストリーミング出力で絵画アシスタントを作成し、ラグドール猫の絵を描くことに関する会話を開始し、アシスタントの応答をリアルタイムで表示します。
import java.util.Arrays;
import com.alibaba.dashscope.protocol.Protocol;
import com.alibaba.dashscope.assistants.Assistant;
import com.alibaba.dashscope.assistants.AssistantParam;
import com.alibaba.dashscope.assistants.Assistants;
import com.alibaba.dashscope.common.GeneralListParam;
import com.alibaba.dashscope.common.ListResult;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.InvalidateParameter;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.threads.AssistantThread;
import com.alibaba.dashscope.threads.ThreadParam;
import com.alibaba.dashscope.threads.Threads;
import com.alibaba.dashscope.threads.messages.Messages;
import com.alibaba.dashscope.threads.messages.TextMessageParam;
import com.alibaba.dashscope.threads.messages.ThreadMessage;
import com.alibaba.dashscope.threads.runs.AssistantStreamMessage;
import com.alibaba.dashscope.threads.runs.Run;
import com.alibaba.dashscope.threads.runs.RunParam;
import com.alibaba.dashscope.threads.runs.Runs;
import com.alibaba.dashscope.tools.T2Image.Text2Image;
import com.alibaba.dashscope.tools.search.ToolQuarkSearch;
import io.reactivex.Flowable;
public class PaintingAssistant {
static {
Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
}
private static boolean checkStatus(Object response, String operation) {
if (response != null) {
System.out.println(operation + " に成功しました。");
return true;
} else {
System.out.println(operation + " に失敗しました。");
return false;
}
}
private static Assistant createPaintingAssistant() throws ApiException, NoApiKeyException {
Assistants assistants = new Assistants();
AssistantParam assistantParam = AssistantParam.builder()
// モデルリスト: https://www.alibabacloud.com/help/model-studio/getting-started/models
.model("qwen-max")
.name("Art Maestro")
.description("AI assistant for painting and art knowledge")
.instructions("Provide information on painting techniques, art history, and creative guidance. Use tools for research and image generation.")
.tools(Arrays.asList(ToolQuarkSearch.builder().build(), Text2Image.builder().build()))
.build();
return assistants.create(assistantParam);
}
private static void runPaintingAssistant(String assistantId) throws ApiException, NoApiKeyException, InvalidateParameter, InputRequiredException, InterruptedException {
Threads threads = new Threads();
AssistantThread thread = threads.create(ThreadParam.builder().build());
if (!checkStatus(thread, "スレッドの作成")) {
System.exit(1);
}
Messages messages = new Messages();
ThreadMessage message = messages.create(thread.getId(),
TextMessageParam.builder()
.role("user")
.content("ラグドール猫の絵を描くのを手伝ってください。")
.build());
if (!checkStatus(message, "メッセージの作成")) {
System.exit(1);
}
Runs runs = new Runs();
RunParam runParam = RunParam.builder().assistantId(assistantId).stream(true).build();
try {
System.out.println("アシスタントの応答のストリーミングを試行しています...");
Flowable<AssistantStreamMessage> runFlowable = runs.createStream(thread.getId(), runParam);
runFlowable.blockingForEach(assistantStreamMessage -> {
System.out.println("イベント: " + assistantStreamMessage.getEvent());
System.out.println("データ: " + assistantStreamMessage.getData());
});
} catch (Exception e) {
System.out.println("ストリーミングに失敗しました。非ストリーミングメソッドに切り替えます。");
e.printStackTrace();
// 非ストリーミングメソッドに切り替え
Run run = runs.create(thread.getId(), RunParam.builder().assistantId(assistantId).build());
while (true) {
if (run.getStatus().equals(Run.Status.COMPLETED) ||
run.getStatus().equals(Run.Status.FAILED) ||
run.getStatus().equals(Run.Status.CANCELLED) ||
run.getStatus().equals(Run.Status.REQUIRES_ACTION) ||
run.getStatus().equals(Run.Status.EXPIRED)) {
break;
}
Thread.sleep(1000);
run = runs.retrieve(thread.getId(), run.getId());
}
System.out.println("Run が完了しました。ステータス: " + run.getStatus());
}
// アシスタントの応答を取得して表示
GeneralListParam listParam = GeneralListParam.builder().limit(100L).build();
ListResult<ThreadMessage> messagesList = messages.list(thread.getId(), listParam);
if (checkStatus(messagesList, "メッセージの取得")) {
if (!messagesList.getData().isEmpty()) {
System.out.println("\nアシスタントの応答:");
for (ThreadMessage threadMessage : messagesList.getData()) {
System.out.println(threadMessage.getContent());
}
} else {
System.out.println("スレッドにメッセージが見つかりません。");
}
} else {
System.out.println("アシスタントの応答の取得に失敗しました。");
}
}
public static void main(String[] args) {
try {
Assistant paintingAssistant = createPaintingAssistant();
if (!checkStatus(paintingAssistant, "アシスタントの作成")) {
System.exit(1);
}
runPaintingAssistant(paintingAssistant.getId());
} catch (ApiException | NoApiKeyException | InputRequiredException | InvalidateParameter | InterruptedException e) {
System.out.println("絵画アシスタントの実行中にエラーが発生しました:");
e.printStackTrace();
}
}
}
次のステップ
アシスタント API コンポーネントの詳細なパラメーター説明については、「アシスタント API 開発リファレンス」をご参照ください。