Skip to main content
Zylon 1.58 unifica las rutas de artefactos y separa las membresías del espacio de trabajo de las cuentas. Usa esta guía para actualizar integraciones creadas para 1.57. Abarca cambios en APIs existentes de Workspace y los nuevos bloques de herramientas de servidor que devuelven los mensajes de chat, tanto en la API de Workspace como en la de ZylonGPT.
Las rutas antiguas de artefactos, integraciones y miembros quedan obsoletas en 1.58 y su retirada está prevista para 1.59. Otros alias aceptados tienen sus propias notas de compatibilidad más abajo. Usa las rutas actuales de 1.58 para integraciones nuevas o mantenidas.Si tu integración depende de la identidad del usuario, IDs de creador o filtros de creador, migra las llamadas afectadas a la API actual y actualiza tus mapeos de identidad. Que una URL antigua funcione no restaura el modelo de identidad de 1.57. Los campos de creador ahora identifican cuentas; las rutas de membresía siguen usando IDs de miembro. Sigue la migración de IDs de usuario guardados antes de confiar en búsquedas, comparaciones o filtros existentes.

Requisitos previos

  • Un token de API y el nombre de host de Zylon. Consulta Gestión de tokens de Workspace.
  • Envía Authorization: Bearer {API_TOKEN} y x-org: {org_slug} en las peticiones de Workspace.
  • Envía Content-Type: application/json para cuerpos JSON. Deja que tu cliente HTTP establezca el delimitador de las peticiones multipart.
Las rutas de las tablas son relativas a https://{BASE_URL}/api/v1.

Rutas de artefactos

Sustituye el prefijo de artefactos del proyecto o de la organización por /app/artifact. Indica explícitamente el proyecto para asignar la propiedad o filtrar cuando corresponda.
Si usas x-org, no envíes también organization_id. Sin x-org, especificar organization_id requiere Operator o SuperAdmin. Crear artefactos de organización requiere AppAdmin o superior; los artefactos Link requieren un proyecto.

Cuerpos de creación

El campo JSON actual content contiene bytes de archivo o texto codificados en Base64. Sustituye al antiguo campo de texto raw_content. Por ejemplo, el texto UTF-8 Hello se convierte en SGVsbG8=.
POST /app/project/{projectID}/artifact
Los demás campos específicos de cada tipo mantienen sus reglas actuales. Consulta los campos y tipos de artefactos.

Cuerpos de actualización

El antiguo content de actualización contenía estado binario del editor codificado en Base64. El content JSON actual contiene texto UTF-8, como Markdown. Exporta el documento del editor a Markdown; decodificar sus bytes Base64 no produce texto del documento.
PUT /app/project/{projectID}/artifact/{artifactID}
{BASE64_EDITOR_STATE} representa tu documento del editor ya codificado.
Creación y actualización usan codificaciones distintas: Base64 al crear con JSON, texto sin codificar al actualizar con JSON. No envíes el antiguo estado del editor a la ruta actual de actualización: se trataría como texto literal.
El mismo formato se aplica a la validación de actualizaciones y a cada entrada artifacts[].update de las actualizaciones en lote. Las entradas siguen usando artifactId y update. Elimina plain_text_content: era un texto de búsqueda separado y ahora se deriva del documento. Para sustituir un archivo, usa file_data multipart en la ruta actual de actualización. Consulta actualizar un artefacto.

Qué peticiones antiguas siguen siendo compatibles

  • La creación, validación y reintento con JSON aceptan raw_content; la creación multipart también acepta bytes de archivo. La creación antigua obtiene el proyecto de la URL y rechaza project_id, organization_id y el nuevo content JSON en el cuerpo.
  • Las actualizaciones JSON antiguas convierten el estado del editor de Base64 a Markdown antes de guardar. El servicio de conversión de documentos de la instalación debe estar disponible. Se puede enviar contenido binario con o sin plain_text_content; este último campo por sí solo no sustituye el contenido.
  • La actualización, validación de actualización y actualización en lote antiguas solo aceptan JSON. Usa el endpoint actual para sustituir archivos con multipart.
  • Se rechaza una creación que combine raw_content y un archivo: no se pueden conservar ambos en el único campo de contenido actual. Envía una sola representación del contenido.
  • Se rechazan campos desconocidos y tipos de datos no válidos. La creación en una organización solo acepta ámbitos de esa organización.

Respuestas y selección de artefactos

Las respuestas antiguas conservan has_content, siempre false: este campo describía el contenido binario del editor, no la existencia de un archivo. Los bytes originales del editor no se pueden reconstruir, por lo que content es nulo/se omite. En las consultas de detalle de artefactos por la URL antigua, añade include_content=true para recibir el texto UTF-8 disponible como raw_content. El valor por defecto es false; los listados y las respuestas de escritura no incluyen texto. Se conservan los espacios y el texto vacío. Los archivos no textuales y el UTF-8 inválido no generan raw_content. Se aplican los permisos actuales de descarga: si están desactivadas, devuelve 403; si falta el archivo almacenado, devuelve el error actual de descarga.
Los campos nulos se omiten. No se genera content binario del editor en Base64 a partir del texto.
Las respuestas actuales de artefactos omiten estos campos de contenido antiguos. Usa /app/artifact/{artifactID}/download para obtener el contenido almacenado. /app/artifact/{artifactID}/parsed-content devuelve texto extraído y requiere un índice vectorial inicializado. La descarga devuelve una URL prefirmada por defecto; con Content-Disposition: attachment devuelve los bytes del archivo. Las URLs antiguas de descarga también admiten ambos modos. created_by ahora representa una cuenta. Actualiza el código que lee los datos del creador o compara sus IDs; consulta IDs de cuenta y campos renombrados. scopes[].ws_auto_select y scopes[].enabled ya existían en las versiones publicadas de 1.57 y siguen siendo compatibles, incluido enabled: false. El campo anterior ws_auto_select de nivel superior no se acepta. Las skills siguen usando file_data; no hay una migración independiente de su cuerpo. Consulta los ámbitos de artefactos.

Miembros del espacio de trabajo

Los datos de usuario se unifican en la cuenta: la identidad, el nombre, el correo y la imagen de perfil pertenecen a la cuenta. El antiguo usuario pasa a ser una membresía del espacio de trabajo, que mantiene los roles, permisos y estado activo/inactivo de esa cuenta dentro del espacio. Sustituye /app/user por /app/member. Los IDs de estas rutas siguen siendo IDs de miembro del espacio de trabajo, no IDs de cuenta. Las respuestas antiguas de /app/user al listar, consultar, crear, cambiar el rol, activar o desactivar un miembro conservan name, email y profile_picture (si está disponible) en el primer nivel, tomados del perfil actual de la cuenta. Se mantienen id, org_id, account_id, state, roles y created_at de la membresía. Los datos eliminados del puesto de trabajo no se pueden recuperar y son nulos/se omiten. Estos campos de respuesta no restauran las actualizaciones de perfil mediante la ruta antigua del miembro. GET /app/me conserva su URL, pero también devuelve el nuevo modelo de miembro. El nombre, el correo y la imagen de perfil son datos de la cuenta y ya no son campos de primer nivel del miembro. Solicita include=Account al listar miembros, consultar un miembro o llamar a /app/me para recibir la cuenta anidada.
Roles del espacio de trabajo: AppGuest, AppMember, AppAdmin, AppOwner.
Actualiza los campos de perfil con POST /account/{accountId} (me permite actualizar tu propia cuenta), en lugar del endpoint de miembros. Los antiguos campos job_position_name y job_position_description se eliminan del miembro; no forman parte del modelo de cuenta.

IDs de cuenta y campos renombrados

Migrar IDs de usuario guardados

Si tu cliente guardó userId a partir del campo id de una respuesta /app/user de 1.57, ese valor es un ID de miembro del espacio de trabajo. No sustituyas todos los userId por accountId: identifican registros distintos. Una cuenta puede tener IDs de miembro diferentes en distintas organizaciones.
  1. Conserva el ID de miembro guardado y su organización. Usa el endpoint actual de miembros para leer el ID de cuenta asociado:
account_id se devuelve sin un parámetro include. Añade include=Account si también necesitas el perfil de cuenta; consulta la respuesta completa de miembro.
  1. Guarda ambos IDs con nombres distintos. Usa account_id para comparar con created_by.id de artefactos, hilos, interacciones e incidencias, y para los filtros created_by de artefactos o incidencias. Conserva el id de miembro para /app/member/{wsMemberId}, miembros de proyecto, transferencia de propiedad y metadata.ws_member_id del chat.
  2. Actualiza las llamadas afectadas a las rutas actuales y nombres canónicos, y comprueba tus relaciones y filtros guardados. Por ejemplo, un filtro de creador de artefactos debe usar created_by={accountId}; una petición de miembro de proyecto sigue usando ws_member_id: "{wsMemberId}".
Para tu propia identidad, GET /api/v1/app/me devuelve la misma distinción entre id y account_id. Para migrar un directorio, pagina /app/member por separado en cada organización y crea un mapeo de IDs de miembro a IDs de cuenta. Si tu aplicación necesita un ID de miembro para la cuenta de un creador, resuelve su membresía en la organización seleccionada; un ID de cuenta por sí solo no identifica una membresía concreta.

Qué conservan los alias antiguos

Las lecturas de /app/user antiguo pueden restaurar campos de perfil seleccionados, como name y email, pero id sigue siendo un ID de miembro y account_id sigue siendo un ID de cuenta. Los objetos de creador de artefactos antiguos ya usan IDs de cuenta. include=User en las consultas de creador compatibles selecciona datos de cuenta; no restaura el antiguo objeto de usuario del espacio de trabajo ni convierte IDs de creador. Usa los alias antiguos solo como puente temporal para los formatos de petición documentados en esta guía. Si tu integración necesita las relaciones antiguas de IDs de usuario, filtros de creador o comportamiento de actualización de perfil, migra a la API actual y al modelo de cuenta/miembro descrito arriba. Cambiar solo la URL o el nombre de campo no basta.

Usar nombres de campo canónicos

Los alias temporales siguientes aceptan ciertos nombres de entrada antiguos. Las respuestas mantienen el modelo y los nombres de campo actuales; los alias no convierten IDs de miembro en IDs de cuenta. Consulta miembros de proyecto, transferencia de propiedad y filtros de incidencias para ver los cuerpos y respuestas actuales completos.

Chats e hilos

Mover el chat de proyecto a la ruta unificada

Sustituye POST /app/project/{projectID}/chat por POST /app/chat y mueve el selector de proyecto al cuerpo. Usa una petición de mensajes envuelta en pgpt (private_gpt sigue siendo un alias de entrada). La ruta actual también acepta una petición antigua sin envolver para contexto del espacio de trabajo, pero los selectores de proyecto y artefactos requieren el cuerpo envuelto. /app/chat/validate recibe la petición de mensajes sin envolver.
La respuesta actual de /app/chat es siempre SSE, incluso con pgpt.stream: false. La URL de chat de proyecto conservada devuelve JSON cuando ese indicador es false y SSE cuando es true. Adapta los clientes que esperan JSON antes de cambiar la URL. El alias de chat de proyecto no tiene asignada una versión de retirada.
Para seleccionar artefactos, usa artifacts.document, artifacts.connector, artifacts.skill o artifacts.agent_flow. Cada campo es un array de selectores con scope (organization o project), all_artifacts opcional y artifacts_ids opcional (observa el plural). Por ejemplo:
Es un cuerpo parcial que debes combinar con pgpt y, para el ámbito de proyecto, project_id. No envíes los campos de los ejemplos antiguos de referencia artifact_ids o all_artifacts en el nivel superior: los campos desconocidos se ignoran y no seleccionan artefactos. Una categoría no puede repetir el mismo ámbito ni combinar all_artifacts: true con artifacts_ids no vacío. Consulta peticiones de chat.

Archivos de hilo y estado de lectura

1.58 añade la escritura de archivos sin multipart con PUT /app/thread/{threadID}/put-file/{path...}. Envía los bytes en el cuerpo. POST /app/thread/{threadID}/upload-file sigue usando el campo multipart file y ahora acepta path y namespace opcionales. Las subidas multipart, escrituras sin multipart y descargas seleccionan session (por defecto), artifacts o skills mediante namespace; la descarga también acepta disposition=attachment (por defecto) o inline. Consulta archivos de hilo para subida, descarga y conversión de artefactos MDX. En los listados de hilos del proyecto, solicita include=ReadState para recibir read_state.last_read_at y read_state.has_unread_response. Un hilo nuevo creado por otra cuenta también puede contar como no leído. Listar interacciones con GET /app/thread/{threadID}/interaction ahora avanza el punto de lectura del solicitante hasta las respuestas completadas devueltas. Los clientes que consultan este endpoint periódicamente pueden marcar así el contenido como leído; tenlo en cuenta en la lógica de notificaciones y sondeo.

Peticiones de filesystem

La validación de credenciales requiere el cuerpo anidado actual en ambas URLs. Las credenciales antiguas sin anidar no se adaptan.
Esta operación devuelve un booleano. Consulta validar credenciales de filesystem para ver un ejemplo completo. La ingestión desde integraciones usa la ruta unificada /ingest y project_id en el cuerpo, como se describe arriba.

Bloques de herramientas de servidor

En 1.57, cada llamada a herramienta de un mensaje se devolvía como un bloque tool_use seguido de un bloque tool_result, tanto si la ejecutaba Zylon como si la ejecutaba tu aplicación. En 1.58, las herramientas que Zylon ejecuta en el servidor usan el formato de herramientas de servidor de la API de Mensajes de Anthropic. Las herramientas que ejecuta tu aplicación (herramientas personalizadas) no cambian y siguen usando tool_use y tool_result. Esto afecta al contenido de los mensajes en los eventos en streaming, en las interacciones guardadas de los hilos y en las respuestas de /messages. Actualiza cualquier código que detecte llamadas a herramientas comprobando type == "tool_use" o type == "tool_result".
  • server_tool_use.name es el name de la herramienta en la solicitud. Los chats del Workspace envían la herramienta web fetch como web_extract, así que sus llamadas aparecen como web_extract; los clientes de la ZylonGPT API ven el nombre que enviaron (web_extract o web_fetch). Identifica el resultado por el tipo de bloque (web_fetch_tool_result) en lugar del nombre.
  • Los IDs de las llamadas a herramientas de servidor empiezan por srvtoolu_, y los de herramientas de cliente, por tool_. El tool_use_id del resultado hace referencia al ID de la llamada, como antes.
  • Zylon ya ha ejecutado las herramientas de servidor, así que no envíes un resultado para ellas. stop_reason: "tool_use" sigue aplicándose solo a las herramientas que ejecuta tu aplicación.
  • Los bloques siguen el formato de herramientas de servidor de Anthropic, por lo que los SDKs de Anthropic pueden leerlos directamente. Ignora los campos que no reconozcas, porque Zylon puede añadir campos adicionales.

Reglas de migración

  • Herramientas de servidor genéricas (server_tool_result): solo cambian los valores de type de los bloques y el prefijo del ID. content e is_error funcionan como antes, así que puedes reutilizar tu parser de 1.57.
  • Herramientas web y de ejecución de código: content es ahora un objeto tipado (o una lista de objetos tipados en la búsqueda web) en lugar de una lista de bloques text. Estos bloques no tienen campo is_error. Para detectar un fallo, comprueba si content.type termina en _error y lee content.error_code.
  • Fallos que 1.57 devolvía como texto: en 1.57, las herramientas del editor de texto devolvían los fallos como un tool_result correcto cuyo texto empezaba por Error:. En 1.58 devuelven un objeto de error.
  • Códigos de salida distintos de cero: un comando bash que termina con un código distinto de cero no es un error en ninguna de las dos versiones. En 1.58, lee return_code en lugar de extraer exit_code: del texto.

Ejemplos de migración por herramienta

Cada ejemplo muestra el bloque de llamada y el bloque de resultado de una llamada correcta y de una llamada fallida. Los IDs, las entradas y los textos de resultado son solo ejemplos.
Error:
Error:
Un comando con código de salida distinto de cero:
Error (la herramienta no se pudo ejecutar):
En 1.57, cada operación era una herramienta distinta. En 1.58 todas son text_editor_code_execution y la operación se indica en input.command. El resto de campos de entrada mantienen su nombre. En insert, 1.58 acepta tanto insert_text como new_str.
view:
create:
str_replace:
insert:
Error. Los errores de archivo se devolvían como un resultado correcto cuyo texto empezaba por Error::
Error:
Error:
Error:
Error:
Error:
Error:
Las herramientas de skills devuelven JSON como texto. Si no se encuentra una skill, la herramienta devuelve una clave error en el JSON y mantiene is_error: false.
Error:
Las herramientas MCP mantienen el nombre de la herramienta del servidor MCP y devuelven los bloques de contenido que genera el servidor MCP.
Error:
Nada cambia para las herramientas que define y ejecuta tu aplicación. La respuesta se detiene con stop_reason: "tool_use", tu aplicación ejecuta la herramienta y envía de vuelta un bloque tool_result, como en 1.57.

Peticiones con la extensión de Zylon activada

Si una petición activa la extensión de Zylon (system.extensions incluye zylon):
  • Los resultados de web_search y web_fetch se devuelven como un bloque tool_result normal, como muestran los ejemplos anteriores. El bloque de llamada sigue siendo server_tool_use y el ID de la llamada sigue empezando por srvtoolu_.
  • Los objetos de error de bash_code_execution_tool_result y text_editor_code_execution_tool_result incluyen un campo detail con el error original.
  • Los bloques específicos de Zylon, como source, se conservan en el contenido de server_tool_result.

Envío del historial de conversación

Puedes enviar de vuelta en messages los bloques server_tool_use y los resultados de herramientas de servidor tal como los recibiste. Zylon los convierte internamente, así que no necesitas cambios si reenvías sin modificar los turnos anteriores del asistente. El historial con los bloques tool_use y tool_result de 1.57 se sigue aceptando.

Antes de actualizar tu cliente

  1. Sustituye las URLs obsoletas y mueve el selector de proyecto a la consulta o al cuerpo correspondiente.
  2. Usa bytes Base64 para crear artefactos con JSON, texto para actualizarlos y file_data para archivos multipart.
  3. Adapta la lectura de respuestas a la separación entre cuenta y miembro y a la eliminación del contenido inline de artefactos. Revisa los IDs de usuario/cuenta almacenados, relaciones, comparaciones y filtros aunque las llamadas sigan funcionando.
  4. Usa IDs de cuenta en los filtros de creador y los nombres canónicos de campos e inclusiones.
  5. Adapta el procesado de mensajes a server_tool_use y a los bloques de resultado de herramientas de servidor, y devuelve tool_result solo para tus herramientas personalizadas.
  6. Adapta los cuerpos de chat, selectores de artefactos por ámbito, SSE, archivos de hilo y sondeo del estado de lectura.
  7. Prueba con 1.58, incluidos permisos, validación, conversión de contenido y validación de filesystem. Las URLs antiguas usan la autorización, las respuestas y el comportamiento de servicio actuales; no reproducen todos los comportamientos de 1.57.