File size: 3,642 Bytes
487bfb7
e995e3b
487bfb7
17cd8b9
b143edd
e995e3b
b143edd
487bfb7
b143edd
487bfb7
 
 
b143edd
 
 
e995e3b
487bfb7
 
 
b143edd
 
 
487bfb7
b143edd
 
487bfb7
 
 
 
 
 
 
 
 
 
 
b143edd
e995e3b
487bfb7
 
 
 
 
e995e3b
487bfb7
b143edd
 
 
487bfb7
 
 
 
 
 
 
e995e3b
b143edd
 
 
 
 
487bfb7
 
b143edd
 
 
 
 
 
487bfb7
b143edd
487bfb7
17cd8b9
487bfb7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17cd8b9
487bfb7
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# genesis/providers.py
import os
import requests
from typing import List, Dict
from openai import OpenAI

# Load API keys
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
HF_TOKEN = os.getenv("HF_TOKEN")  # Still used for Hugging Face models if needed
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
NCBI_API_KEY = os.getenv("NCBI_API_KEY")
NCBI_EMAIL = os.getenv("NCBI_EMAIL")
DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY")

client = OpenAI(api_key=OPENAI_API_KEY)

# -------- DeepSeek Summary --------
def run_deepseek_summary(prompt: str) -> str:
    """Run a dense scientific summary using DeepSeek API."""
    if not DEEPSEEK_API_KEY:
        print("[DeepSeek] API key not set, skipping.")
        return prompt
    try:
        url = "https://api.deepseek.com/v1/chat/completions"
        headers = {"Authorization": f"Bearer {DEEPSEEK_API_KEY}", "Content-Type": "application/json"}
        payload = {
            "model": "deepseek-science",
            "messages": [{"role": "user", "content": prompt}],
            "temperature": 0.2
        }
        r = requests.post(url, headers=headers, json=payload, timeout=60)
        r.raise_for_status()
        data = r.json()
        return data["choices"][0]["message"]["content"]
    except Exception as e:
        print(f"[DeepSeek] Failed: {e}")
        return prompt  # fallback

# -------- Gemini Polish --------
def run_gemini_polish(text: str) -> str:
    """Polish the summary using Gemini for clarity and presentation."""
    if not GEMINI_API_KEY:
        return text
    try:
        url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key={GEMINI_API_KEY}"
        payload = {
            "contents": [{"parts": [{"text": f"Polish and clarify this research report for scientists:\n\n{text}"}]}]
        }
        r = requests.post(url, json=payload, timeout=30)
        r.raise_for_status()
        data = r.json()
        return data["candidates"][0]["content"]["parts"][0]["text"]
    except Exception as e:
        print(f"[Gemini] Failed: {e}")
        return text

# -------- OpenAI Image Generation (DALL·E) --------
def run_openai_image(query: str) -> str:
    """Generate a research diagram using OpenAI DALL·E (gpt-image-1)."""
    if not OPENAI_API_KEY:
        print("[OpenAI Image] API key not set.")
        return None
    try:
        resp = client.images.generate(
            model="gpt-image-1",
            prompt=f"Detailed, realistic scientific diagram about: {query}",
            size="1024x1024"
        )
        return resp.data[0].url
    except Exception as e:
        print(f"[OpenAI Image] Failed: {e}")
        return None

# -------- PubMed Fallback --------
def pubmed_fallback_search(query: str, api_key: str, email: str) -> List[Dict]:
    """Search PubMed for relevant articles if no citations found."""
    results = []
    if not api_key or not email:
        return results
    try:
        base_url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi"
        params = {
            "db": "pubmed",
            "term": query,
            "retmax": 3,
            "api_key": api_key,
            "email": email,
            "retmode": "json"
        }
        r = requests.get(base_url, params=params, timeout=10)
        r.raise_for_status()
        ids = r.json().get("esearchresult", {}).get("idlist", [])
        for pmid in ids:
            results.append({
                "type": "PMID",
                "id": pmid,
                "url": f"https://pubmed.ncbi.nlm.nih.gov/{pmid}/"
            })
    except Exception as e:
        print(f"[PubMed] Failed: {e}")
    return results