# Code Execution Patterns Complete guide to using code execution with Google Gemini API for computational tasks, data analysis, and problem-solving. --- ## What is Code Execution? Code Execution allows Gemini models to generate and execute Python code to solve problems requiring computation, enabling the model to: - Perform precise mathematical calculations - Analyze data with pandas/numpy - Generate charts and visualizations - Implement algorithms - Process files and data structures --- ## How It Works 1. **Model receives prompt** requiring computation 2. **Model generates Python code** to solve the problem 3. **Code executes in sandbox** (secure, isolated environment) 4. **Results return to model** for incorporation into response 5. **Model explains results** in natural language --- ## Enabling Code Execution ### Basic Setup (SDK) ```typescript import { GoogleGenAI } from '@google/genai'; const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY }); const response = await ai.models.generateContent({ model: 'gemini-2.5-flash', // Or gemini-2.5-pro contents: 'Calculate the sum of first 50 prime numbers', config: { tools: [{ codeExecution: {} }] // Enable code execution } }); ``` ### Basic Setup (Fetch) ```typescript const response = await fetch( `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-goog-api-key': env.GEMINI_API_KEY, }, body: JSON.stringify({ tools: [{ code_execution: {} }], contents: [{ parts: [{ text: 'Calculate...' }] }] }), } ); ``` --- ## Available Python Packages ### Standard Library - `math`, `statistics`, `random` - `datetime`, `time`, `calendar` - `json`, `csv`, `re` - `collections`, `itertools`, `functools` ### Data Science - `numpy` - numerical computing - `pandas` - data analysis and manipulation - `scipy` - scientific computing ### Visualization - `matplotlib` - plotting and charts - `seaborn` - statistical visualization **Note**: This is a **limited sandbox environment** - not all PyPI packages are available. --- ## Response Structure ### Parsing Code Execution Results ```typescript for (const part of response.candidates[0].content.parts) { // Inline text if (part.text) { console.log('Text:', part.text); } // Generated code if (part.executableCode) { console.log('Language:', part.executableCode.language); // "PYTHON" console.log('Code:', part.executableCode.code); } // Execution results if (part.codeExecutionResult) { console.log('Outcome:', part.codeExecutionResult.outcome); // "OUTCOME_OK" or "OUTCOME_FAILED" console.log('Output:', part.codeExecutionResult.output); } } ``` ### Example Response ```json { "candidates": [{ "content": { "parts": [ { "text": "I'll calculate that for you." }, { "executableCode": { "language": "PYTHON", "code": "primes = []\nnum = 2\nwhile len(primes) < 50:\n if is_prime(num):\n primes.append(num)\n num += 1\nprint(sum(primes))" } }, { "codeExecutionResult": { "outcome": "OUTCOME_OK", "output": "5117\n" } }, { "text": "The sum is 5117." } ] } }] } ``` --- ## Common Patterns ### 1. Mathematical Calculations ```typescript const response = await ai.models.generateContent({ model: 'gemini-2.5-flash', contents: 'Calculate the 100th Fibonacci number', config: { tools: [{ codeExecution: {} }] } }); ``` **Prompting Tip**: Use phrases like "generate and run code" or "calculate using code" to explicitly request code execution. ### 2. Data Analysis ```typescript const prompt = ` Analyze this sales data: month,revenue,customers Jan,50000,120 Feb,62000,145 Mar,58000,138 Calculate: 1. Total revenue 2. Average revenue per customer 3. Month-over-month growth rate Use pandas or numpy for analysis. `; const response = await ai.models.generateContent({ model: 'gemini-2.5-flash', contents: prompt, config: { tools: [{ codeExecution: {} }] } }); ``` ### 3. Chart Generation ```typescript const response = await ai.models.generateContent({ model: 'gemini-2.5-flash', contents: 'Create a bar chart showing prime number distribution by last digit (0-9) for primes under 100', config: { tools: [{ codeExecution: {} }] } }); ``` **Note**: Chart image data appears in `codeExecutionResult.output` (base64 encoded in some cases). ### 4. Algorithm Implementation ```typescript const response = await ai.models.generateContent({ model: 'gemini-2.5-flash', contents: 'Implement quicksort and sort this list: [64, 34, 25, 12, 22, 11, 90]. Show the sorted result.', config: { tools: [{ codeExecution: {} }] } }); ``` ### 5. File Processing (In-Memory) ```typescript const csvData = `name,age,city Alice,30,NYC Bob,25,LA Charlie,35,Chicago`; const response = await ai.models.generateContent({ model: 'gemini-2.5-flash', contents: `Parse this CSV data and calculate average age:\n\n${csvData}`, config: { tools: [{ codeExecution: {} }] } }); ``` --- ## Chat with Code Execution ### Multi-Turn Computational Conversations ```typescript const chat = await ai.chats.create({ model: 'gemini-2.5-flash', config: { tools: [{ codeExecution: {} }] } }); // First turn let response = await chat.sendMessage('I have a data analysis question'); console.log(response.text); // Second turn (will use code execution) response = await chat.sendMessage(` Calculate statistics for: [12, 15, 18, 22, 25, 28, 30] - Mean - Median - Standard deviation `); for (const part of response.candidates[0].content.parts) { if (part.text) console.log(part.text); if (part.executableCode) console.log('Code:', part.executableCode.code); if (part.codeExecutionResult) console.log('Results:', part.codeExecutionResult.output); } ``` --- ## Error Handling ### Checking Execution Outcome ```typescript for (const part of response.candidates[0].content.parts) { if (part.codeExecutionResult) { if (part.codeExecutionResult.outcome === 'OUTCOME_OK') { console.log('✅ Success:', part.codeExecutionResult.output); } else if (part.codeExecutionResult.outcome === 'OUTCOME_FAILED') { console.error('❌ Execution failed:', part.codeExecutionResult.output); } } } ``` ### Common Execution Errors **Timeout**: ``` Error: Execution timed out after 30 seconds ``` **Solution**: Simplify computation or reduce data size. **Import Error**: ``` ModuleNotFoundError: No module named 'requests' ``` **Solution**: Use only available packages (numpy, pandas, matplotlib, seaborn, scipy). **Syntax Error**: ``` SyntaxError: invalid syntax ``` **Solution**: Model generated invalid code - try rephrasing prompt or regenerating. --- ## Best Practices ### ✅ Do 1. **Be Explicit**: Use phrases like "generate and run code" to trigger code execution 2. **Provide Data**: Include data directly in prompt for analysis 3. **Specify Output**: Ask for specific calculations or metrics 4. **Use Available Packages**: Stick to numpy, pandas, matplotlib, scipy 5. **Check Outcome**: Always verify `outcome === 'OUTCOME_OK'` ### ❌ Don't 1. **Network Access**: Code cannot make HTTP requests 2. **File System**: No persistent file storage between executions 3. **Long Computations**: Timeout limits apply (~30 seconds) 4. **External Dependencies**: Can't install new packages 5. **State Persistence**: Each execution is isolated (no global state) --- ## Limitations ### Sandbox Restrictions - **No Network Access**: Cannot call external APIs - **No File I/O**: Cannot read/write to disk (in-memory only) - **Limited Packages**: Only pre-installed packages available - **Execution Timeout**: ~30 seconds maximum - **No State**: Each execution is independent ### Supported Models ✅ **Works with**: - `gemini-2.5-pro` - `gemini-2.5-flash` ❌ **Does NOT work with**: - `gemini-2.5-flash-lite` (no code execution support) - Gemini 1.5 models (use Gemini 2.5) --- ## Advanced Patterns ### Iterative Analysis ```typescript const chat = await ai.chats.create({ model: 'gemini-2.5-flash', config: { tools: [{ codeExecution: {} }] } }); // Step 1: Initial analysis let response = await chat.sendMessage('Analyze data: [10, 20, 30, 40, 50]'); // Step 2: Follow-up based on results response = await chat.sendMessage('Now calculate the variance'); // Step 3: Visualization response = await chat.sendMessage('Create a histogram of this data'); ``` ### Combining with Function Calling ```typescript const weatherFunction = { name: 'get_current_weather', description: 'Get weather for a city', parametersJsonSchema: { type: 'object', properties: { city: { type: 'string' } }, required: ['city'] } }; const response = await ai.models.generateContent({ model: 'gemini-2.5-flash', contents: 'Get weather for NYC, LA, Chicago. Calculate the average temperature.', config: { tools: [ { functionDeclarations: [weatherFunction] }, { codeExecution: {} } ] } }); // Model will: // 1. Call get_current_weather for each city // 2. Generate code to calculate average // 3. Return result ``` ### Data Transformation Pipeline ```typescript const prompt = ` Transform this data: Input: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Pipeline: 1. Filter odd numbers 2. Square each number 3. Calculate sum 4. Return result Use code to process. `; const response = await ai.models.generateContent({ model: 'gemini-2.5-flash', contents: prompt, config: { tools: [{ codeExecution: {} }] } }); ``` --- ## Optimization Tips ### 1. Clear Instructions **❌ Vague**: ```typescript contents: 'Analyze this data' ``` **✅ Specific**: ```typescript contents: 'Calculate mean, median, and standard deviation for: [12, 15, 18, 22, 25]' ``` ### 2. Provide Complete Data ```typescript const csvData = `...complete dataset...`; const prompt = `Analyze this CSV data:\n\n${csvData}\n\nCalculate total revenue.`; ``` ### 3. Request Code Explicitly ```typescript contents: 'Generate and run code to calculate the factorial of 20' ``` ### 4. Handle Large Datasets For large data, consider: - Sampling (analyze subset) - Aggregation (group by categories) - Pagination (process in chunks) --- ## Troubleshooting ### Code Not Executing **Symptom**: Response has text but no `executableCode` **Causes**: 1. Code execution not enabled (`tools: [{ codeExecution: {} }]`) 2. Model decided code wasn't necessary 3. Using `gemini-2.5-flash-lite` (doesn't support code execution) **Solution**: Be explicit in prompt: "Use code to calculate..." ### Timeout Errors **Symptom**: `OUTCOME_FAILED` with timeout message **Causes**: Computation too complex or data too large **Solution**: - Simplify algorithm - Reduce data size - Use more efficient approach ### Import Errors **Symptom**: `ModuleNotFoundError` **Causes**: Trying to import unavailable package **Solution**: Use only available packages (numpy, pandas, matplotlib, seaborn, scipy) --- ## References - Official Docs: https://ai.google.dev/gemini-api/docs/code-execution - Templates: See `code-execution.ts` for working examples - Available Packages: See "Available Python Packages" section above