FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index Artificial Intelligence examples Class TGemini to use Google Gemini AI
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Class TGemini to use Google Gemini AI
Posted: Thu Feb 13, 2025 08:34 AM
tgemini.prg
// 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
// 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   

//----------------------------------------------------------------------------//
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 16
Joined: Tue Jan 07, 2025 11:59 AM
Re: Class TGemini to use Google Gemini AI
Posted: Mon Feb 17, 2025 10:22 AM

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 !

Fivewinner desde 1.9, programador PHP y Javascript, PWA & HTML5 evangelista
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Class TGemini to use Google Gemini AI
Posted: Mon Feb 17, 2025 11:01 AM
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 :)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 16
Joined: Tue Jan 07, 2025 11:59 AM
Re: Class TGemini to use Google Gemini AI
Posted: Mon Feb 17, 2025 12:33 PM
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 ?
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 ?
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.
Fivewinner desde 1.9, programador PHP y Javascript, PWA & HTML5 evangelista
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Class TGemini to use Google Gemini AI
Posted: Mon Feb 17, 2025 02:07 PM
Tienes que enviarle lo hablado hasta ese momento, para que sepa en que contexto est谩 :)
regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion