File size: 4,929 Bytes
75d2f8c
 
 
 
 
 
 
baeb76a
75d2f8c
 
 
 
 
 
 
 
 
 
 
 
 
 
baeb76a
75d2f8c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4fd3d10
8072cd8
 
 
baeb76a
8072cd8
baeb76a
 
 
945700d
ebe6d08
baeb76a
682ccae
baeb76a
 
 
682ccae
4fd3d10
8072cd8
ebe6d08
8072cd8
 
 
 
 
 
 
ebe6d08
8072cd8
 
 
 
 
 
baeb76a
 
 
 
 
 
 
 
 
 
75d2f8c
 
 
 
 
 
 
 
baeb76a
75d2f8c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
137
138
# new app
import logging
import os
from fastapi import FastAPI, Request
from contextlib import asynccontextmanager
from transformers import pipeline
import langid
from huggingface_hub import InferenceClient, login
import socket
import time

# Global variables
HF_HUB_TOKEN = os.getenv("HUGGINGFACEHUB_API_TOKEN")

def current_time_gmt():
    return time.gmtime().tm_hour+2,':',time.gmtime().tm_min,':',time.gmtime().tm_sec
    
# Verify Hugging Face token
if not HF_HUB_TOKEN:
     raise ValueError("Missing Hugging Face API token. Please set HUGGINGFACEHUB_API_TOKEN in environment variables.")
login(token=HF_HUB_TOKEN)

client = InferenceClient(api_key=HF_HUB_TOKEN)

# Function to detect language
def detect_language(user_input):
    try:
        lang, _ = langid.classify(user_input) # langid.classify returns a tuple (language, confidence)
        print(f"Detected language: {lang}, ", f"current time: {current_time_gmt()}") 
        return "hebrew" if lang == "he" else "english" if lang == "en" else "unsupported"
    except Exception as e:
        print(f"Language detection error: {e}")
        return "unsupported"


def generate_response(text):
    language = detect_language(text)
    print(f"Detected language: {language}, ", f"current time: {current_time_gmt()}")
     
    if language == "hebrew":  # or language == "english":
        content = "转注谞讛 讘拽爪专讛 讗讘诇 转砖转祝 讗转 转讛诇讬讱 拽讘诇转 讛讛讞诇讟讜转 砖诇讱, " + text
        print("content: ", content)
        messages = [
            { "role": "user", "content": content }
        ]
        print(f"Messages: {messages}, ", f"current time: {current_time_gmt()}")
        
        completion = client.chat.completions.create( 
            model="microsoft/Phi-3.5-mini-instruct",  # good in english. not so good in hebrew # i need  to change it!!!
        	messages=messages, 
        	max_tokens=2048,
            temperature=0.5,
            top_p=0.7 
        )
        #print("\ncompletion: ", completion.choices[0].message.content, f"\ncurrent time: {current_time_gmt()}")
        return completion.choices[0].message.content
    elif language ==  "english":
        content = "keep it short but tell your decision making process, " + text  # good
        print("content: ", content)
        messages = [
            { "role": "user", "content": content }
        ]
        print(f"Messages: {messages}, ", f"current time: {current_time_gmt()}")
        
        completion = client.chat.completions.create(    
            model="mistralai/Mistral-Nemo-Instruct-2407",  # good
        	messages=messages, 
        	max_tokens=2048,
            temperature=0.5,
            top_p=0.7 
        )
        return completion.choices[0].message.content
        
    return "Sorry, I only support Hebrew and English."

    

    # if language == "hebrew" or language == "english":
    #     # hebrew_generator = pipeline("text-generation", model="onlplab/alephbert-base")
    #     output = lang_generator(text, max_length=250, truncation=True)
    #     print(f"Model output: {output}, ", f"current time: {current_time_gmt()}")  # Debugging
    #     return output[0]["generated_text"]
    
    # elif language == "english":
    #     #english_generator = pipeline("text-generation", model="mistralai/Mistral-Nemo-Instruct-2407", max_new_tokens=128)
    #     # english_generator = pipeline("text-generation", model="distilgpt2")
    #     output = english_generator(text, max_length=100, truncation=True)
    #     print(f"English model output: {output}, ", f"current time: {current_time_gmt()}")  # Debugging
    #     return output[0]["generated_text"]
    
    # return "Sorry, I only support Hebrew and English."


# FastAPI lifespan event
@asynccontextmanager
async def lifespan(app: FastAPI):
    print("Starting application...")
    yield  # Wait until app closes
    print("Shutting down application...")


# Create FastAPI app
app = FastAPI(lifespan=lifespan)


@app.get("/")
async def root():
    return {"message": "Decision Helper API is running!"}


@app.post("/generate_response")
async def generate_text(request: Request):
    try:
        data = await request.json()
        if not data or "text" not in data:
            logging.error("Invalid request received")
            return {"error": "Invalid request. Please send JSON with a 'text' field."}

        text = data["text"].strip()
        if not text:
            return {"error": "No text provided"}

        print(f"Received text: {text}")  # Debugging
        
        response = generate_response(text)
        print(f"Generated response: {response}")  # Debugging
        return {"response": response}

    except Exception as e:
        logging.error(f"Error processing request: {e}")
        return {"error": "An unexpected error occurred."}


# Run the server
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=7860)