OpenAI structured outputs: strict JSON schemas, refusal handling, and the retry loop | Vectle