Parses a model JSON response and tolerates non-JSON prefixes/suffixes.
| 543 | |
| 544 | // Parses a model JSON response and tolerates non-JSON prefixes/suffixes. |
| 545 | static bool ParseJsonObjectFromResponse(string_view response, Document* response_doc) { |
| 546 | DCHECK(response_doc != nullptr); |
| 547 | if (response_doc == nullptr) return false; |
| 548 | response_doc->Parse(response.data(), response.size()); |
| 549 | if (!response_doc->HasParseError() && response_doc->IsObject()) return true; |
| 550 | |
| 551 | const size_t first_brace = response.find('{'); |
| 552 | const size_t last_brace = response.rfind('}'); |
| 553 | if (first_brace == string_view::npos || last_brace == string_view::npos |
| 554 | || last_brace <= first_brace) { |
| 555 | return false; |
| 556 | } |
| 557 | const string_view candidate = |
| 558 | response.substr(first_brace, last_brace - first_brace + 1); |
| 559 | response_doc->Parse(candidate.data(), candidate.size()); |
| 560 | return !response_doc->HasParseError() && response_doc->IsObject(); |
| 561 | } |
| 562 | |
| 563 | // Returns the assistant message object from common response envelope shapes. |
| 564 | static const Value* FindAssistantMessageInResponse(const Document& response_doc) { |