How to fix 1024 tokens is not thinking error in Antigravity?

Your model suddenly stops thinking beyond 1024 tokens and long analytical tasks collapse into shallow answers. Here is the fastest way to restore useful depth today.

1024 token thinking cap causes shallow reasoning and failures

Hero
You ask for deep analysis, but outputs stall after a couple of short paragraphs. Logs or audit traces show a server side cap of max thinking length 1024 tokens. You may also see stricter quotas such as about one hour of throughput followed by several hours of cooldown, making professional workflows fail. If you are seeing a not thinking at 1024 style symptom, also check this quick fix guide: practical notes for the 1024 tokens not thinking issue.

Solution Overview

AspectDetail
Root CauseServer enforced reasoning budget cap at 1024 tokens plus tighter rate limits
Primary FixMove reasoning into a client side planner executor loop with chunking and a persistent scratchpad
ComplexityMedium
Estimated Time30 to 60 minutes

Fix the 1024 token cap with a planner executor pattern

CleanShot 2026-03-29 at 16.41.15@2x

Step-by-Step Solution

Step 1 Confirm the cap and measure token budgets Use the token counting endpoint to see how many tokens your prompt consumes and keep your prompts lean. This verifies you are not burning the full budget before the model can reason. Terminal command
export API_KEY="YOUR_API_KEY"
curl -s -X POST \
 "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro:countTokens?key=${API_KEY}" \
 -H "Content-Type: application/json" \
 -d '{
 "contents": [
 {"role": "user","parts": [{"text": "Summarize and analyze this document in depth. <paste small sample here>"}]}
 ]
 }'
If your prompt alone consumes hundreds of tokens, shorten it and use chunking in later steps. See Google token counting reference: Count tokens. Step 2 Force short internal thinking and shift reasoning to multiple passes Ask the model for a compact plan first, then execute each step in separate calls. Persist state on disk so you do not depend on long internal chains. Create a working directory
mkdir -p ./scratchpads
Python planner executor scaffold
import os, time, json, textwrap
import google.generativeai as genai

genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
MODEL = "gemini-1.5-pro"

def call_model(prompt, max_output_tokens=512, temperature=0.2):
 model = genai.GenerativeModel(MODEL)
 return model.generate_content(
 prompt,
 generation_config={"max_output_tokens": max_output_tokens, "temperature": temperature}
 ).text

def make_plan(task):
 prompt = f"""You are a planner. Produce a numbered plan of at most 10 steps.
Keep each step under one sentence and avoid verbose thinking.
Task: {task}
Return only the plan."""
 return call_model(prompt, max_output_tokens=300)

def execute_step(step, context):
 prompt = f"""Task context:
{context}

Current step:
{step}

Instructions:
Provide the minimal reasoning needed and the final result.
Keep the explanation concise."""
 return call_model(prompt, max_output_tokens=700)

def run_task(task, source_text):
 plan = make_plan(task)
 scratchpad_path = "./scratchpads/run1_scratchpad.md"
 with open(scratchpad_path, "w") as f:
 f.write("# Scratchpad\n\n")
 f.write("## Plan\n" + plan + "\n\n")

 context = textwrap.shorten(source_text, width=3000, placeholder=" ...")
 results = []
 for line in plan.splitlines():
 if not line.strip():
 continue
 out = execute_step(line, context)
 results.append({"step": line, "output": out})
 with open(scratchpad_path, "a") as f:
 f.write(f"### {line}\n{out}\n\n")
 time.sleep(0.5)
 final_prompt = "Summarize the results and combine them into a coherent final answer:\n" + json.dumps(results, ensure_ascii=False)[:12000]
 final_answer = call_model(final_prompt, max_output_tokens=900)
 with open(scratchpad_path, "a") as f:
 f.write("## Final Answer\n" + final_answer + "\n")
 return final_answer

if __name__ == "__main__":
 long_text = open("./input.txt", "r", encoding="utf-8").read()
 print(run_task("Analyze risks, tradeoffs, and produce a recommendation", long_text))
This pattern keeps each call within the small internal thinking window but achieves depth through iteration and an external scratchpad at ./scratchpads. Step 3 Chunk long documents with overlap and process map then reduce Chunk the source into smaller parts, process each part, then merge with a final pass. Chunker and map reduce
def chunk_by_words(text, max_words=1200, overlap=100):
 words = text.split()
 i = 0
 chunks = []
 while i < len(words):
 chunk = words[i:i+max_words]
 chunks.append(" ".join(chunk))
 i += max_words - overlap
 return chunks

def analyze_chunk(chunk):
 q = f"Extract key points and risks from this chunk. Be concise:\n{chunk}"
 return call_model(q, max_output_tokens=500)

def summarize_findings(findings):
 joined = "\n\n".join(findings)
 q = f"Merge the bullet points below into a single cohesive analysis with clear recommendations:\n{joined}"
 return call_model(q, max_output_tokens=800)
Step 4 Protect the small budget with strict prompts Send compact instructions and cap verbose outputs so thinking is not wasted. Also request structured outputs to keep token use predictable. Minimal generate call
curl -s -X POST \
 "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro:generateContent?key=${API_KEY}" \
 -H "Content-Type: application/json" \
 -d '{
 "generationConfig": { "max_output_tokens": 512, "temperature": 0.2 },
 "contents": [
 { "role": "user",
 "parts": [
 { "text": "Answer in three short sections Context Findings Recommendation. Keep total under 400 tokens.\n\n<your prompt or chunk here>"}
 ]
 }
 ]
 }'
Step 5 Add resilient backoff to live with the tighter quotas When you hit rate limits or cooldown, retry gracefully with exponential backoff. This keeps your pipeline running without manual babysitting. Python retry wrapper
import requests, time

def post_json(url, payload, headers, retries=6, base_delay=1.0):
 for attempt in range(retries):
 r = requests.post(url, json=payload, headers=headers, timeout=60)
 if r.status_code in (200, 201):
 return r.json()
 if r.status_code in (429, 503):
 delay = base_delay  (2 * attempt)
 time.sleep(delay)
 continue
 r.raise_for_status()
 raise RuntimeError("Exhausted retries")
Reference for building requests: Generate content. For production quotas see Google rate limits and quotas in the service specific docs.

Alternative Fixes and Workarounds

Switch to a tier or model variant with a larger reasoning or context budget If your vendor offers a plan with higher thinking length or a non thinking long context model, swap the model name in configuration and re run your jobs. Validate with token counting first to confirm the larger window. Externalize heavy reasoning to a local model and keep the API for final synthesis Run a small reasoning first pass locally to produce distilled notes, then send those notes to the hosted model for polished output. This reduces thinking pressure on the remote cap. Use batched map reduce workflows For very long documents or corpora, run map steps in parallel workers then reduce with two or more synthesis passes. This is robust under small reasoning caps. Ask support for limit adjustments and document your need Provide task examples, token accounting, and throughput requirements. Some vendors allow case by case increases. If rate related failures look like traffic saturation errors, this guide will help you triage them faster: handling servers under high traffic.

Troubleshooting Tips

  • If outputs stop mid thought, your prompt might be consuming most of the small allowance. Measure prompt tokens first, then trim instructions and examples.
  • Verify you are not in cooldown. Check response headers and error messages for rate limit codes like 429 or 503 and delay accordingly.
  • Keep max output tokens modest to reserve room for brief internal reasoning within the cap.
  • If JSON mode or strict formatting causes truncation, reduce schema verbosity and ask for compact fields only.
  • When switching accounts or projects to regain quota, you may hit eligibility checks. If you encounter account eligibility warnings, see this short explainer: account not eligible fixes.

Best Practices

  • Keep prompts short and specific. Prefer targeted instructions over long context.
  • Always chunk source material and overlap slightly to avoid context gaps.
  • Persist a scratchpad per run at paths like ./scratchpads and merge results deterministically.
  • Budget tokens explicitly. Count tokens before calling the model and after, then log per step.
  • Build backoff and jitter into every client and batch runner.
  • Re validate limits after any plan change or model upgrade.
For a concise checklist tailored to the 1024 token thinking symptom, review this practical note: quick 1024 token thinking checklist.

Final Thought

You cannot remove a server side 1024 thinking cap, but you can work around it effectively. By moving reasoning into a planner executor loop, chunking inputs, and adding resilient retries, you restore depth and reliability for real workloads even under strict limits.

Leave a Comment