Spaces:
Running
on
Zero
Running
on
Zero
import os | |
import shutil | |
import hmac | |
import hashlib | |
import base64 | |
import subprocess | |
import time | |
from mysite.libs.logger import logger | |
import async_timeout | |
import asyncio | |
import mysite.interpreter.interpreter_config | |
GENERATION_TIMEOUT_SEC=60 | |
def validate_signature(body: str, signature: str, secret: str) -> bool: | |
if secret is None: | |
logger.error("Secret is None") | |
return False | |
hash = hmac.new( | |
secret.encode("utf-8"), body.encode("utf-8"), hashlib.sha256 | |
).digest() | |
expected_signature = base64.b64encode(hash).decode("utf-8") | |
return hmac.compare_digest(expected_signature, signature) | |
def no_process_file(prompt, foldername): | |
set_environment_variables() | |
try: | |
proc = subprocess.Popen(["mkdir", f"/home/user/app/routers/{foldername}"]) | |
except subprocess.CalledProcessError as e: | |
return f"Processed Content:\n{e.stdout}\n\nMake Command Error:\n{e.stderr}" | |
no_extension_path = f"/home/user/app/routers/{foldername}/prompt" | |
time.sleep(1) | |
with open(no_extension_path, "a") as f: | |
f.write(prompt) | |
time.sleep(1) | |
try: | |
prompt_file_path = no_extension_path | |
with open(prompt_file_path, "w") as prompt_file: | |
prompt_file.write(prompt) | |
except Exception as e: | |
return f"Error writing prompt to file: {str(e)}" | |
time.sleep(1) | |
try: | |
proc = subprocess.Popen( | |
["make", "run", foldername], | |
stdin=subprocess.PIPE, | |
stdout=subprocess.PIPE, | |
stderr=subprocess.PIPE, | |
text=True, | |
) | |
stdout, stderr = proc.communicate(input="n\ny\ny\n") | |
return f"Processed Content:\n{stdout}\n\nMake Command Output:\n{stdout}\n\nMake Command Error:\n{stderr}" | |
except subprocess.CalledProcessError as e: | |
return f"Processed Content:\n{e.stdout}\n\nMake Command Error:\n{e.stderr}" | |
def set_environment_variables(): | |
os.environ["OPENAI_API_BASE"] = "https://api.groq.com/openai/v1" | |
os.environ["OPENAI_API_KEY"] = "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" | |
os.environ["MODEL_NAME"] = "llama3-8b-8192" | |
os.environ["LOCAL_MODEL"] = "true" | |
# Set the environment variable. | |
def chat_with_interpreter( | |
message, history, a=None, b=None, c=None, d=None | |
): # , openai_api_key): | |
# Set the API key for the interpreter | |
# interpreter.llm.api_key = openai_api_key | |
if message == "reset": | |
interpreter.reset() | |
return "Interpreter reset", history | |
full_response = "" | |
# add_conversation(history,20) | |
user_entry = {"role": "user", "type": "message", "content": message} | |
#messages.append(user_entry) | |
# Call interpreter.chat and capture the result | |
messages = [] | |
recent_messages = history[-20:] | |
for conversation in recent_messages: | |
user_message = conversation[0] | |
user_entry = {"role": "user", "content": user_message} | |
messages.append(user_entry) | |
assistant_message = conversation[1] | |
assistant_entry = {"role": "assistant", "content": assistant_message} | |
messages.append(assistant_entry) | |
user_entry = {"role": "user", "content": message} | |
messages.append(user_entry) | |
#system_prompt = {"role": "system", "content": "あなたは日本語の優秀なアシスタントです。"} | |
#messages.insert(0, system_prompt) | |
for chunk in interpreter.chat(messages, display=False, stream=True): | |
# print(chunk) | |
# output = '\n'.join(item['content'] for item in result if 'content' in item) | |
full_response = format_response(chunk, full_response) | |
yield full_response # chunk.get("content", "") | |
# Extract the 'content' field from all elements in the result | |
def insert(full_response,message): | |
age = 28 | |
# データベースファイルのパス | |
db_path = "./workspace/sample.duckdb" | |
# DuckDBに接続(データベースファイルが存在しない場合は新規作成) | |
con = duckdb.connect(database=db_path) | |
con.execute( | |
""" | |
CREATE SEQUENCE IF NOT EXISTS sample_id_seq START 1; | |
CREATE TABLE IF NOT EXISTS samples ( | |
id INTEGER DEFAULT nextval('sample_id_seq'), | |
name VARCHAR, | |
age INTEGER, | |
PRIMARY KEY(id) | |
); | |
""" | |
) | |
cur = con.cursor() | |
con.execute("INSERT INTO samples (name, age) VALUES (?, ?)", (full_response, age)) | |
con.execute("INSERT INTO samples (name, age) VALUES (?, ?)", (message, age)) | |
# データをCSVファイルにエクスポート | |
con.execute("COPY samples TO 'sample.csv' (FORMAT CSV, HEADER)") | |
# データをコミット | |
con.commit() | |
# データを選択 | |
cur = con.execute("SELECT * FROM samples") | |
# 結果をフェッチ | |
res = cur.fetchall() | |
rows = "" | |
# 結果を表示 | |
# 結果を文字列に整形 | |
rows = "\n".join([f"name: {row[0]}, age: {row[1]}" for row in res]) | |
# コネクションを閉じる | |
con.close() | |
# print(cur.fetchall()) | |
insert(full_response,message) | |
yield full_response + rows # , history | |
return full_response, history | |
async def completion(message: str, history, c=None, d=None): | |
from groq import Groq | |
client = Groq(api_key=os.getenv("api_key")) | |
messages = [] | |
recent_messages = history[-20:] | |
for conversation in recent_messages: | |
user_message = conversation[0] | |
user_entry = {"role": "user", "content": user_message} | |
messages.append(user_entry) | |
assistant_message = conversation[1] | |
assistant_entry = {"role": "assistant", "content": assistant_message} | |
messages.append(assistant_entry) | |
user_entry = {"role": "user", "content": message} | |
messages.append(user_entry) | |
system_prompt = {"role": "system", "content": "あなたは日本語で答えるプログラム開発の優秀ななアシスタントです。"} | |
messages.insert(0, system_prompt) | |
async with async_timeout.timeout(GENERATION_TIMEOUT_SEC): | |
try: | |
stream = client.chat.completions.create( | |
model="llama3-8b-8192", | |
messages=messages, | |
temperature=1, | |
max_tokens=1024, | |
top_p=1, | |
stream=True, | |
stop=None, | |
) | |
all_result = "" | |
for chunk in stream: | |
current_content = chunk.choices[0].delta.content or "" | |
all_result += current_content | |
yield current_content | |
yield all_result | |
#return all_result | |
except asyncio.TimeoutError: | |
raise HTTPException(status_code=504, detail="Stream timed out") | |
def process_file(fileobj, prompt, foldername): | |
set_environment_variables() | |
try: | |
proc = subprocess.Popen(["mkdir", f"/home/user/app/routers/{foldername}"]) | |
except subprocess.CalledProcessError as e: | |
return f"Processed Content:\n{e.stdout}\n\nMake Command Error:\n{e.stderr}" | |
time.sleep(2) | |
path = f"/home/user/app/routers/{foldername}/" + os.path.basename(fileobj) | |
shutil.copyfile(fileobj.name, path) | |
base_name = os.path.splitext(os.path.basename(fileobj))[0] | |
no_extension_path = f"/home/user/app/routers/{foldername}/{base_name}" | |
shutil.copyfile(fileobj, no_extension_path) | |
with open(no_extension_path, "a") as f: | |
f.write(prompt) | |
try: | |
prompt_file_path = no_extension_path | |
with open(prompt_file_path, "w") as prompt_file: | |
prompt_file.write(prompt) | |
except Exception as e: | |
return f"Error writing prompt to file: {str(e)}" | |
time.sleep(1) | |
try: | |
proc = subprocess.Popen( | |
["make", "run", foldername], | |
stdin=subprocess.PIPE, | |
stdout=subprocess.PIPE, | |
stderr=subprocess.PIPE, | |
text=True, | |
) | |
stdout, stderr = proc.communicate(input="n\ny\ny\n") | |
return f"Processed Content:\n{stdout}\n\nMake Command Output:\n{stdout}\n\nMake Command Error:\n{stderr}" | |
except subprocess.CalledProcessError as e: | |
return f"Processed Content:\n{stdout}\n\nMake Command Error:\n{e.stderr}" | |