API: Accept content:null and complex tool definitions in tool calling requests

This commit is contained in:
oobabooga 2026-03-06 02:41:16 -03:00
parent 93ebfa2b7e
commit 3880c1a406
2 changed files with 10 additions and 8 deletions

View file

@ -197,7 +197,11 @@ def chat_completions_common(body: dict, is_legacy: bool = False, stream=False, p
# Handle multimodal content validation
content = m.get('content')
if content is None:
raise InvalidRequestError(message="messages: missing content", param='messages')
# OpenAI allows content: null on assistant messages when tool_calls is present
if m['role'] == 'assistant' and m.get('tool_calls'):
m['content'] = ''
else:
raise InvalidRequestError(message="messages: missing content", param='messages')
# Validate multimodal content structure
if isinstance(content, list):

View file

@ -1,8 +1,8 @@
import json
import time
from typing import Dict, List, Optional
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field, model_validator, validator
from pydantic import BaseModel, ConfigDict, Field, model_validator, validator
from modules import shared
@ -65,22 +65,20 @@ class ToolDefinition(BaseModel):
class ToolFunction(BaseModel):
model_config = ConfigDict(extra='allow')
description: str
name: str
parameters: 'ToolParameters'
class ToolParameters(BaseModel):
properties: Optional[Dict[str, 'ToolProperty']] = None
model_config = ConfigDict(extra='allow')
properties: Optional[Dict[str, Any]] = None
required: Optional[list[str]] = None
type: str
description: Optional[str] = None
class ToolProperty(BaseModel):
description: Optional[str] = None
type: Optional[str] = None # we are faced with definitions like anyOf, e.g. {'type': 'function', 'function': {'name': 'git_create_branch', 'description': 'Creates a new branch from an optional base branch', 'parameters': {'type': 'object', 'properties': {'repo_path': {'title': 'Repo Path', 'type': 'string'}, 'branch_name': {'title': 'Branch Name', 'type': 'string'}, 'base_branch': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'title': 'Base Branch'}}, 'required': ['repo_path', 'branch_name'], 'title': 'GitCreateBranch'}}}
class FunctionCall(BaseModel):
name: str