# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Sample agent demonstrating log probability usage.

This agent shows how to access log probabilities from language model responses.
The after_model_callback appends confidence information to demonstrate how
logprobs can be extracted and used.
"""

from google.adk.agents.callback_context import CallbackContext
from google.adk.agents.llm_agent import Agent
from google.adk.models.llm_response import LlmResponse
from google.genai import types


async def append_logprobs_to_response(
    callback_context: CallbackContext, llm_response: LlmResponse
) -> LlmResponse:
  """After-model callback that appends log probability information to response.

  This callback demonstrates how to access avg_logprobs and logprobs_result
  from the LlmResponse and append the information to the response content.

  Args:
    callback_context: The current callback context
    llm_response: The LlmResponse containing logprobs data

  Returns:
    Modified LlmResponse with logprobs information appended
  """
  # Build log probability analysis
  if llm_response.avg_logprobs is None:
    print("⚠️ No log probability data available")
    logprobs_info = """

---

### 📊 Log Probability Analysis

⚠️ *No log probability data available*"""
  else:
    print(f"📊 Average log probability: {llm_response.avg_logprobs:.4f}")

    # Build confidence analysis
    confidence_level = (
        "High"
        if llm_response.avg_logprobs >= -0.5
        else "Medium"
        if llm_response.avg_logprobs >= -1.0
        else "Low"
    )

    logprobs_info = f"""

---

### 📊 Log Probability Analysis

* **Average Log Probability**: {llm_response.avg_logprobs:.4f}
* **Confidence Level**: {confidence_level}
* **Confidence Score**: {100 * (2 ** llm_response.avg_logprobs):.1f}%"""

    # Optionally include detailed logprobs_result information
    if (
        llm_response.logprobs_result
        and llm_response.logprobs_result.top_candidates
    ):
      logprobs_info += (
          "\n* **Top Alternatives Analyzed**:"
          f" {len(llm_response.logprobs_result.top_candidates)}"
      )

  # Append logprobs analysis to the response
  if llm_response.content and llm_response.content.parts:
    if not any(
        "### 📊 Log Probability Analysis" in p.text
        for p in llm_response.content.parts
        if p.text
    ):
      llm_response.content.parts.append(types.Part(text=logprobs_info))

  return llm_response


# Create a simple agent that demonstrates logprobs usage
root_agent = Agent(
    name="logprobs_demo_agent",
    description=(
        "A simple agent that demonstrates log probability extraction and"
        " display."
    ),
    instruction="""
    You are a helpful AI assistant. Answer user questions normally and naturally.

    After you respond, you'll see log probability analysis appended to your response.
    You don't need to include the log probability analysis in your response yourself.
    """,
    generate_content_config=types.GenerateContentConfig(
        response_logprobs=True,  # Enable log probability collection
        logprobs=5,  # Collect top 5 alternatives for analysis
        temperature=0.7,  # Moderate temperature for varied responses
    ),
    after_model_callback=append_logprobs_to_response,
)
