Ver Mensaje Individual
  #13  
Antiguo 13-03-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 16
Reputación: 0
navbuoy Va por buen camino
formateando la respuesta de ChatGPT en nuestra funcion de consulta a ChatGPT

Me las he ingeniado para crear la funcion que formatea los saltos de linea y las comillas en la respuesta de ChatGPT

Tened en cuenta que esto afecta a cuando nos da codigo fuente de ejemplo porque podria ser que el codigo ponga algo asi como "printf("numero %d\n <---esto!!!", variable);"
y en el mensaje que nos muestra en el RichEdit haria el salto de linea (esta es una particularidad que estoy mirando como hacer para discernir cuando ChatGPT me envia codigo fuente de ejemplo y de esa manera diferenciarlo

pero bueno, os paso el codigo de como ha quedado la funcion que tengo para lo de Consulta a ChatGPT
recordad que el Memo1 es en realidad un TMSRichEdit y el "c+1" que hace con la cadena cuando empieza el bucle, es porque si empezamos por 0 en la posicion del AnsiString da "Range Error"

Código:
try
{
  TNetHeaders AuthHeader;
  AuthHeader.Length = 2;
  AuthHeader[0] = TNameValuePair("Authorization", "Bearer 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");
  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;
  //memo->Lines->Add("{\"model\": \"gpt-3.5-turbo\", \"Messages\": \"role\": \"system\" \"content\": \"Actua como un Experto\" \"role\": \"user\" \"content\": \"" + ASAux + "\", \"temperature\": 0, \"max_tokens\": 1000}");
  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("https://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, f;
   A=memo->Lines->Text;
	i=A.AnsiPos("content");
	B=A.SubString(i+10,A.Length());

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

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


//////// Y aqui formateamos la respuesta para hacer que los saltos de linea salgan en el TMSRichEdit
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  AnsiString respuesta_formateada = " - ";

  Memo1->AddLineBreak();   Memo1->AddLineBreak();

  Memo1->AddImage("gpt_icon.png" , 40, 40);  //Esto es un iconcito de chatGPT para darle mejor aspecto a lo que imprime



///// Imprimimos la pregunta para saber a que se refiere la respuesta
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

  Memo1->AddText(Utf8ToAnsi(EPregunta->Text), clGreen, clBlack);
  Memo1->AddLineBreak();   Memo1->AddLineBreak();

  for(int c=0; c < respuesta.Length(); ++c)
   {
	 if(respuesta[c+1] == '\\')
	 {
	  if(respuesta[c+2] == 'n' || respuesta[c+2] == 'r' )
	  {
		// Imprimimos el texto precedente y el salto de linea en el RichEdit
		
                Memo1->AddText(Utf8ToAnsi(respuesta_formateada));
		Memo1->AddLineBreak();
		respuesta_formateada = "";
		c = c+3;
	  }

	  if(respuesta[c+2] == '"')
	   {
		respuesta_formateada = respuesta_formateada + respuesta[c+2];
        respuesta_formateada = respuesta_formateada + " ";
		c = c+1;
	   }
	 }


	 else {
			//Seguimos almacenando la respuesta
			respuesta_formateada = respuesta_formateada + respuesta[c+1];
		   }

   }


  //Imprimimos lo restante de la respuesta
  Memo1->AddText(Utf8ToAnsi(respuesta_formateada));


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

Última edición por navbuoy fecha: 13-03-2024 a las 23:27:07.
Responder Con Cita