diff --git a/docs/static/llama-stack-spec.html b/docs/static/llama-stack-spec.html
index 26cafec8f..00d46e469 100644
--- a/docs/static/llama-stack-spec.html
+++ b/docs/static/llama-stack-spec.html
@@ -13069,12 +13069,57 @@
"type": "string",
"description": "Human-readable description of what the tool does"
},
- "parameters": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ToolParameter"
+ "input_schema": {
+ "type": "object",
+ "additionalProperties": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ },
+ {
+ "type": "array"
+ },
+ {
+ "type": "object"
+ }
+ ]
},
- "description": "List of parameters this tool accepts"
+ "description": "JSON Schema for the tool's input parameters"
+ },
+ "output_schema": {
+ "type": "object",
+ "additionalProperties": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "string"
+ },
+ {
+ "type": "array"
+ },
+ {
+ "type": "object"
+ }
+ ]
+ },
+ "description": "JSON Schema for the tool's output"
},
"metadata": {
"type": "object",
@@ -13109,74 +13154,11 @@
"provider_id",
"type",
"toolgroup_id",
- "description",
- "parameters"
+ "description"
],
"title": "Tool",
"description": "A tool that can be invoked by agents."
},
- "ToolParameter": {
- "type": "object",
- "properties": {
- "name": {
- "type": "string",
- "description": "Name of the parameter"
- },
- "parameter_type": {
- "type": "string",
- "description": "Type of the parameter (e.g., string, integer)"
- },
- "description": {
- "type": "string",
- "description": "Human-readable description of what the parameter does"
- },
- "required": {
- "type": "boolean",
- "default": true,
- "description": "Whether this parameter is required for tool invocation"
- },
- "items": {
- "type": "object",
- "description": "Type of the elements when parameter_type is array"
- },
- "title": {
- "type": "string",
- "description": "(Optional) Title of the parameter"
- },
- "default": {
- "oneOf": [
- {
- "type": "null"
- },
- {
- "type": "boolean"
- },
- {
- "type": "number"
- },
- {
- "type": "string"
- },
- {
- "type": "array"
- },
- {
- "type": "object"
- }
- ],
- "description": "(Optional) Default value for the parameter if not provided"
- }
- },
- "additionalProperties": false,
- "required": [
- "name",
- "parameter_type",
- "description",
- "required"
- ],
- "title": "ToolParameter",
- "description": "Parameter definition for a tool."
- },
"ToolGroup": {
"type": "object",
"properties": {
diff --git a/docs/static/llama-stack-spec.yaml b/docs/static/llama-stack-spec.yaml
index 785f39bbc..8a5cd8891 100644
--- a/docs/static/llama-stack-spec.yaml
+++ b/docs/static/llama-stack-spec.yaml
@@ -9614,11 +9614,29 @@ components:
type: string
description: >-
Human-readable description of what the tool does
- parameters:
- type: array
- items:
- $ref: '#/components/schemas/ToolParameter'
- description: List of parameters this tool accepts
+ input_schema:
+ type: object
+ additionalProperties:
+ oneOf:
+ - type: 'null'
+ - type: boolean
+ - type: number
+ - type: string
+ - type: array
+ - type: object
+ description: >-
+ JSON Schema for the tool's input parameters
+ output_schema:
+ type: object
+ additionalProperties:
+ oneOf:
+ - type: 'null'
+ - type: boolean
+ - type: number
+ - type: string
+ - type: array
+ - type: object
+ description: JSON Schema for the tool's output
metadata:
type: object
additionalProperties:
@@ -9638,53 +9656,8 @@ components:
- type
- toolgroup_id
- description
- - parameters
title: Tool
description: A tool that can be invoked by agents.
- ToolParameter:
- type: object
- properties:
- name:
- type: string
- description: Name of the parameter
- parameter_type:
- type: string
- description: >-
- Type of the parameter (e.g., string, integer)
- description:
- type: string
- description: >-
- Human-readable description of what the parameter does
- required:
- type: boolean
- default: true
- description: >-
- Whether this parameter is required for tool invocation
- items:
- type: object
- description: >-
- Type of the elements when parameter_type is array
- title:
- type: string
- description: (Optional) Title of the parameter
- default:
- oneOf:
- - type: 'null'
- - type: boolean
- - type: number
- - type: string
- - type: array
- - type: object
- description: >-
- (Optional) Default value for the parameter if not provided
- additionalProperties: false
- required:
- - name
- - parameter_type
- - description
- - required
- title: ToolParameter
- description: Parameter definition for a tool.
ToolGroup:
type: object
properties:
diff --git a/llama_stack/apis/tools/tools.py b/llama_stack/apis/tools/tools.py
index 62cc3ad00..33bd95e51 100644
--- a/llama_stack/apis/tools/tools.py
+++ b/llama_stack/apis/tools/tools.py
@@ -48,14 +48,16 @@ class Tool(Resource):
:param type: Type of resource, always 'tool'
:param toolgroup_id: ID of the tool group this tool belongs to
:param description: Human-readable description of what the tool does
- :param parameters: List of parameters this tool accepts
+ :param input_schema: JSON Schema for the tool's input parameters
+ :param output_schema: JSON Schema for the tool's output
:param metadata: (Optional) Additional metadata about the tool
"""
type: Literal[ResourceType.tool] = ResourceType.tool
toolgroup_id: str
description: str
- parameters: list[ToolParameter]
+ input_schema: dict[str, Any] | None = None
+ output_schema: dict[str, Any] | None = None
metadata: dict[str, Any] | None = None
diff --git a/llama_stack/core/routing_tables/toolgroups.py b/llama_stack/core/routing_tables/toolgroups.py
index 8172b9b5f..d38009fd4 100644
--- a/llama_stack/core/routing_tables/toolgroups.py
+++ b/llama_stack/core/routing_tables/toolgroups.py
@@ -83,7 +83,8 @@ class ToolGroupsRoutingTable(CommonRoutingTableImpl, ToolGroups):
identifier=t.name,
toolgroup_id=toolgroup.identifier,
description=t.description or "",
- parameters=t.parameters or [],
+ input_schema=t.input_schema,
+ output_schema=t.output_schema,
metadata=t.metadata,
provider_id=toolgroup.provider_id,
)
diff --git a/llama_stack/providers/inline/agents/meta_reference/responses/streaming.py b/llama_stack/providers/inline/agents/meta_reference/responses/streaming.py
index 487ae678b..cb9a1bd8d 100644
--- a/llama_stack/providers/inline/agents/meta_reference/responses/streaming.py
+++ b/llama_stack/providers/inline/agents/meta_reference/responses/streaming.py
@@ -65,35 +65,10 @@ def convert_tooldef_to_chat_tool(tool_def):
from llama_stack.models.llama.datatypes import ToolDefinition
from llama_stack.providers.utils.inference.openai_compat import convert_tooldef_to_openai_tool
- # Build JSON Schema from tool parameters
- properties = {}
- required = []
-
- for param in tool_def.parameters:
- param_schema = {
- "type": param.parameter_type,
- "description": param.description,
- }
- if param.default is not None:
- param_schema["default"] = param.default
- if param.items is not None:
- param_schema["items"] = param.items
-
- properties[param.name] = param_schema
-
- if param.required:
- required.append(param.name)
-
- input_schema = {
- "type": "object",
- "properties": properties,
- "required": required,
- }
-
internal_tool_def = ToolDefinition(
tool_name=tool_def.name,
description=tool_def.description,
- input_schema=input_schema,
+ input_schema=tool_def.input_schema,
)
return convert_tooldef_to_openai_tool(internal_tool_def)
@@ -546,33 +521,10 @@ class StreamingResponseOrchestrator:
from llama_stack.providers.utils.inference.openai_compat import convert_tooldef_to_openai_tool
def make_openai_tool(tool_name: str, tool: Tool) -> ChatCompletionToolParam:
- # Build JSON Schema from tool parameters
- properties = {}
- required = []
-
- for param in tool.parameters:
- param_schema = {
- "type": param.parameter_type,
- "description": param.description,
- }
- if param.default is not None:
- param_schema["default"] = param.default
-
- properties[param.name] = param_schema
-
- if param.required:
- required.append(param.name)
-
- input_schema = {
- "type": "object",
- "properties": properties,
- "required": required,
- }
-
tool_def = ToolDefinition(
tool_name=tool_name,
description=tool.description,
- input_schema=input_schema,
+ input_schema=tool.input_schema,
)
return convert_tooldef_to_openai_tool(tool_def)
@@ -659,16 +611,11 @@ class StreamingResponseOrchestrator:
MCPListToolsTool(
name=t.name,
description=t.description,
- input_schema={
+ input_schema=t.input_schema
+ or {
"type": "object",
- "properties": {
- p.name: {
- "type": p.parameter_type,
- "description": p.description,
- }
- for p in t.parameters
- },
- "required": [p.name for p in t.parameters if p.required],
+ "properties": {},
+ "required": [],
},
)
)
diff --git a/llama_stack/providers/inline/ios/inference/LocalInferenceImpl/SystemPrompts.swift b/llama_stack/providers/inline/ios/inference/LocalInferenceImpl/SystemPrompts.swift
index 88c0218b0..8bae3582b 100644
--- a/llama_stack/providers/inline/ios/inference/LocalInferenceImpl/SystemPrompts.swift
+++ b/llama_stack/providers/inline/ios/inference/LocalInferenceImpl/SystemPrompts.swift
@@ -68,9 +68,7 @@ public class FunctionTagCustomToolGenerator {
{
"name": "{{t.tool_name}}",
"description": "{{t.description}}",
- "parameters": {
- "type": "dict",
- "properties": { {{t.parameters}} }
+ "input_schema": { {{t.input_schema}} }
}
{{/let}}
diff --git a/llama_stack/providers/remote/inference/vllm/vllm.py b/llama_stack/providers/remote/inference/vllm/vllm.py
index bef5cbf2c..90ec37a34 100644
--- a/llama_stack/providers/remote/inference/vllm/vllm.py
+++ b/llama_stack/providers/remote/inference/vllm/vllm.py
@@ -110,18 +110,6 @@ def _convert_to_vllm_tools_in_request(tools: list[ToolDefinition]) -> list[dict]
compat_tools = []
for tool in tools:
- properties = {}
- compat_required = []
- if tool.parameters:
- for tool_key, tool_param in tool.parameters.items():
- properties[tool_key] = {"type": tool_param.param_type}
- if tool_param.description:
- properties[tool_key]["description"] = tool_param.description
- if tool_param.default:
- properties[tool_key]["default"] = tool_param.default
- if tool_param.required:
- compat_required.append(tool_key)
-
# The tool.tool_name can be a str or a BuiltinTool enum. If
# it's the latter, convert to a string.
tool_name = tool.tool_name
@@ -133,10 +121,11 @@ def _convert_to_vllm_tools_in_request(tools: list[ToolDefinition]) -> list[dict]
"function": {
"name": tool_name,
"description": tool.description,
- "parameters": {
+ "parameters": tool.input_schema
+ or {
"type": "object",
- "properties": properties,
- "required": compat_required,
+ "properties": {},
+ "required": [],
},
},
}