{"id":16977,"date":"2025-03-24T11:06:51","date_gmt":"2025-03-24T18:06:51","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=16977"},"modified":"2025-06-13T16:36:16","modified_gmt":"2025-06-13T23:36:16","slug":"chat-with-your-git-history-rag-couchbase-shell","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/chat-with-your-git-history-rag-couchbase-shell\/","title":{"rendered":"Chatea con tu historial de Git, gracias a RAG y Couchbase Shell"},"content":{"rendered":"<p>\u00bfNo te encanta leer los mensajes de compromiso de los dem\u00e1s? \u00bfNo? Pues a m\u00ed s\u00ed, y mientras le\u00eda un mensaje de confirmaci\u00f3n muy perspicaz, me di cuenta de todo el contenido sin explotar que hay en varios registros de Git (suponiendo que los desarrolladores a los que sigues escriban mensajes \u00fatiles, claro). As\u00ed que, \u00bfno ser\u00eda genial si pudieras hacer preguntas a un repositorio? Veamos c\u00f3mo se puede lograr esto haciendo RAG con Couchbase Shell.<\/p>\n<p>TL;DR<\/p>\n<pre class=\"wrap:true lang:sh decode:true\"># con bash, extrae tu historial de commits a json\r\nsource git-log-json.sh &amp;&amp; git-log-json &gt; commitlog.json\r\n\r\n# con cbsh, crear \u00e1mbito, colecci\u00f3n e \u00edndice primario de colecci\u00f3n\r\nscopes create gitlog; cb-env scope gitlog;collections create commits; cb-env collection commits; query \"CREATE PRIMARY INDEX ON `default`:`cbsh`.`gitlog`.`commits`\"\r\n\r\n# Importar el documento en la colecci\u00f3n seleccionada\r\nopen commitlog.json | wrap content | insert id { |it| echo $it.content.commitHash } | doc upsert\r\n\r\n# Enriquecer el documento con el modelo por defecto\r\nquery \"SELECT c.*, meta().id as id, c.subject || ' ' || c.body as text FROM `commits` as c\". | wrap content vector enrich-doc text doc upsert\r\n\r\n# Crear un \u00edndice vectorial\r\nvector create-index --similarity-metric dot_product commits textVector 1536\r\n\r\n# Ejecutar RAG\r\nvector enrich-text \"gemini\" | vector search commits textVector --neighbors 20| select id |doc get| select content | reject -i content.textVector | par-each {|x| to json} | preguntar \"cu\u00e1ndo y en qu\u00e9 commit se a\u00f1adi\u00f3 el soporte para gemini llm\"<\/pre>\n<h2>Configuraci\u00f3n de Couchbase Shell<\/h2>\n<p>El paso inicial es instalar y configurar <em>cbsh<\/em>. Voy a utilizar mi instancia de Capella. Para obtener la configuraci\u00f3n puede ir a <strong>Conectar<\/strong> de su cluster Capella y seleccione <strong>Shell de Couchbase<\/strong>. Esta es la configuraci\u00f3n en <em>[[cluster]]<\/em>. Para configurar el modelo, eche un vistazo a lo que hay bajo<em> [[llm]]<\/em>. Yo he elegido OpenAI pero hay otros. Es necesario definir el modelo utilizado para la incrustaci\u00f3n (que es lo que convierte el texto en un vector) y uno para el Chat. Este toma la pregunta y alg\u00fan contexto adicional para responder a la pregunta. Y por supuesto necesitar\u00e1s una clave API.<\/p>\n<pre class=\"wrap:true lang:yaml decode:true\">versi\u00f3n = 1\r\n\r\n[[llm]]\r\nidentificador = \"OpenAI\"\r\nproveedor = \"OpenAI\"\r\nembed_model = \"text-embedding-3-small\"\r\nchat_model = \"gpt-3.5-turbo\"\r\napi_key = \"sk-proj-xxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\r\n\r\n[[cluster]]\r\nidentificador = \"capella\"\r\nconnstr = \"couchbases:\/\/cb.xxxxxxx.cloud.couchbase.com\"\r\nnombre-usuario = \"Laurent Doguin\"\r\nnombre_usuario = \"USUARIO\"\r\ncontrase\u00f1a = \"CONTRASE\u00d1A\"\r\ndefault-bucket = \"cbsh\"\r\n\u00e1mbito por defecto = \"gitlog\"<\/pre>\n<p>Tambi\u00e9n necesitas Git instalado, entonces deber\u00edas estar todo listo.<\/p>\n<h2>Importar el registro de confirmaciones de Git<\/h2>\n<p>El primer paso es obtener todos los commits del repo en JSON. Siendo perezoso y viejo, y por viejo me refiero a no estar acostumbrado a preguntarle a una IA, busqu\u00e9 esto en Google, encontr\u00e9 una serie de Gists, que enlazaban a otras Gists, y finalmente me decid\u00ed por <a href=\"https:\/\/gist.github.com\/april\/ee2e104b1435f3113e67663d8875bbef\" target=\"_blank\" rel=\"noopener\">en este<\/a>.<\/p>\n<p>Lo descargu\u00e9, lo busqu\u00e9, entr\u00e9 en mi repositorio local git de couchbase-shell y lo llam\u00e9.<\/p>\n<pre class=\"nums:false lang:default decode:true\">source git-log-json.sh &amp;&amp; git-log-json &gt; commitlog.json<\/pre>\n<p>Pero, en beneficio del lector que se pregunte si he tomado la decisi\u00f3n correcta, preguntemos al modelo configurado. Cbsh tiene un <em>pregunte a<\/em> que le permite hacer esto:<\/p>\n<pre class=\"wrap:true lang:sh decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; ask \"get the full commits in json for a git repo\"\r\n\r\nTo get the full commits in a Git repository as JSON, you can use the following command:\r\n\r\ngit log --pretty=format:'{%n \"commit\": \"%H\",%n \"author\": \"%an &lt;%ae&gt;\",%n \"date\": \"%ad\",%n \"message\": \"%f\"%n},' --date=iso --reverse --all &gt; commits.json\r\n<\/pre>\n<p>Este comando mostrar\u00e1 cada confirmaci\u00f3n en el repositorio como un objeto JSON con el hash de la confirmaci\u00f3n, el nombre y el correo electr\u00f3nico del autor, la fecha y el mensaje de la confirmaci\u00f3n. El comando<code> --todos<\/code> garantiza la inclusi\u00f3n de todas las ramas. En <code>--reverse<\/code> muestra las confirmaciones en orden cronol\u00f3gico inverso. Por \u00faltimo, la salida se redirige a un archivo <code>commits.json<\/code> archivo.<\/p>\n<p>Aseg\u00farate de ejecutar este comando en el directorio ra\u00edz del repositorio Git del que quieres obtener los commits.<\/p>\n<p>Y resulta que no funciona nada m\u00e1s sacarlo de la caja (chocante, lo s\u00e9). Y no ten\u00eda toda la informaci\u00f3n que necesitaba, como la parte del cuerpo del mensaje. Por supuesto que podr\u00edamos pasar tiempo afinando esto, pero es muy espec\u00edfico, con un mont\u00f3n de casos extremos.<\/p>\n<p>En cualquier caso ahora tengo una lista de commits en formato JSON:<\/p>\n<pre class=\"lang:js decode:true\">[\r\n  {\r\n  ....\r\n  },\r\n  {\r\n    \"autor\": {\r\n      \"nombre\": \"Michael Nitschinger\",\r\n      \"email\": \"michael@nitschinger.at\",\r\n      \"date\": \"Thu, 20 Feb 2020 21:29:20 +0100\",\r\n      \"dateISO8601\": \"2020-02-20T21:29:20+01:00\"\r\n    },\r\n    \"body\": \"\",\r\n    \"commitHash\": \"7a0d269fffd10045a63d40ca460deba944531890\",\r\n    \"commitHashAbbreviated\": \"7a0d269\",\r\n    \"committer\": {\r\n      \"name\": \"Michael Nitschinger\",\r\n      \"email\": \"michael@nitschinger.at\",\r\n      \"date\": \"Thu, 20 Feb 2020 21:29:20 +0100\",\r\n      \"dateISO8601\": \"2020-02-20T21:29:20+01:00\"\r\n    },\r\n    \"encoding\": \"\",\r\n    \"notes\": \"\",\r\n    \"parent\": \"\",\r\n    \"padreAbreviado\": \"\",\r\n    \"refs\": \"\",\r\n    \"signature\": {\r\n      \"clave\": \"A6BCCB72D65B0D0F\",\r\n      \"firmante\": \"\",\r\n      \"verificationFlag\": \"E\"\r\n    },\r\n    \"subject\": \"Initial commit\",\r\n    \"subjectSanitized\": \"Initial-commit\",\r\n    \"tree\": \"3db442f3ef0438de58f72235e2658e5368a6752b\",\r\n    \"treeAbbreviated\": \"3db442f\"\r\n}]<\/pre>\n<p>\u00bfQu\u00e9 puedes hacer con un array de objetos JSON? Puedes importarlo a trav\u00e9s del Capella UI o puedes importarlos con Couchbase Shell. Primero creo el array <em>alcance<\/em> y <em>colecci\u00f3n<\/em> y seleccionarlos con cb-env, luego crear el \u00edndice SQL++.<\/p>\n<pre class=\"wrap:true lang:sh decode:true\">scopes create gitlog; cb-env scope gitlog; collections create commits; cb-env collection commits; query \"CREATE PRIMARY INDEX ON `default`:`cbsh`.`gitlog`.`commits`\"<\/pre>\n<p>Dado que cbsh se basa en Nushell, el archivo JSON resultante puede abrirse f\u00e1cilmente, convertirse en un marco de datos, transformarse en un documento Couchbase e insertarse de este modo:<\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; open commitlog.json |wrap content | insert id { |it| echo $it.content.commitHash }| doc upsert\r\n\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 processed \u2502 success \u2502 failed \u2502 failures \u2502 cluster \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 660 \u2502 660 \u2502 0       \u2502        \u2502 capella  \u2502         \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\r\n<\/pre>\n<p>Consigamos algunos documentos para ver c\u00f3mo funcionaba:<\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; query \"SELECT subject, body FROM `commits` LIMIT 1\"\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 subject      \u2502 body \u2502 cluster \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 Bump Nushell \u2502      \u2502 capella \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\r\n\r\n<\/pre>\n<p>As\u00ed que este es el contenido que podr\u00edamos utilizar para el GAR. Es hora de enriquecer estos documentos.<\/p>\n<h2>Enriquecer el documento con un modelo de IA<\/h2>\n<p>Para enriquecer el doc necesitas tener un modelo configurado. Aqu\u00ed estoy usando OpenAI y el <em>enriquecer-doc<\/em> comando cbsh:<\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; query \"SELECT c.*, meta().id as id, c.subject || ' ' || c.body as text FROM `commits` as c\" | wrap content| vector enrich-doc text | doc upsert\r\nEmbedding batch 1\/1\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 processed \u2502 success \u2502 failed \u2502 failures \u2502 cluster \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 61        \u2502 61      \u2502 0      \u2502          \u2502 capella \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f<\/pre>\n<p>La cl\u00e1usula SELECT devolver\u00e1 un objeto JSON con el contenido del doc, y campos adicionales <em>id<\/em> y <em>texto<\/em>. El texto es el asunto y el cuerpo unidos en una cadena. El objeto se envuelve en un objeto de contenido y se da al vector <em>enriquecer-doc<\/em> con texto como par\u00e1metro, ya que es el campo que se transformar\u00e1 en un vector. Ahora deber\u00eda haber un <em>textVector<\/em> en cada documento.<\/p>\n<h2>B\u00fasqueda vectorial<\/h2>\n<p>Con el fin de buscar a trav\u00e9s de estos vectores, tenemos que crear un \u00edndice de b\u00fasqueda de vectores. Se puede hacer a trav\u00e9s de la API o la interfaz de usuario para algo personalizable. Aqu\u00ed estoy feliz con las opciones por defecto as\u00ed que uso cbsh en su lugar:<\/p>\n<pre class=\"wrap:true lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; vector create-index --similarity-metric dot_product commits textVector 1536<\/pre>\n<p>El \u00edndice creado utilizar\u00e1 <em>punto_producto<\/em> como algoritmo de similitud, la dimensionalidad del vector ser\u00e1 1536, el nombre del \u00edndice es <em>escriba a<\/em> y el campo indexado es <em>textVector<\/em>. El cubo, el \u00e1mbito y la colecci\u00f3n son los seleccionados a trav\u00e9s de <em>cb-env<\/em>.<\/p>\n<p>Para probar la b\u00fasqueda vectorial, hay que convertir la consulta de b\u00fasqueda en un vector, y luego enviarlo a la b\u00fasqueda:<\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; vector enrich-text \"TLS support\" | vector search commits textVector\r\nEmbedding batch 1\/1\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 id                                       \u2502 score      \u2502 cluster \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 f2c1f124269884c88ab3925c7c5a8914298a2fbc \u2502 0.37283808 \u2502 capella \u2502\r\n\u2502 1 \u2502 da28adf7adbe910cd06c960d9c25d7316d666d1c \u2502 0.33915368 \u2502 capella \u2502\r\n\u2502 2 \u2502 f0f82353e7c060030cc2511ffab1edbcc263d099 \u2502 0.3294143  \u2502 capella \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f<\/pre>\n<p>Por defecto devuelve 3 filas. Vamos a ampliarlo para ver el contenido del documento. Voy a a\u00f1adir <code>rechazar -i textVector<\/code> para eliminar el campo vectorial, porque nadie necesita un campo de 1536 l\u00edneas en la salida de su terminal:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16978\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-1024x1019.png\" alt=\"\" width=\"900\" height=\"896\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-1024x1019.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-300x299.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-150x150.png 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-768x765.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-1536x1529.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1-1320x1314.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/image1-1.png 1999w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<h2>Pregunte a su repositorio Git<\/h2>\n<p>A partir de aqu\u00ed tienes todos los commits de un repositorio Git almacenados en Couchbase, enriquecidos con un modelo de IA, y todo indexado y consultable. Lo \u00faltimo que hay que hacer es llamar al modelo para ejecutar una consulta con RAG. Comienza convirtiendo una pregunta en un vector, lo canaliza a una b\u00fasqueda vectorial, obtiene el documento completo a partir de los IDs de retorno, selecciona el objeto de contenido sin el campo vectorial, convierte cada objeto en un doc JSON (de esta forma podemos enviar el contenido y sus metadatos estructurados), envuelve el <em>jsonText<\/em> en una tabla y, por \u00faltimo, canalizarlo a la <em>pregunte a<\/em> mando:<\/p>\n<pre class=\"wrap:true lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; vector enrich-text \"gemini\" | vector search commits textVector --neighbors 10| select id |doc get| select content | reject -i content.textVector | par-each {|x| to json} | wrap content| ask \"when and in which commit was gemini llm support added\"\r\nEmbedding batch 1\/1\r\nGemini LLM support was added in the commit with the subject \"Add support for Gemini llm\". This commit was authored by Jack Westwood on May 15, 2024, with the commit hash \"3da9b4a3532ab4f432428319361909cc14a035af\".\r\n\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; git show 3da9b4a3532ab4f432428319361909cc14a035af\r\ncommit 3da9b4a3532ab4f432428319361909cc14a035af\r\nAuthor: Jack Westwood &lt;jack.westwood@couchbase.com&gt;\r\nDate: Wed May 15 15:40:13 2024 +0100\r\n\r\nAdd support for Gemini llm\r\n....<\/pre>\n<p>Preguntando al LLM cu\u00e1ndo se introdujo el soporte Gemini. Obtenemos una fecha y un hash de confirmaci\u00f3n. Entonces es f\u00e1cil de verificar usando <code>git show<\/code>. Aqu\u00ed hay un poco de repetici\u00f3n, as\u00ed que puedes declarar una variable para tu pregunta y reutilizarla:<\/p>\n<pre class=\"wrap:true lang:default decode:true\">\ud83d\udc64 Laurent Doguin \ud83c\udfe0 capella in \u2601\ufe0f cbsh.gitlog.commits\r\n&gt; let question = \"why was the client crate rewritten? \"; vector enrich-text $question | vector search commits textVector --neighbors 10| select id |doc get| select content | reject -i content.textVector | par-each {|x| to json} | wrap content| ask $question\r\nEmbedding batch 1\/1\r\nThe client crate was rewritten to address issues such as inconsistency, difficulty in usage, and code organization. The rewrite split the client into key-value (kv) and HTTP clients, each consuming a common HTTP handler. This separation into multiple clients and files improved code organization and made the clients easier to understand and use. Additionally, various improvements were made to the HTTP handler, errors, and runtime instantiation within the client crate to enhance overall functionality and performance. The rewrite effort aimed to streamline the client crate, making it more robust, maintainable, and user-friendly.<\/pre>\n<p>Y ahora todos sabemos por qu\u00e9 hubo que reescribir la caja cliente. Puede que no responda a tus propias preguntas, \u00a1pero ahora ya sabes c\u00f3mo obtener respuestas de cualquier repositorio!<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Empieza con <a href=\"https:\/\/cloud.couchbase.com\" target=\"_blank\" rel=\"noopener\">Capella gratis<\/a><\/li>\n<li>Lea nuestro <a href=\"https:\/\/www.couchbase.com\/blog\/es\/llm-embeddings\/\" target=\"_blank\" rel=\"noopener\">Gu\u00eda de incrustaciones LLM<\/a><\/li>\n<li>Leer m\u00e1s de <a href=\"https:\/\/www.couchbase.com\/blog\/es\/author\/laurent-doguin\/\" target=\"_blank\" rel=\"noopener\">mis blogs de desarrolladores<\/a> sobre b\u00fasqueda vectorial y m\u00e1s<\/li>\n<li>Pruebe <a href=\"https:\/\/couchbase.sh\" target=\"_blank\" rel=\"noopener\">Shell de Couchbase<\/a> hoy<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/couchbase.sh\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-16979\" style=\"border: 1px solid Gainsboro;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-1024x1019.png\" alt=\"\" width=\"646\" height=\"643\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-1024x1019.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-300x299.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-150x150.png 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-768x764.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-1536x1529.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-2048x2038.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-65x65.png 65w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/blog-cbsh-rag-1320x1314.png 1320w\" sizes=\"auto, (max-width: 646px) 100vw, 646px\" \/><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Don&#8217;t you love reading other people&#8217;s commit messages? No? Well, I do and as I was reading a very insightful commit message, I realized all the untapped content living in various Git logs (assuming the dev you follow are writing [&hellip;]<\/p>","protected":false},"author":49,"featured_media":16986,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[10122,1815,2225,1816,9973,2201,9937],"tags":[10023,10020,10024,10038,9924],"ppma_author":[9023],"class_list":["post-16977","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artificial-intelligence-ai","category-best-practices-and-tutorials","category-cloud","category-couchbase-server","category-generative-ai-genai","category-tools-sdks","category-vector-search","tag-cbsh","tag-cbshell","tag-couchbase-shell","tag-nushell","tag-rag-retrieval-augmented-generation"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Chat With Your Git History, Thanks to RAG and Couchbase Shell - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Turn your Git history into a chat-ready knowledge base using RAG and Couchbase Shell.\" \/>\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.couchbase.com\/blog\/es\/chat-with-your-git-history-rag-couchbase-shell\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Chat With Your Git History, Thanks to RAG and Couchbase Shell\" \/>\n<meta property=\"og:description\" content=\"Turn your Git history into a chat-ready knowledge base using RAG and Couchbase Shell.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/chat-with-your-git-history-rag-couchbase-shell\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-03-24T18:06:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-13T23:36:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"unstructured.io\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"Chat With Your Git History, Thanks to RAG and Couchbase Shell\",\"datePublished\":\"2025-03-24T18:06:51+00:00\",\"dateModified\":\"2025-06-13T23:36:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\"},\"wordCount\":980,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\",\"keywords\":[\"cbsh\",\"cbshell\",\"couchbase shell\",\"nushell\",\"RAG retrieval-augmented generation\"],\"articleSection\":[\"Artificial Intelligence (AI)\",\"Best Practices and Tutorials\",\"Couchbase Capella\",\"Couchbase Server\",\"Generative AI (GenAI)\",\"Tools &amp; SDKs\",\"Vector Search\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\",\"name\":\"Chat With Your Git History, Thanks to RAG and Couchbase Shell - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\",\"datePublished\":\"2025-03-24T18:06:51+00:00\",\"dateModified\":\"2025-06-13T23:36:16+00:00\",\"description\":\"Turn your Git history into a chat-ready knowledge base using RAG and Couchbase Shell.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg\",\"width\":2400,\"height\":1256,\"caption\":\"Couchbase Shell and RAG\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Chat With Your Git History, Thanks to RAG and Couchbase Shell\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\/\/x.com\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/laurent-doguin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Chat With Your Git History, Thanks to RAG and Couchbase Shell - The Couchbase Blog","description":"Convierte tu historial Git en una base de conocimientos lista para el chat usando RAG y Couchbase Shell.","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.couchbase.com\/blog\/es\/chat-with-your-git-history-rag-couchbase-shell\/","og_locale":"es_MX","og_type":"article","og_title":"Chat With Your Git History, Thanks to RAG and Couchbase Shell","og_description":"Turn your Git history into a chat-ready knowledge base using RAG and Couchbase Shell.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/chat-with-your-git-history-rag-couchbase-shell\/","og_site_name":"The Couchbase Blog","article_published_time":"2025-03-24T18:06:51+00:00","article_modified_time":"2025-06-13T23:36:16+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","type":"image\/jpeg"}],"author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"Chat With Your Git History, Thanks to RAG and Couchbase Shell","datePublished":"2025-03-24T18:06:51+00:00","dateModified":"2025-06-13T23:36:16+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/"},"wordCount":980,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","keywords":["cbsh","cbshell","couchbase shell","nushell","RAG retrieval-augmented generation"],"articleSection":["Artificial Intelligence (AI)","Best Practices and Tutorials","Couchbase Capella","Couchbase Server","Generative AI (GenAI)","Tools &amp; SDKs","Vector Search"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/","url":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/","name":"Chat With Your Git History, Thanks to RAG and Couchbase Shell - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","datePublished":"2025-03-24T18:06:51+00:00","dateModified":"2025-06-13T23:36:16+00:00","description":"Convierte tu historial Git en una base de conocimientos lista para el chat usando RAG y Couchbase Shell.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/03\/CBShell_V2.jpg","width":2400,"height":1256,"caption":"Couchbase Shell and RAG"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/chat-with-your-git-history-rag-couchbase-shell\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Chat With Your Git History, Thanks to RAG and Couchbase Shell"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"Laurent Doguin","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"Laurent es un metalero empoll\u00f3n que vive en Par\u00eds. Principalmente escribe c\u00f3digo en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programaci\u00f3n reactiva y otras cosas de moda. Tambi\u00e9n fue Developer Advocate de Clever Cloud y Nuxeo, donde dedic\u00f3 su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/laurent-doguin\/"}]}},"authors":[{"term_id":9023,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","author_category":"","last_name":"Doguin","first_name":"Laurent","job_title":"","user_url":"","description":"Laurent es un metalero empoll\u00f3n que vive en Par\u00eds. Principalmente escribe c\u00f3digo en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programaci\u00f3n reactiva y otras cosas de moda. Tambi\u00e9n fue Developer Advocate de Clever Cloud y Nuxeo, donde dedic\u00f3 su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/16977","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=16977"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/16977\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/16986"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=16977"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=16977"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=16977"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=16977"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}