|
|
|
import re |
|
from dotenv import load_dotenv |
|
import requests |
|
import json |
|
import os |
|
import logging |
|
import io |
|
import sys |
|
from api_client import predict_deepseek,predict_gpt |
|
|
|
load_dotenv() |
|
|
|
if os.environ.get("method") =="local": |
|
from model import generate_response |
|
|
|
|
|
|
|
from prompt_templates import prompt_template_textual,prompt_template_visual,description_template,suggestion_template,libraries |
|
|
|
|
|
def describe_file(df,filename): |
|
first_row = df.iloc[0].to_dict() |
|
prompt = description_template.format(filename=filename,example_row=first_row) |
|
response = predict_gpt(prompt) |
|
return response |
|
|
|
def suggest_questions(df,filename): |
|
example_row = dict(df.iloc[0]) |
|
prompt = suggestion_template.format(filename=filename,example_row=example_row) |
|
response = predict_gpt(prompt) |
|
return response |
|
|
|
def extract_code(text): |
|
try: |
|
matches = [] |
|
pattern = r"```python(.*?)```" |
|
if text: |
|
matches = re.findall(pattern, text, re.DOTALL) |
|
if matches: |
|
return matches[0] |
|
else: |
|
raise Exception("Error extracting code: No match") |
|
except Exception as e: |
|
raise Exception("Error extracting code: ",e) from e |
|
|
|
def execute(code,namespace): |
|
try: |
|
buffer = io.StringIO() |
|
sys.stdout = buffer |
|
exec(libraries+code,namespace) |
|
|
|
sys.stdout = sys.__stdout__ |
|
|
|
return buffer.getvalue() |
|
|
|
except Exception as e: |
|
raise Exception("Error executing: ",e) from e |
|
|
|
|
|
|
|
def run(namespace,description,columns,question,method): |
|
try: |
|
if question.lower().startswith('plot'): |
|
prompt = prompt_template_visual.format(description=description,columns=columns,question=question) |
|
else: |
|
prompt = prompt_template_textual.format(description=description,columns=columns,question=question) |
|
full_response= None |
|
extracted_code= None |
|
execution= None |
|
error = None |
|
try: |
|
if method == 'server': |
|
request = { |
|
'url' : os.environ.get("MODEL_URL"), |
|
'payload' : json.dumps({"prompt": prompt}), |
|
'headers' : { |
|
'Content-Type': 'application/json' |
|
}} |
|
full_response = requests.request("POST", request['url'], headers=request['headers'], data=request['payload']).json()["response"] |
|
|
|
elif method == 'local': |
|
full_response = generate_response(prompt) |
|
|
|
elif method == 'api': |
|
full_response = predict_deepseek(prompt) |
|
|
|
else: |
|
return {'execution': 'Wrong model method'} |
|
|
|
extracted_code = extract_code(full_response) |
|
execution = execute(extracted_code,namespace) |
|
|
|
except Exception as e: |
|
error = e |
|
|
|
|
|
|
|
data = { |
|
'question': question, |
|
'prompt':prompt, |
|
'full_response': full_response, |
|
'extracted_code': extracted_code, |
|
'execution': execution, |
|
'error': error |
|
} |
|
|
|
logging.info(data) |
|
with open("log.json", 'w') as file: |
|
json.dump(data, file, indent=4) |
|
|
|
return data |
|
|
|
except Exception as e: |
|
print(e) |
|
|
|
|
|
|