Skip to content
Insights · AI Agents

Which container did that code use?

Name the container that code ran in: the id, the status, and the memory. A different call can use another container, and the model cannot recall it.

Scroll
AI AgentsOct 30, 202614 min readBy Salman Naqvi, Founder & CEO
Which container did that code use?

Do not treat the reply as something a container ran, and do not ask the model which container it used, until you can name the container id, the status, and the memory limit, show a different call whose container id is not this one, and show that you stored the request. If the log does not keep the container, write that. A sentence that ran is not a container. A file the reply mentions is not a container id.

This is the container. It is not the schema. Which schema did that call require? is a schema name and the keys it required. A schema can match while the code ran in a container you did not store, and a container id is not a schema name. It is not the tool result. Which tool result did the model see? is the block you returned. A tool result can be present while the container id is missing. It is not the citation. Which document did that citation name? is a document index and a span. A file citation inside a container is a different object, and a character span is not a container id. It is not the batch. Which batch did that request join? is a batch id. A batch can finish while no container was created.

None of what follows is an accuracy for this product, and none of it is a promise that a sandbox held your customer's file. The fields below are one vendor's current description of a code-interpreter container. The scores below that are a 2024 benchmark of models asked to drive a code interpreter on someone else's notebooks. A memory tier is not a census of your calls. A leaderboard that never stored your request cannot name the container the code used tonight. They do tell you which numbers people mix up when they try to sound precise about a sandbox they have not opened.

OpenAI's create example that returns a real-looking id prints id cntr_682e30645a488191b6363a0cbefc0f0a025ec61b66250591, object container, created_at 1747857508, and status running. The id is 53 characters. created_at equals last_active_at on that object. The gap is 0 seconds, not 20 minutes, and not an hour. expires_after.anchor is last_active_at, and expires_after.minutes is 20. The parameter text on the same page says the expiration is a time in seconds relative to the anchor. The field it then defines is minutes. 20 minutes is 1200 seconds. 20 is not 1200. Do not store 20 as if it were 1200, and do not store 1200 as if the example had printed it. memory_limit is 4g. name is My Container, 12 characters. network_policy.type is allowlist, and the only domain is api.buildkite.com, 17 characters. The placeholder example above that response prints id as the string id, created_at 0, minutes 0, and memory_limit 1g. 0 is not 20. 1g is not 4g. A placeholder is not the container you ran (OpenAI, Create container).

The memory tiers are four strings, and they are not four containers. The guide says you can choose 1g, which it calls the default, 4g, 16g, or 64g. Four names. 1 times 4 is 4. 4 times 4 is 16. 16 times 4 is 64. The sequence is a multiplication, and the page does not print that multiplication. Leaving memory_limit out keeps the 1g tier. The worked examples set 4g. 4g is not the default. The selected limit applies for the life of that container. You do not get a second tier by wishing. Status text on the reference says the status is, for example, active or deleted. The returned example says running. running is not active, and it is not deleted. The guide says you cannot move a container from an expired state to an active one. expired is a fourth word the status examples did not list. Do not treat the two examples as one enum until the page prints the enum. A container that expired is a new container if you still need the code. It is not the old id brought back.

Auto mode and explicit mode are not one request. The guide's first call sets model gpt-6-astra, which is 11 characters, tool type code_interpreter, and container type auto with memory_limit 4g. That curl does not send file_ids. A later sentence says you can pass file_ids file-1 and file-2. file-1 is 6 characters, and so is file-2. Two ids. The first curl does not contain them. Do not paste file-1 onto a request that did not send it. The instructions string in that example is 123 characters. The input is I need to solve the equation 3x + 11 = 14. Can you help me?, which is 59 characters. Solving it gives 1. The page does not print 1. 1 is not a container id, and it is not 4g. The explicit curl creates a container named My Container and then sends container cntr_abc123, 11 characters, on the following responses call. 11 is not 53. cntr_abc123 is not cntr_682e30645a488191b6363a0cbefc0f0a025ec61b66250591. The JavaScript example names the container test-container, 14 characters. The Java example names it analysis, 8 characters. 12, 14, and 8 are three names. They are not one container. The explicit prompt asks for 4 times 3.82, then a square root, then another. 4 times 3.82 is 15.28. The page does not print 15.28. 15.28 is not 4, and it is not a container id (OpenAI, Code Interpreter).

The guide says a container expires if it is not used for 20 minutes, which matches the example's minutes field and does not match the parameter's talk of seconds. 20 minutes is still 1200 seconds. Any retrieve, or any add or delete of a file, refreshes last_active_at. A refresh is not a new id. The skill example on the create page sends two skill references. One id is skill_4db6f1a2c9e73508b41f9da06e2c7b5f, 38 characters. The other is openai-spreadsheets, 19 characters, with version latest. 38 is not 19. skill_id allows at most 64 characters. 38 is under 64, and 64 is not 53, the container id's length. An inline skill's data allows at most 70254592 characters. A domain secret's value allows at most 10485760 characters. 70254592 is not 10485760. Neither is a container id. allowed_domains, when the policy is allowlist, has a minimum of 1 item. The example has 1. A minimum is not a count of your files. network type disabled is the other mode. disabled is not allowlist. The guide also names o3 and o4-mini as reasoning models that can use the tool. o3 is not gpt-6-astra. A model id is not a container id.

A file the model writes is an annotation, and the annotation's container is not the create example's container. The message id is msg_682d514e268c8191a89c38ea318446200f2610a7ec781a4f, 52 characters. The file id is cfile_682d514b2e00819184b9b07e13557f82, 38 characters. The container_id on that annotation is cntr_682d513bb0c48191b10bd4f8b0b3312200e64562acc2e0af, also 53 characters, and it is not the create example's 53-character id. Same length is not the same id. filename adds .png to the file id, 42 characters. start_index is 0 and end_index is 0. A citation whose span is 0 to 0 is still a citation. It is not a missing file. type is container_file_citation. The message status is completed. completed is not the container status running. logprobs is an empty array. Empty is not a score. The supported-file table prints 32 rows. .py appears twice, and .csv appears twice, so 32 rows are not 32 extensions. 32 minus those two repeated rows is 30 distinct extensions if you drop one of each pair. The page does not print 30. The xml row's MIME cell is the phrase application/xml or text/xml. That is two types in one cell, not one. .jpeg and .jpg are different extensions and the same image/jpeg type. A filename is not a container id.

The study people reach for when they want an execution rate did not open this container. Songyang Zhang, Chuyu Zhang, Yingfan Hu, Haowen Shen, Kuikun Liu, Zerun Ma, Fengzhe Zhou, Wenwei Zhang, Xuming He, Dahua Lin, and Kai Chen built CIBench, a code-interpreter benchmark. The comparison table says CIBench is 234 tasks and 1900+ questions. Table 5's total row is 1900 exactly. 1900+ is not 1900. 1900 divided by 234 is about 8.12, which is not an integer, and it is not a notebook of 10 to 15 steps. 234 times 10 is 2340. 234 times 15 is 3510. Neither is 1900. The page says each generated notebook has 10 to 15 steps, and the question total is not that multiplication. They also say they summarized 50 topics for each of ten libraries. 50 times 10 is 500. 500 is not 234, and the page does not print 500. Do not add it and then call it the task count. The preprint is arXiv:2407.10499 (Zhang et al., CIBench).

Table 5 adds in more than one direction, and the neighboring benchmarks do not. generation is 210 numeric, 76 text, 466 visualization, 208 other, total 960. template is 147, 20, 161, 142, total 470. template_cn repeats that row: 147, 20, 161, 142, 470. Two copies are not one copy. 470 plus 470 is 940, and 940 plus 960 is 1900. The column totals are 504, 116, 788, and 492. 210 plus 147 plus 147 is 504. 76 plus 20 plus 20 is 116. 466 plus 161 plus 161 is 788. 208 plus 142 plus 142 is 492. 504 plus 116 plus 788 plus 492 is 1900. Those additions match the printed total. The comparison table's other datasets do not. DS-1000 is 1000 questions, MINT is 586, CodeGen is 115 tasks, and QwenAgent is 295 questions. 1000 plus 586 plus 115 plus 295 is 1996. 1996 is not 1900, and it is not 234. The page does not print 1996. Do not add other people's datasets and call the sum CIBench.

The model count and the average claim do not survive the table. One contribution sentence says the experiments used 19 LLMs. Another says 24. Section 4.1 says 19 chat models. Table 3 prints 24 rows, from Llama-2-7B-Chat through GPT-4-1106-preview, including gpt-4o. 24 is not 19. The five rows you would have to drop to make 19 are not marked. Do not drop gpt-4o, or the 70B rows, until the paper does. The caption says Average is the mean of numeric, text, and visualization in both modes. Six cells. GPT-4-1106-preview's six cells are 77.8, 78.9, 64.0, 77.5, 81.6, and 73.1. Their sum is 452.9. 452.9 divided by 6 is 75.4833, which rounds to the printed average 75.5. That cell rounds. The sentence next to it does not. It says Llama-3-70B-Instruct's overall score is 10.0% lower than GPT-4-1106-preview. The printed averages are 65.5 and 75.5. 75.5 minus 65.5 is 10.0 points. 10% of 75.5 is 7.55, not 10.0. 75.5 minus 7.55 is 67.95, not 65.5. A difference of 10.0 points is not a reduction of 10.0%.

Oracle mode is not higher on every cell of the row they treat as best. The prose says oracle mode surpasses end-to-end across all metrics for most models. On GPT-4-1106-preview, end-to-end tool rate is 99.8 and oracle is 99.6. Executable is 98.6 and 97.7. Numeric is 77.8 and 77.5. Oracle is lower on those three. Text moves from 78.9 to 81.6, and visualization from 64.0 to 73.1. Higher on two metrics is not higher on all five. gpt-4o's end-to-end tool rate is 100.0 and its oracle tool rate is 99.2. Executable is 97.2 and 94.8. 100.0 is not 99.2. The error shares they assign by hand on GPT-4-1106-preview are 31.9%, 4.3%, 40.4%, and 23.4%. Those four sum to 100. The addition matches. It is still a split of someone else's errors, not a container status. They allow up to 3 trials and say the visible jump for most models arrives when the trial count reaches 2. 3 is not 2. A trial count is not minutes 20.

Do the three proofs on one real call, in the log that actually holds it. First, the binding. Copy the container id, the status, and the memory limit. If the id is 53 characters on an example, that example is not your call. If minutes is 20, write 20 minutes, and write that the parameter text also says seconds. Do not store 1200 unless you computed it and labeled it as your arithmetic. If status is running, write running. Do not rewrite it as active because another sentence used active. If the annotation names a different container id of the same length, write both ids. Second, the other call. A different response, with a different container id, is not this one. A table of executable rates is not that second container. If you cannot show a call that is not this one, you have a score, not a record. Third, the stored request. The container id has to be in a log you hold, not in the model's recollection. If the only record is the sentence the customer saw, write that. A log you cannot open is the finding.

Three moves feel like the proof and are a second problem. Reusing an expired container because creating another one felt wasteful. The guide says you cannot move expired back to active. A new id is a new container, and the old files are gone. Quoting 98.6% because it looks precise, while the call you were asked about is one id, and the notebooks that produced that percent had not opened your log. Asking the model which container it used. The model will invent a plausible id. It will not read your log. A schema you have not kept, while the customer is arguing about a field, is which schema did that call require?. Opening that page does not name the container.

The path is ordinary when one assistant's turn is stored without opening the next assistant's turn as the method. Inflectiv Helios runs more than one domain assistant, with conversation history and prompt monitoring. The shape that matters here is one assistant's turn you can point at, distinct from the next turn. That case is not a container ledger. Nothing in the description is a headcount, a duration, or a result figure. If the only control on the screen sends every assistant's code as one unlogged call, you do not have this proof. You have a chat window.

There is a version of this afternoon where a rescue is the wrong purchase. Nothing is in production. No model is being called. The request was not logged. A customer has already seen another customer's data. The wrong value was already a write. Or no metric was ever named. 98.6% is not your call, and cntr_abc123 is not your call. A score does not close a leak, and a lawyer is the right hire when the question is whether a policy was broken.

When the reply is already in front of a customer and the log cannot name the container, the missing object is specific. The id, the status, and the memory limit on that request, a different request that is not that one, and a stored request rather than a recollection. An AI pilot failed to reach production engagement is for the system that is already in front of customers and cannot yet show those three: audit in the first one to two weeks, finished in 8 to 12 weeks, scoped after the audit, unpaid if the agreed metric does not move, rollout behind a human-review gate. The container you failed to store tonight is the kind of case the harness has to include, or the next release will run code and still be unable to say where. The harness is AI evaluation and observability. An AI integration sprint is the shape where the acceptance sentence can require the container id on every stored call. If you do not yet know whether the pilot can be saved, a two-week AI readiness assessment hands you the findings either way. The free production-readiness diagnostic is the short way to see whether you are looking at a missing id, a file from a container that already expired, or a system that has not reached a customer. Those are the terms. They are not 98.6%, and they are not 20 minutes of someone else's notebook.

The payout a charge settled into, and the ruleset a push hit, are different objects: which payout did that charge settle? and which ruleset did that push hit?. Do not record either on this page. A payout status is not a container status. An enforcement value is not a memory limit. The store a file joined is a different object: which store did that file join?. Do not record it here. A store id is not a container id.

Before you tell them the code ran in a sandbox, do the three proofs and write the id. Name the container, the status, and the memory limit, or write that the request did not store them. Show a different call that is not that container. Show that the request is in a log you hold. Do not ask the model which container it was, and do not treat a fluent answer as a reason to skip storing the id. A benchmark can tell you how often a model produced code that executed on someone else's tasks. The binding is the container you can defend.

Questions

You stop treating the reply as something a container ran, and you stop asking the model which container it used, until you can name the container id, the status, and the memory limit, show a different call whose container id is not this one, and show that you stored the request. If the log does not keep the container, write that.

No. A percentage on a code-interpreter benchmark is a share of someone else's tasks. A container you can defend is the id, the status, and the memory limit on this stored call, or a written line that the call stored no container. 98.6 on one row is not a container id, and 20 minutes on an example is not 20 seconds.

When nothing is in production, when no model is being called, when the request was not logged, when a customer has already seen another customer's data, when the wrong value was already a write, or when no metric was ever named.

Find this useful? Tell Google to show you more of it.

Let's put AI to work in your business.

A 30-minute call. You bring the workflow or the roadmap — we'll tell you what's feasible, what it costs, and what we'd build first.

Book a call→