La API de Asistentes proporciona un conjunto de herramientas de desarrollo para ayudarle a gestionar fácilmente los mensajes de conversación y llamar a herramientas. Este tema utiliza el ejemplo de la construcción de un asistente de pintura desde cero para ayudarle a aprender rápidamente los métodos básicos de codificación de la API de Asistentes.
ImportanteLa API de Assistant está siendo descontinuada. Migre a la API de Responses como alternativa. La API de Responses incluye múltiples herramientas integradas y admite la gestión de contexto de múltiples turnos.
Proceso típico
El siguiente es un proceso típico para crear una aplicación de agente (Asistente):
- Crear un asistente: Al crear un asistente, seleccione un modelo, proporcione instrucciones y agregue herramientas, como un intérprete de código y llamada a funciones.
- Crear un hilo: Cuando un usuario inicia una conversación, cree un hilo de sesión para rastrear el historial de la conversación.
- Enviar un mensaje al hilo: Agregue el mensaje del usuario a la conversación.
- Iniciar una ejecución: Ejecute el asistente en el hilo de sesión. El asistente analiza el mensaje, llama a las herramientas o servicios apropiados, genera una respuesta y se la devuelve.
Escenario de ejemplo
Los modelos de generación de texto no pueden generar imágenes por sí mismos. Por lo general, se requiere un modelo específico de texto a imagen para convertir texto en imágenes. Una aplicación de agente creada con la API de Asistentes puede optimizar automáticamente las palabras descriptivas proporcionadas por el usuario y llamar a una herramienta de texto a imagen para generar imágenes de alta calidad. Por ejemplo, para generar una imagen realista de un gato mascota, solo necesita proporcionar una descripción básica. El asistente de dibujo refina automáticamente el prompt y lo pasa directamente a la herramienta de texto a imagen para completar eficientemente la tarea de creación de imágenes.
Procedimiento
Los siguientes pasos le guían a través del proceso en Python para el modo de salida sin streaming. Para ver el código completo de los SDK de Python y Java tanto para salida con streaming como sin streaming, consulte Código completo al final de este tema.
Paso 1: Preparar el entorno de desarrollo
| |
Paso 2: Crear un asistenteDespués de importar el SDK de DashScope, utilice el método create de la clase Assistant para crear un agente Asistente. Este proceso implica configurar los siguientes parámetros clave:
En nuestro ejemplo, el objetivo es construir un Asistente enfocado en la pintura. Dado que la herramienta de texto a imagen tiene altos requisitos de comprensión del lenguaje, seleccionamos Qwen-Max como modelo de razonamiento para mejorar las capacidades de comprensión semántica y generación de texto del Asistente. Los detalles de configuración del agente, incluido su nombre, descripción de función e instrucciones, se muestran claramente en el fragmento de código adjunto. Para enriquecer la funcionalidad y utilidad del agente, integramos el plugin predefinido oficial Generación de imágenes. Esto asegura que el agente pueda generar automáticamente contenido de imagen correspondiente basado en las descripciones de texto recibidas. Puede crear un número ilimitado de asistentes. Sin embargo, las llamadas frecuentes a un solo modelo pueden activar limitación de tasa. Le recomendamos que configure diferentes modelos para sus asistentes según sus casos de uso. Para obtener más información sobre cómo utilizar la API, consulte API de asistentes. | |
Paso 3: Crear un hiloUn hilo es un concepto clave en la API de Asistentes que representa un contexto de conversación continua. Un hilo le permite crear un hilo de gestión de sesiones cuando un usuario inicia una nueva conversación. El Asistente puede usar el hilo para comprender todo el contexto de la conversación y proporcionar respuestas más coherentes y relevantes. Le recomendamos que:
En el escenario del asistente de pintura, el hilo puede rastrear la solicitud inicial del usuario, las sugerencias preliminares del Asistente, los comentarios del usuario y el resultado final de la pintura, formando un proceso de creación completo. Esto garantiza la coherencia y trazabilidad de todo el proceso de creación. Para obtener más información sobre cómo utilizar la API, consulte API de hilos. | |
Paso 4: Agregar un mensaje a un hiloSu entrada se transmite a través de un objeto Message. La API de Asistentes admite el envío de uno o más mensajes a un solo hilo. Al crear un mensaje, considere los siguientes parámetros:
Aunque no existe un límite estricto en la cantidad de tokens que un hilo puede recibir, la cantidad real de tokens pasados al LLM debe cumplir con el límite máximo de longitud de entrada del modelo. Para obtener más información, consulte la documentación oficial de cada modelo de la serie Qwen respecto a la longitud del contexto. En nuestro escenario, enviará el primer mensaje en el hilo a través de un Message: "Por favor, ayúdame a dibujar una imagen de un gato ragdoll". Necesita crear una clase Message. La configuración detallada de los parámetros se proporciona en el fragmento de código adjunto. Para obtener más información sobre cómo utilizar la API, consulte Mensajes. NotaDespués de que se ejecuta el método Messages.create(), este agrega automáticamente el mensaje al hilo y activa el almacenamiento en cola. Esto equivale a completar tanto las operaciones de creación como de envío del mensaje al mismo tiempo, lo cual es el comportamiento predeterminado de la API. | |
Paso 5: Crear y ejecutar una ejecuciónDespués de que un usuario asigna un mensaje a un hilo específico, puede iniciar una ejecución para activar el Asistente preconfigurado. El asistente utiliza todos los mensajes del hilo como contexto, emplea el modelo especificado y los plugins disponibles para responder inteligentemente a las preguntas del usuario, e inserta las respuestas generadas en la secuencia de mensajes del hilo. En este escenario, realice los siguientes pasos:
Esta serie de operaciones garantiza un flujo de procesamiento automatizado para el asistente, desde la recepción de una pregunta hasta la emisión de un resultado. Para obtener más información sobre cómo utilizar la API, consulte API de ejecuciones. NotaEs posible que muchos usuarios estén utilizando el modelo al mismo tiempo, lo cual puede extender el tiempo de procesamiento. Le recomendamos que espere hasta que el estado muestre "complete" antes de realizar la siguiente operación para garantizar un proceso fluido. | |
Código completo
Salida sin streaming
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} successful.")
return True
else:
print(f"{operation} failed. Status code: {component.status_code}, Error code: {component.code}, Error message: {component.message}")
return False
# 1. Create a painting assistant
painting_assistant = dashscope.Assistants.create(
# Model list: 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, "Assistant creation"):
exit()
# 2. Create a new thread
thread = dashscope.Threads.create()
if not check_status(thread, "Thread creation"):
exit()
# 3. Send a message to the thread
message = dashscope.Messages.create(thread.id, content='Please help me draw a picture of a ragdoll cat.')
if not check_status(message, "Message creation"):
exit()
# 4. Run the assistant on the thread
run = dashscope.Runs.create(thread.id, assistant_id=painting_assistant.id)
if not check_status(run, "Run creation"):
exit()
# 5. Wait for the run to complete
print("Waiting for the assistant to process the request...")
run = dashscope.Runs.wait(run.id, thread_id=thread.id)
if check_status(run, "Run completion"):
print(f"Run completed, status: {run.status}")
else:
print("Run not completed.")
exit()
# 6. Retrieve and display the assistant's response
messages = dashscope.Messages.list(thread.id)
if check_status(messages, "Message retrieval"):
if messages.data:
# Display the content of the last message (the assistant's response)
last_message = messages.data[0]
print("\nAssistant's response:")
print(json.dumps(last_message, ensure_ascii=False, default=lambda o: o.__dict__, sort_keys=True, indent=4))
else:
print("No messages found in the thread.")
else:
print("Failed to retrieve the assistant's response.")
# Tip: This code creates a painting assistant, starts a conversation about how to draw a ragdoll cat,
# and displays the assistant's answer.
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 + " successful.");
return true;
} else {
System.out.println(operation + " failed.");
return false;
}
}
public static void main(String[] args) {
try {
// 1. Create a painting assistant
Assistants assistants = new Assistants();
AssistantParam assistantParam = AssistantParam.builder()
// Model list: 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, "Assistant creation")) {
System.exit(1);
}
// 2. Create a new thread
Threads threads = new Threads();
AssistantThread thread = threads.create(ThreadParam.builder().build());
if (!checkStatus(thread, "Thread creation")) {
System.exit(1);
}
// 3. Send a message to the thread
Messages messages = new Messages();
ThreadMessage message = messages.create(thread.getId(),
TextMessageParam.builder()
.role("user")
.content("Please help me draw a picture of a ragdoll cat.")
.build());
if (!checkStatus(message, "Message creation")) {
System.exit(1);
}
// 4. Run the assistant on the thread
Runs runs = new Runs();
RunParam runParam = RunParam.builder().assistantId(paintingAssistant.getId()).build();
Run run = runs.create(thread.getId(), runParam);
if (!checkStatus(run, "Run creation")) {
System.exit(1);
}
// 5. Wait for the run to complete
System.out.println("Waiting for the assistant to process the request...");
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 completion")) {
System.out.println("Run completed, status: " + run.getStatus());
} else {
System.out.println("Run not completed.");
System.exit(1);
}
// 6. Retrieve and display the assistant's response
ListResult<ThreadMessage> messagesList = messages.list(thread.getId(), GeneralListParam.builder().build());
if (checkStatus(messagesList, "Message retrieval")) {
if (!messagesList.getData().isEmpty()) {
// Display the last message (the assistant's response)
ThreadMessage lastMessage = messagesList.getData().get(0);
System.out.println("\nAssistant's response:");
System.out.println(lastMessage.getContent());
} else {
System.out.println("No messages found in the thread.");
}
} else {
System.out.println("Failed to retrieve the assistant's response.");
}
} catch (ApiException | NoApiKeyException | InputRequiredException | InvalidateParameter | InterruptedException e) {
e.printStackTrace();
}
}
}
Salida de transmisión
Actualmente, el SDK de Java no admite llamadas en streaming para la herramienta de generación de imágenes.
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} successful.")
return True
else:
print(f"{operation} failed. Status code: {response.status_code}, Error code: {response.code}, Error message: {response.message}")
sys.exit(response.status_code)
# 1. Create a painting assistant
def create_painting_assistant():
return dashscope.Assistants.create(
# Model list: 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__':
# Create a painting assistant
painting_assistant = create_painting_assistant()
print(painting_assistant)
check_status(painting_assistant, "Assistant creation")
# Create a new thread with an initial message
thread = dashscope.Threads.create(
messages=[{
'role': 'user',
'content': 'Please help me draw a picture of a ragdoll cat.'
}]
)
print(thread)
check_status(thread, "Thread creation")
# Create a run with streaming output
run_iterator = dashscope.Runs.create(
thread.id,
assistant_id=painting_assistant.id,
stream=True
)
# Iterate over events and messages
print("Processing request...")
for event, msg in run_iterator:
print(event)
print(msg)
# Retrieve and display the assistant's response
messages = dashscope.Messages.list(thread.id)
check_status(messages, "Message retrieval")
print("\nAssistant's response:")
print(json.dumps(messages, ensure_ascii=False, default=lambda o: o.__dict__, sort_keys=True, indent=4))
# Tip: This script creates a painting assistant with streaming output, starts a conversation about drawing a ragdoll cat,
# and displays the assistant's responses in real time.
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 + " successful.");
return true;
} else {
System.out.println(operation + " failed.");
return false;
}
}
private static Assistant createPaintingAssistant() throws ApiException, NoApiKeyException {
Assistants assistants = new Assistants();
AssistantParam assistantParam = AssistantParam.builder()
// Model list: 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, "Thread creation")) {
System.exit(1);
}
Messages messages = new Messages();
ThreadMessage message = messages.create(thread.getId(),
TextMessageParam.builder()
.role("user")
.content("Please help me draw a picture of a ragdoll cat.")
.build());
if (!checkStatus(message, "Message creation")) {
System.exit(1);
}
Runs runs = new Runs();
RunParam runParam = RunParam.builder().assistantId(assistantId).stream(true).build();
try {
System.out.println("Attempting to stream the assistant's response...");
Flowable<AssistantStreamMessage> runFlowable = runs.createStream(thread.getId(), runParam);
runFlowable.blockingForEach(assistantStreamMessage -> {
System.out.println("Event: " + assistantStreamMessage.getEvent());
System.out.println("Data: " + assistantStreamMessage.getData());
});
} catch (Exception e) {
System.out.println("Streaming failed, switching to non-streaming method.");
e.printStackTrace();
// Switch to non-streaming method
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 completed, status: " + run.getStatus());
}
// Retrieve and display the assistant's response
GeneralListParam listParam = GeneralListParam.builder().limit(100L).build();
ListResult<ThreadMessage> messagesList = messages.list(thread.getId(), listParam);
if (checkStatus(messagesList, "Message retrieval")) {
if (!messagesList.getData().isEmpty()) {
System.out.println("\nAssistant's response:");
for (ThreadMessage threadMessage : messagesList.getData()) {
System.out.println(threadMessage.getContent());
}
} else {
System.out.println("No messages found in the thread.");
}
} else {
System.out.println("Failed to retrieve the assistant's response.");
}
}
public static void main(String[] args) {
try {
Assistant paintingAssistant = createPaintingAssistant();
if (!checkStatus(paintingAssistant, "Assistant creation")) {
System.exit(1);
}
runPaintingAssistant(paintingAssistant.getId());
} catch (ApiException | NoApiKeyException | InputRequiredException | InvalidateParameter | InterruptedException e) {
System.out.println("An error occurred while running the painting assistant:");
e.printStackTrace();
}
}
}
Siguientes pasos
Para obtener explicaciones detalladas de los parámetros de los componentes de la API de Asistentes, consulte Referencia de desarrollo de la API de Asistentes.