github / github/copilot-cli

Grok 4.5: 351 tools fail with HTTP 400 instead of reporting the 350-tool limit

Ouverte
#4,836 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

triage
Langage dominant
Shell
Étoiles
11.2k
Forks
1.9k
Merge moyen
14 h 16 min
PR mergées (30 j)
6

Description

Type: Bug

Copilot CLI Version: 1.0.84-5
OS Version: Windows 11 x64
Model: grok-4.5

Summary

When the total number of advertised tools exceeds 350, requests to grok-4.5 fail with HTTP 400 Bad Request.

Copilot CLI does not enforce or report the tool count limit before making the API call.

Steps to Reproduce
  1. Use a test MCP configuration with no other user/plugin MCP servers enabled, so they do not add to the count.
  2. Save schema-repro.mjs, grok-350.json, and grok-351.json from the Reproducer files section below in the same directory. Node.js must be available.
  3. From that directory, run these native Copilot commands:
copilot --model grok-4.5 --no-custom-instructions --disable-builtin-mcps --disable-mcp-server computer-use --additional-mcp-config "@grok-350.json" --available-tools "mcp:*" --allow-all-tools -p "Reply with exactly OK. Do not call tools."
copilot --model grok-4.5 --no-custom-instructions --disable-builtin-mcps --disable-mcp-server computer-use --additional-mcp-config "@grok-351.json" --available-tools "mcp:*" --allow-all-tools -p "Reply with exactly OK. Do not call tools."

The fixture tools have unique names and identical simple schemas. mcp:* excludes native CLI tools; the MCP-only precondition isolates the fixture's 350/351 count. There is no SDK dependency or shell helper.

Actual Behaviour

With 350 tools:

  • Request succeeds with exit code 0.

With 351 tools:

  • Request immediately fails with:
Execution failed: 400 Bad Request (Request ID: ...)

Comparison:

Tool Count Model Result
350 tools grok-4.5 OK (exit 0)
351 tools grok-4.5 HTTP 400 (exit 1)

The debug tool-surface records confirm exactly 350 and 351 advertised tools for these two runs.

Expected Behaviour

Copilot CLI should track provider-specific limits:

  1. Enforce a tool count budget before sending the request.
  2. If tool count exceeds 350 for Grok, report an actionable error explaining that the active tool count (351) exceeds Grok's maximum limit of 350 tools.
  3. Alternatively, defer tools via tool search rather than sending the entire catalog upfront.
Notes
  • Tested with inert synthetic tools with identical simple schemas ({"type":"object","properties":{"value":{"type":"string"}}}).
  • The issue is purely triggered by the total number of advertised tools, regardless of whether tools are actually invoked by the model.
Impact

Users with multiple MCP servers easily exceed 350 tools in aggregate (native + MCP tools), causing Grok to become completely unusable across the entire session with an unhelpful 400 error.

Reproducer files
schema-repro.mjs
import { createInterface } from 'node:readline';

const mode = process.argv[2];
const count = Number(process.argv[3] ?? 1);
const allowedModes = ['array-enum-bad', 'array-enum-fixed', 'count'];

if (!allowedModes.includes(mode) ||
    !Number.isInteger(count) ||
    count < 1 ||
    count > 400) {
  throw new Error('Usage: node schema-repro.mjs array-enum-bad|array-enum-fixed|count [1..400]');
}

const levels = { type: ['array', 'null'], items: { type: 'integer' } };
if (mode === 'array-enum-bad') {
  levels.enum = [0, 1, 2, 3, 4, 25];
} else {
  levels.items.enum = [0, 1, 2, 3, 4, 25];
}

const tools = Array.from({ length: mode === 'count' ? count : 1 }, (_, index) => ({
  name: `probe_${String(index).padStart(3, '0')}`,
  description: 'Schema diagnostic only; performs no operation.',
  inputSchema: {
    type: 'object',
    properties: mode === 'count' ? { value: { type: 'string' } } : { levels },
  },
}));

for await (const line of createInterface({ input: process.stdin, crlfDelay: Infinity })) {
  if (!line.trim()) {
    continue;
  }
  const request = JSON.parse(line);
  if (request.id === undefined) {
    continue;
  }

  let result;
  if (request.method === 'initialize') {
    result = {
      protocolVersion: request.params.protocolVersion,
      capabilities: { tools: {} },
      serverInfo: { name: 'schema-repro', version: '1.0.0' },
    };
  } else if (request.method === 'tools/list') {
    result = { tools };
  } else if (request.method === 'tools/call') {
    result = {
      isError: true,
      content: [{ type: 'text', text: 'This diagnostic never executes an operation.' }],
    };
  } else if (request.method === 'ping') {
    result = {};
  } else {
    process.stdout.write(`${JSON.stringify({
      jsonrpc: '2.0',
      id: request.id,
      error: { code: -32601, message: 'Method not found' },
    })}\n`);
    continue;
  }

  process.stdout.write(`${JSON.stringify({ jsonrpc: '2.0', id: request.id, result })}\n`);
}
grok-350.json
{
  "mcpServers": {
    "schema_repro": {
      "type": "stdio",
      "command": "node",
      "args": ["schema-repro.mjs", "count", "350"],
      "tools": ["*"]
    }
  }
}
grok-351.json
{
  "mcpServers": {
    "schema_repro": {
      "type": "stdio",
      "command": "node",
      "args": ["schema-repro.mjs", "count", "351"],
      "tools": ["*"]
    }
  }
}

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par exécuter les deux commandes natives de Copilot avec grok-350.json et grok-351.json, en utilisant schema-repro.mjs pour confirmer les nombres d’outils isolés. Suivez le chemin de la requête CLI qui construit la liste d’outils annoncée et gère la réponse de Grok ; le travail est terminé lorsque 350 outils fonctionnent toujours et que 351 produit une erreur de limite exploitable avant la requête HTTP.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
node.js
Domaine
api, cli
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Active
Clarté
Plutôt claire
Accessibilité débutants
50/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.