Minha maior experiência foi com os modelos Deepseek sem usar o Tool Calling nativo nem JSON Mode, só prompt básico + Prefix filling.
Eu praticamente não tive problemas em gerar JSONs válidos com esse setup, o que é bem interessante, mas o modelo ainda gerava chamadas inválidas (ferramentas que não existem, parâmetros errados, etc), então os 'fluxos de exceção' eram indispensáveis.
Do pouco que testei, o Tool Calling nativo do Deepseek me pareceu mais robusto, sofrendo menos com esses problemas, mas não fiz comparações muito profundas.
Eu gosto dessa visão que tu comentou de tratar o output do modelo como 'intenção', já que nem sempre aquelas requisições poderão ser executadas. Pra mim, programar integrações com esses LLMs é que nem expor um sistema pra um usuário humano normal (que gosta de quebrar as coisas e apertar botões que não deve) só que 100x mais criativo 😅