Ver Mensaje Individual
  #11  
Antiguo 07-03-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 16
Reputación: 0
navbuoy Va por buen camino
Codigo Final de la funcion Consulta a ChatGPT

Os dejo aqui el codigo como lo he dejado al final en Rad Studio 12

tened en cuenta a la hora de adaptarlo para vuestra app, que uso un EditBox llamado EPregunta, un Memo llamado Memo1 (para las respuestas) y mi formulario es el Form6
y tened en cuenta que aunque yo uso AddText en el memo, es porque en realidad es un TMSRichEditor ... en un Memo standard seria Memo->Lines->Add("el texto que sea");

y el uso de la funcion Utf8ToAnsi al enviar el query....es debido a que si no, el ChatGPT como le pongas una Ñ o algun caracter especial que no entienda bien, cascara con un error en el envio de la consulta
y de la misma manera el uso de Utf8ToAnsi en la respuesta, hace que convierta los caracteres especiales a nuestra codepage local, (acentos, eñes etc)

Código:
/// Recordad los include de cabecera
////////////////////////////////////////////////////
#include <vcl.h>
#include <System.Classes.hpp>
#include <System.Net.URLClient.hpp>
#include <windows.h>
#include <System.JSON.hpp>
#include <System.SysUtils.hpp>

/// Y esto en el onclick del boton que por ejemplo usemos para enviar la consulta
//////////////////////////////////////////////////////////////////////////////////////////////////////

try
{
  TNetHeaders AuthHeader;
  AuthHeader.Length = 2;
  AuthHeader[0] = TNameValuePair("Authorization", "Bearer TU_API_KEY");
  AuthHeader[1] = TNameValuePair("Content-Type", "application/json");
  TMemoryStream *salida = new TMemoryStream();
  TMemoryStream *entrada = new TMemoryStream();
  TMemo *memo = new TMemo(Form6);
  memo->Parent = Form6;
  memo->Visible = false;
  memo->Lines->Clear();
  String  ASAux = EPregunta->Text;
  char dest[200];
  UnicodeToUtf8(dest, 200, EPregunta->Text.c_str(), 200);
  ASAux = dest;

  TJSONObject *inputObject = new TJSONObject();
		inputObject->AddPair("model", "gpt-3.5-turbo");

   // Construir el array de mensajes
		TJSONArray *messagesArray = new TJSONArray();

  TJSONObject *messageObject = new TJSONObject();
			messageObject->AddPair("role", "system");
			messageObject->AddPair("content", "You are a helpful assistant.");
			messageObject->AddPair("role", "user");
			messageObject->AddPair("content", Utf8ToAnsi(EPregunta->Text));

  messagesArray->Add(messageObject);

  // Agregar el array de mensajes al objeto de entrada
		inputObject->AddPair("messages", messagesArray);

  memo->Lines->Add(inputObject->ToString());

  memo->Lines->SaveToStream(salida);
  salida->Position = soFromBeginning;
  NetHTTPC1->Post("h_t_t_p_s://api.openai.com/v1/chat/completions", salida, entrada, AuthHeader);
  memo->Lines->Clear();
  memo->Lines->LoadFromStream(entrada);
  delete salida;
  delete entrada;
  TJSONObject *o = (TJSONObject*) TJSONObject::ParseJSONValue(TEncoding::ANSI->GetBytes(memo->Lines->Text), 0);


 //Como soy muy ceporro y no me aclaro de como extraer el content de los Json, lo he apañado asi :D
 //////////////////////////////////////////////////////////////////////////////////////////////////
  AnsiString A,B, respuesta;
   int i;
   A=memo->Lines->Text;
	i=A.AnsiPos("content");
	B=A.SubString(i+10,A.Length());

	i=B.AnsiPos("}");
	respuesta = B.SubString(0, i-1);

  respuesta = StringReplace(respuesta, "\\n\\n", sLineBreak, TReplaceFlags() << rfReplaceAll);
  respuesta = StringReplace(respuesta, "\\n", sLineBreak, TReplaceFlags() << rfReplaceAll);

  ////////////////////////////////////////////////////////////////////////////////////////////////

  Memo1->AddText("\r\n \r\n");
  Memo1->AddText(Utf8ToAnsi(respuesta));

	return;

  o->Free();
  memo->Free();
}
catch (...)
{
  ShowMessage("Error accediendo a los servicios IA de HFocused");
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Responder Con Cita