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
11 changes: 7 additions & 4 deletions ollama/_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,13 @@ def convert_function_to_tool(func: Callable) -> Tool:
schema['required'].remove(k)
types.discard('null')

schema['properties'][k] = {
'description': parsed_docstring[k],
'type': ', '.join(types),
}
property_schema = dict(v)
property_schema.pop('anyOf', None)
property_schema.update(
description=parsed_docstring[k],
type=', '.join(types),
)
schema['properties'][k] = property_schema

tool = Tool(
type='function',
Expand Down
13 changes: 12 additions & 1 deletion tests/test_utils.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import json
import sys
from typing import Dict, List, Mapping, Sequence, Set, Tuple, Union
from typing import Dict, List, Literal, Mapping, Sequence, Set, Tuple, Union

from ollama._utils import convert_function_to_tool

Expand Down Expand Up @@ -44,6 +44,17 @@ def simple_func():
assert tool['function']['parameters']['properties'] == {}


def test_function_preserves_parameter_schema_constraints():
def process(ids: list[int], mode: Literal['fast', 'safe']): ...

properties = convert_function_to_tool(process).model_dump()['function']['parameters']['properties']

assert properties['ids']['type'] == 'array'
assert properties['ids']['items'] == {'type': 'integer'}
assert properties['mode']['type'] == 'string'
assert properties['mode']['enum'] == ['fast', 'safe']


def test_function_with_all_types():
if sys.version_info >= (3, 10):

Expand Down