HuggingFace Deployer
Deploy SLM Agents monorepo to Hugging Face Spaces
f87a697
|
Raw
History Blame Contribute Delete
7.45 kB
# SLM Code Interpreter
A lightweight, CPU-optimized local Python Code Interpreter agent powered by a local Small Language Model (SLM) running via ONNX Runtime GenAI. It is built to support a self-correcting feedback loop in an isolated, sandboxed Python environment, enabling small models (1.5B) to execute Python scripts, catch runtime exceptions, and autonomously correct syntax/semantic errors iteratively.
---
## Features
- **Local Python Execution**: Executes scripts inside a separate, secure subprocess environment with resource bounds (timeout limits).
- **Self-Correcting Loop**: If execution fails, the agent takes the stack trace, traceback, or stderr output, feeds it back into its context history, and attempts to repair the code automatically up to `max_retries`.
- **Ultra Low RAM Footprint**: Runs on standard CPU within ~1.5 GB - 2.0 GB RAM using INT4 quantized Qwen2.5-1.5B-Instruct-ONNX.
- **Claude-style Streaming & Thought process**: Decodes reasoning thoughts inside `<thought>` tags before printing the final output block.
---
## Installation
In your local project environment:
```bash
pip install -e ./slm_code_interpreter
```
Ensure `onnxruntime-genai` is installed. It shares the central monorepo model path cached locally at `models/qwen2.5-1.5b-onnx`.
---
## API Reference
### `SLMCodeInterpreter`
```python
from slm_code_interpreter.code_interpreter import SLMCodeInterpreter
interpreter = SLMCodeInterpreter(
model_path=None, # Path to the ONNX model directory (defaults to models/qwen2.5-1.5b-onnx)
cache_dir=None, # Alternative HF cache dir
n_ctx=2048, # Context length (defaults to 2048)
n_threads=4 # Number of CPU threads to use for execution
)
```
#### Methods
#### `run(instruction: str, max_retries: int = 3, stream: bool = False)`
Runs the user instruction to write and execute code.
- **Arguments**:
- `instruction` (str): Task instructions (e.g. "Calculate the 10th Fibonacci number").
- `max_retries` (int): Number of execution recovery attempts if exceptions occur (default: 3).
- `stream` (bool): If `True`, returns a generator that yields decoded output tokens in real-time. If `False`, runs the self-correction loop to completion.
- **Returns**:
- `dict` (when `stream=False`):
```python
{
"success": True/False,
"stdout": str, # Process standard output
"stderr": str, # Process errors (or traceback summary if failed)
"code": str, # Executed Python source code
"attempts": int, # Count of turns taken to complete
"response": str # Raw text response generated by model
}
```
- `Generator` (when `stream=True`): Token yield generator.
---
## Usage Examples
### 1. Basic Generation and Execution
```python
from slm_code_interpreter.code_interpreter import SLMCodeInterpreter
interpreter = SLMCodeInterpreter()
# The interpreter will generate the Python code, execute it, and return output
result = interpreter.run("Write a python script to compute the 10th Fibonacci number and print it.")
print(f"Success: {result['success']}")
print(f"Executed Code:\n{result['code']}")
print(f"Stdout Output: {result['stdout']}")
```
### 2. Sandbox Subprocess Timeout Limits
The interpreter limits runtime scripts (default: 10s timeout) to prevent infinite loops from locking up the system:
```python
# Execute python script that loops infinitely
res = interpreter._execute_sandbox("import time\nwhile True:\n time.sleep(0.1)", timeout=1.0)
print(res[0]) # Output: -1 (Execution timeout code)
print(res[2]) # Output: Execution Timeout Expired.
```
### 3. Agentic Self-Correction Loop In Action
When an exception occurs (like a NameError or SyntaxError), the agent gets the error traceback back in its prompt history, and fixes it:
```python
# Reference a missing variable manually to trigger correction loop
result = interpreter.run(
"Write a python script that references an undefined variable `non_existent_var` first, "
"catches the error, but eventually prints 'Recovered Output'",
max_retries=3
)
print(f"Attempts: {result['attempts']}") # Recovered in 1 or more runs depending on model response
print(f"Stdout: {result['stdout']}") # Output: Recovered Output
```
### 4. Complex Data Processing Example
The interpreter agent can handle robust multi-stage scripts using advanced third-party libraries (e.g. `pandas`, `numpy`, `matplotlib`) for data munging:
```python
from slm_code_interpreter.code_interpreter import SLMCodeInterpreter
interpreter = SLMCodeInterpreter()
query = (
"Load raw CSV text with employee records containing department, sales, and dates. "
"Parse the dates, extract the quarter, group by department and quarter, "
"aggregate total sales, filter out combinations below $40,000, and print "
"a structured markdown summary table."
)
result = interpreter.run(query)
print("Success Status:", result["success"])
print("Generated Code:\n", result["code"])
print("Execution Output:\n", result["stdout"])
```
#### Generated Python Script:
```python
import pandas as pd
from io import StringIO
csv_data = """date,department,revenue
2026-01-15,Sales,32000
2026-02-10,Marketing,15000
2026-03-01,Sales,45000
2026-04-12,Engineering,60000
2026-05-18,Marketing,45000
2026-06-22,Sales,12000
"""
df = pd.read_csv(StringIO(csv_data))
df['date'] = pd.to_datetime(df['date'])
df['quarter'] = df['date'].dt.to_period('Q')
# Aggregate and group
agg = df.groupby(['department', 'quarter'])['revenue'].sum().reset_index()
filtered = agg[agg['revenue'] >= 40000]
print(filtered.to_markdown(index=False))
```
---
## Configuration (`config.yaml`)
Specify settings inside the project directory:
```yaml
models:
code_interpreter:
path: "../../models/qwen2.5-1.5b-onnx"
repo_id: "tonythethompson/Qwen2.5-1.5B-Instruct-ONNX"
```
---
## 🔌 VS Code Integration Guide
You can integrate the **SLM Code Interpreter** directly inside Visual Studio Code to execute highlighted text prompts or code sections locally on your CPU.
### Step 1: Start the Background Daemon Server
Start the local HTTP JSON API server on port `8085`:
```bash
# Option A: Run directly from python module
python -m slm_code_interpreter.server
# Option B: Run programmatically from code
from slm_code_interpreter import run_server
run_server(port=8085)
```
The server will output:
`[SLMCodeInterpreter] Local VS Code integration server active on http://127.0.0.1:8085`
### Step 2: Install the VS Code Extension Blueprint
The package includes a lightweight, pre-configured VS Code extension folder located at [vscode-extension/](file:///Users/revathysuryaprakash/Documents/SLMAgents/slm_code_interpreter/vscode-extension).
1. Open the [vscode-extension](file:///Users/revathysuryaprakash/Documents/SLMAgents/slm_code_interpreter/vscode-extension) folder in VS Code.
2. Press `F5` to start a new VS Code debug window with the extension activated.
3. In the new window, select any text or code prompt, right-click, and select:
**"SLM Code Interpreter: Execute Selected Prompt / Code"**
4. Alternately, open the Command Palette (`Cmd+Shift+P` on Mac / `Ctrl+Shift+P` on Windows) and search for:
**"SLM Code Interpreter: Ask Agent to Write & Run..."**
5. All reasoning traces, code, stdout outputs, and errors will be printed in real-time inside the VS Code **Output Channel** (under the "SLM Code Interpreter" filter).