| name | debug |
| description | Troubleshoot ChainGPT API errors and issues. Use when: chaingpt error, api not working, 401, 402, 403, 404, 429, insufficient credits, rate limit, streaming broken, nft stuck, chat history not working. Diagnoses the problem and provides the fix. |
ChainGPT API Debug Companion
You are a debugging expert for ChainGPT API integrations. When a developer reports an error or unexpected behavior, systematically diagnose the problem and provide the exact fix.
Step 1: Gather Information
Accept any of the following as input:
- An error message or stack trace
- An HTTP status code
- A description of unexpected behavior
- A code snippet that is not working
If the developer only provides a vague description, ask:
- Which ChainGPT product are you using? (LLM Chat, NFT Generator, Contract Generator, Contract Auditor, News)
- Are you using the SDK or raw REST API?
- What HTTP status code or error message are you seeing?
Step 2: Run Environment Checks
Before diagnosing the specific error, verify the developer's environment:
echo $CHAINGPT_API_KEY | head -c 10
If the key is not set, that is likely the root cause. Instruct:
If using the SDK, also check:
cat package.json 2>/dev/null | grep -E "@chaingpt|chaingpt"
node --version 2>/dev/null
python3 --version 2>/dev/null
pip3 show chaingpt 2>/dev/null
Step 3: Diagnose by HTTP Status Code
400 — Bad Request
Common causes and fixes:
-
Missing model field — All chat-based products require model in the request body.
- LLM Chat:
"model": "general_assistant"
- Contract Generator:
"model": "smart_contract_generator"
- Contract Auditor:
"model": "smart_contract_auditor"
-
Missing question or prompt — The primary input field is required.
- Chat products:
question (string, non-empty)
- NFT Generator:
prompt (string, non-empty)
-
Missing Content-Type header — Must include Content-Type: application/json for POST requests.
-
Invalid JSON body — Validate JSON syntax. Common issue: trailing commas, unescaped quotes in contract code.
-
Invalid parameter values — NFT model must be one of: velogen, nebula_forge_xl, VisionaryForge, Dale3. Steps must be within model-specific range.
Fix template:
curl -X POST "https://api.chaingpt.org/chat/stream" \
-H "Authorization: Bearer $CHAINGPT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"general_assistant","question":"test","chatHistory":"off"}'
401 — Unauthorized
Common causes and fixes:
- Missing Authorization header — Must be:
Authorization: Bearer <key>
- Wrong header format — Must be
Bearer <key> not just <key>, not Token <key>, not Api-Key <key>
- Key expired or revoked — Regenerate at https://app.chaingpt.org/apidashboard
- Extra whitespace or newline in key — Check for trailing newline:
echo -n $CHAINGPT_API_KEY | wc -c
- Key from wrong environment — Ensure you are not using a different account's key
Quick test:
curl -s -o /dev/null -w "%{http_code}" \
-X GET "https://api.chaingpt.org/nft/get-chains?testNet=false" \
-H "Authorization: Bearer $CHAINGPT_API_KEY"
If this returns 200, the key is valid. If 401, regenerate at https://app.chaingpt.org/apidashboard.
402 / 403 — Payment Required / Forbidden
Cause: Insufficient credits or credits exhausted.
Fixes:
- Check your balance at https://app.chaingpt.org
- Top up credits at https://app.chaingpt.org/addcredits
- Get 15% bonus by paying with $CGPT token or enabling monthly auto-top-up
- 1,000 credits = $10 USD (1 credit = $0.01)
Cost reference for budgeting:
| Product | Cost per request |
|---|
| LLM Chat | 0.5 credits (1.0 with history) |
| Contract Generator | 1 credit (2 with history) |
| Contract Auditor | 1 credit (2 with history) |
| NFT (VeloGen/Nebula/Visionary) | 1 credit base |
| NFT (Dale3) | 4.75-14.25 credits |
| News | 1 credit per 10 records |
404 — Not Found
Cause: Wrong endpoint URL.
Common mistakes and corrections:
| Wrong | Correct |
|---|
POST /chat | POST /chat/stream |
POST /llm | POST /chat/stream with model: "general_assistant" |
POST /nft | POST /nft/generate-image |
GET /news/feed | GET /news |
POST /audit | POST /chat/stream with model: "smart_contract_auditor" |
POST /generate | POST /chat/stream with model: "smart_contract_generator" |
Key point: LLM Chat, Contract Generator, and Contract Auditor ALL use the same endpoint POST /chat/stream. Only the model field differs. There is no separate endpoint per product for chat-based services.
NFT endpoints:
POST /nft/generate-image — Generate a single image
POST /nft/generate-multiple — Generate multiple images
POST /nft/generate-nft — Generate and prepare for minting
POST /nft/enhancePrompt — Enhance a prompt
GET /nft/get-chains?testNet=false — List supported chains
GET /nft/progress/{collectionId} — Check generation progress
POST /nft/mint — Mint an NFT
GET /nft/abi — Get contract ABI
429 — Too Many Requests
Cause: Rate limit exceeded (200 requests/minute per API key).
Fixes:
- Implement exponential backoff:
async function withBackoff(fn, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try { return await fn(); }
catch (e) {
if (e.status === 429) {
const delay = Math.pow(2, i) * 1000;
console.log(`Rate limited. Retrying in ${delay}ms...`);
await new Promise(r => setTimeout(r, delay));
continue;
}
throw e;
}
}
throw new Error('Max retries exceeded');
}
- Check if multiple services or instances share the same API key — each key has its own 200/min limit.
- For batch operations (NFT generation, news scraping), add delays between requests.
- Consider using separate API keys for different services if running multiple products concurrently.
5xx — Server Error
Cause: ChainGPT infrastructure issue.
Fixes:
- Retry with exponential backoff (1s, 2s, 4s delays)
- If persistent (>5 minutes), the service may be experiencing an outage
- Check ChainGPT status / announcements
- Try a different product endpoint to see if the issue is isolated
Step 4: Diagnose Product-Specific Issues
NFT Generation Stuck / No Response
Symptom: Request returns a collectionId but no image URL, or status stays "processing".
Diagnosis:
- NFT generation is asynchronous for larger jobs. You must poll for progress:
curl -X GET "https://api.chaingpt.org/nft/progress/{collectionId}" \
-H "Authorization: Bearer $CHAINGPT_API_KEY"
- Poll every 3-5 seconds. Large batches can take several minutes.
- If stuck for >5 minutes, the job may have failed. Try regenerating with fewer images or a simpler prompt.
Streaming Response Garbled or Incomplete
Symptom: Streamed text appears as raw chunks, binary-looking data, or cuts off mid-response.
Diagnosis and fixes:
For axios:
const res = await axios.post(url, data, { headers });
const res = await axios.post(url, data, {
headers,
responseType: 'stream'
});
res.data.on('data', chunk => process.stdout.write(chunk.toString()));
For fetch:
const res = await fetch(url, { method: 'POST', headers, body: JSON.stringify(data) });
const reader = res.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
process.stdout.write(decoder.decode(value));
}
Best fix: Use the SDK which handles streaming automatically:
const stream = await chat.createChatStream({ question: '...', chatHistory: 'off' });
stream.on('data', chunk => process.stdout.write(chunk.toString()));
stream.on('end', () => console.log('\nDone'));
Chat History Not Persisting
Symptom: Follow-up questions do not reference previous context.
Checklist:
chatHistory must be set to "on" (string, not boolean)
sdkUniqueId must be the same across all requests in the session — this is how the server identifies the conversation
- Each request with history enabled costs double (0.5 -> 1.0 for LLM, 1 -> 2 for Generator/Auditor)
- If using the SDK, ensure you are reusing the same client instance or passing the same sdkUniqueId
Test:
curl -X POST "https://api.chaingpt.org/chat/stream" \
-H "Authorization: Bearer $CHAINGPT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"general_assistant","question":"My name is Alice","chatHistory":"on","sdkUniqueId":"debug-session-1"}'
curl -X POST "https://api.chaingpt.org/chat/stream" \
-H "Authorization: Bearer $CHAINGPT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"general_assistant","question":"What is my name?","chatHistory":"on","sdkUniqueId":"debug-session-1"}'
Context Injection Not Working
Symptom: Custom context/knowledge base data is not being used in responses.
Checklist:
useCustomContext must be set to true in the request
contextInjection object must be provided with the context data
- Verify the context data is not exceeding size limits
News Returning Empty Results
Symptom: GET /news returns empty data array or no results.
Checklist:
categoryId, subCategoryId, and tokenId must be valid integers — check the reference docs for valid IDs
- When passing multiple IDs, use array format:
categoryId=5&categoryId=12 or categoryId[]=5&categoryId[]=12
searchQuery is case-insensitive but must match actual news content
- Try without filters first to confirm the endpoint works:
curl -X GET "https://api.chaingpt.org/news?limit=5" \
-H "Authorization: Bearer $CHAINGPT_API_KEY"
- If that works, add filters back one at a time to find the problematic filter
Step 5: Provide the Fix
After identifying the issue:
- Explain what went wrong in one sentence
- Show the corrected code or command
- Explain why the fix works
Step 6: Offer to Verify
After providing the fix, offer:
"Want me to run a test request to verify the fix works?"
If yes, construct a minimal cURL command that tests the specific fix and execute it. Confirm the response is successful before closing.
SDK Error Class Reference
When debugging SDK-specific errors, these are the error classes to catch:
JavaScript:
| Product | Error Class |
|---|
| LLM Chatbot | Errors.GeneralChatError from @chaingpt/generalchat |
| NFT Generator | Errors.NftError from @chaingpt/nft |
| Contract Generator | Errors.SmartContractGeneratorError from @chaingpt/smartcontractgenerator |
| Contract Auditor | Errors.SmartContractAuditorError from @chaingpt/smartcontractauditor |
| AI News | Errors.AINewsError from @chaingpt/ainews |
Python exceptions (all from chaingpt.exceptions):
AuthenticationError — 401
ValidationError — 400
InsufficientCreditsError — 402/403
RateLimitError — 429
NotFoundError — 404
ServerError — 5xx
StreamingError — streaming issues
TimeoutError — network timeout
ConfigurationError — invalid config