import yaml, json, re, sys spec = yaml.safe_load(open('sources/openai/openapi/openapi-master.yaml')) paths = spec['paths'] comps = spec['components']['schemas'] PFX = ('/agents', '/vaults', '/chatkit', '/threads', '/assistants') out = {} refs = set() def collect(o): if isinstance(o, dict): for k, v in o.items(): if k == '$ref': refs.add(v.split('/')[-1]) else: collect(v) elif isinstance(o, list): for v in o: collect(v) for p, ops in paths.items(): if not p.startswith(PFX): continue for m, op in ops.items(): if m not in ('get','post','delete','put','patch'): continue meta = op.get('x-oaiMeta', {}) ex = meta.get('examples', {}) req = ex.get('request', {}) if isinstance(ex, dict) else {} rec = { 'operationId': op.get('operationId'), 'summary': op.get('summary'), 'description': op.get('description'), 'deprecated': op.get('deprecated'), 'parameters': op.get('parameters'), 'requestBody': op.get('requestBody'), 'responses': op.get('responses'), 'meta': {k: v for k, v in meta.items() if k != 'examples'}, 'curl': req.get('curl') if isinstance(req, dict) else None, 'example_response': ex.get('response') if isinstance(ex, dict) else None, } collect(rec['parameters']); collect(rec['requestBody']); collect(rec['responses']) out[f'{m.upper()} {p}'] = rec json.dump(out, open('tmp/agents/spec_ops.json','w'), indent=1, default=str) # resolve schema refs transitively seen = set(); todo = list(refs) while todo: r = todo.pop() if r in seen or r not in comps: continue seen.add(r); collect(comps[r]) todo.extend(refs - seen) schemas = {k: comps[k] for k in sorted(seen)} json.dump(schemas, open('tmp/agents/spec_schemas.json','w'), indent=1, default=str) print(len(out), 'ops;', len(schemas), 'schemas') for k in out: print(k, '| beta=', out[k]['meta'].get('beta'), '| group=', out[k]['meta'].get('group'), '| dep=', out[k]['deprecated'])