File size: 1,705 Bytes
faaafef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
"""Private SDK schema view: omit non-assertive titles, preserve constraints.

Needle can copy a field title such as 'Path' into its arguments. Titles are JSON
Schema annotations, not validation keywords. Never walk instance-valued keywords
(const/enum/default/examples) or erase a property literally named 'title'. Public
catalogues and complete original-schema validation remain unchanged.
"""
import copy

_MAPS=('properties','patternProperties','$defs','definitions','dependentSchemas')
_SINGLE=('additionalProperties','unevaluatedProperties','propertyNames','contains','additionalItems','unevaluatedItems','not','if','then','else','contentSchema')
_LISTS=('allOf','anyOf','oneOf','prefixItems')


def _schema(schema):
    if not isinstance(schema,dict):return copy.deepcopy(schema)
    result=copy.deepcopy(schema);result.pop('title',None)
    for key in _MAPS:
        if isinstance(result.get(key),dict):result[key]={name:_schema(child) for name,child in result[key].items()}
    for key in _SINGLE:
        if key in result:result[key]=_schema(result[key])
    for key in _LISTS:
        if isinstance(result.get(key),list):result[key]=[_schema(child) for child in result[key]]
    if 'items' in result:
        value=result['items'];result['items']=[_schema(child) for child in value] if isinstance(value,list) else _schema(value)
    if isinstance(result.get('dependencies'),dict):
        result['dependencies']={name:_schema(value) if isinstance(value,(dict,bool)) else value for name,value in result['dependencies'].items()}
    return result


def inference_tools(tools):
    result=copy.deepcopy(tools)
    for tool in result:tool['parameters']=_schema(tool['parameters'])
    return result