{"id":29185,"date":"2024-08-08T12:49:26","date_gmt":"2024-08-08T10:49:26","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=29185"},"modified":"2024-09-03T12:22:59","modified_gmt":"2024-09-03T10:22:59","slug":"usando-gemini-desde-laravel","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/","title":{"rendered":"Usando Gemini desde Laravel"},"content":{"rendered":"\n<p>En ocasiones la creaci\u00f3n de contenidos es un problema para presentar informaci\u00f3n en la web y por eso es importante, por no decir imprescindible conectar tu aplicaci\u00f3n Laravel con una inteligencia artificial.<\/p>\n\n\n\n<p>La integraci\u00f3n con Gemini, el modelo de lenguaje de Google, te permite desbloquear un abanico de posibilidades para crear experiencias de usuario m\u00e1s completas y personalizadas.<\/p>\n\n\n\n<p>En este art\u00edculo, te guiaremos paso a paso a trav\u00e9s del proceso de integraci\u00f3n de Gemini en tu proyecto Laravel, desde la configuraci\u00f3n de la API hasta la implementaci\u00f3n de funcionalidades avanzadas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-empezamos\">Empezamos!<\/h2>\n\n\n\n<p>Como siempre comenzamos creando un proyecto nuevo con la \u00faltima versi\u00f3n de Laravel.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">composer create-project laravel\/laravel gemini<\/code><\/span><\/pre>\n\n\n<p>Lo primero que tenemos que hacer es instalar la paqueter\u00eda correspondiente, mediante la herramienta Composer. En este caso, instalaremos la API de Gemini y adem\u00e1s guzzle, para poder manejar de una forma m\u00e1s sencilla las llamadas a la API de Gemini.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">composer <span class=\"hljs-built_in\">require<\/span> google-gemini-php\/client<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">composer <span class=\"hljs-built_in\">require<\/span> guzzlehttp\/guzzle<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Una vez instalada la paqueter\u00eda, nos vamos a Google, y buscamos nuestra API KEY.<\/p>\n\n\n\n<p>Para ello accedemos al <a href=\"https:\/\/aistudio.google.com\/app\/u\/1\/apikey?hl=es-419\">portal de AI Studio<\/a>, con nuestra cuenta de usuario<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"508\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG001-1024x508.jpg\" alt=\"\" class=\"wp-image-29266\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG001-1024x508.jpg 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG001-300x149.jpg 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG001-768x381.jpg 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG001-1536x763.jpg 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG001.jpg 1682w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Si no la tienes creada, has de seguir todos los pasos para el alta. Debes indicar un n\u00famero de tarjeta de cr\u00e9dito, aunque no se te cobrar\u00e1 nada hasta que gastes tus cr\u00e9ditos gratuitos. Si lo que est\u00e1s haciendo son pruebas de desarrollo, no te preocupes, que para llegar a consumir un euro, hay que hacer muchas pruebas, con lo que tendr\u00e1s para unas cuantas semanas antes de agotar los cr\u00e9ditos gratuitos y en cualquier caso, nunca se te cobrar\u00e1 nada sin pedirte previamente autorizaci\u00f3n. As\u00ed que tranquilo.<\/p>\n\n\n\n<p>Esta API Key la vamos a llevar a un sitio seguro, salvo que necesites disponer de una cuenta de la API por usuario, el lugar m\u00e1s adecuado es el fichero de variables de entorno.<\/p>\n\n\n\n<p>A\u00f1adimos al final (puede ser en cualquier punto, pero mejor lo mantenemos ordenado) la siguiente l\u00ednea, sustituyendo el texto a partir del igual por tu clave API.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">GEMINI_API_KEY=\u2026B3RY<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-a-utilizar-la-api\">A utilizar la API<\/h2>\n\n\n\n<p>Como cada cosa debe estar en su sitio dentro de Laravel, vamos a crear un controlador para gestionar las peticiones a la API y posteriormente disponbilizarlas en la web.<\/p>\n\n\n\n<p>Creamos un controlador con<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">php<\/span> <span class=\"hljs-selector-tag\">artisan<\/span> <span class=\"hljs-selector-tag\">make<\/span><span class=\"hljs-selector-pseudo\">:controller<\/span> <span class=\"hljs-selector-tag\">GeminiController<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Y a partir de aqu\u00ed vamos a jugar un poco con las opciones. Empezamos por lo m\u00e1s sencillo<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-generacion-de-texto\">Generaci\u00f3n de texto<\/h2>\n\n\n\n<p>Creamos una funci\u00f3n que sirva para obtener un texto de bienvenida a nuestra web y vamos a aprovechar para aprender un poco de historia. Le pediremos a nuestra inteligencia artificial que nos indique alguna de las efem\u00e9rides m\u00e1s importantes del d\u00eda actual.<\/p>\n\n\n\n<p>Primero obtenemos la fecha actual a partir de Carbon (no de olvides de importar la clase) y nos quedamos con el d\u00eda y el nombre del mes.<\/p>\n\n\n\n<p>A continuaci\u00f3n incluimos el d\u00eda y el mes en el prompt que hemos creado al efecto y solicitamos a Gemini que nos devuelva un texto en base a nuestro prompt, que ser\u00e1 lo que devolvamos a nuestra vista:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">getText<\/span><span class=\"hljs-params\">()<\/span><\/span>{\n        <span class=\"hljs-comment\">\/\/ Carbon::setLocale('es');<\/span>\n        $fechaActual = Carbon::now();\n\n        $dia = $fechaActual-&gt;day;\n        $nombreMes = $fechaActual-&gt;monthName;\n        \n        $prompt = <span class=\"hljs-string\">\"Dime una efem\u00e9ride del d\u00eda $dia de $nombreMes a nivel mundial y en Espa\u00f1a. Utiliza el formato 'Tal d\u00eda como hoy, en Espa\u00f1a ... y a nivel mundial ...' siendo los tres puntos un texto breve sobre cada uno de los hechos relevalentes\"<\/span>;\n    \n        $apiKey = getenv(<span class=\"hljs-string\">'GEMINI_API_KEY'<\/span>);\n        $client = Gemini::client($apiKey);\n\n        $result = $client-&gt;geminiPro()-&gt;generateContent($prompt);\n        <span class=\"hljs-keyword\">return<\/span> view (<span class=\"hljs-string\">'gemini.text'<\/span>, &#91;<span class=\"hljs-string\">'fecha'<\/span> =&gt; <span class=\"hljs-string\">\"$dia de $nombreMes\"<\/span>, <span class=\"hljs-string\">'result'<\/span> =&gt; $result-&gt;text()]);\n    } <\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>La l\u00ednea comentada, te puede hacer falta si tu aplicaci\u00f3n est\u00e1 internacionalizada y quieres asignar la configuraci\u00f3n regional al idioma espa\u00f1ol solamente para este m\u00e9todo. En mi caso no ha hecho falta, porque lo he indicado en el fichero .env.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-las-rutas\">Las rutas<\/h3>\n\n\n\n<p>Primero cambiamos la ruta de Welcome por una p\u00e1gina base que se llamar\u00e1 inicio. Y tambi\u00e9n creamos la ruta que permitir\u00e1 llamar a la funci\u00f3n del controller que acabamos de crear.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Illuminate<\/span>\\<span class=\"hljs-title\">Support<\/span>\\<span class=\"hljs-title\">Facades<\/span>\\<span class=\"hljs-title\">Route<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">App<\/span>\\<span class=\"hljs-title\">Http<\/span>\\<span class=\"hljs-title\">Controllers<\/span>\\<span class=\"hljs-title\">GeminiController<\/span>;\n\nRoute::get(<span class=\"hljs-string\">'\/'<\/span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> view(<span class=\"hljs-string\">'inicio'<\/span>);\n});\n\nRoute::get(<span class=\"hljs-string\">'\/text'<\/span>, &#91;GeminiController::class, <span class=\"hljs-string\">'getText'<\/span>])-&gt;name(<span class=\"hljs-string\">'geminiGetText'<\/span>);<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-las-vistas\">Las vistas<\/h3>\n\n\n\n<p>Primero una vista inicial que solamente contendr\u00e1<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">php<\/span> <span class=\"hljs-selector-tag\">artisan<\/span> <span class=\"hljs-selector-tag\">make<\/span><span class=\"hljs-selector-pseudo\">:view<\/span> <span class=\"hljs-selector-tag\">inicio<\/span>\u00a0\u00a0<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Que tendr\u00e1 simplemente un enlace a la ruta de geminiGetText<\/p>\n\n\n\n<p>Y la correspondiente a nuestra primera interacci\u00f3n con IA<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">php<\/span> <span class=\"hljs-selector-tag\">artisan<\/span> <span class=\"hljs-selector-tag\">make<\/span><span class=\"hljs-selector-pseudo\">:view<\/span> <span class=\"hljs-selector-tag\">gemini<\/span><span class=\"hljs-selector-class\">.text<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>En esta p\u00e1gina, crearemos un espacio para indicar que hoy es el d\u00eda que nos llega como par\u00e1metro $fecha y justo debajo, si nos ha devuelto informaci\u00f3n nuestra IA, indicaremos el contenido del primer texto propuesto. Esto llega en este formato por las caracter\u00edsticas de Gemini, que permite generar varias alternativas o borradores para que seamos nosotros quienes elijamos. En este caso, confiaremos en su buen criterio y nos quedamos con la primera opci\u00f3n.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span>&gt;<\/span>Hoy es {{$fecha}} <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n    @if(isset($result))\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n            {{$result}}\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    @endif     \n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-a-probar\">A probar<\/h3>\n\n\n\n<p>Pues vamos a probar. Como no s\u00e9 en qu\u00e9 fecha vas a leer estas l\u00edneas, voy a utilizar una fecha al azar, el 5 de marzo (que es al azar, no porque sea mi cumplea\u00f1os). Y tenemos este resultado.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"326\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG002-1024x326.jpg\" alt=\"\" class=\"wp-image-29267\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG002-1024x326.jpg 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG002-300x96.jpg 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG002-768x245.jpg 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG002-1536x489.jpg 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG002.jpg 1548w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Ten cuidado, que en muchos casos, las inteligencias artificiales se ponen creativas y dan resultados un tanto imprecisos. Pero en cualquier caso, ya hemos visto como obtener un contenido nuevo, generado por inteligencia artificial sin nuestra intervenci\u00f3n.<\/p>\n\n\n\n<p>Si vas a poner esto al inicio de tu web p\u00fablica, te recomiendo que solamente hagas una petici\u00f3n a la IA por d\u00eda y guardes en una base de datos local el resultado. De esta forma, te ahorrar\u00e1s unos cuantos tokens.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-interpretacion-de-imagenes\">Interpretaci\u00f3n de im\u00e1genes<\/h2>\n\n\n\n<p>Vamos a complicar un poco la llamada y para ello utilizaremos el modelo de an\u00e1lisis gr\u00e1fico.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-creacion-de-elementos\">Creaci\u00f3n de elementos<\/h3>\n\n\n\n<p>Nos vamos al controlador y utilizamos el m\u00e9todo geminiProVision que es el que nos indica el propietario del paquete en su repositorio de GitHub.<\/p>\n\n\n\n<p>&nbsp;Le indicamos como prompt que explique el contenido de la siguiente imagen y para ello elegimos una imagen de la web de CodeMotion, en concreto, la que corresponde a los segundos previos a la Keynote inaugural de la edici\u00f3n de 2023:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/conferences.codemotion.com\/madrid2024\/wp-content\/uploads\/sites\/4\/2023\/11\/AlexLomart_CODEMOTION2023-332-1-2048x1365.jpg\" alt=\"\"\/><\/figure>\n\n\n\n<p>El segundo par\u00e1metro, en este caso es la imagen. Normalmente, las IA no entienden de urls y si lo hacen (Gemini s\u00ed que es capaz de interpretar el contenido de una url), no lo hacen del todo bien. Por este motivo, lo nos decantamos por obtener la imagen en formato base64 y pasarla como par\u00e1metro. En este caso, es una imagen de tipo jpg por lo que si queremos procesar un png o cualquier otro formato, debemos cambiar el MimeType.<\/p>\n\n\n\n<p>Creamos la ruta en este caso a\u00f1adimos la siguiente l\u00ednea al fichero web.php<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Route::get(<span class=\"hljs-string\">'\/image'<\/span>, &#91;GeminiController::class, <span class=\"hljs-string\">'getImageComment'<\/span>])-&gt;name(<span class=\"hljs-string\">'geminiGetImage'<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Creamos la p\u00e1gina, tambi\u00e9n muy sencilla, a partir de la anterior. Le quitamos la fecha y poco m\u00e1s, con lo que queda algo as\u00ed como:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span>&gt;<\/span>Esto es lo que representa la imagen<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n    @if(isset($result))\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n            {{$result}}\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    @else\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>No hay contenido disponible.<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n    @endif        \n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Y vamos a probar<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-ups\">Ups!<\/h3>\n\n\n\n<p>El resultado no es el esperado, as\u00ed que no nos queda m\u00e1s remedio que investigar c\u00f3mo cambiar del modelo ProVision a 1.5 flash que nos recomienda el mensaje de error de Gemini.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"372\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG003-1024x372.jpg\" alt=\"\" class=\"wp-image-29268\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG003-1024x372.jpg 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG003-300x109.jpg 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG003-768x279.jpg 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG003.jpg 1493w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Para ello debemos localizar dos ficheros y modificarlos. En nuestro c\u00f3digo del controlador, estamos indicando que el modelo es ProVision con la instrucci\u00f3n geminiProVision, que se encuentra en el fichero <strong>\/vendor\/google-gemini-php\/client\/src\/Client.php<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">declare<\/span>(strict_types=<span class=\"hljs-number\">1<\/span>);\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">Gemini<\/span>;\n\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Gemini<\/span>\\<span class=\"hljs-title\">Contracts<\/span>\\<span class=\"hljs-title\">ClientContract<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Gemini<\/span>\\<span class=\"hljs-title\">Contracts<\/span>\\<span class=\"hljs-title\">TransporterContract<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Gemini<\/span>\\<span class=\"hljs-title\">Data<\/span>\\<span class=\"hljs-title\">Model<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Gemini<\/span>\\<span class=\"hljs-title\">Enums<\/span>\\<span class=\"hljs-title\">ModelType<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Gemini<\/span>\\<span class=\"hljs-title\">Resources<\/span>\\<span class=\"hljs-title\">ChatSession<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Gemini<\/span>\\<span class=\"hljs-title\">Resources<\/span>\\<span class=\"hljs-title\">EmbeddingModel<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Gemini<\/span>\\<span class=\"hljs-title\">Resources<\/span>\\<span class=\"hljs-title\">GenerativeModel<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Gemini<\/span>\\<span class=\"hljs-title\">Resources<\/span>\\<span class=\"hljs-title\">Models<\/span>;\n\n<span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Client<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">ClientContract<\/span>\n<\/span>{\n    <span class=\"hljs-comment\">\/**\n     * Creates an instance with the given Transporter\n     *\/<\/span>\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">(private readonly TransporterContract $transporter)<\/span>\n    <\/span>{\n    }\n\n    <span class=\"hljs-comment\">\/**\n     *  Lists available models.\n     *\/<\/span>\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">models<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">Models<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Models(transporter: <span class=\"hljs-keyword\">$this<\/span>-&gt;transporter);\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">generativeModel<\/span><span class=\"hljs-params\">(ModelType|string $model)<\/span>: <span class=\"hljs-title\">GenerativeModel<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> GenerativeModel(transporter: <span class=\"hljs-keyword\">$this<\/span>-&gt;transporter, model: $model);\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">geminiPro<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">GenerativeModel<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;generativeModel(model: ModelType::GEMINI_PRO);\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">geminiProVision<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">GenerativeModel<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;generativeModel(model: ModelType::GEMINI_PRO_VISION);\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">embeddingModel<\/span><span class=\"hljs-params\">(ModelType|string $model = ModelType::EMBEDDING)<\/span>: <span class=\"hljs-title\">EmbeddingModel<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> EmbeddingModel(transporter: <span class=\"hljs-keyword\">$this<\/span>-&gt;transporter, model: $model);\n    }\n\n    <span class=\"hljs-comment\">\/**\n     * Contains an ongoing conversation with the model.\n     *\/<\/span>\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">chat<\/span><span class=\"hljs-params\">(ModelType|string $model = ModelType::GEMINI_PRO)<\/span>: <span class=\"hljs-title\">ChatSession<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ChatSession(model: <span class=\"hljs-keyword\">$this<\/span>-&gt;generativeModel(model: $model));\n    }\n\n    <span class=\"hljs-comment\">\/\/ A\u00f1adido<\/span>\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">geminiPro1_0<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">GenerativeModel<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;generativeModel(model: ModelType::GEMINI_PRO_1_0);\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">geminiProLatest1_0<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">GenerativeModel<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;generativeModel(model: ModelType::GEMINI_PRO_1_0_LATEST);\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">geminiPro1_5<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">GenerativeModel<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;generativeModel(model: ModelType::GEMINI_PRO_1_5);\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">geminiProFlash1_5<\/span><span class=\"hljs-params\">()<\/span>: <span class=\"hljs-title\">GenerativeModel<\/span>\n    <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;generativeModel(model: ModelType::GEMINI_PRO_1_5_FLASH);\n    }\n    <span class=\"hljs-comment\">\/\/ Fin a\u00f1adido<\/span>\n}\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>En este fichero a\u00f1adiremos los modelos de Gemini posteriores a la creaci\u00f3n del paquete,&nbsp; antes de la \u00faltima llave de cierre, para que sean m\u00e9todos disponibles en la clase Cliente.<\/p>\n\n\n\n<p>Aqu\u00ed hacemos referencia a los nombres de los modelos, o mejor dicho a unos valores definidos en la enumeraci\u00f3n de modelos soportados por el paquete.<\/p>\n\n\n\n<p>Agregamos estos modelos a la clase ModelType, al igual que en el caso anterior, lo hacemos justo antes de la \u00faltima llave de cierre del fichero <strong>\/vendor\/google-gemini-php\/client\/src\/Enums\/ModelType.php<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">declare<\/span>(strict_types=<span class=\"hljs-number\">1<\/span>);\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">Gemini<\/span>\\<span class=\"hljs-title\">Enums<\/span>;\n\nenum ModelType: string\n{\n    <span class=\"hljs-keyword\">case<\/span> GEMINI_PRO = <span class=\"hljs-string\">'models\/gemini-pro'<\/span>;\n    <span class=\"hljs-keyword\">case<\/span> GEMINI_PRO_VISION = <span class=\"hljs-string\">'models\/gemini-pro-vision'<\/span>;\n    <span class=\"hljs-keyword\">case<\/span> EMBEDDING = <span class=\"hljs-string\">'models\/embedding-001'<\/span>;\n    <span class=\"hljs-comment\">\/\/ A\u00f1adido<\/span>\n    <span class=\"hljs-keyword\">case<\/span> GEMINI_PRO_1_0 = <span class=\"hljs-string\">'models\/gemini-1.0-pro'<\/span>;\n    <span class=\"hljs-keyword\">case<\/span> GEMINI_PRO_1_0_LATEST = <span class=\"hljs-string\">'models\/gemini-1.0-pro-latest'<\/span>;\n    <span class=\"hljs-keyword\">case<\/span> GEMINI_PRO_1_5 = <span class=\"hljs-string\">'models\/gemini-1.5-pro'<\/span>;\n    <span class=\"hljs-keyword\">case<\/span> GEMINI_PRO_1_5_FLASH = <span class=\"hljs-string\">'models\/gemini-1.5-flash'<\/span>;\n    <span class=\"hljs-comment\">\/\/ Fin a\u00f1adido <\/span>\n}<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Esta lista de la <a href=\"https:\/\/ai.google.dev\/gemini-api\/docs?authuser=1&amp;hl=es-419\">documentaci\u00f3n de referencia<\/a> que nos ofrece el proveedor de la API, en este caso, Google<a href=\"https:\/\/ai.google.dev\/gemini-api\/docs?authuser=1&amp;hl=es-419\">.<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-por-fin\">Por fin!<\/h3>\n\n\n\n<p>Ahora s\u00ed, probamos y nos describe el contenido de la imagen<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"119\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG004-1024x119.jpg\" alt=\"\" class=\"wp-image-29269\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG004-1024x119.jpg 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG004-300x35.jpg 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG004-768x89.jpg 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG004-1536x178.jpg 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG004.jpg 1906w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Pues con esto, hemos logrado avanzar un paso m\u00e1s en nuestro conocimiento de Laravel. No s\u00f3lo hemos incorporado una de las API m\u00e1s potentes de la inteligencia artificial a nuestro Laravel, sino que adicionalmente nos hemos encontrado con nuestro primer paquete desactualizado. Y como no nos gusta quedarnos a las puertas de finalizar un objetivo, nos hemos puesto manos a la obra a modificar el c\u00f3digo de un paquete de terceros para hacer una peque\u00f1a adaptaci\u00f3n que cubra nuestras necesidades del proyecto.<\/p>\n\n\n\n<p>Ahora puedes seguir todos los paso o bien descargar directamente el <a href=\"https:\/\/github.com\/inforrada\/laravelgemini.git\" target=\"_blank\" rel=\"noreferrer noopener\">repositorio de git desde aqu\u00ed<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En ocasiones la creaci\u00f3n de contenidos es un problema para presentar informaci\u00f3n en la web y por eso es importante, por no decir imprescindible conectar tu aplicaci\u00f3n Laravel con una inteligencia artificial. La integraci\u00f3n con Gemini, el modelo de lenguaje de Google, te permite desbloquear un abanico de posibilidades para crear experiencias de usuario m\u00e1s&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/\">Read more<\/a><\/p>\n","protected":false},"author":249,"featured_media":29271,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10606,10598,10648],"tags":[11880],"collections":[],"class_list":{"0":"post-29185","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-backend-es","8":"category-inteligencia-artificial","9":"category-lenguajes-de-programacion","10":"tag-laravel-es","11":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Usando Gemini desde Laravel - Codemotion Magazine<\/title>\n<meta name=\"description\" content=\"Aprende a integrar Gemini en tu proyecto Laravel con la gu\u00eda de David. Desde la configuraci\u00f3n de la API hasta la implementaci\u00f3n de funcionalidades.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Usando Gemini desde Laravel\" \/>\n<meta property=\"og:description\" content=\"Aprende a integrar Gemini en tu proyecto Laravel con la gu\u00eda de David. Desde la configuraci\u00f3n de la API hasta la implementaci\u00f3n de funcionalidades.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-08-08T10:49:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-03T10:22:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"David Martinez\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"David Martinez\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/\"},\"author\":{\"name\":\"David Martinez\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/29b244cd009ab9146d634ceae52bdab2\"},\"headline\":\"Usando Gemini desde Laravel\",\"datePublished\":\"2024-08-08T10:49:26+00:00\",\"dateModified\":\"2024-09-03T10:22:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/\"},\"wordCount\":1365,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000.jpeg\",\"keywords\":[\"Laravel\"],\"articleSection\":[\"Backend\",\"Inteligencia Artificial\",\"Lenguajes de programaci\u00f3n\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/\",\"name\":\"Usando Gemini desde Laravel - Codemotion Magazine\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000.jpeg\",\"datePublished\":\"2024-08-08T10:49:26+00:00\",\"dateModified\":\"2024-09-03T10:22:59+00:00\",\"description\":\"Aprende a integrar Gemini en tu proyecto Laravel con la gu\u00eda de David. Desde la configuraci\u00f3n de la API hasta la implementaci\u00f3n de funcionalidades.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/#primaryimage\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000.jpeg\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000.jpeg\",\"width\":1024,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Backend\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Usando Gemini desde Laravel\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Codemotion.Italy\/\",\"https:\/\/x.com\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/29b244cd009ab9146d634ceae52bdab2\",\"name\":\"David Martinez\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/05\/lado_cuadrada-100x100.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/05\/lado_cuadrada-100x100.png\",\"caption\":\"David Martinez\"},\"description\":\"Hi! I'm David. Sometimes a speaker, sometimes a listener, and always interested in web technologies. I specialize in complex projects involving anything related to PHP and Javascript. Lately, I've been diving deep into Laravel and API development (and the worst part is that I'm starting to like it).\",\"sameAs\":[\"https:\/\/martinezmartinez.com\",\"https:\/\/www.linkedin.com\/in\/dmartinezmartinez\/\"],\"url\":\"https:\/\/www.codemotion.com\/magazine\/author\/david-martinez\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Usando Gemini desde Laravel - Codemotion Magazine","description":"Aprende a integrar Gemini en tu proyecto Laravel con la gu\u00eda de David. Desde la configuraci\u00f3n de la API hasta la implementaci\u00f3n de funcionalidades.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/","og_locale":"en_US","og_type":"article","og_title":"Usando Gemini desde Laravel","og_description":"Aprende a integrar Gemini en tu proyecto Laravel con la gu\u00eda de David. Desde la configuraci\u00f3n de la API hasta la implementaci\u00f3n de funcionalidades.","og_url":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2024-08-08T10:49:26+00:00","article_modified_time":"2024-09-03T10:22:59+00:00","og_image":[{"width":1024,"height":1024,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000.jpeg","type":"image\/jpeg"}],"author":"David Martinez","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"David Martinez","Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/"},"author":{"name":"David Martinez","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/29b244cd009ab9146d634ceae52bdab2"},"headline":"Usando Gemini desde Laravel","datePublished":"2024-08-08T10:49:26+00:00","dateModified":"2024-09-03T10:22:59+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/"},"wordCount":1365,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000.jpeg","keywords":["Laravel"],"articleSection":["Backend","Inteligencia Artificial","Lenguajes de programaci\u00f3n"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/","url":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/","name":"Usando Gemini desde Laravel - Codemotion Magazine","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000.jpeg","datePublished":"2024-08-08T10:49:26+00:00","dateModified":"2024-09-03T10:22:59+00:00","description":"Aprende a integrar Gemini en tu proyecto Laravel con la gu\u00eda de David. Desde la configuraci\u00f3n de la API hasta la implementaci\u00f3n de funcionalidades.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000.jpeg","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000.jpeg","width":1024,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/usando-gemini-desde-laravel\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Backend","item":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/"},{"@type":"ListItem","position":3,"name":"Usando Gemini desde Laravel"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/29b244cd009ab9146d634ceae52bdab2","name":"David Martinez","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/05\/lado_cuadrada-100x100.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/05\/lado_cuadrada-100x100.png","caption":"David Martinez"},"description":"Hi! I'm David. Sometimes a speaker, sometimes a listener, and always interested in web technologies. I specialize in complex projects involving anything related to PHP and Javascript. Lately, I've been diving deep into Laravel and API development (and the worst part is that I'm starting to like it).","sameAs":["https:\/\/martinezmartinez.com","https:\/\/www.linkedin.com\/in\/dmartinezmartinez\/"],"url":"https:\/\/www.codemotion.com\/magazine\/author\/david-martinez\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000-600x400.jpeg","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000-600x600.jpeg","author_info":{"display_name":"David Martinez","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/david-martinez\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000.jpeg",1024,1024,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000-150x150.jpeg",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000-300x300.jpeg",300,300,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000-768x768.jpeg",768,768,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000.jpeg",1024,1024,false],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000.jpeg",1024,1024,false],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000.jpeg",1024,1024,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000-100x100.jpeg",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000-180x128.jpeg",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000-896x504.jpeg",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000-400x225.jpeg",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000-600x400.jpeg",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/08\/Gemini-IMG000-600x600.jpeg",600,600,true]},"uagb_author_info":{"display_name":"David Martinez","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/david-martinez\/"},"uagb_comment_info":0,"uagb_excerpt":"En ocasiones la creaci\u00f3n de contenidos es un problema para presentar informaci\u00f3n en la web y por eso es importante, por no decir imprescindible conectar tu aplicaci\u00f3n Laravel con una inteligencia artificial. La integraci\u00f3n con Gemini, el modelo de lenguaje de Google, te permite desbloquear un abanico de posibilidades para crear experiencias de usuario m\u00e1s&#8230;&hellip;","lang":"es","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/29185","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/249"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=29185"}],"version-history":[{"count":2,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/29185\/revisions"}],"predecessor-version":[{"id":29270,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/29185\/revisions\/29270"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/29271"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=29185"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=29185"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=29185"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=29185"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}