Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ venv.bak/
# IDE
.idea/
.vscode/
.zed/
*.swp
*.swo
.DS_Store
Expand Down
4 changes: 2 additions & 2 deletions contributing/samples/hello_world_gemma/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import random

from google.adk.agents.llm_agent import Agent
from google.adk.models.gemma_llm import Gemma
from google.adk.models.gemma_llm import Gemma3GeminiAPI
from google.genai.types import GenerateContentConfig


Expand Down Expand Up @@ -61,7 +61,7 @@ async def check_prime(nums: list[int]) -> str:


root_agent = Agent(
model=Gemma(model="gemma-3-27b-it"),
model=Gemma3GeminiAPI(model="gemma-3-27b-it"),
name="data_processing_agent",
description=(
"hello world agent that can roll many-sided dice and check if numbers"
Expand Down
16 changes: 16 additions & 0 deletions contributing/samples/hello_world_gemma3_ollama/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Copyright 2025 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.


from . import agent
93 changes: 93 additions & 0 deletions contributing/samples/hello_world_gemma3_ollama/agent.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# Copyright 2025 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.

import logging
import random

from google.adk.agents.llm_agent import Agent
from google.adk.models.gemma_llm import Gemma3Ollama

litellm_logger = logging.getLogger("LiteLLM")
litellm_logger.setLevel(logging.WARNING)


def roll_die(sides: int) -> int:
"""Roll a die and return the rolled result.

Args:
sides: The integer number of sides the die has.

Returns:
An integer of the result of rolling the die.
"""
return random.randint(1, sides)


async def check_prime(nums: list[int]) -> str:
"""Check if a given list of numbers are prime.

Args:
nums: The list of numbers to check.

Returns:
A str indicating which number is prime.
"""
primes = set()
for number in nums:
number = int(number)
if number <= 1:
continue
is_prime = True
for i in range(2, int(number**0.5) + 1):
if number % i == 0:
is_prime = False
break
if is_prime:
primes.add(number)
return (
"No prime numbers found."
if not primes
else f"{', '.join(str(num) for num in primes)} are prime numbers."
)


root_agent = Agent(
model=Gemma3Ollama(model="ollama/gemma3:12b"),
name="data_processing_agent",
description=(
"hello world agent that can roll a dice of 8 sides and check prime"
" numbers."
),
instruction="""
You roll dice and answer questions about the outcome of the dice rolls.
You can roll dice of different sizes.
You can use multiple tools in parallel by calling functions in parallel(in one request and in one round).
It is ok to discuss previous dice roles, and comment on the dice rolls.
Comment on lines +73 to +76

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

There are a couple of typos in the instruction string that could affect model behavior or confuse readers.

  • parallel(in should be parallel (in
  • dice roles should be dice rolls
Suggested change
You roll dice and answer questions about the outcome of the dice rolls.
You can roll dice of different sizes.
You can use multiple tools in parallel by calling functions in parallel(in one request and in one round).
It is ok to discuss previous dice roles, and comment on the dice rolls.
You roll dice and answer questions about the outcome of the dice rolls.
You can roll dice of different sizes.
You can use multiple tools in parallel by calling functions in parallel (in one request and in one round).
It is ok to discuss previous dice rolls, and comment on the dice rolls.

When you are asked to roll a die, you must call the roll_die tool with the number of sides. Be sure to pass in an integer. Do not pass in a string.
You should never roll a die on your own.
When checking prime numbers, call the check_prime tool with a list of integers. Be sure to pass in a list of integers. You should never pass in a string.
You should not check prime numbers before calling the tool.
When you are asked to roll a die and check prime numbers, you should always make the following two function calls:
1. You should first call the roll_die tool to get a roll. Wait for the function response before calling the check_prime tool.
2. After you get the function response from roll_die tool, you should call the check_prime tool with the roll_die result.
2.1 If user asks you to check primes based on previous rolls, make sure you include the previous rolls in the list.
3. When you respond, you must include the roll_die result from step 1.
You should always perform the previous 3 steps when asking for a roll and checking prime numbers.
You should not rely on the previous history on prime results.
""",
tools=[
roll_die,
check_prime,
],
)
77 changes: 77 additions & 0 deletions contributing/samples/hello_world_gemma3_ollama/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Copyright 2025 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.


import asyncio
import time

import agent
from dotenv import load_dotenv
from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService
from google.adk.cli.utils import logs
from google.adk.runners import Runner
from google.adk.sessions.in_memory_session_service import InMemorySessionService
from google.adk.sessions.session import Session
from google.genai import types

load_dotenv(override=True)
logs.log_to_tmp_folder()


async def main():

app_name = 'my_app'
user_id_1 = 'user1'
session_service = InMemorySessionService()
artifact_service = InMemoryArtifactService()
runner = Runner(
app_name=app_name,
agent=agent.root_agent,
artifact_service=artifact_service,
session_service=session_service,
)
session_11 = await session_service.create_session(
app_name=app_name, user_id=user_id_1
)
Comment on lines +44 to +46

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

For better readability and consistency with user_id_1, consider renaming session_11 to session_1.

This change should also be applied to its usages on lines 64, 66, 68, and 69.

Suggested change
session_11 = await session_service.create_session(
app_name=app_name, user_id=user_id_1
)
session_1 = await session_service.create_session(
app_name=app_name, user_id=user_id_1
)


async def run_prompt(session: Session, new_message: str):
content = types.Content(
role='user', parts=[types.Part.from_text(text=new_message)]
)
print('** User says:', content.model_dump(exclude_none=True))
async for event in runner.run_async(
user_id=user_id_1,
session_id=session.id,
new_message=content,
):
if event.content.parts and event.content.parts[0].text:
print(f'** {event.author}: {event.content.parts[0].text}')

start_time = time.time()
print('Start time:', start_time)
print('------------------------------------')
await run_prompt(session_11, 'Hi, introduce yourself.')
await run_prompt(
session_11, 'Roll a die with 100 sides and check if it is prime'
)
await run_prompt(session_11, 'Roll it again.')
await run_prompt(session_11, 'What numbers did I get?')
end_time = time.time()
print('------------------------------------')
print('End time:', end_time)
print('Total time:', end_time - start_time)


if __name__ == '__main__':
asyncio.run(main())
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ extensions = [
"llama-index-embeddings-google-genai>=0.3.0",# For files retrieval using LlamaIndex.
"lxml>=5.3.0", # For load_web_page tool.
"toolbox-core>=0.1.0", # For tools.toolbox_toolset.ToolboxToolset
"instructor>=1.11.3", # For Gemma3 LLMs (parsing function responses).
]

otel-gcp = [
Expand Down
9 changes: 6 additions & 3 deletions src/google/adk/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
"""Defines the interface to support a model."""

from .base_llm import BaseLlm
from .gemma_llm import Gemma
from .gemma_llm import Gemma3GeminiAPI
from .gemma_llm import Gemma3Ollama
from .google_llm import Gemini
from .llm_request import LlmRequest
from .llm_response import LlmResponse
Expand All @@ -24,10 +25,12 @@
__all__ = [
'BaseLlm',
'Gemini',
'Gemma',
'Gemma3GeminiAPI',
'Gemma3Ollama',
'LLMRegistry',
]


LLMRegistry.register(Gemini)
LLMRegistry.register(Gemma)
LLMRegistry.register(Gemma3GeminiAPI)
LLMRegistry.register(Gemma3Ollama)
Loading
Loading