482 lines
11 KiB
Markdown
482 lines
11 KiB
Markdown
# 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
|