What happens if…
Failures, refunds, limits and going live with AI tools: what Gemmein does and what you do.
| If… | What happens | What you do |
|---|---|---|
| The provider fails before its first byte, with an error or no answer | The person gets the tool's full price back. The response carries x-gemmein-credit: refunded and the provider's own status | Nothing; the person can retry |
| A stream stops mid-answer, or the person hangs up | No refund: the request is already on your provider bill | Nothing |
| The person has fewer credits than the tool costs | 402 credits_exhausted, naming the tool, its price and their balance. The provider is never called | Show the credit pack |
| One person makes more than 20 calls in a minute | The next call answers 429 ai_capped with resetAt and spends nothing. The limit is per person; other people are unaffected | Wait for resetAt |
| You create a tool before pasting its provider key | The tool saves, and the AI page shows it waiting on a key. Calls answer ai_not_configured until the key is there | Paste the key on the AI page |
| A tool requires a plan the person lacks | 403 entitlement_required, naming the plan. If that plan was deleted, the person reads a neutral sentence and your Logs row keeps the detail | Sell or grant the plan |
| You delete a tool | Calls naming it answer 404 unknown_tool and spend nothing. Runs already open still end, failed, with their holds returned | Nothing |
| A call is refused in Live | The person reads a neutral sentence. Your Logs row names who, which tool and why, and Errors groups it | Read the Logs row |
| A provider meters more than the tool's ceiling | The run is charged its hold, never more | Raise bounds.maxUnits if the ceiling is too low |
| The provider is busy (429) or down (5xx) while a run is in progress | Gemmein checks again later, until the run's deadline. A job is never submitted twice | Nothing |
| The provider refuses or fails the submit itself | The run fails, says why and returns its hold. It is not sent again | Start a new run |
A run is still open 60 minutes after it started (or its own deadlineMinutes) | It ends expired, its hold returned, and the provider is told to stop | Nothing |
| The person cancels a run | It ends cancelled, its hold returned, and the provider is told. A second cancel answers 409 run_ended | Nothing |
| Your pipeline answers the hand-off with a 4xx other than 408 or 429 | The run fails and its hold is returned. Any other failure is retried, with the same run.id, until the deadline | Fix the URL or the pipeline |
| A person hands a tool a kind of file it does not tick | 400 input_not_accepted, naming the kinds it takes. Nothing is spent | Send a kind it takes, or tick the kind on the AI page |
| The tool's model does not read that kind (an alias was repointed) | 409 input_not_supported. Nothing is spent | Pick a model that reads it, or untick the kind |
| The file is bigger than the tool's, the provider's or the platform's limit | 413 input_too_large, naming the limit. Nothing is spent | Send a smaller file |
| The file is sealed and belongs to someone else, or was deleted | 400 invalid_inputs: file not found. Nothing is spent | Send a ref of a file this person uploaded |
| A person sends a second large file while their first is still streaming to the provider | A chat tool answers 429 input_busy and spends nothing. A run waits and tries again | Retry when the first finishes |
| A tool that takes files costs more than the person holds | 402 credits_exhausted, before any file is read | Show the credit pack |
| A tool charged per token ticks a file kind | Refused at gemmein dev, gemmein sync and on the AI page: a tool that takes files is priced per run | Set a credit price per call |
| Your app's storage is full (on Live, past its tier's grace: the lesser of 10% over or 7 days; in Development, past twice its cap) | Uploads are refused with 429 usage_limit_exceeded and a clear message. Files already stored stay, and runs on them keep working | Delete files, add a 50 GB storage pack under Usage, or move the app up a tier |
| The provider refuses the file | A chat tool answers 502 input_rejected and spends nothing. A run fails with the provider's sentence and returns its hold | Check the file, then retry |
A hand-off reaches g.pipelines.handle with the wrong secret, an altered body or an old timestamp | Refused before your function runs. The same run.id delivered twice runs your function once; a function that throws fails the run and returns its hold | Check the pipeline secret |
Was this page helpful?
Thanks for telling us.
Thanks for telling us.
Last updated