From a78f981dbbd66273b02a87cc54e50432d68d97d8 Mon Sep 17 00:00:00 2001 From: Ashwin Bharambe Date: Tue, 30 Sep 2025 21:06:40 -0700 Subject: [PATCH] fixes --- docs/static/llama-stack-spec.html | 120 ++++++++---------- docs/static/llama-stack-spec.yaml | 73 ++++------- llama_stack/apis/tools/tools.py | 6 +- llama_stack/core/routing_tables/toolgroups.py | 3 +- .../meta_reference/responses/streaming.py | 65 +--------- .../LocalInferenceImpl/SystemPrompts.swift | 4 +- .../providers/remote/inference/vllm/vllm.py | 19 +-- 7 files changed, 91 insertions(+), 199 deletions(-) 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": [], }, }, }