{
  "error": {
    "message": "{\"error\":{\"message\":\"{\\n  \\\"error\\\": {\\n    \\\"code\\\": 403,\\n    \\\"message\\\": \\\"Your API key was reported as leaked. Please use another API key.\\\",\\n    \\\"status\\\": \\\"PERMISSION_DENIED\\\"\\n  }\\n}\\n\",\"code\":403,\"status\":\"Forbidden\"}}",
    "stack": "ApiError: {\"error\":{\"message\":\"{\\n  \\\"error\\\": {\\n    \\\"code\\\": 403,\\n    \\\"message\\\": \\\"Your API key was reported as leaked. Please use another API key.\\\",\\n    \\\"status\\\": \\\"PERMISSION_DENIED\\\"\\n  }\\n}\\n\",\"code\":403,\"status\":\"Forbidden\"}}\n    at throwErrorIfNotOK (file:///home/claude/.npm-global/lib/node_modules/@google/gemini-cli/bundle/chunk-67TFD6HC.js:36178:24)\n    at process.processTicksAndRejections (node:internal/process/task_queues:103:5)\n    at async file:///home/claude/.npm-global/lib/node_modules/@google/gemini-cli/bundle/chunk-67TFD6HC.js:35941:7\n    at async Models.generateContentStream (file:///home/claude/.npm-global/lib/node_modules/@google/gemini-cli/bundle/chunk-67TFD6HC.js:37037:16)\n    at async file:///home/claude/.npm-global/lib/node_modules/@google/gemini-cli/bundle/chunk-UQGLVPZQ.js:278827:19\n    at async file:///home/claude/.npm-global/lib/node_modules/@google/gemini-cli/bundle/chunk-UQGLVPZQ.js:255732:23\n    at async retryWithBackoff (file:///home/claude/.npm-global/lib/node_modules/@google/gemini-cli/bundle/chunk-UQGLVPZQ.js:275704:23)\n    at async GeminiChat.makeApiCallAndProcessStream (file:///home/claude/.npm-global/lib/node_modules/@google/gemini-cli/bundle/chunk-UQGLVPZQ.js:311287:28)\n    at async GeminiChat.streamWithRetries (file:///home/claude/.npm-global/lib/node_modules/@google/gemini-cli/bundle/chunk-UQGLVPZQ.js:311125:29)\n    at async Turn.run (file:///home/claude/.npm-global/lib/node_modules/@google/gemini-cli/bundle/chunk-UQGLVPZQ.js:311618:24)"
  },
  "context": [
    {
      "role": "user",
      "parts": [
        {
          "text": "<session_context>\nThis is the Gemini CLI. We are setting up the context for our chat.\nToday's date is Wednesday, June 24, 2026 (formatted according to the user's locale).\nMy operating system is: linux\nThe project's temporary directory is: /home/claude/.gemini/tmp/pr-review-mdqr7a\n- **Workspace Directories:**\n  - /tmp/pr-review-MDQR7A\n- **Directory Structure:**\n\nShowing up to 200 items (files + folders).\n\n/tmp/pr-review-MDQR7A/\n\n\n\n</session_context>"
        }
      ]
    },
    {
      "role": "user",
      "parts": [
        {
          "text": "You are a dedicated code reviewer for this repository. You are deeply familiar with its conventions and codebase.\n\n## Project Conventions (from CLAUDE.md)\n## gstack (REQUIRED — global install)\n\n**Before doing ANY work, verify gstack is installed:**\n\n```bash\ntest -d ~/.claude/skills/gstack/bin && echo \"GSTACK_OK\" || echo \"GSTACK_MISSING\"\n```\n\nIf GSTACK_MISSING: STOP. Do not proceed. Tell the user:\n\n> gstack is required for all AI-assisted work in this repo.\n> Install it:\n> ```bash\n> git clone --depth 1 https://github.com/garrytan/gstack.git ~/.claude/skills/gstack\n> cd ~/.claude/skills/gstack && ./setup --team\n> ```\n> Then restart your AI coding tool.\n\nDo not skip skills, ignore gstack errors, or work around missing gstack.\n\nUsing gstack skills: After install, skills like /qa, /ship, /review, /investigate,\nand /browse are available. Use /browse for all web browsing.\nUse ~/.claude/skills/gstack/... for gstack file paths (the global path).\n\n\n## Review Task\n\nPR #29: \"test(ai): update generated model fixture ids\"\n\nDescription:\n## Summary\n\n- Update AI provider test fixtures to use current generated model IDs, including `github-copilot/gpt-5.5`.\n- Keep generated model metadata unchanged in this PR.\n\n## Validation\n\n- `npm ci --ignore-scripts`\n- `node packages/ai/scripts/generate-models.ts && npm run check`\n- `git restore -- packages/ai/src/models.generated.ts && npm run check`\n- `PI_NO_LOCAL_LLM=1 node ../../node_modules/vitest/dist/cli.js --run test/context-overflow.test.ts test/empty.test.ts test/image-tool-result.test.ts test/tokens.test.ts test/tool-call-without-result.test.ts test/total-tokens.test.ts test/unicode-surrogate.test.ts`\n- `grep -rn 'getModel(\"github-copilot\", \"gpt-4o\\|github-copilot.*gpt-4o' packages/ai/test || true` returned no matches\n- `grep -rn 'getModel(\"github-copilot\", \"gpt-4\\.1\\|github-copilot.*gpt-4\\.1' packages/ai/test || true` returned no matches\n- `grep -rn 'gemini-2\\.0-flash-001' packages/ai/test || true` returned no matches\n\n## Notes\n\n- The OpenRouter total-token fixture moved from `google/gemini-2.0-flash-001` to `google/gemini-2.5-flash`; the affected `total-tokens.test.ts` case was included in the targeted rerun above.\n- The first affected-test run was interrupted after `context-overflow.test.ts` attempted to pull the 13 GB `gpt-oss:20b` Ollama model from a local Ollama server. The rerun set `PI_NO_LOCAL_LLM=1`, which is the existing test guard for local LLM cases.\n- `packages/coding-agent/docs/images/interactive-mode.png` appeared modified in the fresh clone and was left unstaged.\n\n\nReview the diff below. Provide your response as a JSON object with these keys:\n- \"summary\": a concise markdown summary. Tag issues with severity: [blocking] for must-fix, [suggestion] for improvements, [nitpick] for style.\n- \"comments\": array of { \"path\", \"line\", \"body\" } — inline review comments with severity tags\n- \"verdict\": \"approve\" (no blocking issues) or \"request_changes\" (blocking issues found)\n- \"workflow_suggestions\": array of strings — suggestions for improving the development workflow (e.g., \"Consider splitting this PR\", \"Add a pre-commit hook for X\")\n\nFocus on meaningful issues: bugs, security, performance, correctness. Skip trivial style nits.\nReturn ONLY valid JSON, no markdown fences.\n\nDiff:\n```diff\nFile: packages/ai/test/context-overflow.test.ts (modified, +2/-2)\n@@ -126,9 +126,9 @@ describe(\"Context overflow error handling\", () => {\n \tdescribe(\"GitHub Copilot (OAuth)\", () => {\n \t\t// OpenAI model via Copilot\n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should detect overflow via isContextOverflow\",\n+\t\t\t\"gpt-5.5 - should detect overflow via isContextOverflow\",\n \t\t\tasync () => {\n-\t\t\t\tconst model = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst model = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tconst result = await testContextOverflow(model, githubCopilotToken!);\n \t\t\t\tlogResult(result);\n \n\nFile: packages/ai/test/empty.test.ts (modified, +8/-8)\n@@ -630,37 +630,37 @@ describe(\"AI Providers Empty Message Tests\", () => {\n \n \tdescribe(\"GitHub Copilot Provider Empty Messages\", () => {\n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle empty content array\",\n+\t\t\t\"gpt-5.5 - should handle empty content array\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testEmptyMessage(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n \n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle empty string content\",\n+\t\t\t\"gpt-5.5 - should handle empty string content\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testEmptyStringMessage(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n \n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle whitespace-only content\",\n+\t\t\t\"gpt-5.5 - should handle whitespace-only content\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testWhitespaceOnlyMessage(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n \n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle empty assistant message in conversation\",\n+\t\t\t\"gpt-5.5 - should handle empty assistant message in conversation\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testEmptyAssistantMessage(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n\nFile: packages/ai/test/image-tool-result.test.ts (modified, +4/-4)\n@@ -443,19 +443,19 @@ describe(\"Tool Results with Images\", () => {\n \n \tdescribe(\"GitHub Copilot Provider\", () => {\n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle tool result with only image\",\n+\t\t\t\"gpt-5.5 - should handle tool result with only image\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait handleToolWithImageResult(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n \n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle tool result with text and image\",\n+\t\t\t\"gpt-5.5 - should handle tool result with text and image\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait handleToolWithTextAndImageResult(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n\nFile: packages/ai/test/tokens.test.ts (modified, +2/-2)\n@@ -289,10 +289,10 @@ describe(\"Token Statistics on Abort\", () => {\n \n \tdescribe(\"GitHub Copilot Provider\", () => {\n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should include token stats when aborted mid-stream\",\n+\t\t\t\"gpt-5.5 - should include token stats when aborted mid-stream\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testTokensOnAbort(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n\nFile: packages/ai/test/tool-call-without-result.test.ts (modified, +2/-2)\n@@ -297,10 +297,10 @@ describe(\"Tool Call Without Result Tests\", () => {\n \n \tdescribe(\"GitHub Copilot Provider\", () => {\n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should filter out tool calls without corresponding tool results\",\n+\t\t\t\"gpt-5.5 - should filter out tool calls without corresponding tool results\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst model = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst model = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testToolCallWithoutResult(model, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n\nFile: packages/ai/test/total-tokens.test.ts (modified, +4/-4)\n@@ -666,10 +666,10 @@ describe(\"totalTokens field\", () => {\n \t\t);\n \n \t\tit(\n-\t\t\t\"google/gemini-2.0-flash-001 - should return totalTokens equal to sum of components\",\n+\t\t\t\"google/gemini-2.5-flash - should return totalTokens equal to sum of components\",\n \t\t\t{ retry: 3, timeout: 60000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"openrouter\", \"google/gemini-2.0-flash-001\");\n+\t\t\t\tconst llm = getModel(\"openrouter\", \"google/gemini-2.5-flash\");\n \n \t\t\t\tconsole.log(`\\nOpenRouter / ${llm.id}:`);\n \t\t\t\tconst { first, second } = await testTotalTokensWithCache(llm, { apiKey: process.env.OPENROUTER_API_KEY });\n@@ -706,10 +706,10 @@ describe(\"totalTokens field\", () => {\n \n \tdescribe(\"GitHub Copilot (OAuth)\", () => {\n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should return totalTokens equal to sum of components\",\n+\t\t\t\"gpt-5.5 - should return totalTokens equal to sum of components\",\n \t\t\t{ retry: 3, timeout: 60000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \n \t\t\t\tconsole.log(`\\nGitHub Copilot / ${llm.id}:`);\n \t\t\t\tconst { first, second } = await testTotalTokensWithCache(llm, { apiKey: githubCopilotToken });\n\nFile: packages/ai/test/unicode-surrogate.test.ts (modified, +6/-6)\n@@ -396,28 +396,28 @@ describe(\"AI Providers Unicode Surrogate Pair Tests\", () => {\n \n \tdescribe(\"GitHub Copilot Provider Unicode Handling\", () => {\n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle emoji in tool results\",\n+\t\t\t\"gpt-5.5 - should handle emoji in tool results\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testEmojiInToolResults(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n \n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle real-world LinkedIn comment data with emoji\",\n+\t\t\t\"gpt-5.5 - should handle real-world LinkedIn comment data with emoji\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testRealWorldLinkedInData(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n \n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle unpaired high surrogate (0xD83D) in tool results\",\n+\t\t\t\"gpt-5.5 - should handle unpaired high surrogate (0xD83D) in tool results\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testUnpairedHighSurrogate(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n```\n\n-"
        }
      ]
    },
    {
      "role": "user",
      "parts": [
        {
          "text": "You are a dedicated code reviewer for this repository. You are deeply familiar with its conventions and codebase.\n\n## Project Conventions (from CLAUDE.md)\n## gstack (REQUIRED — global install)\n\n**Before doing ANY work, verify gstack is installed:**\n\n```bash\ntest -d ~/.claude/skills/gstack/bin && echo \"GSTACK_OK\" || echo \"GSTACK_MISSING\"\n```\n\nIf GSTACK_MISSING: STOP. Do not proceed. Tell the user:\n\n> gstack is required for all AI-assisted work in this repo.\n> Install it:\n> ```bash\n> git clone --depth 1 https://github.com/garrytan/gstack.git ~/.claude/skills/gstack\n> cd ~/.claude/skills/gstack && ./setup --team\n> ```\n> Then restart your AI coding tool.\n\nDo not skip skills, ignore gstack errors, or work around missing gstack.\n\nUsing gstack skills: After install, skills like /qa, /ship, /review, /investigate,\nand /browse are available. Use /browse for all web browsing.\nUse ~/.claude/skills/gstack/... for gstack file paths (the global path).\n\n\n## Review Task\n\nPR #29: \"test(ai): update generated model fixture ids\"\n\nDescription:\n## Summary\n\n- Update AI provider test fixtures to use current generated model IDs, including `github-copilot/gpt-5.5`.\n- Keep generated model metadata unchanged in this PR.\n\n## Validation\n\n- `npm ci --ignore-scripts`\n- `node packages/ai/scripts/generate-models.ts && npm run check`\n- `git restore -- packages/ai/src/models.generated.ts && npm run check`\n- `PI_NO_LOCAL_LLM=1 node ../../node_modules/vitest/dist/cli.js --run test/context-overflow.test.ts test/empty.test.ts test/image-tool-result.test.ts test/tokens.test.ts test/tool-call-without-result.test.ts test/total-tokens.test.ts test/unicode-surrogate.test.ts`\n- `grep -rn 'getModel(\"github-copilot\", \"gpt-4o\\|github-copilot.*gpt-4o' packages/ai/test || true` returned no matches\n- `grep -rn 'getModel(\"github-copilot\", \"gpt-4\\.1\\|github-copilot.*gpt-4\\.1' packages/ai/test || true` returned no matches\n- `grep -rn 'gemini-2\\.0-flash-001' packages/ai/test || true` returned no matches\n\n## Notes\n\n- The OpenRouter total-token fixture moved from `google/gemini-2.0-flash-001` to `google/gemini-2.5-flash`; the affected `total-tokens.test.ts` case was included in the targeted rerun above.\n- The first affected-test run was interrupted after `context-overflow.test.ts` attempted to pull the 13 GB `gpt-oss:20b` Ollama model from a local Ollama server. The rerun set `PI_NO_LOCAL_LLM=1`, which is the existing test guard for local LLM cases.\n- `packages/coding-agent/docs/images/interactive-mode.png` appeared modified in the fresh clone and was left unstaged.\n\n\nReview the diff below. Provide your response as a JSON object with these keys:\n- \"summary\": a concise markdown summary. Tag issues with severity: [blocking] for must-fix, [suggestion] for improvements, [nitpick] for style.\n- \"comments\": array of { \"path\", \"line\", \"body\" } — inline review comments with severity tags\n- \"verdict\": \"approve\" (no blocking issues) or \"request_changes\" (blocking issues found)\n- \"workflow_suggestions\": array of strings — suggestions for improving the development workflow (e.g., \"Consider splitting this PR\", \"Add a pre-commit hook for X\")\n\nFocus on meaningful issues: bugs, security, performance, correctness. Skip trivial style nits.\nReturn ONLY valid JSON, no markdown fences.\n\nDiff:\n```diff\nFile: packages/ai/test/context-overflow.test.ts (modified, +2/-2)\n@@ -126,9 +126,9 @@ describe(\"Context overflow error handling\", () => {\n \tdescribe(\"GitHub Copilot (OAuth)\", () => {\n \t\t// OpenAI model via Copilot\n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should detect overflow via isContextOverflow\",\n+\t\t\t\"gpt-5.5 - should detect overflow via isContextOverflow\",\n \t\t\tasync () => {\n-\t\t\t\tconst model = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst model = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tconst result = await testContextOverflow(model, githubCopilotToken!);\n \t\t\t\tlogResult(result);\n \n\nFile: packages/ai/test/empty.test.ts (modified, +8/-8)\n@@ -630,37 +630,37 @@ describe(\"AI Providers Empty Message Tests\", () => {\n \n \tdescribe(\"GitHub Copilot Provider Empty Messages\", () => {\n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle empty content array\",\n+\t\t\t\"gpt-5.5 - should handle empty content array\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testEmptyMessage(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n \n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle empty string content\",\n+\t\t\t\"gpt-5.5 - should handle empty string content\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testEmptyStringMessage(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n \n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle whitespace-only content\",\n+\t\t\t\"gpt-5.5 - should handle whitespace-only content\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testWhitespaceOnlyMessage(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n \n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle empty assistant message in conversation\",\n+\t\t\t\"gpt-5.5 - should handle empty assistant message in conversation\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testEmptyAssistantMessage(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n\nFile: packages/ai/test/image-tool-result.test.ts (modified, +4/-4)\n@@ -443,19 +443,19 @@ describe(\"Tool Results with Images\", () => {\n \n \tdescribe(\"GitHub Copilot Provider\", () => {\n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle tool result with only image\",\n+\t\t\t\"gpt-5.5 - should handle tool result with only image\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait handleToolWithImageResult(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n \n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle tool result with text and image\",\n+\t\t\t\"gpt-5.5 - should handle tool result with text and image\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait handleToolWithTextAndImageResult(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n\nFile: packages/ai/test/tokens.test.ts (modified, +2/-2)\n@@ -289,10 +289,10 @@ describe(\"Token Statistics on Abort\", () => {\n \n \tdescribe(\"GitHub Copilot Provider\", () => {\n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should include token stats when aborted mid-stream\",\n+\t\t\t\"gpt-5.5 - should include token stats when aborted mid-stream\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testTokensOnAbort(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n\nFile: packages/ai/test/tool-call-without-result.test.ts (modified, +2/-2)\n@@ -297,10 +297,10 @@ describe(\"Tool Call Without Result Tests\", () => {\n \n \tdescribe(\"GitHub Copilot Provider\", () => {\n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should filter out tool calls without corresponding tool results\",\n+\t\t\t\"gpt-5.5 - should filter out tool calls without corresponding tool results\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst model = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst model = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testToolCallWithoutResult(model, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n\nFile: packages/ai/test/total-tokens.test.ts (modified, +4/-4)\n@@ -666,10 +666,10 @@ describe(\"totalTokens field\", () => {\n \t\t);\n \n \t\tit(\n-\t\t\t\"google/gemini-2.0-flash-001 - should return totalTokens equal to sum of components\",\n+\t\t\t\"google/gemini-2.5-flash - should return totalTokens equal to sum of components\",\n \t\t\t{ retry: 3, timeout: 60000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"openrouter\", \"google/gemini-2.0-flash-001\");\n+\t\t\t\tconst llm = getModel(\"openrouter\", \"google/gemini-2.5-flash\");\n \n \t\t\t\tconsole.log(`\\nOpenRouter / ${llm.id}:`);\n \t\t\t\tconst { first, second } = await testTotalTokensWithCache(llm, { apiKey: process.env.OPENROUTER_API_KEY });\n@@ -706,10 +706,10 @@ describe(\"totalTokens field\", () => {\n \n \tdescribe(\"GitHub Copilot (OAuth)\", () => {\n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should return totalTokens equal to sum of components\",\n+\t\t\t\"gpt-5.5 - should return totalTokens equal to sum of components\",\n \t\t\t{ retry: 3, timeout: 60000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \n \t\t\t\tconsole.log(`\\nGitHub Copilot / ${llm.id}:`);\n \t\t\t\tconst { first, second } = await testTotalTokensWithCache(llm, { apiKey: githubCopilotToken });\n\nFile: packages/ai/test/unicode-surrogate.test.ts (modified, +6/-6)\n@@ -396,28 +396,28 @@ describe(\"AI Providers Unicode Surrogate Pair Tests\", () => {\n \n \tdescribe(\"GitHub Copilot Provider Unicode Handling\", () => {\n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle emoji in tool results\",\n+\t\t\t\"gpt-5.5 - should handle emoji in tool results\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testEmojiInToolResults(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n \n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle real-world LinkedIn comment data with emoji\",\n+\t\t\t\"gpt-5.5 - should handle real-world LinkedIn comment data with emoji\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testRealWorldLinkedInData(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n \n \t\tit.skipIf(!githubCopilotToken)(\n-\t\t\t\"gpt-4o - should handle unpaired high surrogate (0xD83D) in tool results\",\n+\t\t\t\"gpt-5.5 - should handle unpaired high surrogate (0xD83D) in tool results\",\n \t\t\t{ retry: 3, timeout: 30000 },\n \t\t\tasync () => {\n-\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-4o\");\n+\t\t\t\tconst llm = getModel(\"github-copilot\", \"gpt-5.5\");\n \t\t\t\tawait testUnpairedHighSurrogate(llm, { apiKey: githubCopilotToken });\n \t\t\t},\n \t\t);\n```\n\n-"
        }
      ]
    }
  ]
}