@@ -16,29 +16,25 @@ interface
1616 TDelphiAIDevAIChatGPT = class (TInterfacedObject, IDelphiAIDevAI)
1717 private
1818 FSettings: TDelphiAIDevSettings;
19+ FResponse: IDelphiAIDevAIResponse;
1920 protected
20- function GetResponse (const AQuestion: string): string ;
21+ function GetResponse (const AQuestion: string): IDelphiAIDevAIResponse ;
2122 public
22- class function New (const ASettings: TDelphiAIDevSettings): IDelphiAIDevAI;
23- constructor Create(const ASettings: TDelphiAIDevSettings);
23+ constructor Create(const ASettings: TDelphiAIDevSettings; const AResponse: IDelphiAIDevAIResponse);
2424 end ;
2525
2626implementation
2727
2828const
2929 API_JSON_BODY_BASE = ' {"model": "%s", "messages": [{"role": "user", "content": "%s"}], "stream": false, "max_tokens": 2048}' ;
3030
31- class function TDelphiAIDevAIChatGPT.New (const ASettings: TDelphiAIDevSettings): IDelphiAIDevAI;
32- begin
33- Result := Self.Create(ASettings);
34- end ;
35-
36- constructor TDelphiAIDevAIChatGPT.Create(const ASettings: TDelphiAIDevSettings);
31+ constructor TDelphiAIDevAIChatGPT.Create(const ASettings: TDelphiAIDevSettings; const AResponse: IDelphiAIDevAIResponse);
3732begin
3833 FSettings := ASettings;
34+ FResponse := AResponse;
3935end ;
4036
41- function TDelphiAIDevAIChatGPT.GetResponse (const AQuestion: string): string ;
37+ function TDelphiAIDevAIChatGPT.GetResponse (const AQuestion: string): IDelphiAIDevAIResponse ;
4238var
4339 LResponse: IResponse;
4440 LJsonValueAll: TJSONValue;
@@ -48,8 +44,9 @@ function TDelphiAIDevAIChatGPT.GetResponse(const AQuestion: string): string;
4844 LJsonValueMessage: TJSONValue;
4945 LJsonObjMessage: TJSONObject;
5046 LItemChoices: Integer;
47+ LResult: string;
5148begin
52- Result := ' ' ;
49+ Result := FResponse ;
5350
5451 LResponse := TRequest.New
5552 .BaseURL(FSettings.BaseUrlOpenAI)
@@ -59,18 +56,29 @@ function TDelphiAIDevAIChatGPT.GetResponse(const AQuestion: string): string;
5956 .AddBody(Format(API_JSON_BODY_BASE, [FSettings.ModelOpenAI, AQuestion]))
6057 .Post;
6158
59+ FResponse.SetStatusCode(LResponse.StatusCode);
60+
6261 if LResponse.StatusCode <> 200 then
63- Exit(' Question cannot be answered' + sLineBreak + ' Return: ' + LResponse.Content);
62+ begin
63+ FResponse.SetContentText(' Question cannot be answered' + sLineBreak + ' Return: ' + LResponse.Content);
64+ Exit;
65+ end ;
6466
6567 LJsonValueAll := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(LResponse.Content), 0 );
6668 if not (LJsonValueAll is TJSONObject) then
67- Exit(' The question cannot be answered, return object not found.' + sLineBreak +
69+ begin
70+ FResponse.SetContentText(' The question cannot be answered, return object not found.' + sLineBreak +
6871 ' Return: ' + LResponse.Content);
72+ Exit;
73+ end ;
6974
7075 LJsonValueChoices := TJSONObject(LJsonValueAll).GetValue(' choices' );
7176 if not (LJsonValueChoices is TJSONArray) then
72- Exit(' The question cannot be answered, choices not found.' + sLineBreak +
77+ begin
78+ FResponse.SetContentText(' The question cannot be answered, choices not found.' + sLineBreak +
7379 ' Return: ' + LResponse.Content);
80+ Exit;
81+ end ;
7482
7583 LJsonArrayChoices := LJsonValueChoices as TJSONArray;
7684 for LItemChoices := 0 to Pred(LJsonArrayChoices.Count) do
@@ -88,10 +96,10 @@ function TDelphiAIDevAIChatGPT.GetResponse(const AQuestion: string): string;
8896
8997 // GET MESSAGE LIKE TJSONObject
9098 LJsonObjMessage := LJsonValueMessage as TJSONObject;
91- Result := Result + TJSONString(LJsonObjMessage.GetValue(' content' )).Value .Trim + sLineBreak;
99+ LResult := LResult + TJSONString(LJsonObjMessage.GetValue(' content' )).Value .Trim + sLineBreak;
92100 end ;
93101
94- Result := Result. Trim;
102+ FResponse.SetContentText(LResult. Trim) ;
95103end ;
96104
97105end .
0 commit comments