Schema inválido para ferramenta: "type: None" ao usar nó MS SQL com $fromAI() dentro do AI Agent

Descreva o problema/erro/pergunta

Descreva o problema/erro/pergunta
Tenho um nó AI Agent com um nó Microsoft SQL anexado como uma Ferramenta.
O nó SQL usa $fromAI() no campo Query para que o agente possa construir
queries dinamicamente. Toda vez que o agente tenta invocar esta ferramenta,
falha com um erro de requisição inválida.
Qual é a mensagem de erro (se houver)?

Problem in node ‘EXPERTO SQL’: Bad request - please check your parameters.
Invalid schema for function ‘AnalisisAgentes’: schema must be a JSON Schema
of ‘type: “object”’, got ‘type: “None”’.
Configuração

  • Nó: Microsoft SQL (Execute Query), usado como Ferramenta dentro de um AI Agent

  • LLM: Azure OpenAI Chat Model

  • Valor do campo Query: {{ $fromAI('description') }}

  • Descrição da Ferramenta: Definida Manualmente
    O que já tentei

  • Mudei o nome do parâmetro $fromAI: {{ $fromAI('sqlQuery', 'SQL to execute', 'string') }}

  • Verifiquei se o campo Descrição da Ferramenta contém texto

  • Reiniciei e salvei novamente o workflow
    Nenhuma dessas soluções corrigiu o erro. O schema ainda é gerado como type: "None"
    em vez de type: "object", o que Azure OpenAI rejeita.
    Pergunta
    Existe uma correção conhecida ou contorno para forçar o nó da ferramenta MS SQL a gerar
    um JSON Schema válido (type: "object") quando usado dentro de um AI Agent?

Informações sobre sua configuração n8n

  • Versão n8n: 2.20.6 (Self Hosted)
  • Banco de dados (padrão: SQLite):
  • Configuração n8n EXECUTIONS_PROCESS (padrão: own, main):
  • Executando n8n via (Docker, npm, n8n cloud, desktop app): npm
  • Sistema operacional: windows server 2019

Bem-vindo @jnscb à nossa comunidade! Sou Jay e sou um criador verificado da n8n.

O erro ocorre porque $fromAI() sem um argumento de tipo gera um schema com "type": null em vez de um tipo JSON Schema válido. A solução: sempre especifique o tipo explicitamente na sua chamada $fromAI(). Para uma string de consulta SQL, deve ser: $fromAI('query', 'The SQL query to execute', 'string'). Sem o terceiro argumento, o n8n não consegue inferir o tipo e a validação do schema falha. Também certifique-se de que você não está envolvendo $fromAI() em chaves duplas - deve ser usado diretamente no campo sem a sintaxe {{ }}.

Oi @nguyenthieutoan, obrigado pela resposta!

Apliquei ambas as alterações que você mencionou — removi as {{ }} e defini explicitamente o tipo como 'string'. Também tentei alternar a Tool Description de Set Manually para Set Automatically e vice-versa. O erro continua exatamente o mesmo em todos os casos:

Invalid schema for function ‘Microsoft_SQL’: schema must be a JSON Schema of ‘type: “object”’, got ‘type: “None”’.

Isso é o que tenho agora no campo Query:

$fromAI('sqlQuery', 'The SQL query to execute against [CMS].[dbo].[VW_HAGLOG]', 'string')

Configurações:

  • n8n version: 2.20.6 (self-hosted, npm, Windows Server 2019)
  • LLM: Azure OpenAI Chat Model
  • Node: Microsoft SQL (Execute Query), conectado como Tool ao AI Agent

O schema continua chegando ao modelo como type: "None" independentemente da configuração. Você recomendaria outro workaround?

Obrigado!

Muito obrigado por testar tudo isso e compartilhar os detalhes.

Considerando que você:

  • removeu {{ }} e chama $fromAI(...) diretamente no campo Query

  • definiu explicitamente o tipo como 'string'

  • experimentou com os modos de Tool Description

e o schema continua aparecendo como type: "None", isso realmente parece ser uma limitação/bug em como o node Microsoft SQL expõe seu schema de ferramenta dentro do AI Agent, e não um problema de configuração do seu lado.

Neste ponto, eu analisaria duas opções:

  1. Tente um $fromAI mínimo
    Primeiro eu testaria rapidamente uma versão muito simples como:

    text
    

    {{$fromAI("query")}}

    Se isso ainda resultar em type: "None", podemos ter certeza de que é específico do node e não sobre a assinatura $fromAI em si.

  2. Mude para sub-workflow + Call n8n Workflow Tool
    Para algo que você quer usar em produção, eu recomendaria:

    • Workflow principal: AI Agent → Call n8n Workflow Tool (funciona como seu “executor SQL”)

    • Sub-workflow: Workflow Input Trigger → Microsoft SQL (Execute Query)

    No sub-workflow:

    • defina uma entrada como sqlQuery e mapeie para o campo Query do MS SQL

    • configure Workflow Inputs para Defined automatically by the model para que o agent possa preenchê-las baseado na descrição da ferramenta.

    Desta forma você:

    • controla o schema através de entradas do workflow em vez de depender do schema da ferramenta do node MS SQL

    • obtém melhor tratamento de erros e pode retornar mensagens mais limpas se o modelo gerar SQL inválido

    • pode facilmente reutilizar este “executor SQL” em outros agents/workflows.

Então da minha parte: seu uso de $fromAI já é válido, e o problema restante é provavelmente no nível do node/schema. Até que o n8n lance uma correção, o padrão sub-workflow + Call Workflow Tool é a abordagem que eu mais confiaria em projetos reais.

Opção 1 — Chamada $fromAI mínima

Substituí o campo Query pela forma mais simples possível:

$fromAI("query")

Mesmo erro:

Invalid schema for function ‘Microsoft_SQL’: schema must be a JSON Schema of ‘type: “object”’, got ‘type: “None”’.

Opção 2 — Subfluxo + Ferramenta Call n8n Workflow

Construí o padrão que você sugeriu:

  • Subfluxo: Execute Workflow Trigger (com entrada sqlQuery definida como string) → Microsoft SQL (Execute Query) usando {{ $json.sqlQuery }} no campo Query.
  • Fluxo principal: AI Agent + Azure OpenAI Chat Model + Call n8n Workflow Tool apontando para o subfluxo, com $fromAI('sqlQuery', '...', 'string') mapeado para a entrada do fluxo.

O erro é idêntico, apenas o nome da função muda:

Invalid schema for function ‘executeSQL’: schema must be a JSON Schema of ‘type: “object”’, got ‘type: “None”’.

Portanto, o mesmo problema de schema type: "None" se reproduz em um nó de ferramenta completamente diferente (Call n8n Workflow Tool em vez de Microsoft SQL). Isso descarta o nó MS SQL como causa raiz e aponta para algo mais profundo — seja em como o n8n 2.20.6 gera JSON Schemas para ferramentas com parâmetros $fromAI(), ou em como esses schemas são enviados ao Azure OpenAI (que os valida de forma mais rigorosa do que o OpenAI padrão).

Considerando que dois nós de ferramenta diferentes produzem exatamente o mesmo schema malformado, sou inclinado a pensar que este é um bug avançado na camada de geração de schema, em vez de um problema de configuração. Abri uma issue no GitHub com todos os detalhes e etapas de reprodução.

Fluxo Principal

Sub-Fluxo

Obrigado por testar ambas as opções tão minuciosamente — esses dados são realmente valiosos.

O fato de o erro aparecer tanto no nó MS SQL quanto na ferramenta Call n8n Workflow Tool confirma que isso não é específico do nó. A string type: "None" é um nulo em estilo Python vazando para a serialização do JSON Schema — isso é um problema conhecido no n8n <= 2.20.x quando usado com Azure OpenAI, que realiza validação de schema mais rigorosa do que os endpoints padrão do OpenAI.

Causa raiz: o gerador de schema $fromAI() do n8n produz type: null em alguns casos extremos, mas o Azure OpenAI rejeita tudo que não seja uma string de tipo JSON Schema válida. O OpenAI padrão é mais permissivo e geralmente o ignora.

Solução definitiva — use um nó Code como ferramenta:

Em vez de conectar o MS SQL diretamente como uma Tool, use um nó Code que:

  1. Receba a consulta SQL como entrada de string pré-definida do agente
  2. Execute a consulta via nó MS SQL em um sub-workflow (como você já possui)
  3. Retorne os resultados

Para a “Call n8n Workflow Tool”, a correção fundamental é definir Workflow Inputs → type como string explicitamente no nó Execute Workflow Trigger, então na ferramenta Tool defina a descrição de entrada claramente. Certifique-se de que você não está usando $fromAI() no próprio trigger do sub-workflow — esse campo deve apenas usar {{ $json.sqlQuery }}.

Alternativamente, o caminho mais rápido: atualize para n8n 2.21+ onde esse bug de serialização de schema foi corrigido.

Se a atualização não for possível agora, compartilhe a captura de tela da definição de entrada do seu nó Execute Workflow Trigger e posso apontar exatamente onde o None está vazando.

Obrigado pela análise, me ajudou a saber por onde procurar.

Atualização importante: instalei a versão mais recente do n8n e o erro continua exatamente o mesmo. Encontrei o relatório oficial de bug (issue #25276 no repositório do n8n) e fica claro que isso NÃO foi corrigido atualizando — está confirmado nas versões atuais e persiste após atualizar. Também não é exclusivo do Azure: o mesmo erro type: "None" é rejeitado pelo OpenAI padrão e pelo Anthropic também. A causa raiz é que o n8n gera um schema inválido com type: "None" na raiz do input_schema da ferramenta, em vez de "object".

Então atualizar para 2.21+ não resolveu como você sugeriu — e pelo que vejo, esse número de versão não corresponde ao versionamento real do n8n onde esse bug existe (v2.6.3).

O que preciso agora, e é urgente: você conhece alguma forma de forçar o schema da ferramenta a sair com type: "object" na raiz (algum patch, configuração, ou nó intermediário)? Preciso que as ferramentas funcionem agora e fazer downgrade não é uma opção. Posso te enviar uma captura de tela do Execute Workflow Trigger se isso ajudar você a identificar exatamente onde o None está vazando.

Obrigado por investigar o relatório de bug - isso confirma que é um problema mais profundo de serialização de schema no núcleo, não algo que apenas um bump de versão resolve agora.

O desbloqueio mais confiável é a abordagem Code node como ferramenta que mencionei anteriormente. Como o Code node não passa pelo gerador de schema $fromAI(), não há type: None vazando. Configure o Code node com uma descrição clara de entrada, escreva a consulta SQL dentro do código, depois chame o nó MS SQL de um sub-workflow. O agente passa a consulta como uma string simples e o schema fica limpo.

Para o caminho da ferramenta Call n8n Workflow especificamente - certifique-se de que o Execute Workflow Trigger no sub-workflow tenha sua entrada definida como type string (não deixada em branco). Entradas em branco é o que produz type: None na raiz do schema. Vá para o nó de trigger, adicione um campo manualmente com type definido como string, e isso deve resolver a rejeição de schema mesmo sem uma correção de bug do lado do n8n.

Atualização — agora há uma correção em progresso para isso.

Um pull request foi vinculado que aborda a causa raiz: PR #31681 — fix(Microsoft SQL Node): Allow expressions in the query field (aberto em 3 de jun de 2026, criado por um membro da comunidade). Está vinculado ao problema que relatamos, então o fechará assim que for mesclado e lançado em uma versão.

Um aviso para que ninguém seja pego desprevenido: no momento, o PR está vinculado/aberto, ainda não mesclado em uma versão estável — então simplesmente atualizar ainda não corrigirá. Acompanhe o PR e o changelog do n8n e atualize assim que a versão que o inclui for lançada.

Solução alternativa que funciona enquanto isso (para usar o nó MS SQL como ferramenta de um Agente de IA):

  1. No campo Query, escreva $fromAI() diretamente, sem o wrapper {{ }}:
    $fromAI('sqlQuery', 'SELECT query to run against [DB].[schema].[table]', 'string')
    
    Quando o nó atua como ferramenta, o n8n precisa analisar a expressão $fromAI() como está para construir o JSON Schema. Envolvê-la em {{ }} é o que faz o schema sair como type: "None" em vez de "object".
  2. Defina Tool Description para Set Automatically para que o n8n derive o schema dos argumentos $fromAI declarados.
  3. Certifique-se de que as aspas são retas ('), não inteligentes/tipográficas — aquelas também quebram a análise.

Essa combinação força um schema raiz type: "object" válido. Assim que o #31681 chegar em uma versão, o campo de query deve aceitar expressões adequadamente e essa solução alternativa não será mais necessária.