Navya-Sree's picture
Create agents/coder_agent.py
afc2b98 verified
import openai
import os
from typing import Dict, Any
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
class CoderAgent:
"""
Agent responsible for generating code based on user prompts.
This agent understands programming requirements and writes initial code.
"""
def __init__(self, model="gpt-3.5-turbo", temperature=0.7):
"""
Initialize the coder agent with specific model parameters.
Args:
model: Which OpenAI model to use
temperature: Controls creativity (0=deterministic, 1=creative)
"""
self.model = model
self.temperature = temperature
self.api_key = os.getenv("OPENAI_API_KEY")
if not self.api_key:
raise ValueError("OPENAI_API_KEY not found in environment variables")
openai.api_key = self.api_key
def generate_code(self, prompt: str, context: str = "") -> Dict[str, Any]:
"""
Generate code based on user prompt and optional context.
Args:
prompt: User's coding requirement (e.g., "Write a function to reverse a string")
context: Additional context from RAG or previous conversations
Returns:
Dictionary containing code and metadata
"""
try:
# Build the system message
system_message = """You are an expert Python programmer.
Write clean, efficient, and well-documented code.
Always include function signatures with type hints.
Provide only the code without explanations unless asked."""
# Build user message with context
user_message = prompt
if context:
user_message = f"Context: {context}\n\nTask: {prompt}"
# Call OpenAI API
response = openai.ChatCompletion.create(
model=self.model,
messages=[
{"role": "system", "content": system_message},
{"role": "user", "content": user_message}
],
temperature=self.temperature,
max_tokens=500
)
# Extract and clean the code
raw_code = response.choices[0].message.content
# Clean the response (remove markdown code blocks if present)
if "```python" in raw_code:
code = raw_code.split("```python")[1].split("```")[0].strip()
elif "```" in raw_code:
code = raw_code.split("```")[1].split("```")[0].strip()
else:
code = raw_code.strip()
return {
"status": "success",
"code": code,
"raw_response": raw_code,
"model_used": self.model,
"tokens_used": response.usage.total_tokens
}
except Exception as e:
return {
"status": "error",
"error": str(e),
"code": "",
"raw_response": ""
}