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");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////