{"id":219,"date":"2026-04-05T14:22:19","date_gmt":"2026-04-05T18:22:19","guid":{"rendered":"https:\/\/juredev.com\/blog\/?p=219"},"modified":"2026-04-05T17:02:03","modified_gmt":"2026-04-05T21:02:03","slug":"symfony-ai-agentes-tools-php","status":"publish","type":"post","link":"https:\/\/juredev.com\/blog\/2026\/04\/symfony-ai-agentes-tools-php\/","title":{"rendered":"Symfony AI en la pr\u00e1ctica: agentes, tools y modelos gratuitos desde PHP"},"content":{"rendered":"\n<p>El ecosistema PHP ha dado un paso importante con la llegada de Symfony AI, un conjunto de componentes oficiales que te permite integrar modelos de lenguaje (LLMs) directamente en tus aplicaciones Symfony, sin tener que salir del entorno PHP ni renunciar a la arquitectura limpia que tanto nos gusta.<\/p>\n\n\n\n<p>Hasta hace poco, si quer\u00edas trabajar con IA en un proyecto Symfony, lo m\u00e1s habitual era delegar esa parte a un microservicio en Python o Node.js. Symfony AI cambia eso: te ofrece una alternativa s\u00f3lida y nativa para muchos casos de uso reales. No pretende reemplazar el ecosistema de Python (especialmente en investigaci\u00f3n, fine-tuning o tareas muy avanzadas), pero s\u00ed te permite construir funcionalidades inteligentes dentro de tu aplicaci\u00f3n Symfony manteniendo todo en el mismo stack.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Nota importante:<\/strong> En el momento de publicar este art\u00edculo, Symfony AI se encuentra en estado experimental (\u00faltima versi\u00f3n estable: <code>v0.6.0<\/code>). Esto significa que la API puede sufrir cambios y que no est\u00e1 cubierta por la promesa de compatibilidad hacia atr\u00e1s de Symfony. Puedes usarlo en producci\u00f3n, pero con esa precauci\u00f3n en mente.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">1. \u00bfQu\u00e9 es Symfony AI y qu\u00e9 problema resuelve?<\/h2>\n\n\n\n<p>Symfony AI no es simplemente un wrapper de la API de OpenAI. Es una <strong>capa de abstracci\u00f3n<\/strong> pensada con la filosof\u00eda de Symfony: desacoplamiento, extensibilidad e integraci\u00f3n profunda con el Service Container.<\/p>\n\n\n\n<p>Sus componentes principales son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Platform<\/strong>: una interfaz unificada para conectarte a m\u00e1s de 25 proveedores de modelos (OpenAI, Anthropic, Google Gemini, Azure, Mistral, Ollama, etc.).<\/li>\n\n\n\n<li><strong>Agent<\/strong>: el framework para crear agentes que razonan, usan herramientas y gestionan flujos complejos.<\/li>\n\n\n\n<li><strong>Chat<\/strong>: una API de alto nivel para manejar conversaciones con historial.<\/li>\n\n\n\n<li><strong>Store<\/strong>: abstracci\u00f3n sobre bases de datos vectoriales para implementar RAG.<\/li>\n\n\n\n<li><strong>AI Bundle<\/strong>: la integraci\u00f3n de todo lo anterior con el contenedor de servicios de Symfony.<\/li>\n<\/ul>\n\n\n\n<p>Gracias a esto, puedes cambiar de proveedor (por ejemplo, de OpenAI a Anthropic) solo modificando la configuraci\u00f3n, sin tocar ni una l\u00ednea de tu l\u00f3gica de negocio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Los cuatro pilares en detalle<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Platform &#8211; La conexi\u00f3n con los modelos<\/h3>\n\n\n\n<p>El componente Platform se encarga de la comunicaci\u00f3n con los distintos proveedores de IA. Ofrece una interfaz com\u00fan (<code>PlatformInterface<\/code>) que oculta las diferencias entre las APIs de cada uno.<\/p>\n\n\n\n<p>Puedes enviarle un <code>MessageBag<\/code> con mensajes del sistema y del usuario, y recibir una respuesta estructurada. Adem\u00e1s, soporta streaming mediante Server-Sent Events, lo que permite mostrar las respuestas en tiempo real al usuario (tema que desarrollaremos en el pr\u00f3ximo art\u00edculo).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Agent &#8211; El n\u00facleo l\u00f3gico<\/h3>\n\n\n\n<p>El <code>Agent<\/code> es el cerebro del sistema. Recibe los mensajes, decide si necesita usar alguna herramienta, ejecuta los ciclos necesarios y devuelve la respuesta final. Es el componente m\u00e1s completo: soporta memoria, procesadores de entrada y salida, subagentes, tolerancia a fallos en las herramientas y mucho m\u00e1s.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tools &#8211; La acci\u00f3n sobre tu c\u00f3digo<\/h3>\n\n\n\n<p>Aqu\u00ed est\u00e1, para m\u00ed, una de las ideas m\u00e1s potentes de Symfony AI.<\/p>\n\n\n\n<p>Las <strong>tools<\/strong> son clases PHP normales que decoras con el atributo <code>#[AsTool]<\/code>. El agente puede llamarlas autom\u00e1ticamente cuando detecta que las necesita.<\/p>\n\n\n\n<p>Lo mejor es que Symfony AI genera autom\u00e1ticamente el esquema JSON de cada herramienta a partir de los tipos de los par\u00e1metros y los comentarios del docblock. No tienes que escribir descripciones manuales complicadas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Store &#8211; La memoria a largo plazo<\/h3>\n\n\n\n<p>El componente <strong>Store<\/strong> es una abstracci\u00f3n sobre bases de datos vectoriales (ChromaDB, Pinecone, Weaviate, pgvector, etc.). Es la pieza fundamental para implementar <strong>RAG (Retrieval-Augmented Generation)<\/strong>: antes de responder, el agente recupera los fragmentos m\u00e1s relevantes de tu propia documentaci\u00f3n o base de conocimiento y los incluye en el contexto de la conversaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. \u00bfCu\u00e1ndo usar Symfony AI (y cu\u00e1ndo no)?<\/h2>\n\n\n\n<p>Como con cualquier herramienta, es importante saber d\u00f3nde encaja y d\u00f3nde no.<\/p>\n\n\n\n<p><strong>Casos donde funciona muy bien:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Asistentes conversacionales integrados en una aplicaci\u00f3n Symfony ya existente.<\/li>\n\n\n\n<li>Funcionalidades que necesitan acceder a datos internos (base de datos, APIs propias) durante la conversaci\u00f3n.<\/li>\n\n\n\n<li>B\u00fasqueda sem\u00e1ntica o sistemas de preguntas y respuestas sobre documentaci\u00f3n interna.<\/li>\n\n\n\n<li>Flujos automatizados en los que el LLM orquesta acciones sobre tu propio sistema.<\/li>\n<\/ul>\n\n\n\n<p><strong>Casos donde probablemente no sea la mejor opci\u00f3n:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Investigaci\u00f3n, fine-tuning o entrenamiento de modelos (ah\u00ed Python sigue siendo el rey).<\/li>\n\n\n\n<li>Integraciones muy espec\u00edficas con SDKs de proveedores que a\u00fan no est\u00e1n cubiertas por Symfony AI.<\/li>\n\n\n\n<li>Proyectos donde la estabilidad de la API es cr\u00edtica y no puedes permitirte posibles breaking changes (recuerda que el bundle sigue siendo experimental).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">4. Ejemplo pr\u00e1ctico: un asistente de productos<\/h2>\n\n\n\n<p>Vamos a construir un asistente sencillo pero realista: uno que pueda responder preguntas sobre productos consultando datos reales de nuestra aplicaci\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Paso 1: Instalaci\u00f3n<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>composer require symfony\/ai-bundle<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Paso 2: Configuraci\u00f3n<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># config\/packages\/ai.yaml\nai:\n    platform:\n        openai:\n            api_key: '%env(OPENAI_API_KEY)%'\n    agent:\n        default:\n            model: 'gpt-4o-mini'<\/code><\/pre>\n\n\n\n<p>El bundle registra autom\u00e1ticamente el agente por defecto con el alias <code>AgentInterface $defaultAgent<\/code>.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>\u00bfNo tienes acceso a una API de pago?<\/strong> No hay problema. Symfony AI soporta varias opciones gratuitas o de coste cero, y lo mejor es que el c\u00f3digo de tu aplicaci\u00f3n no cambia en absoluto. Solo modificas la configuraci\u00f3n del proveedor.<\/p>\n<\/blockquote>\n\n\n\n<p><strong>Opci\u00f3n A: Ollama \u2014 modelos locales y sin coste<\/strong><\/p>\n\n\n\n<p>Ollama te permite ejecutar modelos directamente en tu m\u00e1quina. Es ideal para desarrollo local: sin claves API, sin l\u00edmites de peticiones y sin latencia de red.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Bridge oficial\ncomposer require symfony\/ai-ollama-platform\n\n# Descargar un modelo (fuera de Symfony)\nollama pull llama3.2<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># config\/packages\/ai.yaml\nai:\n    platform:\n        ollama:\n            host_url: '%env(OLLAMA_HOST_URL)%'\n    agent:\n        default:\n            model: 'llama3.2'<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># .env.local\nOLLAMA_HOST_URL=http:\/\/localhost:11434<\/code><\/pre>\n\n\n\n<p>Requiere una m\u00e1quina con suficiente RAM (m\u00ednimo 8 GB recomendados para modelos de 7B), pero para desarrollo y aprendizaje es excelente.<\/p>\n\n\n\n<p><strong>Opci\u00f3n B: Google Gemini \u2014 free tier generoso<\/strong><\/p>\n\n\n\n<p>Google Gemini ofrece un tier gratuito bastante usable (<code>gemini-1.5-flash<\/code> permite unas 1.500 peticiones diarias gratis). No pide tarjeta de cr\u00e9dito.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ai:\n    platform:\n        gemini:\n            api_key: '%env(GEMINI_API_KEY)%'\n    agent:\n        default:\n            model: 'gemini-1.5-flash'<\/code><\/pre>\n\n\n\n<p>La clave se obtiene gratis en <a href=\"https:\/\/aistudio.google.com\" target=\"_blank\" rel=\"noreferrer noopener\">aistudio.google.com<\/a>.<\/p>\n\n\n\n<p><strong>Opci\u00f3n C: OpenRouter<\/strong><\/p>\n\n\n\n<p>Proxy unificado a muchos modelos. \u00datil para probar opciones espec\u00edficas, aunque su capa gratuita suele saturarse f\u00e1cilmente.<\/p>\n\n\n\n<p><strong>Opci\u00f3n D: Groq &#8211; velocidad extrema y gratuita<\/strong><\/p>\n\n\n\n<p>Si buscas la mejor combinaci\u00f3n actual de <strong>velocidad + tool calling<\/strong> gratuito, Groq es dif\u00edcil de superar. Usa chips LPU especializados.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ai:\n    platform:\n        generic:\n            groq:\n                base_url: 'https:\/\/api.groq.com\/openai'\n                api_key: '%env(GROQ_API_KEY)%'\n                model_catalog: 'ai.platform.model_catalog.generic.fallback'\n    agent:\n        default:\n            platform: 'ai.platform.generic.groq'\n            model: 'llama-3.3-70b-versatile'<\/code><\/pre>\n\n\n\n<p><strong>Nota sobre el cat\u00e1logo de modelos (Generic Bridge):<\/strong><\/p>\n\n\n\n<p>Cuando usas el <code>bridge<\/code> generic, Symfony AI intenta validar el modelo contra su cat\u00e1logo interno. Si no lo encuentra, falla. La soluci\u00f3n es registrar un cat\u00e1logo comod\u00edn:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># config\/services.yaml\nservices:\n    ai.platform.model_catalog.generic.fallback:\n        class: Symfony\\AI\\Platform\\Bridge\\Generic\\FallbackModelCatalog<\/code><\/pre>\n\n\n\n<p><strong>Resumen de opciones gratuitas y de pago:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Opci\u00f3n<\/th><th>Coste<\/th><th>Tool Calling<\/th><th>Ideal para<\/th><\/tr><tr><td>OpenAI (gpt-4o-mini)<\/td><td>De pago (~0.15$\/1M tokens)<\/td><td><img decoding=\"async\" alt=\"\u2705\" src=\"https:\/\/abs-0.twimg.com\/emoji\/v2\/svg\/2705.svg\"> S\u00ed<\/td><td>Producci\u00f3n<\/td><\/tr><tr><td>Groq (llama-3.3-70b)<\/td><td>Gratis (LPU)<\/td><td><img decoding=\"async\" alt=\"\u2705\" src=\"https:\/\/abs-0.twimg.com\/emoji\/v2\/svg\/2705.svg\"> S\u00ed<\/td><td>Desarrollo \/ Agentes r\u00e1pidos<\/td><\/tr><tr><td>Ollama (llama3.2)<\/td><td>Gratis (local)<\/td><td><img decoding=\"async\" alt=\"\u2705\" src=\"https:\/\/abs-0.twimg.com\/emoji\/v2\/svg\/2705.svg\"> S\u00ed<\/td><td>Desarrollo local y privado<\/td><\/tr><tr><td>Google Gemini<\/td><td>Gratis (hasta l\u00edmite diario)<\/td><td><img decoding=\"async\" alt=\"\u2705\" src=\"https:\/\/abs-0.twimg.com\/emoji\/v2\/svg\/2705.svg\"> S\u00ed<\/td><td>Proyectos peque\u00f1os<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Nota sobre Tool Calling<\/strong>: No todos los modelos lo soportan bien. En Ollama y Groq, elige modelos como <code>llama-3.3-70b<\/code> o <code>mistral-nemo<\/code>. Los modelos muy peque\u00f1os suelen fallar al generar el formato de las herramientas.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Paso 3: Crear una Tool<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\nnamespace App\\AI\\Tool;\n\nuse Symfony\\AI\\Agent\\Toolbox\\Attribute\\AsTool;\n\n#&#91;AsTool(\n    name: 'product_price',\n    description: 'Returns the current price of a product given its SKU',\n)]\nfinal class ProductPriceTool\n{\n    public function __construct(\n        private readonly ProductRepository $productRepository,\n    ) {}\n\n    \/**\n     * @param string $sku The product SKU identifier\n     *\/\n    public function __invoke(string $sku): string\n    {\n        $product = $this->productRepository->findBySku($sku);\n\n        if ($product === null) {\n            return sprintf('No product found with SKU \"%s\".', $sku);\n        }\n\n        return sprintf(\n            'The product \"%s\" (SKU: %s) costs %.2f EUR.',\n            $product->getName(),\n            $sku,\n            $product->getPrice(),\n        );\n    }\n}<\/code><\/pre>\n\n\n\n<p>Symfony genera autom\u00e1ticamente el esquema JSON a partir del tipo y el docblock. Puedes inyectar cualquier servicio de Symfony (repositorios, clientes HTTP, etc.).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Paso 4: Crear el servicio de chat<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\nnamespace App\\AI;\n\nuse Symfony\\AI\\Agent\\AgentInterface;\nuse Symfony\\AI\\Platform\\Message\\Message;\nuse Symfony\\AI\\Platform\\Message\\MessageBag;\n\nfinal readonly class ProductChatService\n{\n    public function __construct(\n        private AgentInterface $defaultAgent,\n    ) {}\n\n    public function ask(string $userQuestion): string\n    {\n        $messages = new MessageBag(\n            Message::forSystem(\n                'You are a helpful assistant for an online store. ' .\n                'Answer questions about products concisely and accurately. ' .\n                'If you need to check a price or product details, use the available tools.'\n            ),\n            Message::ofUser($userQuestion),\n        );\n\n        $result = $this->defaultAgent->call($messages);\n\n        return $result->getContent();\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Paso 5: Usarlo desde un controlador<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#&#91;Route('\/api\/chat', methods: &#91;'POST'])]\npublic function chat(Request $request, ProductChatService $chatService): JsonResponse\n{\n    $body = json_decode($request->getContent(), true);\n    $question = $body&#91;'question'] ?? '';\n\n    if (empty($question)) {\n        return $this->json(&#91;'error' => 'Question is required'], 400);\n    }\n\n    $answer = $chatService->ask($question);\n\n    return $this->json(&#91;'answer' => $answer]);\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">5. Qu\u00e9 ocurre internamente<\/h2>\n\n\n\n<p>Cuando el usuario pregunta algo como \u00ab\u00bfCu\u00e1nto cuesta el producto con SKU laptop-pro-1?\u00bb, el flujo es el siguiente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El <code>Agent<\/code> env\u00eda el mensaje al modelo junto con el esquema de las herramientas disponibles.<\/li>\n\n\n\n<li>El modelo decide que necesita informaci\u00f3n externa y responde pidiendo una llamada a la herramienta <code>product_price<\/code> con <code>sku: \"laptop-pro-1\"<\/code>.<\/li>\n\n\n\n<li>El <code>AgentProcessor<\/code> ejecuta <code>ProductPriceTool::__invoke() <\/code>y a\u00f1ade el resultado al contexto.<\/li>\n\n\n\n<li>El modelo genera la respuesta final usando esa informaci\u00f3n real.<\/li>\n<\/ul>\n\n\n\n<p>Este ciclo puede repetirse varias veces en una sola petici\u00f3n si es necesario. El agente lo gestiona autom\u00e1ticamente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Observabilidad y testing<\/h2>\n\n\n\n<p><strong>Symfony Profiler<\/strong>: El bundle a\u00f1ade un panel espec\u00edfico en el Profiler donde puedes ver los prompts enviados, las respuestas recibidas y el consumo de tokens. Es una herramienta invaluable durante el desarrollo.<\/p>\n\n\n\n<p><strong>Testing<\/strong>: Symfony AI incluye <code>InMemoryPlatform<\/code>, una implementaci\u00f3n falsa que te permite probar tu l\u00f3gica sin llamar a ninguna API real:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>use Symfony\\AI\\Platform\\Test\\InMemoryPlatform;\n\n$platform = new InMemoryPlatform('The product costs 999.99 EUR.');\n$agent = new Agent($platform, $model);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Para cerrar: lo que logramos y lo que viene despu\u00e9s<\/h2>\n\n\n\n<p>Symfony AI llena un hueco importante en el ecosistema PHP: nos da una forma estructurada, desacoplada y bien integrada de incorporar inteligencia artificial en aplicaciones Symfony.<\/p>\n\n\n\n<p>No es la soluci\u00f3n universal, pero para asistentes conversacionales, RAG, automatizaci\u00f3n de procesos internos o cualquier funcionalidad que necesite combinar LLMs con tus datos y l\u00f3gica de negocio, ofrece una base muy s\u00f3lida y agradable de trabajar.<\/p>\n\n\n\n<p>El ejemplo que vimos en este art\u00edculo funciona correctamente, pero tiene una limitaci\u00f3n clara: devuelve la respuesta completa de una sola vez. Si el modelo tarda varios segundos, la experiencia de usuario no es la ideal.<\/p>\n\n\n\n<p>Puedes descargar y probar el c\u00f3digo completo del ejemplo desarrollado en este art\u00edculo en el siguiente repositorio:<\/p>\n\n\n\n<p>Repositorio del ejemplo: <a href=\"https:\/\/github.com\/jure-ve\/symfony-ai-product-agent\">https:\/\/github.com\/jure-ve\/symfony-ai-product-agent<\/a><\/p>\n\n\n\n<p>En el pr\u00f3ximo art\u00edculo veremos c\u00f3mo resolver exactamente eso: construiremos un chat en tiempo real con <strong>streaming via Server-Sent Events<\/strong>, una interfaz JavaScript para consumir el stream desde el navegador y la gesti\u00f3n del historial de conversaci\u00f3n con el componente <strong>Chat<\/strong> de Symfony AI.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>El ecosistema PHP ha dado un paso importante con la llegada de Symfony AI, un conjunto de componentes oficiales que te permite integrar modelos de lenguaje (LLMs) directamente en tus aplicaciones Symfony, sin tener que salir del entorno PHP ni renunciar a la arquitectura limpia que tanto nos gusta. Hasta hace poco, si quer\u00edas trabajar [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[134,138,15],"class_list":["post-219","post","type-post","status-publish","format-standard","hentry","category-desarrollo","tag-ia","tag-llm","tag-php"],"_links":{"self":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/219","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/comments?post=219"}],"version-history":[{"count":0,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/219\/revisions"}],"wp:attachment":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/media?parent=219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/categories?post=219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/tags?post=219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}