File size: 4,200 Bytes
1a7b925
 
 
73e412f
b60a7a6
1a7b925
b60a7a6
1a7b925
8282e1a
b60a7a6
 
 
 
 
 
8282e1a
b60a7a6
 
8282e1a
b60a7a6
 
 
1a7b925
 
73e412f
1a7b925
 
 
 
631eaa5
1a7b925
 
 
 
 
 
e231bca
1a7b925
 
 
 
 
 
73e412f
1a7b925
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73e412f
1a7b925
 
 
 
 
 
 
 
 
d6131be
1a7b925
 
d6131be
1a7b925
 
 
 
 
 
 
b60a7a6
1a7b925
 
 
 
 
 
 
 
 
 
 
 
 
 
73e412f
 
1a7b925
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73e412f
1a7b925
 
 
 
73e412f
 
 
 
 
 
1a7b925
 
 
 
73e412f
1a7b925
73e412f
5d79c49
 
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import os
import logging
from fastapi import FastAPI, Request
import subprocess
from huggingface_hub import InferenceClient, login  #, configure_http_backend, get_session
import langid
# import requests


# # Create a factory function that returns a requests.Session object
# def backend_factory() -> requests.Session:
#     session = requests.Session()
#     # session.proxies = {"http": "http://your-proxy-host:your-proxy-port", 
#     #                    "https": "http://your-proxy-host:your-proxy-port"}
#     return session

# # Set our custom backend factory as the default HTTP backend
# configure_http_backend(backend_factory=backend_factory)

# # For debugging
# session = get_session()
# print("Configured session:", session)

# Configure logging
logging.basicConfig(format="%(asctime)s - %(levelname)s - %(message)s", level=logging.INFO)
logger = logging.getLogger(__name__)


# Get Hugging Face API token from environment variable
HF_HUB_TOKEN = os.getenv("HUGGINGFACEHUB_API_TOKEN")
if not HF_HUB_TOKEN:
    raise ValueError("Missing Hugging Face API token. Please set HUGGINGFACEHUB_API_TOKEN.")


# Login and initialize the InferenceClient
login(token=HF_HUB_TOKEN)
client = InferenceClient(token=HF_HUB_TOKEN)


# Create FastAPI app instance
app = FastAPI()


def detect_language(user_input):
    """
    Detect the language of the input text.
    Returns "hebrew" if Hebrew, "english" if English, or "unsupported" otherwise.
    """
    try:
        lang, _ = langid.classify(user_input)
        if lang == "he":
            return "hebrew"
        elif lang == "en":
            return "english"
        else:
            return "unsupported"
    except Exception as e:
        logger.error(f"Language detection error: {e}")
        return "unsupported"


def generate_response(text):
    """
    Generate a response based on the input text.
    Selects a prompt and model according to the detected language,
    and calls the Hugging Face chat completion API.
    """
    language = detect_language(text)
    if language == "hebrew":
        # Hebrew prompt: answer shortly but explain your decision-making process
        content = "转砖诪讜专 注诇 转砖讜讘讛 拽爪专讛, 讗讘诇 转住驻专 讗讬讱 拽讬讘诇转 讗转 讛讛讞诇讟讛, " + text
        model = "mistralai/Mistral-Nemo-Instruct-2407" 
    elif language == "english":
        content = "keep it short but tell your decision making process, " + text
        model = "mistralai/Mistral-Nemo-Instruct-2407"
    else:
        return "Sorry, I only support Hebrew and English."

    messages = [{"role": "user", "content": content}]

    try:
        completion = client.chat.completions.create(
            #model=model,
            messages=messages,
            max_tokens=2048,
            temperature=0.5,
            top_p=0.7
        )
        return completion.choices[0].message.content
    except Exception as e:
        logger.error(f"Error generating response: {e}")
        return "Error: Could not generate response."


@app.post("/generate_response")
async def generate_text(request: Request):
    """
    API endpoint to generate a response from the chat model.
    Expects a JSON with a "text" field.
    """
    try:
        data = await request.json()
        text = data.get("text", "").strip()
        if not text:
            return {"error": "No text provided"}
        response = generate_response(text)
        return {"response": response}
    except Exception as e:
        logger.error(f"Error processing request: {e}")
        return {"error": "An unexpected error occurred."}


@app.get("/")
async def root():
    """
    Root endpoint to check that the API is running.
    """
    return {"message": "Decision Helper API is running!"}


def run_bot():
    """
    Start the Telegram bot by running bot.py as a subprocess.
    """
    logger.info("Starting Telegram bot...")
    subprocess.Popen(["python3", "bot.py"])


if __name__ == "__main__":
    # When running app.py directly, start the bot as well.
    run_bot()
    # Uncomment the next lines to run the FastAPI server standalone.
    # Start the FastAPI server with uvicorn
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=7860)