Para llamar a un agente registrado específico, proporciona el campo opcional agentsSpec en tu solicitud a la API de REST streamAssist o en la llamada a la biblioteca cliente. La API de AgentsSpec define la especificación de los agentes que se usan para atender la solicitud. El asistente enruta las consultas directamente a ese agente y conserva el contexto de la sesión en todas las interacciones.
Resumen
| Especificación | Detalles |
|---|---|
| Método de la API | projects.locations.collections.engines.assistants.streamAssist |
| Versiones del extremo | v1alpha para descubrir IDs de agentes; v1 para llamar a streamAssist |
| Parámetro clave | agentsSpec.agentSpecs[].agentId |
| Tipos de agentes admitidos | Core Assistant, Deep Research, agentes de chat de Workflow Builder (antes de poco código) y flujos de trabajo de Workflow Builder (consulta Cómo llamar a un flujo de trabajo) |
| Permiso de IAM obligatorio | discoveryengine.assistants.assist |
| Permiso de OAuth obligatorio | https://www.googleapis.com/auth/cloud-platform |
Antes de comenzar
- Habilita la API de Discovery Engine (
discoveryengine.googleapis.com) en tu Google Cloud proyecto. - Asegúrate de que tu principal (cuenta de usuario o cuenta de servicio) tenga un rol que otorgue el permiso de IAM
discoveryengine.assistants.assist, como Editor de Discovery Engine (roles/discoveryengine.editor) o Administrador de Gemini Enterprise (roles/discoveryengine.agentspaceAdmin). - Verifica que tu app de Gemini Enterprise (motor) esté creada y contenga al menos un agente registrado.
- Si te autenticas con las credenciales predeterminadas de la aplicación (ADC), asegúrate de que tu cliente envíe el encabezado del proyecto de cuota:
-H "X-Goog-User-Project: PROJECT_ID".
Cómo encontrar el ID y la ubicación de tu app
La URL de streamAssist requiere el ID de tu motor y su ubicación (global, us o eu). Si solo conoces el nombre visible de la app, enumera los motores de tu proyecto para ubicar el ID subyacente:
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://LOCATION-discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/collections/default_collection/engines"
En la respuesta, el formato name del motor es projects/{project}/locations/{location}/collections/default_collection/engines/{ENGINE_ID}. El segmento ENGINE_ID es el APP_ID requerido en la llamada.
Cómo encontrar el ID del agente
agentId es el segmento final del nombre completo del recurso del agente en la API de Discovery Engine:
projects/{project}/locations/{location}/collections/{collection}/engines/{engine}/assistants/{assistant}/agents/{AGENT_ID}
Los agentes registrados usan un ID numérico largo (por ejemplo, 15492003793394502655) en lugar de un nombre visible descriptivo. Proporciona solo esta cadena numérica {AGENT_ID} final en tu solicitud.
Para enumerar los agentes registrados en tu app y descubrir sus IDs numéricos, llama a la colección agents en el extremo v1alpha:
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://LOCATION-discoveryengine.googleapis.com/v1alpha/projects/PROJECT_ID/locations/LOCATION/collections/default_collection/engines/APP_ID/assistants/default_assistant/agents"
Cada recurso de agente que se muestra incluye los siguientes campos:
name: Es la ruta de acceso completa del recurso que termina en{AGENT_ID}.displayName: Es el nombre legible por humanos que se muestra en la Google Cloud consola.state: Es el estado operativo (comoENABLEDoPRIVATE).- Un objeto de definición que indica el tipo de agente (como
a2aAgentDefinition,lowCodeAgentDefinitionoworkflowAgentDefinition).
Consulta la referencia de la API de REST agents para obtener el esquema completo del recurso del agente.
Envía consultas a los agentes
Para enviar consultas a un agente específico, debes crear tu solicitud con el agentsSpec adecuado y ejecutarla con REST o bibliotecas cliente.
Estructura del cuerpo de la solicitud
Para enrutar una consulta a un agente específico, incluye el objeto agentsSpec opcional en el cuerpo de la solicitud POST:
{
"query": {
"text": "QUERY_TEXT"
},
"session": "SESSION_RESOURCE_NAME",
"agentsSpec": {
"agentSpecs": [
{
"agentId": "AGENT_ID"
}
]
}
}
Referencia de campo
agentsSpec(objeto, opcional): Es la especificación de los agentes que se usan para atender la solicitud.agentsSpec.agentSpecs[](array, opcional): Es una lista de especificaciones de agentes. Puedes especificar varios agentes en este array.agentsSpec.agentSpecs[].agentId(cadena, obligatoria dentro de la especificación): Es el ID que identifica el recurso del agente registrado. Debe ajustarse a RFC-1034 con una longitud máxima de 63 caracteres.
Consulta la referencia de la API de REST streamAssist para obtener el esquema completo de la solicitud.
Llama a streamAssist
REST
El siguiente comando curl envía una consulta a un agente específico con la API de REST:
curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ "https://LOCATION-discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/collections/default_collection/engines/APP_ID/assistants/default_assistant:streamAssist" \ -d '{ "query": { "text": "List all contact cards." }, "agentsSpec": { "agentSpecs": [ { "agentId": "AGENT_ID" } ] } }'
Reemplaza los marcadores de posición que se indican más abajo:
LOCATION: Es la multirregión para el nombre de host y la ruta de acceso del recurso (global,usoeu). Si tu app reside en la ubicaciónglobal, omite el prefijo de ubicación del nombre de host (discoveryengine.googleapis.com).PROJECT_ID: Es el ID del proyecto de Google Cloud .APP_ID: Es el ID de tu motor de Gemini Enterprise (descubierto en Cómo encontrar el ID y la ubicación de tu app).AGENT_ID: Es el ID numérico del agente (descubierto en Cómo encontrar el ID del agente).
Python
En este ejemplo de Python, se llama a streamAssist con la biblioteca cliente de google-cloud-discoveryengine:
# Install library: pip install google-cloud-discoveryengine from google.api_core.client_options import ClientOptions from google.cloud import discoveryengine_v1 as discoveryengine # TODO(developer): Replace placeholder values with your project and agent details. project_id = "PROJECT_ID" location = "LOCATION" # For example: "us", "eu", or "global" engine_id = "APP_ID" agent_id = "AGENT_ID" # The numeric agent ID query_text = "List all contact cards." client_options = ( ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com") if location != "global" else None ) client = discoveryengine.AssistantServiceClient(client_options=client_options) assistant_path = client.assistant_path( project=project_id, location=location, collection="default_collection", engine=engine_id, assistant="default_assistant", ) request = discoveryengine.StreamAssistRequest( name=assistant_path, query=discoveryengine.Query(text=query_text), agents_spec=discoveryengine.StreamAssistRequest.AgentsSpec( agent_specs=[ discoveryengine.StreamAssistRequest.AgentsSpec.AgentSpec( agent_id=agent_id, ) ] ), ) for response in client.stream_assist(request=request): for reply in response.answer.replies: # Filter out model reasoning fragments (thought: true) if hasattr(reply, "grounded_content") and reply.grounded_content.content: print(reply.grounded_content.content.text, end="", flush=True) print()
Comprende la respuesta de transmisión
El extremo streamAssist muestra una transmisión de fragmentos JSON a través de REST o un iterador de objetos de respuesta en las bibliotecas cliente:
- Texto de respuesta: El texto de respuesta incremental llega en
answer.replies[].groundedContent.content.text. Concatena estos fragmentos de texto en orden de recepción para reconstruir la respuesta completa. - Fragmentos de razonamiento: Los fragmentos marcados con
"thought": truerepresentan el proceso de razonamiento interno del modelo. Filtra estos fragmentos cuando presentes el resultado final a los usuarios finales. - Estado de la ejecución: El campo
answer.stateavanza deIN_PROGRESSa un estado terminal:SUCCEEDED: La solicitud se completó y generó una respuesta.SKIPPED: Se ignoró o se omitió la consulta. InspeccionaassistSkippedReasonspara obtener detalles (comoNON_ASSIST_SEEKING_QUERY_IGNOREDpara saludos breves).FAILED: La invocación encontró un error de ejecución.
- Continuidad de la sesión: El fragmento terminal incluye
sessionInfo.session(el nombre del recurso de la sesión) y unassistToken.
Continúa la conversación en la misma sesión
Para mantener el contexto en todas las interacciones, pasa la cadena session de sessionInfo en las solicitudes posteriores:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://LOCATION-discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/collections/default_collection/engines/APP_ID/assistants/default_assistant:streamAssist" \
-d '{
"session": "projects/PROJECT_ID/locations/LOCATION/collections/default_collection/engines/APP_ID/sessions/SESSION_ID",
"query": {
"text": "Who is John Doe?"
},
"agentsSpec": {
"agentSpecs": [
{
"agentId": "AGENT_ID"
}
]
}
}'
Si omites el campo session o especificas - como el ID de sesión, la API genera automáticamente una sesión nueva y aislada.
Cómo llamar a un flujo de trabajo
Para ejecutar un flujo de trabajo de Workflow Builder, envía la misma solicitud con el ID del flujo de trabajo en agentsSpec.agentSpecs[].agentId. Cada llamada inicia una ejecución manual del flujo de trabajo.
- Versión que se ejecuta: Si se publica el flujo de trabajo, la llamada ejecuta su versión publicada. Los cambios guardados en Workflow Builder, pero que aún no se publicaron, no afectan a las llamadas a la API hasta que los publiques. Si el flujo de trabajo nunca se publicó, la llamada ejecuta su borrador.
- Quién puede llamarlo: El propietario y los administradores del flujo de trabajo pueden llamarlo. Otros usuarios pueden llamar a un flujo de trabajo publicado después de que se comparte con ellos. Solo el propietario o un administrador pueden llamar a un flujo de trabajo que nunca se publicó; otros llamadores reciben
HTTP 403. - Activadores: El flujo de trabajo debe tener exactamente un activador manual. Las llamadas fallan para un flujo de trabajo que combina un activador manual con cualquier otro activador o que tiene más de un activador manual.
- Entradas: No puedes configurar las variables de entrada del activador manual a través de
streamAssist. Si el activador manual tiene una entrada obligatoria, la ejecución falla, incluso si la entrada tiene un valor predeterminado. Las entradas opcionales están vacías y no se aplican sus valores predeterminados. El texto de la consulta se pasa a los nodos LLM del flujo de trabajo, por lo que puedes incluir datos allí, pero no completa las variables de entrada.
Limitaciones
Las siguientes limitaciones se aplican cuando se llama a agentes con streamAssist:
- Tipos de agentes no admitidos: Los agentes A2A o ADK registrados en una app de Gemini Enterprise no son compatibles con
streamAssist. Para llamar a un agente A2A directamente con su extremo de registro, consulta Cómo llamar a un agente con su extremo A2A de registro. - Acciones mutativas: La API de
streamAssistestá optimizada para consultas conversacionales y recuperación de solo lectura a través de conectores. No se admite la ejecución programática de herramientas y acciones mutativas (como la creación de correos electrónicos, la creación de eventos de calendario o la mensajería de chat) a través destreamAssist. Si intentas invocar un flujo de trabajo de agente que ejecuta acciones mutativas, es posible que se produzcan fallas silenciosas o bucles de ejecución no fundamentados.
Soluciona problemas
Usa la siguiente tabla para solucionar problemas relacionados con errores comunes de invocación de streamAssist:
| Síntoma | Causa probable | Solución |
|---|---|---|
| HTTP 404 cuando se enumeran agentes | Llamar a agents en el extremo v1 o v1beta. |
Envía la solicitud de lista al extremo v1alpha. |
La respuesta parece genérica a pesar de configurar agentsSpec |
agentId numérico no válido o la consulta es demasiado genérica para activar el comportamiento del dominio. |
Confirma el ID numérico exacto de la lista de agentes v1alpha; envía una consulta específica del dominio; verifica el texto de respuesta para obtener una redacción específica del agente. |
| No se muestra ningún error, pero el agente de destino no se ejecutó | agentId con formato incorrecto causó una reserva silenciosa a la organización predeterminada. |
Verifica que el agentId conste solo de dígitos y coincida exactamente con un ID de la lista de registro. |
El estado de la respuesta muestra SKIPPED |
La entrada se evaluó como una consulta que no busca asistencia (como un saludo breve). | Envía una consulta de tarea sustantiva; inspecciona assistSkippedReasons en la carga útil de la respuesta. |
HTTP 401 o HTTP 403 Permission Denied |
Falta el permiso de OAuth, el rol de IAM es insuficiente o falta el encabezado del proyecto de cuota. | Verifica que el llamador tenga discoveryengine.assistants.assist; asegúrate de que el permiso de OAuth incluya cloud-platform; agrega -H "X-Goog-User-Project: PROJECT_ID" si usas ADC. |
HTTP 403 con Only the agent owner or an admin can run a draft of this agent. |
El flujo de trabajo nunca se publicó y el llamador no es su propietario ni un administrador. | Publica el flujo de trabajo en Workflow Builder y compártelo con el llamador. |
HTTP 403 con User does not have permission to access the Agent. |
El flujo de trabajo no se comparte con el llamador. | Comparte el flujo de trabajo con el llamador. |
| El flujo de trabajo se comporta como una versión anterior | La llamada ejecuta la versión publicada, no los cambios no publicados en Workflow Builder. | Publica el flujo de trabajo. |
La llamada al flujo de trabajo termina con answer.state FAILED y un error INTERNAL |
El flujo de trabajo tiene un activador manual más otro activador o más de un activador manual. | Mantén un solo activador manual. |
¿Qué sigue?
- Obtén resultados de la búsqueda de StreamAssist
- Referencia de la API de REST de streamAssist
- Descripción general de los agentes