-
Notifications
You must be signed in to change notification settings - Fork 2.1k
feat: add gemma3 ollama model support #3120
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
douglas-reid
wants to merge
1
commit into
google:main
Choose a base branch
from
douglas-reid:local-gemma-example
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -32,6 +32,7 @@ venv.bak/ | |
# IDE | ||
.idea/ | ||
.vscode/ | ||
.zed/ | ||
*.swp | ||
*.swo | ||
.DS_Store | ||
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
16 changes: 16 additions & 0 deletions
16
contributing/samples/hello_world_gemma3_ollama/__init__.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. | ||
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, | ||
], | ||
) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For better readability and consistency with This change should also be applied to its usages on lines 64, 66, 68, and 69.
Suggested change
|
||||||||||||||
|
||||||||||||||
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()) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There are a couple of typos in the instruction string that could affect model behavior or confuse readers.
parallel(in
should beparallel (in
dice roles
should bedice rolls