Extracts assistant content text from string or content-part array formats.
| 587 | |
| 588 | // Extracts assistant content text from string or content-part array formats. |
| 589 | static bool TryExtractAssistantContentText( |
| 590 | const Value* assistant_message, string* assistant_content) { |
| 591 | DCHECK(assistant_content != nullptr); |
| 592 | if (assistant_message == nullptr) return false; |
| 593 | if (assistant_content == nullptr) return false; |
| 594 | assistant_content->clear(); |
| 595 | if (!assistant_message->HasMember(JSON_KEY_CONTENT)) return false; |
| 596 | |
| 597 | const Value& content = (*assistant_message)[JSON_KEY_CONTENT]; |
| 598 | if (content.IsString()) { |
| 599 | assistant_content->assign(content.GetString(), content.GetStringLength()); |
| 600 | return true; |
| 601 | } |
| 602 | if (!content.IsArray()) return false; |
| 603 | |
| 604 | for (rapidjson::SizeType i = 0; i < content.Size(); ++i) { |
| 605 | const Value& part = content[i]; |
| 606 | if (!part.IsObject()) continue; |
| 607 | |
| 608 | const Value* text_field = nullptr; |
| 609 | if (part.HasMember(JSON_KEY_TEXT) && part[JSON_KEY_TEXT].IsString()) { |
| 610 | text_field = &part[JSON_KEY_TEXT]; |
| 611 | } else if (part.HasMember(JSON_KEY_OUTPUT_TEXT) |
| 612 | && part[JSON_KEY_OUTPUT_TEXT].IsString()) { |
| 613 | text_field = &part[JSON_KEY_OUTPUT_TEXT]; |
| 614 | } else if (part.HasMember(JSON_KEY_TEXT) && part[JSON_KEY_TEXT].IsObject() |
| 615 | && part[JSON_KEY_TEXT].HasMember(JSON_KEY_VALUE) |
| 616 | && part[JSON_KEY_TEXT][JSON_KEY_VALUE].IsString()) { |
| 617 | text_field = &part[JSON_KEY_TEXT][JSON_KEY_VALUE]; |
| 618 | } |
| 619 | if (text_field == nullptr) continue; |
| 620 | if (!assistant_content->empty()) assistant_content->append("\n"); |
| 621 | assistant_content->append(text_field->GetString(), text_field->GetStringLength()); |
| 622 | } |
| 623 | return !assistant_content->empty(); |
| 624 | } |
| 625 | |
| 626 | namespace test { |
| 627 |