2.12.0

FlyteLlm

Package: flyteplugins.agents.google

A BaseLlm that records each model turn via durable_step for replay.

Wraps an inner BaseLlm (resolved from the agent’s model); model is set to the inner model name so ADK behaves identically. Construct via flyteplugins.agents.google.durable_model.

Parameters

class FlyteLlm(
    model: str,
    inner: typing.Any = None,
)

Create a new model by parsing and validating input data from keyword arguments.

Raises ValidationError if the input data cannot be validated to form a valid model.

self is explicitly positional-only to allow self as a field name.

Parameter Type Description
model str
inner typing.Any

Methods

Method Description
generate_content_async() Generates content for a single model turn.

generate_content_async()

def generate_content_async(
    llm_request: typing.Any,
    stream: bool = False,
) -> typing.AsyncGenerator[typing.Any, None]

Generates content for a single model turn.

This method handles Server-Sent Events (SSE) streaming for unidirectional content generation. For bidirectional streaming (e.g., Gemini Live API), use the connect() method instead.

Yields:

LlmResponse objects representing the model’s response for one turn.

Non-streaming mode (stream=False):

Yields exactly one LlmResponse containing the complete model output (text, function calls, bytes, etc.). This response has partial=False.

Streaming mode (stream=True):

Yields multiple LlmResponse objects as chunks arrive:

  • Intermediate chunks: partial=True (progressive updates)
  • Final chunk: partial=False (aggregated content from entire turn, identical to stream=False output)
  • Text consolidation: Consecutive text parts of the same type (thought/non-thought) SHOULD merge without separator, but client code must not rely on this - unconsolidated parts are unusual but also valid

Common content in partial chunks:

All intermediate chunks have partial=True regardless of content type. Common examples include:

  • Text: Streams incrementally as tokens arrive
  • Function calls: May arrive in separate chunks
  • Bytes (e.g., images): Typically arrive as single chunk, interleaved with text
  • Thoughts: Stream incrementally when thinking_config is enabled

Examples:

  1. Simple text streaming:

    LlmResponse(partial=True,  parts=["The weather"])
    LlmResponse(partial=True,  parts=[" in Tokyo is"])
    LlmResponse(partial=True,  parts=[" sunny."])
    LlmResponse(partial=False, parts=["The weather in Tokyo is sunny."])
  2. Text + function call:

    LlmResponse(partial=True,  parts=[Text("Let me check...")])
    LlmResponse(partial=True,  parts=[FunctionCall("get_weather", ...)])
    LlmResponse(partial=False, parts=[Text("Let me check..."),
                                      FunctionCall("get_weather", ...)])
  3. Parallel function calls across chunks:

    LlmResponse(partial=True,  parts=[Text("Checking both cities...")])
    LlmResponse(partial=True,  parts=[FunctionCall("get_weather", Tokyo)])
    LlmResponse(partial=True,  parts=[FunctionCall("get_weather", NYC)])
    LlmResponse(partial=False, parts=[Text("Checking both cities..."),
                                      FunctionCall("get_weather", Tokyo),
                                      FunctionCall("get_weather", NYC)])
  4. Text + bytes (image generation with gemini-2.5-flash-image):

    LlmResponse(partial=True,  parts=[Text("Here's an image of a dog.")])
    LlmResponse(partial=True,  parts=[Text("")])
    LlmResponse(partial=True,  parts=[Blob(image/png, 1.6MB)])
    LlmResponse(partial=True,  parts=[Text("It carries a bone")])
    LlmResponse(partial=True,  parts=[Text(" and running around.")])
    LlmResponse(partial=False, parts=[Text("Here's an image of a dog."),
                                      Blob(image/png, 1.6MB),
                                      Text("It carries a bone and running around.")])

    Note: Consecutive text parts before and after blob merge separately.

  5. Text with thinking (gemini-2.5-flash with thinking_config):

    LlmResponse(partial=True,  parts=[Thought("Let me analyze...")])
    LlmResponse(partial=True,  parts=[Thought("The user wants...")])
    LlmResponse(partial=True,  parts=[Text("Based on my analysis,")])
    LlmResponse(partial=True,  parts=[Text(" the answer is 42.")])
    LlmResponse(partial=False, parts=[Thought("Let me analyze...The user wants..."),
                                      Text("Based on my analysis, the answer is 42.")])

    Note: Consecutive parts of same type merge (thoughts→thought, text→text).

Important: All yielded responses represent one logical model turn. The final response with partial=False should be identical to the response that would be received with stream=False.

Parameter Type Description
llm_request typing.Any LlmRequest, the request to send to the LLM.
stream bool bool = False, whether to enable SSE streaming mode.