From e51020721a331fdbd34e1d14573f719d99a5e7c9 Mon Sep 17 00:00:00 2001 From: anlex N <1293006794@qq.com> Date: Tue, 23 Dec 2025 11:21:04 +0300 Subject: [PATCH] fix: update `text` definition in the `class GenerationResponse` --- .../generative_models/_generative_models.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/vertexai/generative_models/_generative_models.py b/vertexai/generative_models/_generative_models.py index e9d5c26505..2c3eabd192 100644 --- a/vertexai/generative_models/_generative_models.py +++ b/vertexai/generative_models/_generative_models.py @@ -2506,6 +2506,14 @@ def candidates(self) -> List["Candidate"]: for raw_candidate in self._raw_response.candidates ] + @staticmethod + def _strip_code_fences(text: str) -> str: + """ + Removes triple-backtick fenced blocks, including language tags. + """ + fenced = re.match(r"```(?:\w+)?\n(.*)\n```", text, re.DOTALL) + return fenced.group(1).strip() if fenced else text.strip() + # GenerationPart properties @property def text(self) -> str: @@ -2521,7 +2529,16 @@ def text(self) -> str: "Response:\n" + _dict_to_pretty_string(self.to_dict()) ) try: - return self.candidates[0].text + # Response's text is stored in content.parts[*].text + parts = self.candidates[0]._raw_candidate.content.parts + text = "".join( + part.text for part in parts if hasattr(part, "text") and part.text + ) + + if not text: + raise ValueError("Candidate has no text parts.") + + return self._strip_code_fences(text) except (ValueError, AttributeError) as e: # Enrich the error message with the whole Response. # The Candidate object does not have full information.