Upload files to "/"
هذا الالتزام موجود في:
1
.env
Normal file
1
.env
Normal file
@@ -0,0 +1 @@
|
|||||||
|
AUTH_TOKEN="b8f6b49e-999e-4643-a1d8-9c6f43b445e2.VBRq5IvEjWMOZOAzKLFvKcM54DR6G4L-"
|
||||||
2
.gitignore
مباع
Normal file
2
.gitignore
مباع
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
venv
|
||||||
|
.env
|
||||||
159
main.py
Normal file
159
main.py
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
import requests
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
# === CONFIGURATION ===
|
||||||
|
AUTH_TOKEN = os.getenv("AUTH_TOKEN")
|
||||||
|
BASE_URL = "https://chat.cumin.dev/api"
|
||||||
|
HEADERS = {
|
||||||
|
"Authorization": f"Bearer {AUTH_TOKEN}",
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fixed initial prompt (R&D assistant, Arabic only)
|
||||||
|
INITIAL_PROMPT = """You are an expert R&D assistant specialized in AI, Machine Learning, and LLMs. Provide 3-5 creative, underexplored research directions. For each idea: short title, brief explanation, why it's promising (with novelty evidence), and at least one reference to a paper or source. Be concise but insightful. Reply only in Arabic."""
|
||||||
|
|
||||||
|
def create_conversation(title="AI R&D Session"):
|
||||||
|
url = f"{BASE_URL}/conversations"
|
||||||
|
payload = {"title": title}
|
||||||
|
resp = requests.post(url, headers=HEADERS, json=payload)
|
||||||
|
if resp.status_code in (200, 201):
|
||||||
|
conv_id = resp.json().get("id")
|
||||||
|
print(f"[✓] New conversation created: {conv_id}")
|
||||||
|
return conv_id
|
||||||
|
else:
|
||||||
|
print(f"[✗] Failed to create conversation: {resp.status_code} - {resp.text}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def send_message(conv_id, text):
|
||||||
|
url = f"{BASE_URL}/conversations/{conv_id}/chat"
|
||||||
|
payload = {"message": text, "files": []}
|
||||||
|
resp = requests.post(url, headers=HEADERS, json=payload)
|
||||||
|
if resp.status_code == 200:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
print(f"[✗] Send failed: {resp.text}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_conversation(conv_id):
|
||||||
|
url = f"{BASE_URL}/conversations/{conv_id}"
|
||||||
|
resp = requests.get(url, headers=HEADERS)
|
||||||
|
if resp.status_code == 200:
|
||||||
|
return resp.json()
|
||||||
|
else:
|
||||||
|
print(f"[✗] Failed to fetch conversation: {resp.text}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_last_assistant_reply(conv_data):
|
||||||
|
if not conv_data or "messages" not in conv_data:
|
||||||
|
return None
|
||||||
|
for msg in reversed(conv_data["messages"]):
|
||||||
|
if msg.get("role") == "assistant":
|
||||||
|
return msg.get("content")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def wait_for_assistant_reply(conv_id, last_msg_count, timeout=40, poll_interval=2):
|
||||||
|
start = time.time()
|
||||||
|
while time.time() - start < timeout:
|
||||||
|
conv = get_conversation(conv_id)
|
||||||
|
if conv and "messages" in conv:
|
||||||
|
if len(conv["messages"]) > last_msg_count:
|
||||||
|
new_msg = conv["messages"][-1]
|
||||||
|
if new_msg["role"] == "assistant":
|
||||||
|
return new_msg["content"]
|
||||||
|
time.sleep(poll_interval)
|
||||||
|
print("[!] Timeout waiting for assistant reply.")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def initialize_conversation(conv_id):
|
||||||
|
"""Send the initial R&D prompt and return the assistant's first reply."""
|
||||||
|
print("\n[→] Sending initial R&D prompt (Arabic only)...")
|
||||||
|
if not send_message(conv_id, INITIAL_PROMPT):
|
||||||
|
return None
|
||||||
|
print("[→] Waiting for assistant to generate ideas...")
|
||||||
|
conv_data = get_conversation(conv_id)
|
||||||
|
if not conv_data:
|
||||||
|
return None
|
||||||
|
msg_count = len(conv_data.get("messages", []))
|
||||||
|
reply = wait_for_assistant_reply(conv_id, msg_count)
|
||||||
|
return reply
|
||||||
|
|
||||||
|
# === MAIN LOOP ===
|
||||||
|
def main():
|
||||||
|
print("\n" + "="*60)
|
||||||
|
print("R&D ASSISTANT (AI/ML/LLM) – Arabic responses only")
|
||||||
|
print("Commands: /new -> start a fresh conversation (with initial prompt)")
|
||||||
|
print(" /exit -> quit")
|
||||||
|
print("="*60 + "\n")
|
||||||
|
|
||||||
|
conv_id = None
|
||||||
|
choice = input("Start a new conversation? (y/n): ").strip().lower()
|
||||||
|
if choice == 'y':
|
||||||
|
conv_id = create_conversation()
|
||||||
|
if not conv_id:
|
||||||
|
print("Could not create conversation. Exiting.")
|
||||||
|
sys.exit(1)
|
||||||
|
# Send the initial Arabic R&D prompt automatically
|
||||||
|
first_reply = initialize_conversation(conv_id)
|
||||||
|
if first_reply:
|
||||||
|
print("\n" + "="*60)
|
||||||
|
print("ASSISTANT'S INITIAL RESPONSE (Arabic):")
|
||||||
|
print("="*60)
|
||||||
|
print(first_reply)
|
||||||
|
else:
|
||||||
|
print("[!] Could not get initial response. You can still chat.")
|
||||||
|
else:
|
||||||
|
conv_id = input("Paste an existing conversation ID: ").strip()
|
||||||
|
print(f"[i] Using existing conversation: {conv_id}")
|
||||||
|
|
||||||
|
# Interactive loop (continue conversation)
|
||||||
|
while True:
|
||||||
|
user_input = input("\nYou: ").strip()
|
||||||
|
if not user_input:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if user_input == "/exit":
|
||||||
|
print("Goodbye!")
|
||||||
|
break
|
||||||
|
|
||||||
|
if user_input == "/new":
|
||||||
|
print("\n[!] Creating a fresh conversation...")
|
||||||
|
new_id = create_conversation()
|
||||||
|
if new_id:
|
||||||
|
conv_id = new_id
|
||||||
|
# Send initial prompt for the new conversation too
|
||||||
|
first_reply = initialize_conversation(conv_id)
|
||||||
|
if first_reply:
|
||||||
|
print("\n" + "="*60)
|
||||||
|
print("ASSISTANT'S INITIAL RESPONSE (Arabic):")
|
||||||
|
print("="*60)
|
||||||
|
print(first_reply)
|
||||||
|
else:
|
||||||
|
print("[!] No initial response. Continue chatting.")
|
||||||
|
else:
|
||||||
|
print("[✗] Failed to create new conversation. Staying in current.")
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Normal message
|
||||||
|
if not send_message(conv_id, user_input):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Wait for reply
|
||||||
|
conv_data = get_conversation(conv_id)
|
||||||
|
if not conv_data:
|
||||||
|
continue
|
||||||
|
msg_count = len(conv_data.get("messages", []))
|
||||||
|
print("Assistant is thinking...", end="", flush=True)
|
||||||
|
reply = wait_for_assistant_reply(conv_id, msg_count)
|
||||||
|
print("\r" + " " * 30 + "\r", end="")
|
||||||
|
if reply:
|
||||||
|
print(f"\nAssistant (Arabic): {reply}")
|
||||||
|
else:
|
||||||
|
print("\nAssistant: (No response)")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
ثنائية
requirements.txt
Normal file
ثنائية
requirements.txt
Normal file
ملف ثنائي غير معروض.
المرجع في مشكلة جديدة
حظر مستخدم