From dad9e1ca3a1a3fafb8916e83823fcee19bbc0024 Mon Sep 17 00:00:00 2001 From: Parth Sareen Date: Tue, 5 Aug 2025 15:58:55 -0700 Subject: [PATCH] examples: add gpt-oss tools (#549) --- examples/README.md | 4 ++ examples/gpt-oss-tools-stream.py | 77 ++++++++++++++++++++++++++++++++ examples/gpt-oss-tools.py | 70 +++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 examples/gpt-oss-tools-stream.py create mode 100644 examples/gpt-oss-tools.py diff --git a/examples/README.md b/examples/README.md index b14d56f..ff6bdb8 100644 --- a/examples/README.md +++ b/examples/README.md @@ -27,6 +27,10 @@ See [ollama/docs/api.md](https://github.com/ollama/ollama/blob/main/docs/api.md) - [async-tools.py](async-tools.py) - [multi-tool.py](multi-tool.py) - Using multiple tools, with thinking enabled + #### gpt-oss +- [gpt-oss-tools.py](gpt-oss-tools.py) - Using tools with gpt-oss +- [gpt-oss-tools-stream.py](gpt-oss-tools-stream.py) - Using tools with gpt-oss, with streaming enabled + ### Multimodal with Images - Chat with a multimodal (image chat) model - [multimodal-chat.py](multimodal-chat.py) diff --git a/examples/gpt-oss-tools-stream.py b/examples/gpt-oss-tools-stream.py new file mode 100644 index 0000000..dee8c54 --- /dev/null +++ b/examples/gpt-oss-tools-stream.py @@ -0,0 +1,77 @@ +import random +from typing import Iterator + +from ollama import chat +from ollama._types import ChatResponse + + +def get_weather(city: str) -> str: + """ + Get the current temperature for a city + + Args: + city (str): The name of the city + + Returns: + str: The current temperature + """ + temperatures = list(range(-10, 35)) + + temp = random.choice(temperatures) + + return f'The temperature in {city} is {temp}°C' + + +def get_weather_conditions(city: str) -> str: + """ + Get the weather conditions for a city + + Args: + city (str): The name of the city + + Returns: + str: The current weather conditions + """ + conditions = ['sunny', 'cloudy', 'rainy', 'snowy', 'foggy'] + return random.choice(conditions) + + +available_tools = {'get_weather': get_weather, 'get_weather_conditions': get_weather_conditions} + +messages = [{'role': 'user', 'content': 'What is the weather like in London? What are the conditions in Toronto?'}] + + +model = 'gpt-oss:20b' +# gpt-oss can call tools while "thinking" +# a loop is needed to call the tools and get the results +final = True +while True: + response_stream: Iterator[ChatResponse] = chat(model=model, messages=messages, tools=[get_weather, get_weather_conditions], stream=True) + + for chunk in response_stream: + if chunk.message.content: + if not (chunk.message.thinking or chunk.message.thinking == '') and final: + print('\nFinal result: ') + final = False + print(chunk.message.content, end='', flush=True) + if chunk.message.thinking: + print(chunk.message.thinking, end='', flush=True) + + print() + + if chunk.message.tool_calls: + for tool_call in chunk.message.tool_calls: + function_to_call = available_tools.get(tool_call.function.name) + if function_to_call: + print('\nCalling tool: ', tool_call.function.name, 'with arguments: ', tool_call.function.arguments) + result = function_to_call(**tool_call.function.arguments) + print('Tool result: ', result + '\n') + + messages.append(chunk.message) + messages.append({'role': 'tool', 'content': result, 'tool_name': tool_call.function.name}) + else: + print(f'Tool {tool_call.function.name} not found') + + else: + # no more tool calls, we can stop the loop + break diff --git a/examples/gpt-oss-tools.py b/examples/gpt-oss-tools.py new file mode 100644 index 0000000..2cc9bd4 --- /dev/null +++ b/examples/gpt-oss-tools.py @@ -0,0 +1,70 @@ +import random + +from ollama import chat +from ollama._types import ChatResponse + + +def get_weather(city: str) -> str: + """ + Get the current temperature for a city + + Args: + city (str): The name of the city + + Returns: + str: The current temperature + """ + temperatures = list(range(-10, 35)) + + temp = random.choice(temperatures) + + return f'The temperature in {city} is {temp}°C' + + +def get_weather_conditions(city: str) -> str: + """ + Get the weather conditions for a city + + Args: + city (str): The name of the city + + Returns: + str: The current weather conditions + """ + conditions = ['sunny', 'cloudy', 'rainy', 'snowy', 'foggy'] + return random.choice(conditions) + + +available_tools = {'get_weather': get_weather, 'get_weather_conditions': get_weather_conditions} + +messages = [{'role': 'user', 'content': 'What is the weather like in London? What are the conditions in Toronto?'}] + + +model = 'gpt-oss:20b' +# gpt-oss can call tools while "thinking" +# a loop is needed to call the tools and get the results +while True: + response: ChatResponse = chat(model=model, messages=messages, tools=[get_weather, get_weather_conditions]) + + if response.message.content: + print('Content: ') + print(response.message.content + '\n') + if response.message.thinking: + print('Thinking: ') + print(response.message.thinking + '\n') + + if response.message.tool_calls: + for tool_call in response.message.tool_calls: + function_to_call = available_tools.get(tool_call.function.name) + if function_to_call: + result = function_to_call(**tool_call.function.arguments) + print('Result from tool call name: ', tool_call.function.name, 'with arguments: ', tool_call.function.arguments, 'result: ', result + '\n') + + messages.append(response.message) + messages.append({'role': 'tool', 'content': result, 'tool_name': tool_call.function.name}) + else: + print(f'Tool {tool_call.function.name} not found') + + else: + # no more tool calls, we can stop the loop + break