Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-03-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 16
Poder: 0
navbuoy Va por buen camino
consultar a API ChatGPT con REST en C++ Builder Rad Studio 12

Buenos dias a todos

me gustaria si alguien me pudiese ayudar en este asunto que me trae de cabeza ya

Estoy intentando hacer una consulta a CHATGPT mediante los componentes RESTClient RESTRequest y RESTResponse de C++ Builder Rad Studio 12
tengo esta funcion y aunque lo he intentado de multiples maneras, siempre me tira este error que lo que deduzco es que no logra autentificarse bien en el API de entrada

Código:
{"error":{"message":"You didn't provide an API key. You need to provide your API key in an Authorization header using Bearer auth (i.e. Authorization: Bearer YOUR_KEY), or as the password field (with blank username) if you're accessing the API from your browser and are prompted for a username and password. You can obtain an API key from https:\/\/platform.openai.com\/account\/api-keys.","type":"invalid_request_error","param":null,"code":null}}
y el codigo fuente en C++ Builder que estoy usando con esos componentes REST es este:
he de aclarar que el codigo compila sin errores ninguno y funciona y en la ejecucion es cuando falla al intentar la Authorization

Código:
// Set REST Client

 Memo1->Clear();

 RESTClient1->BaseURL = "https://api.openai.com/v1/chat/completions";

RESTClient1->Params->AddHeader( "content", "Content-Type: application/json");
  RESTClient1->Params->AddHeader( "Authorization",   "Authorization: Bearer AQUI_PONGO_EL_API_KEY_QUE_TENGO_CREADO");


 // Set REST Request
 RESTRequest1->Method   = TRESTRequestMethod::rmPOST;
 RESTRequest1->Response = RESTResponse1;
 RESTRequest1->Response->ContentType = "application/json";
 RESTRequest1->Response->ContentEncoding="UTF-8";

 RESTRequest1->ClearBody();
 RESTRequest1->Body->Add("{ \"prompt\": \"it was a rainy day for\",   \"max_tokens\": 150 }", Rest::Types::TRESTContentType::ctNotLeadChar);
 RESTRequest1->Execute();

 // Get REST Response
 TJSONValue *jValue = RESTResponse1->JSONValue;

 // Print REST Response
 Memo1->Lines->Add(jValue->ToString());
he probado incluso a meter los Params de RESTClient de forma manual desde el IDE y en la propiedad Kind he probado con varios tipos "pkCOOKIE, pkHTTPSHEADERS, pkGetorPost, pkQUERY etc" y no parece ir ninguna aunque creo que la correcta es pkHTTPSHEADERS

si alguien me pudiese ayudar lo agradeceria enormemente

Última edición por Neftali [Germán.Estévez] fecha: 06-03-2024 a las 12:17:48. Razón: Añadir URL
Responder Con Cita
  #2  
Antiguo 06-03-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
¿Has probado con el RESTDebugger o con PostMan/Insomnia?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 06-03-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Prueba a añadir el parámetro de esta manera:

Código Delphi [-]
RESTRequest1.AddParameter('Authorization','Bearer ' + 'MY-API-KAY',TRESTRequestParameterKind.pkHTTPHEADER,[poDoNotEncode]);
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 06-03-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 16
Poder: 0
navbuoy Va por buen camino
pues no Neftali, no tengo esos programas, intente bajarme el REST Debugger pero estos tios de Embarcadero tienen un formulario enorme pa esa jodida descarga y la verdad que ni lo rellene

tampoco funciona el codigo ese, lo acepta y compila asi como lo he adaptado, no lo he metido como me has puesto porque el parametro PoDoNotEncode no lo acepta
lo he adaptado a C++ builder de esta manera pero me sigue dando el error de "Unauthorized" diciendo que no le estoy dando la API KEY

Código:
 
  RESTRequest1->AddParameter("Authorization","Authorization: Bearer API_KEY", pkHTTPHEADER);
  RESTRequest1->AddParameter( "Content-Type", "application/json");
he probado tambien asi:

Código:
 
  RESTRequest1->AddParameter("Authorization","Bearer API_KEY", pkHTTPHEADER);
  RESTRequest1->AddParameter( "Content-Type", "application/json");
los tios de TMS componentes tienen un componente para eso segun este codigo, se llama TMSCloudBase o algo asi pero no se donde esta, tengo los UI Pack pero no lo veo que lo tenga en la paleta

el codigo que ellos dan para lo de CHAT GPT con su componente es este:

Código:
uses  
  System.JSON, VCL.TMSFNCCloudBase;  
  
function AskChatGPT(AQuestion: string): string;  
var  
  LCb: TTMSFNCCloudBase;  
  LPostdata: string;  
  LJsonValue: TJsonValue;  
  LJsonArray: TJsonArray;  
  LJSonString: TJsonString;  
begin  
  Result := '';  
  
  LPostData := '{' +  
    '"model": "text-davinci-003",'+  
    '"prompt": "' + AQuestion + '",'+  
    '"max_tokens": 2048,'+  
    '"temperature": 0'+  
    '}';  
  
  // create instance of TMS FNC Cloud Base class  
  LCb := TTMSFNCCloudBase.Create;  
  
  try  
    // Use JSON for the REST API calls and set API KEY via Authorization header  
    LCb.Request.AddHeader('Authorization','Bearer ' + CHATGPT_APIKEY);  
    LCb.Request.AddHeader('Content-Type','application/json');  
  
    // Select HTTPS POST method, set POST data and specify endpoint URL  
    LCb.Request.Method := rmPOST;  
    LCb.Request.PostData := LPostData;  
    LCb.Request.Host := 'http__s://api.openai.com';  
    LCb.Request.Path := 'v1/completions';  
  
    // Execute the HTTPS POST request synchronously (last param Async = false)  
    LCb.ExecuteRequest(nil,nil,false);  
  
    // Process returned JSON when request was successful   
    if Lcb.RequestResult.Success then  
    begin  
      LJsonValue := TJSonObject.ParseJSONValue(Lcb.RequestResult.ResultString);  
      LJsonValue := LJsonValue.GetValue<TJSonValue>('choices');  
      if LJsonValue is TJSonArray then  
      begin  
        LJSonArray := LJsonValue as TJSonArray;  
        LJSonString := LJSonArray.Items[0].GetValue<TJSONString>('text');  
        Result := LJSonString.Value;  
      end  
      else  
    end  
    else  
      raise Exception.Create('HTTP response code: ' + LCb.RequestResult.ResponseCode.ToString);  
  finally  
    LCb.Free;  
  end;  
end;
Responder Con Cita
  #5  
Antiguo 06-03-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.285
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por navbuoy Ver Mensaje
pues no Neftali, no tengo esos programas, intente bajarme el REST Debugger pero estos tios de Embarcadero tienen un formulario enorme pa esa jodida descarga y la verdad que ni lo rellene
Sólo como información, el RESTDebugger viene con Delphi (en el directorio bin), al menos con la versión que yo tengo.
Revisalo, tal vez con las básicas o la community no viene, esto ya no lo puedo asegurar.

A mi, esta me funciona en RADStudio 12:
Código Delphi [-]
RESTRequest1.AddParameter('Authorization','Bearer ' + 'MY-API-KAY',TRESTRequestParameterKind.pkHTTPHEADER,[poDoNotEncode]);

Lo que pasa que en mi caso, me dice que ya he excedido la cuota, pero creo que si llega a ese punto es que ya ha pasado la autentificación.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 06-03-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 16
Poder: 0
navbuoy Va por buen camino
podrias darmela en formato C++ Builder?? yo es que pascal no lo controlo muy bien, se sustituir los . por -> y las comillas simples por dobles pero no mucho mas
y creo que si le meto los 4 parametros el de DoNotEncode dice que no corresponde con la estructura de la funcion

me molesta que no funcione porque este codigo PHP lo tengo en mi hosting y funciona perfecto con mi api key y tal para consultar CHATGPT desde la pagina web
pero aunque miro que lo envio con el Method POST y como lo compone el codigo este de PHP, no se lo traga no se porque

mira, el codigo php es este y te aseguro que funciona perfecto ya luego en la app C++ Builder mirare como componer el prompt bien pero la cuestion es que no pasa el Login del Authorization

Código:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Verificar si se recibió la pregunta del chat
    if (isset($_POST['mensaje'])) {
        // Obtener la pregunta del chat
        $pregunta = $_POST['mensaje'];

        $api_key = "AQUI PONGO MI API KEY SOLAMENTE sk-taltal";

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'http__s://api.openai.com/v1/chat/completions');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $api_key,
        ]);

        $data = [
            'model' => 'gpt-3.5-turbo',
            'messages' => [],
        ];

        $data['messages'][] = ['role' => 'system', 'content' => 'Actua como un experto '];
        $data['messages'][] = ['role' => 'user', 'content' => $pregunta];

        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));


        $response = curl_exec($ch);
        $respuesta = '';
        $decoded_response = json_decode($response, true);

        if (isset($decoded_response['choices'][0]['message']['content'])) {
            $respuesta = $decoded_response['choices'][0]['message']['content'];
        }

        curl_close($ch);

        echo $respuesta;
    }
}
Neftali: una cosa que podria servirme es si con esa funcion solo hago un echo en PHP para mostrar la respuesta, pudiese capturar esa respuesta por ejemplo con un componente NetHTTPClient..... tu sabrias darme algo de codigo para capturar esa respuesta haciendo un GET desde NetHTTPClient?? porque eso podria valerme de modo chapucero claro
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Integrar ChatGPT en aplicación C++ Builder chenech Trucos 1 20-02-2023 21:16:20
CSFML en Rad Studio 10.0 Seattle (o en C++ Builder en general) Snaked C++ Builder 3 24-11-2016 04:40:32
Como consultar si existe una tabla desde el componente Query de C++ Builder MARX C++ Builder 3 06-08-2016 20:42:38
Consultar movimientos bancarios utilizando servicios rest EL WINDSURFISTA Internet 2 11-02-2016 09:57:56
Consumir servicios rest desde c++ builder 6 JM1985 C++ Builder 3 20-01-2016 08:40:07


La franja horaria es GMT +2. Ahora son las 07:28:23.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi