in google/generativeai/types/generation_types.py [0:0]
def text(self):
"""A quick accessor equivalent to `self.candidates[0].content.parts[0].text`
Raises:
ValueError: If the candidate list or parts list does not contain exactly one entry.
"""
parts = self.parts
if not parts:
candidate = self.candidates[0]
fr = candidate.finish_reason
FinishReason = protos.Candidate.FinishReason
msg = (
"Invalid operation: The `response.text` quick accessor requires the response to contain a valid "
"`Part`, but none were returned. The candidate's "
f"[finish_reason](https://ai.google.dev/api/generate-content#finishreason) is {fr}."
)
if fr is FinishReason.FINISH_REASON_UNSPECIFIED:
raise ValueError(msg)
elif fr is FinishReason.STOP:
raise ValueError(msg)
elif fr is FinishReason.MAX_TOKENS:
raise ValueError(msg)
elif fr is FinishReason.SAFETY:
raise ValueError(
msg + f" The candidate's safety_ratings are: {candidate.safety_ratings}.",
candidate.safety_ratings,
)
elif fr is FinishReason.RECITATION:
raise ValueError(
msg + " Meaning that the model was reciting from copyrighted material."
)
elif fr is FinishReason.LANGUAGE:
raise ValueError(msg + " Meaning the response was using an unsupported language.")
elif fr is FinishReason.OTHER:
raise ValueError(msg)
elif fr is FinishReason.BLOCKLIST:
raise ValueError(msg)
elif fr is FinishReason.PROHIBITED_CONTENT:
raise ValueError(msg)
elif fr is FinishReason.SPII:
raise ValueError(msg + " SPII - Sensitive Personally Identifiable Information.")
elif fr is FinishReason.MALFORMED_FUNCTION_CALL:
raise ValueError(
msg + " Meaning that model generated a `FunctionCall` that was invalid. "
"Setting the "
"[Function calling mode](https://ai.google.dev/gemini-api/docs/function-calling#function_calling_mode) "
"to `ANY` can fix this because it enables constrained decoding."
)
else:
raise ValueError(msg)
texts = []
for part in parts:
if "text" in part:
texts.append(part.text)
continue
if "executable_code" in part:
language = part.executable_code.language.name.lower()
if language == "language_unspecified":
language = ""
else:
language = f" {language}"
texts.extend([f"```{language}", part.executable_code.code.lstrip("\n"), "```"])
continue
if "code_execution_result" in part:
outcome_result = part.code_execution_result.outcome.name.lower().replace(
"outcome_", ""
)
if outcome_result == "ok" or outcome_result == "unspecified":
outcome_result = ""
else:
outcome_result = f" {outcome_result}"
texts.extend([f"```{outcome_result}", part.code_execution_result.output, "```"])
continue
part_type = protos.Part.pb(part).WhichOneof("data")
raise ValueError(f"Could not convert `part.{part_type}` to text.")
return "\n".join(texts)