Skip to main content

OpenCheese FAQ

/ HELP CENTER
88 results

Getting started

What is OpenCheese AI?

OpenCheese is one place to use many AI models. You add credit to your account, get an API key, and use Claude, GPT, Gemini, DeepSeek and more from the tools you already like, such as OpenCode, Claude Code or Codex. It is one account instead of a separate one for every model. Which models you see depends on your plan and your key.

How does it work, in simple terms?

Add credit to your balance (or pick a plan), create an API key, and put that key into your tool. The Configuration page prepares the settings for you. After that you just work as usual. Each request takes a small amount from your balance, depending on the model and how much text it handled, and the Transactions page shows what every request cost.

What is a token?

A token is a small piece of text, often a bit shorter than a word. AI models read and write in tokens, and that is what usage is measured in. Longer chats and bigger files use more tokens. You never have to count them: Transactions shows how many each request used and what it cost.

How do I sign in? Do I need to register?

There is no separate registration. Sign in with Google, GitHub, Discord, Yandex or Telegram, or with a crypto wallet (MetaMask, Phantom or WalletConnect), and your account is created the first time. You do not need to send documents or verify your identity.

Do I get anything for signing up?

Yes, a small starting balance when you sign in with Google, GitHub, Discord, Yandex or Telegram. It is enough to look around, not to do much work. Signing in with a crypto wallet does not include it. The free models need a little more than that, see "Are there free models?".

Is this an official Claude or ChatGPT subscription?

No. OpenCheese is prepaid credit for AI models that you use through your own tools. It is not a shared account and not someone else's account, and you never log in to Claude or ChatGPT. You use your own OpenCheese account and your own API key.

How do I send my first request?

The easiest way is the Configuration page: pick your tool, pick an API key and copy the ready-made settings. If you write your own code, point it at https://api.opencheese.dev, send your API key, and call /v1/models to see which models you can use. Then pick a model from that list and make a request to /v1/chat/completions, /v1/responses or /v1/messages, depending on what your tool speaks. OpenAI SDKs take https://api.opencheese.dev/v1 as their base URL, Anthropic SDKs https://api.opencheese.dev. The API quickstart has copy-paste examples: https://opencheese.dev/en/docs/

Which host should API requests use?

Always https://api.opencheese.dev. That is a different address from the website at https://opencheese.dev. If a tool points at the website address, it gets a web page back instead of an answer and nothing works.

Where can I find step-by-step setup guides?

In the app, the Configuration page walks you through each tool step by step, in your language. There are also written guides, in English, Russian and German, at https://opencheese.dev/en/docs/ for Claude Code, Claude Desktop, Codex, OpenCode, Harness AI, Zed, VS Code and JetBrains, RikkaHub, Chatbox and LobeHub, and for every API endpoint with curl examples.

Can I read the docs as Markdown?

Yes. Add .md to the address of any docs page, for example https://opencheese.dev/en/docs/sessions.md, and you get the same page as plain Markdown, handy for AI assistants and your own notes. https://opencheese.dev/llms.txt lists every page.

Models, prices and images

Are the models real?

Yes. Every model is the genuine one, served through official providers. There are no swaps and no cheaper stand-ins behind the name.

Which model should I pick?

For big planning and thinking things through, we like Claude Opus 5.5. For doing the work, like writing code and making edits, Claude Sonnet 5.5 is cheaper and plenty fast. Just trying things out? Start with a cheaper model and move up when you need to. The Prices page lists every model with its price, so you can compare.

Are there free models?

Yes. Look for FREE on the Prices page. They cost nothing per request, but you need a small minimum balance in your account first. The sign-up bonus alone falls just short, so one small top-up unlocks them. They are good for simple tasks and for testing your setup.

Can I hide models I do not use?

Yes. On the Prices page you can switch models on or off for your account. Switched-off models disappear from your tools' model list, so the list stays short and tidy. With OpenCode Auto-sync the change arrives by itself.

What does the Rate on the Prices page mean?

It is a model's price in one number: roughly how many dollars you pay per million tokens, averaged over input and output with our discount already applied. x1.000 means one dollar per million tokens, x0.150 means 15 cents, and lower is cheaper. Next to each request in Transactions you see the same kind of number for that request, with caching taken into account.

How far does one dollar go?

It depends on the model. On the cheapest text models one dollar buys around ten million tokens or more, on the most expensive ones around a hundred thousand, and everyday models land in between. Input costs less than output, and cached input costs less still. Treat these numbers as a rough guide and check the Rate of the model you want.

What does Fast in a model name mean?

A Fast model is a speedier version of the same model. Replies come sooner, especially at busy times, and it costs more per request. If you do not need the speed, the normal version gives the same quality for less.

What is reasoning effort?

Some models can think longer before they answer. Higher effort usually gives better results on hard tasks, but the thinking itself is billed as tokens, so it costs more and takes longer. Lower effort is fine for simple work. You choose the level in your tool's settings; if you choose none, the model's default level is used.

How much text can a model handle at once?

Most models can hold around a million tokens in one conversation, which is a lot of code or documents. A few have smaller windows. The Context column on the Prices page shows each model's size.

Can I generate images?

Yes. Open AI Images in the dashboard to create and edit pictures, pick a model and see what each image cost. From your own code you can use /v1/images/generations and /v1/images/edits. In chat apps that use the OpenAI format you can also pick an image model right in the chat and get a picture back (this does not work in Claude Code). Image models are on the Image tab of the Prices page, mostly priced per picture.

How long are my generated images kept?

Your AI Images history is kept for 90 days, and older sessions and pictures are then removed automatically. Save anything you want to keep for longer.

API and keys

Which API endpoints does OpenCheese support?

The ones your tools already know: /v1/chat/completions and /v1/responses in the OpenAI format, /v1/messages in the Anthropic format, and /v1/images/generations and /v1/images/edits for pictures. /v1/models lists everything your key can use. There are also /v1/messages/count_tokens for free token counting, /v1/images/capabilities with the settings each image model accepts, and /v1/key, /v1/plan and /v1/balance to check what you can still spend. Every endpoint with examples: https://opencheese.dev/en/docs/

Which model ID should I use?

Ask /v1/models with your API key and use an ID from the list. Do not copy IDs from old examples, because what you can use depends on your plan, your key's settings and what is currently offered. If you would rather not type IDs at all, the Configuration page fills them in for you.

Do all models support streaming, tools, images, and reasoning controls?

No, it depends on the model. Check what a model supports on the Prices page and in the list from /v1/models, and try the exact feature you need before you rely on it.

How should API requests be authenticated?

Send your OpenCheese API key as a Bearer token in the Authorization header. Tools that speak the Anthropic format may send it as x-api-key instead. Keep your key on your server, restrict its models if you like, and never put it in public website code.

Is token counting billed?

No. Some tools, like Claude Code, ask how big a conversation is (the /v1/messages/count_tokens request). That is free: nothing is charged and no transaction is recorded.

How do I keep my requests together as one conversation?

A session is one conversation: Transactions shows all of its requests together, with the total cost. Most tools, such as OpenCode, Claude Code, Codex and RikkaHub, group their requests by themselves. In your own code, send the same opencheese-session-uuid header, a new random UUID for each conversation, with every request of that conversation; without it, each request is a session of its own. Examples: https://opencheese.dev/en/docs/sessions/

How do I set the reasoning effort from my own code?

Send the level with each request, in the field your API format uses: reasoning_effort on /v1/chat/completions, reasoning.effort on /v1/responses, output_config.effort on /v1/messages. Choose one of the levels the model lists in /v1/models under supported_reasoning_levels. If you send none, the model's default level is used. A level the model does not have is refused with a message that lists the ones it does. Details: https://opencheese.dev/en/docs/chat-completions/#reasoning-effort

Why does my chat app show a 🧀 message instead of an answer?

Messages that start with 🧀 come from OpenCheese, not from the model. They say what went wrong, for example an invalid API key, a used-up plan, an empty balance or a busy model, and what you can do about it. Chat apps show them in the conversation or as an error notice. Fix what the message says and send again. If you write your own code: on /v1/chat/completions, the problems you must fix yourself (key, plan, balance) arrive as the assistant's reply, even without streaming, so check the response type; all other errors are a normal HTTP status with a JSON body. All messages and codes: https://opencheese.dev/en/docs/errors/

Can I limit what an API key can spend or use?

Yes. On the API Keys page you can give each key its own spending limit, so it can only use part of your balance, and restrict it to specific models. You can create as many keys as you like and switch one off at any time.

Can I check my balance or plan from my own code?

Yes. Three requests with your usual API key report what you can still spend: /v1/key shows the key's spending limit and usage, /v1/plan your plan with its 5-hour, weekly and monthly windows, and /v1/balance your balance and this month's usage. They cost nothing and do not count toward your request limits. Examples and every field: https://opencheese.dev/en/docs/account/

Tools and apps

Which CLI tools can I use with OpenCheese?

The Configuration page has ready-made setups for OpenCode, Claude Code, Claude Desktop, Codex, Harness AI and Zed. Each tab gives you the settings in the format that tool expects, so you do not build anything by hand. Claude Code and Claude Desktop share one tab with a switch at the top. There is also an optional Skills tab you can ignore at first. Any other tool that lets you set a custom OpenAI or Anthropic address works too, and the docs at https://opencheese.dev/en/docs/ also cover LobeHub, RikkaHub, Chatbox and the VS Code and JetBrains extensions.

Where do I get my CLI configuration?

Sign in, open the Configuration page and choose the tab for your tool. Pick an API key and enter that key's own password, then copy the generated file. Until you confirm the password you only see a placeholder instead of your real key. Claude Desktop is a little different: you download a file and import it inside the app. OpenCode can skip copying altogether with Auto-sync.

Can OpenCode keep its model list up to date by itself?

Yes, with Auto-sync, the recommended setup on the Install OpenCode tab. You create a personal link once (pick an API key and enter its password) and run the one command the page shows. After that OpenCode gets its settings straight from OpenCheese: models you switch on or off, and new models, appear without copying any file. OpenCode 2 refreshes within 10 minutes, or right away if you run opencode reload while it is idle. OpenCode 1 refreshes the next time it starts.

Treat the link like a password. If it leaks, revoke it in the Your personal links list and switch off or delete the API key, because an OpenCode that is already signed in keeps the key. If you change the key's password, run the same opencode auth login command again.

Can I keep my own OpenCode settings and MCP servers with Auto-sync?

Yes. Keep a small opencode.json with only your own things, such as an mcp section, or add servers with opencode mcp add. OpenCode combines it with the settings it downloads. Just do not keep a model list in that file, because models listed there stay visible even after you switch them off. If you copied an opencode.json earlier, delete it or trim it down.

Can I use OpenCode 2?

Yes, and it is the recommended version. Step 2 of the Install OpenCode tab has a switch between OpenCode 2 (the default) and OpenCode 1, which is legacy and supported until 1 November. Both use the same opencode.json. If you are moving up from OpenCode 1: OpenCode 2 is a different package, and it moves your session history over the first time it starts, so back that history up first. The tab shows the exact commands, including how to go back to OpenCode 1.

Where do the CLI configuration files live?

OpenCode reads ~/.config/opencode/opencode.json (you do not need it with Auto-sync, and opencode.jsonc works too), Claude Code reads ~/.claude/settings.json, and Codex reads ~/.codex/config.toml. On Windows the ~ is your user folder, %USERPROFILE%, for example %USERPROFILE%\.claude\settings.json. If you run Codex inside WSL, its file is in your WSL home folder instead.

Why does each CLI use a different base URL?

Each tool adds its own ending to the address. OpenCode and Codex need the address to end in /v1. Claude Code adds /v1/messages itself, so its ANTHROPIC_BASE_URL must not end in /v1. The generated settings already have the right form, so just copy them.

Should I overwrite my existing CLI configuration file?

No. Add the generated parts to your existing file so your permissions, hooks, sandbox, approvals and MCP servers stay. In Codex's config.toml, every top-level key has to come before the first [table] header, or the file will not load.

Can I put the configuration inside my project repository?

Better not. Use the user-level file shown on the Configuration page. A .claude/settings.json committed to a repository shares your API key with everyone who can see it. Codex also ignores model_provider in a project-level .codex/config.toml and warns you at startup, so a project file cannot point Codex at OpenCheese.

Do I need to restart the CLI after editing configuration?

Claude Code picks up settings.json changes while it runs, but reads the model aliases at startup, so restart it after changing those. Codex only reads config.toml at startup, so restart it after every edit. OpenCode with Auto-sync updates by itself.

How do I switch models inside a CLI session?

In Claude Code use /model with an alias such as opus, sonnet, haiku, or fable, which point to the models set in your settings. In OpenCode use /models. In Codex, /model shows Codex's own built-in list rather than the OpenCheese models, and a model from that list works only if your key has one with the same ID. To use any other OpenCheese model in Codex, change model in config.toml or start it with codex -m <model-id>.

Are there special requirements for Codex?

You need Codex 0.120 or newer, because older versions use a protocol that no longer exists and the generated settings will not load. The generated file stores your key as plain text. To keep it out of the file, replace experimental_bearer_token with env_key and set that variable in your shell, with the key in single quotes because it contains $ signs. Never use both, since Codex rejects that.

Do requests from my tools show up in my transaction history?

Yes. Every request appears under Transactions with its tokens and cost. Requests from most tools, such as OpenCode, Claude Code, Codex, Zed and RikkaHub, are grouped by themselves into one session per conversation, so you can see what a whole conversation cost. Chatbox, and your own code without the session header, show each request on its own; https://opencheese.dev/en/docs/sessions/ explains how to group them.

Can I use OpenCheese in other apps, like chat apps?

Yes, in any app that lets you set a custom API address and key. Choose the OpenAI format with https://api.opencheese.dev/v1 as the address, or the Anthropic format with https://api.opencheese.dev, and paste your OpenCheese API key. A few apps want /v1 even in their Anthropic mode, RikkaHub's Claude type for example; each app's guide says which form it needs. Apps that only work with their own accounts, such as the ChatGPT or Claude websites, cannot use it. Guides for LobeHub, RikkaHub and Chatbox are at https://opencheese.dev/en/docs/

Can I use OpenCheese on my phone?

Yes, in chat apps that let you add your own provider. RikkaHub on Android and Chatbox on Android and iOS both work: choose the OpenAI format, enter https://api.opencheese.dev/v1 as the address and paste your API key. Step-by-step guides: https://opencheese.dev/en/docs/rikkahub/ and https://opencheese.dev/en/docs/chatbox/

Can I use OpenCheese in VS Code or JetBrains IDEs?

Yes. The Claude Code extension for VS Code and Cursor and the Claude Code plugin for IntelliJ and other JetBrains IDEs read the same ~/.claude/settings.json as Claude Code, and the Codex extension reads the same ~/.codex/config.toml as Codex. Set up the command-line tool once and the IDE follows. In VS Code, also turn on Disable Login Prompt in the Claude Code extension's settings, or it asks you to sign in to Anthropic. Guide: https://opencheese.dev/en/docs/ide/

Plans and limits

How do I get a plan?

Open Overview in the dashboard and choose a plan. You can pay from your credit balance, or top up first and then subscribe. Before you confirm, the dialog shows the 5-hour and weekly windows, the included credits and the available models.

How long does a plan last?

A plan runs for 30 days from activation. Overview shows how many days are left.

Do plans renew automatically?

No. There is no automatic renewal and no recurring charge. When the 30 days end, the plan expires and requests are paid from your credit balance if you have one. Buy a new plan whenever you want to go back to plan pricing.

Can I upgrade or downgrade my plan?

You can upgrade to a higher plan at any time. Your remaining monthly credits carry over to the new plan and the monthly period starts again. Moving down to a lower plan is not possible, so wait for the current one to expire.

What happens when I hit a plan limit?

You are told which limit you reached: the 5-hour window, the weekly window, or the monthly plan credits. You can upgrade, wait for the window to reset, or let your balance take over, which the next answer explains.

Can requests continue after plan credits run out?

Yes, if the plan supports it. Two switches on Overview control this (hover a label for details). "Keep going on balance after plan limits": your plan credits are always used first; once the 5-hour window, the weekly window or the monthly plan credits run out, requests to your plan's models continue and are paid from your credit balance at normal model prices instead of being rejected, and the plan covers them again when a window resets. "Use balance for Credit Models" (on by default): models your plan does not include stay available and are paid from your balance at normal prices, without touching plan credits or plan limits; turn it off to allow only your plan's models.

Why does a model say it is not included in my plan?

Each plan comes with a set of models. If a request asks for a model outside that set, it is turned down with a hint to upgrade or pick another model. Overview and the Prices page show which models your plan covers. Or keep "Use balance for Credit Models" on and pay for such models from your balance.

What happens when my balance reaches zero?

Requests are turned down with a message asking you to add credit. If your balance is very low, a big request may be refused in advance when its estimated cost is more than you have, and you are told the estimate so you can top up or start a smaller conversation.

Does my balance expire?

No. Credit you buy stays on your account until you spend it. A plan is different: it lasts 30 days, but your balance is untouched when it ends.

Is there a limit on how much I can use?

Without a plan, the limit is simply your balance. A plan adds its own 5-hour and weekly windows and monthly credits. You can also set a spending limit on any API key to keep it from using more than you intend.

Top-ups and payments

How do I top up my account?

Open the Payments page in the dashboard, choose an amount with the slider or by typing it, and select a payment method. The quote card shows the bonus and the total credits you will receive before you confirm. The Payments page also shows the smallest top-up you can make.

Which payment methods are supported?

It depends on what is switched on at the moment, and the payment dialog always shows the live options. These can include crypto checkout, an in-page crypto widget, direct transfers from MetaMask or Phantom, and a rouble option for bank cards and wallets, with the processor fee included in the charge.

How do top-up bonuses work?

Larger top-ups earn a larger bonus percentage. The bonus is extra credit on top of what you pay, not a discount on the price, and you see the exact percentage for your amount before you confirm. The rate is locked in when the payment is created, so later changes do not affect a payment already in progress.

What do I need to know about paying on-chain?

On-chain payments take USDT and USDC on the supported networks, and some networks take only one of them. The transfer must come from the address you authorized, match the quoted amount exactly, and arrive within the time shown in the dialog. A transfer with a different amount or from a different sender is not credited automatically.

How long does a payment take to confirm?

Crypto transfers are credited once the network has confirmed them, so the wait depends on the chain you chose. Keep the payment window open and it updates by itself as soon as the payment goes through.

How do I redeem a credit code?

Open the Payments page and use Redeem Code. Enter one code per line, up to ten different codes at once, and each code is reported on its own as applied, already redeemed, invalid or deleted. Credit codes are added at face value and do not get a top-up bonus.

Where can I see my payments?

The Payments page lists pending and completed payments with their status, and shows any bonus next to the amount you paid. Your payments are never deleted. You can remove failed payments and pending ones that were never submitted, but a pending on-chain payment with a submitted transaction is kept.

How does the referral program work?

Share your referral link from the Referral page. You earn a small bonus when someone signs up through it with Google, GitHub, Discord, Yandex or Telegram, and a larger bonus once that person has topped up a qualifying total. Plan purchases and redeemed credit codes do not count toward that total, and wallet sign-ups do not earn the sign-up bonus.

Can I get a refund on credits or a plan?

Prepaid balance, plan fees and used credit are not refundable under the Terms of Service, and completed top-ups are generally final. The Refunds page in the dashboard is a different thing: it gives you back the cost of single requests that went wrong, not money back to your payment method.

What is the Refunds page for?

It shows requests that were charged but did not come out right, for example after an outage or when a reply was cut off midway. If the fault was clearly ours or the model's, you are refunded automatically. Unclear cases wait for a quick review. A request that was invalid, or where the model simply refused the task, stays charged because the work was already done. Automatic refunds have a daily limit; past it, cases go to manual review and nothing is lost. If you disconnect after the model has started answering, the request is still charged, because the full answer is produced anyway. Leaving before that point is refunded.

Privacy and data policies

Are prompts used for model training?

OpenCheese itself never trains on your prompts or replies. Every model's details on the Prices page show a Training data label. "No Training" means we have set things up so your requests are not used for training. "Training by Provider" means the company that runs that model may use your data, so pick another model if that matters to you. We cannot see or control what those companies do on their side, so check the label before you send anything private. You can also use the Prompt Filter to swap names and secrets for placeholders. The Privacy Policy has the full details.

What request information is recorded?

We keep the records needed to run your account: which model you used, how many tokens, what it cost and whether it worked. That is what the Transactions page shows. The Privacy Policy is the authoritative source for what we collect, how long we keep it and what rights you have.

How long is my history kept?

Your Transactions and Refunds lists keep the last 12 weeks, and older entries are removed. Your payments are never deleted, so your top-ups stay on record, and your balance is not affected. AI Images sessions are kept for 90 days.

What is the Prompt Filter?

An optional feature that swaps exact text in your requests for something else before they are sent, for example replacing a project name with a placeholder. It is off by default and it only replaces the exact text you define. It does not detect personal data on its own and it is not a content firewall.

How do I delete my account or request my data?

Send the request to service@opencheese.dev. Closing an account, exporting data and correcting data are handled by hand and not through a button. When an account is deleted, your identifiers are anonymized, while de-identified usage and billing records are kept as described in the Privacy Policy.

Support and contact

How do I contact support?

Use the Support Chat launcher in the dashboard, which opens a private conversation with the team right in the app. Replies usually arrive within a day, and the conversation stays available so you can follow up on the same thread.

Can I still get help if I am muted in community chat?

Yes. Support Chat is separate from the public community channels, and community mutes or bans do not close it. It stays available so that people who cannot post publicly can still ask for help.

Which email address should I write to?

Use support@opencheese.dev to dispute an account ban, service@opencheese.dev for account closure, data requests, legal notices, a suspected compromised API key or an incorrect geographic block, and security@opencheese.dev to report a security vulnerability.

Is there a community channel?

Yes. The dashboard has a community chat where you can talk with other users, and a public Telegram group is linked in the site footer. These are community spaces, not official support, so use Support Chat for account, billing or technical issues.

What should I include when reporting a failed request?

Tell us the approximate time, the endpoint, the model ID, the HTTP status and the request ID: every API response carries it in its x-request-id header (the request's entry in Transactions helps too). Remove API keys, prompts, personal data and other secrets before sharing logs.

Troubleshooting

Why do I get an invalid or disabled API key error?

The key may have been revoked, switched off or copied incompletely. Open the API Keys page, check that the key is still active, and generate the configuration again so it uses the current key. Also make sure the request goes to https://api.opencheese.dev and not to the website. If you keep the key in a terminal variable, put it in single quotes: the key contains $ signs, and double quotes break it.

My tool says a model is not available for some effort. What now?

The model does not have the reasoning level your tool asked for. The message lists the levels it does have, for example "Choose one of these efforts: low, medium, high." Pick one of those in your tool's settings, or choose Auto to use the model's default. If the message says the model takes no effort setting, turn the effort off for that model. "Temporarily unavailable for ... effort" means that level is busy right now: wait a little or pick another level from the list.

What does "User request limit exceeded" mean?

You sent more requests in a short time than your account allows. Each account has request limits per minute, hour, day and month, and the message names the one you reached. Wait a little and try again; most tools wait and retry by themselves. If it keeps happening, send fewer requests at once, for example by running fewer agents in parallel.

Why does a long conversation exceed a model's context limit?

Everything counts toward the limit: the chat history, tool results, instructions and the answer itself. If a conversation is too big for the model, OpenCheese tells you before sending it, and you are not charged. You will see a message like "Prompt is too long ... You were not charged." Start a new conversation, shorten the history, or pick a model with a larger window. OpenCode and Claude Code can also summarize the old part for you, which is covered next.

What is context compaction?

When a conversation gets close to the model's limit, OpenCheese can summarize the older messages and leave your recent ones untouched, so long sessions keep working instead of stopping. You can tune it or switch it off on the Context Compacter page. A model writes the summary, so it costs a little balance and shows up in Transactions as its own entry marked Compacted.

I get "opencode is not recognized" or "command not found". What now?

It means the terminal cannot find OpenCode yet. Close the terminal and open a new one, because a terminal only sees programs installed before it was opened. Run node --version to check that Node.js is installed, install OpenCode with npm install -g @opencode/cli, and check it with opencode --version. If you still use OpenCode 1, use the install command shown in step 2 of the tab instead. If it still fails, send us the last few lines of the error.

A model takes very long or does not answer. What can I do?

First look at Transactions: if your request is there and the balance moved, it reached the model. Big models, high reasoning effort and busy hours can all make answers slow. Try a lower reasoning effort, a lighter or Fast model, or a new conversation, because very long chats get slower. If you get nothing at all or an error, send us the model name, the time and the exact error text.

Why do I see requests in Transactions that I did not send?

Some tools make small helper requests on their own: naming a chat, summarizing a long conversation, or guessing your next prompt (Claude Code does that and cancels the guess as soon as you type). They are marked as background calls in Transactions and billed like any other request.

Why can requests in the same chat be charged as uncached?

Caching is a discount for input the model has just seen, and it is not guaranteed, even inside one conversation. A changed prompt, new files or tools, a pause, or a busy moment can all make a request count as fresh input. Transactions shows exactly what was counted for each request.

How is the cost of a request calculated?

By the tokens used: what you send (input), what the model writes (output), and cached input at a lower price. Each model has its own rates on the Prices page. Transactions shows the tokens, the cost and the rate of every request.

The cheese has holes. Your infrastructure should not.