@@ -221,15 +221,13 @@ bool CAIApi_Chat::AIApi_Chat_Excute(XNETHANDLE xhToken, LPCXSTR lpszModelName, L
221221 st_JsonRoot[" messages" ] = st_JsonArray;
222222
223223 xstring m_StrBody = Json::writeString (st_JsonBuilder, st_JsonRoot);
224- #if XENGINE_VERSION_KERNEL >= 9 && XENGINE_VERSION_MAIN >= 21
225224 if (!APIClient_Http_Excute (xhToken, m_StrBody.c_str (), m_StrBody.length (), stl_MapIterator->second ->tszAPIHdr ))
226225 {
227226 AIApi_IsErrorOccur = true ;
228227 AIApi_dwErrorCode = APIClient_GetLastError ();
229228 st_Locker.unlock_shared ();
230229 return false ;
231230 }
232- #endif
233231 st_Locker.unlock_shared ();
234232 return true ;
235233}
@@ -347,11 +345,7 @@ bool CAIApi_Chat::AIApi_Chat_GetStatus(XNETHANDLE xhToken, bool* pbComplete, int
347345 return false ;
348346 }
349347
350- #if XENGINE_VERSION_KERNEL >= 9 && XENGINE_VERSION_MAIN >= 21
351348 if (!APIClient_Http_GetResult (xhToken, pbComplete, pInt_HTTPCode, bWaitExist))
352- #else
353- if (!APIClient_Http_GetResult (xhToken, pbComplete, pInt_HTTPCode))
354- #endif
355349 {
356350 AIApi_IsErrorOccur = true ;
357351 AIApi_dwErrorCode = APIClient_GetLastError ();
@@ -453,10 +447,21 @@ bool CAIApi_Chat::AIApi_Chat_Parse(AICLIENT_CHAT* pSt_AIClient, LPCXSTR lpszMSGB
453447 XCHAR tszGBKBuffer[8192 ] = {};
454448 BaseLib_Charset_UTFToAnsi (st_JsonMessage[" content" ].asString ().c_str (), tszGBKBuffer, &nGBKLen);
455449 pSt_AIClient->lpCall_Chat (pSt_AIClient->xhToken , st_JsonRoot[" model" ].asCString (), tszGBKBuffer, nGBKLen, pSt_AIClient->lParam );
450+ if (bSSEReply)
451+ {
452+ // 流式数据需要单独处理保存
453+ memcpy (pSt_AIClient->st_HisStream .tszRoleContent + pSt_AIClient->st_HisStream .nCLen , tszGBKBuffer, nGBKLen);
454+ pSt_AIClient->st_HisStream .nCLen += nGBKLen;
455+ }
456456#else
457457 pSt_AIClient->lpCall_Chat (pSt_AIClient->xhToken , st_JsonRoot[" model" ].asCString (), st_JsonMessage[" content" ].asString ().c_str (), st_JsonMessage[" content" ].asString ().length (), pSt_AIClient->lParam );
458+ if (bSSEReply)
459+ {
460+ memcpy (pSt_AIClient->st_HisStream .tszRoleContent + pSt_AIClient->st_HisStream .nCLen , st_JsonMessage[" content" ].asString ().c_str (), st_JsonMessage[" content" ].asString ().length ());
461+ pSt_AIClient->st_HisStream .nCLen += st_JsonMessage[" content" ].asString ().length ();
462+ }
458463#endif
459- if (pSt_AIClient->bHistory )
464+ if (pSt_AIClient->bHistory && !bSSEReply )
460465 {
461466 pSt_AIClient->pStl_ListHistory ->push_back (st_AIHistory);
462467 }
@@ -483,9 +488,9 @@ void CAIApi_Chat::AIApi_Chat_CBRecv(XNETHANDLE xhToken, XPVOID lpszMsgBuffer, in
483488 if (pSt_AIClient->bStream )
484489 {
485490 // SSE
486- printf (" %s\n " , (LPCXSTR)lpszMsgBuffer);
487491 int nPos = 0 ;
488492 LPCXSTR lpszSSEStr = _X (" data: " );
493+ LPCXSTR lpszSSEEnd = _X (" [DONE]" );
489494
490495 XCHAR* ptszStart = pSt_AIClient->ptszMSGBuffer ;
491496 XCHAR* ptszEnd = ptszStart + pSt_AIClient->nMSGLen ;
@@ -507,6 +512,19 @@ void CAIApi_Chat::AIApi_Chat_CBRecv(XNETHANDLE xhToken, XPVOID lpszMsgBuffer, in
507512 {
508513 nPos = _tcsxlen (lpszSSEStr);
509514 }
515+ if (_tcsxnicmp (lpszSSEEnd, ptszStart + nPos, _tcsxlen (lpszSSEEnd)) == 0 )
516+ {
517+ // 结束
518+ if (pSt_AIClient->bHistory )
519+ {
520+ _xstrcpy (pSt_AIClient->st_HisStream .tszRoleName , _X (" assistant" ), sizeof (pSt_AIClient->st_HisStream .tszRoleName ));
521+ pSt_AIClient->pStl_ListHistory ->push_back (pSt_AIClient->st_HisStream );
522+ memset (&pSt_AIClient->st_HisStream , ' \0 ' , sizeof (AICLIENT_HISTORY));
523+ }
524+ pSt_AIClient->nMSGLen = 0 ;
525+ memset (pSt_AIClient->ptszMSGBuffer , ' \0 ' , XENGINE_MEMORY_SIZE_MAX);
526+ break ;
527+ }
510528 // 解析当前消息体
511529 if (!pClass_This->AIApi_Chat_Parse (pSt_AIClient, ptszStart + nPos, nOneMsgLen - nPos, true ))
512530 {
0 commit comments