Page 1 of 1

Class TGemini to use Google Gemini AI

Posted: Thu Feb 13, 2025 8:34 am
by Antonio Linares
tgemini.prg

Code: Select all | Expand

// Get your API key from https://aistudio.google.com

#include "FiveWin.ch"
#include "c:\harbour\contrib\hbcurl\hbcurl.ch"

//----------------------------------------------------------------------------//

CLASS TGemini
    
    DATA   cKey   INIT ""
    DATA   cModel INIT "gemini-2.0-flash"
    DATA   cResponse
    DATA   cUrl
    DATA   hCurl
    DATA   nError INIT 0
    DATA   nHttpCode INIT 0
    DATA   nTemperature INIT 0

    METHOD New( cKey, cModel )
    METHOD Send( cPrompt )    
    METHOD End()    
    METHOD GetValue()    

ENDCLASS        

//----------------------------------------------------------------------------//

METHOD New( cKey, cModel ) CLASS TGemini

    if Empty( cKey )
       ::cKey = GetEnv( "GEMINI_API_KEY" )
    else
       ::cKey = cKey   
    endif

    if ! Empty( cModel )
       ::cModel = cModel
    endif
    
    ::cUrl = "https://generativelanguage.googleapis.com/v1beta/models"
    ::hCurl = curl_easy_init()
    
return Self    

//----------------------------------------------------------------------------//

METHOD End() CLASS TGemini

    curl_easy_cleanup( ::hCurl )
    ::hCurl = nil

return nil    

//----------------------------------------------------------------------------//

METHOD GetValue() CLASS TGemini

   local uValue := hb_jsonDecode( ::cResponse )

   TRY 
      uValue = uValue[ "candidates" ][ 1 ][ "content" ][ "parts" ][ 1 ][ "text" ]
   CATCH
      uValue = uValue[ "error" ][ "message" ]
   END   

return uValue

//----------------------------------------------------------------------------//

METHOD Send( cPrompt ) CLASS TGemini 

   local aHeaders, cJson, hRequest, hContents := { => }, hGenerationConfig

   curl_easy_setopt( ::hCurl, HB_CURLOPT_POST, .T. )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_URL, ::cUrl + "/" + ::cModel + ":generateContent?key=" + ::cKey )

   aHeaders := { "Content-Type: application/json" }

   curl_easy_setopt( ::hCurl, HB_CURLOPT_HTTPHEADER, aHeaders )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_USERNAME, "" )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_DL_BUFF_SETUP )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_SSL_VERIFYPEER, .F. )

   hContents[ "role" ]  = "user"
   hContents[ "parts" ] = { { "text" => cPrompt } }
   hGenerationConfig = { "temperature" => ::nTemperature,;
                         "topK" => 40, "topP" => 0.95, "maxOutputTokens" => 8192,;
                         "responseMimeType" => "text/plain" }  
   hRequest = { "contents" => hContents, "generationConfig" => hGenerationConfig }

   cJson = hb_jsonEncode( hRequest )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_POSTFIELDS, cJson )
   ::nError = curl_easy_perform( ::hCurl )
   curl_easy_getinfo( ::hCurl, HB_CURLINFO_RESPONSE_CODE, @::nHttpCode )

   if ::nError == HB_CURLE_OK
      ::cResponse = curl_easy_dl_buff_get( ::hCurl )
   else
      ::cResponse := "Error code " + Str( ::nError )
   endif
    
return ::cResponse

//----------------------------------------------------------------------------//
gemini1.prg

Code: Select all | Expand

// Get your API key from https://aistudio.google.com
// from cmd: set GEMINI_API_KEY=your_api_key

#include "FiveWin.ch"

//----------------------------------------------------------------------------//

function Main()

   local oChat := TGemini():New()

   oChat:Send( "cuantas 'r's hay en 'strawberry' ?" )
   ? oChat:GetValue() 

   oChat:End()

return nil   

//----------------------------------------------------------------------------//

Re: Class TGemini to use Google Gemini AI

Posted: Mon Feb 17, 2025 10:22 am
by quim_
Enhorabuena !

Qué forma tan sencilla y bonita de conectar nuestro 'pequeño' mundo harbour con la IA, almenos esta IA convesacional

Despues de algunos problemas con CURL, instalando la ultima version proporcionada por Enrico Maria Giordano (Grazie mille!) he compilado sin más problemas

Veo que a la pregunta : cuantas 'r's hay en 'strawberry' ? contesta que sólo 1, supongo que rr se considera un token aparte

Ahora toca investigar un poco lo que ofrece la API, he visto que se pueden subir archivos de video o PDF y mantener un chat 'razonable'

Gracias de nuevo !

Re: Class TGemini to use Google Gemini AI

Posted: Mon Feb 17, 2025 11:01 am
by Antonio Linares
Estimado Quim,

Disponemos ya de una Clase TGemini actualizada que permite enviar imágenes y PDFs. Ahora estamos generalizándola para que admita muchos mas tipos de ficheros, incluidos videos.

Además le falta el ir reportando token a token, algo que ya tenemos en las Clases TOpenAI, TDeepSeek y TOllama, para que el usuario vea como se va escribiendo la salida poco a poco.

Todo esto lo veremos en el webinar de IA con Harbour/xHarbour los dias 26 y 27 de este mismo mes de Febrero :)

Re: Class TGemini to use Google Gemini AI

Posted: Mon Feb 17, 2025 12:33 pm
by quim_
Super interesante la movida que estás preparando para que estos viejos rokeros clipperos podamos subir al carro de la IA

Veo si puedo tener el tiempo y la tranquilidad para poder asistir al evento, seguiré el hilo creado a tal efecto

Mis primeras pruebas con esta IA, parece que no guarda el contexto ( o no sé como decirle que lo guarde)


> Conoces el lenguaje de programacion harbour ?

Code: Select all | Expand

Sí, conozco Harbour.  Es un lenguaje de programación de propósito general, un dialecto de xBase,  que es compatible con la mayoría del código Clipper.  Se caracteriza por ser:

* **Open source:**  Su código fuente está disponible públicamente.
* **Multiplataforma:**  Puede compilarse para diferentes sistemas operativos, incluyendo Windows, Linux, macOS y otros.
* **Orientado a bases de datos:**  Aunque puede usarse para otras tareas, su fortaleza reside en el desarrollo de aplicaciones que interactúan con bases de datos, especialmente aquellas compatibles con el formato DBF (dBase).
* **Compilado:**  A diferencia de lenguajes interpretados, Harbour genera código ejecutable, lo que resulta en aplicaciones más rápidas.
* **Compatible con Clipper:**  Gran parte del código escrito en Clipper puede ser compilado con Harbour con mínimas o ninguna modificación.  Esto facilita la migración de aplicaciones antiguas.

Sin embargo, es importante destacar que Harbour no es tan popular como otros lenguajes de programación modernos.  Su comunidad es más pequeña y la documentación puede ser menos extensa que la de lenguajes como Java, Python o C#.  Su uso se centra principalmente en la migración y mantenimiento de aplicaciones legacy basadas en xBase.
> Un ejemplo en codigo ?

Code: Select all | Expand

Para darte un ejemplo de código, necesito saber qué tipo de código quieres.  Por favor, especifica:

* **Lenguaje de programación:** (ej. Python, JavaScript, C++, Java, etc.)
* **Propósito del código:** ¿Qué debería hacer el código? (ej. calcular el factorial de un número, imprimir "Hola, mundo!", leer un archivo, etc.)
* **Nivel de complejidad:** ¿Algo simple o algo más avanzado?

Una vez que me des esta información, podré proporcionarte un ejemplo de código relevante.


Re: Class TGemini to use Google Gemini AI

Posted: Mon Feb 17, 2025 2:07 pm
by Antonio Linares
Tienes que enviarle lo hablado hasta ese momento, para que sepa en que contexto está :)