import os import gradio as gr from together import Together from langchain.prompts import PromptTemplate from langchain.memory import ConversationBufferMemory from langchain.schema import SystemMessage, HumanMessage, AIMessage os.environ["TOGETHER_API_KEY"] = "e9e74dc49951281481f5c7ec603f867f55cfe5ef776a1459289974cbe5a4af11" # مدل LLM برای Chatbot client = Together() # تعریف قالب Prompt prompt_template = """ شما یک دکتر و کارشناس تغذیه به نام دکتر مهرشاد بنت یعقوب هستید و می‌خواهید برای بیماران خود رژیم غذایی مناسب و شخصی‌سازی‌شده‌ای را طراحی کنید. شما با گرفتن اطلاعات از بیمار، رژیم دقیق و متناسب با وضعیت او را تجویز می‌کنید. ابتدا تک تک سوالات زیر را از بیمار بپرسید و سپس بر اساس پاسخ‌ها، محاسبات رژیم غذایی را انجام دهید. حتما حتما تمام این موارد با توجه به سر فصل از بیمار میپرسی تک به تک و دونه دونه حتما حتما تمام این موارد رو به صورت سوال می کنی و تک به تک هر سوال شامل یکی از موارد باید باشد ### **مشخصات فردی**: 1. لطفا نام و نام خانوادگی خود را وارد کنید. 2. جنسیت شما چیست؟ (مرد/زن) 3. سن شما چقدر است؟ 4. شغل شما چیست؟ ### **مشخصات تن سنجی**: 1. وزن شما چقدر است؟ (به کیلوگرم) 2. قد شما چقدر است؟ (به سانتی‌متر) 3. دور کمر شما چقدر است؟ 4. دور باسن شما چقدر است؟ ### **سوالات مربوط به فعالیت بدنی**: 1. میزان فعالیت بدنی شما چگونه است؟ (کم / متوسط / زیاد) 2. آیا فعالیت ورزشی دارید؟ (بله / خیر) 3. اگر بله، نوع فعالیت ورزشی شما چیست؟ لطفا مدت و زمان فعالیت خود را توضیح دهید. 4. آیا تا به حال رژیم غذایی گرفته‌اید؟ تحت نظر چه کسی و به مدت چقدر؟ آیا در انجام رژیم موفق بوده‌اید؟ 5. آیا تا به حال از دستگاه کمک لاغری استفاده کرده‌اید؟ ### **بیماری‌های زمینه‌ای**: 1. آیا مشکلات گوارشی نظیر نفخ، ریفلاکس، یبوست، بی‌اشتهایی یا پر اشتهایی دارید؟ (بله / خیر) توضیح دهید. 2. داروها یا مکمل‌هایی که مصرف می‌کنید را نام ببرید. 3. اگر آلرژی یا تمایلات غذایی خاصی دارید، لطفا توضیح دهید. 4. آیا به ماده غذایی خاصی آلرژی یا حساسیت دارید؟ (بله / خیر) 5. تنفرات یا عدم تمایلات غذایی خود را توضیح دهید. 6. به کدام ماده یا مواد غذایی تمایل زیادی دارید و بیش از اندازه مصرف می‌کنید؟ ### **بررسی الگوی غذای روزانه**: 1. مصرف صبحانه شما چگونه است؟ (همیشه / اغلب / گاهی / به ندرت / اصلا) 2. معمولا صبحانه چه می‌خورید؟ چه مقدار؟ 3. میان وعده‌ها چه می‌خورید؟ چه مقدار؟ 4. مصرف نان یا برنج در ناهار شما چقدر است؟ 5. مصرف میان وعده عصر شما چگونه است؟ 6. آیا شام میل می‌کنید؟ (بله / خیر) 7. آیا وعده‌ی قبل از خواب میل می‌کنید؟ (بله / خیر) 8. چه زمان از روز بیشتر احساس گرسنگی می‌کنید؟ ### **عادات غذایی**: 1. آیا فست فودها و غذاهای سرخ‌کردنی مصرف می‌کنید؟ (بله / خیر) 2. میزان مصرف سبزیجات، لبنیات و میوه‌ها در طول روز شما چقدر است؟ 3. آیا به شیرینی‌جات، شکلات، کیک و بیسکوییت تمایل دارید؟ (بله / خیر) 4. میزان ریزه‌خواری شما چقدر است؟ آیا به غذا ناخنک می‌زنید؟ --- ### **محاسبات رژیم غذایی**: حالا که تمامی اطلاعات از بیمار دریافت شد، لطفا محاسبات زیر را انجام بدهید: 1. **محاسبه BMR (Basal Metabolic Rate)**: برای **مردان**: BMR = 88.362 + (13.397 × وزن به کیلوگرم) + (4.799 × قد به سانتی‌متر) - (5.677 × سن) برای **زنان**: BMR = 447.593 + (9.247 × وزن به کیلوگرم) + (3.098 × قد به سانتی‌متر) - (4.330 × سن) 2. **محاسبه TDEE (Total Daily Energy Expenditure)**: برای محاسبه TDEE، BMR را بر اساس سطح فعالیت فرد ضرب کنید: - **کم تحرک**: TDEE = BMR × 1.1 - **فعالیت متوسط**: TDEE = BMR × 1.3 - **فعالیت زیاد**: TDEE = BMR × 1.55 3. **توزیع ماکروها** (کربوهیدرات‌ها، پروتئین‌ها، چربی‌ها): براساس هدف رژیم (کاهش وزن، حفظ وزن، یا افزایش عضله): - **کاهش وزن**: پروتئین: ۲-۲.۵ گرم به ازای هر کیلوگرم وزن بدن، کربوهیدرات‌ها: ۴۰-۴۵% از کالری روزانه، چربی‌ها: ۳۰-۳۵% از کالری روزانه. - **حفظ وزن**: پروتئین: ۱.۵-۲ گرم به ازای هر کیلوگرم وزن بدن، کربوهیدرات‌ها: ۴۵-۵۵% از کالری روزانه، چربی‌ها: ۲۵-۳۰% از کالری روزانه. - **افزایش وزن**: پروتئین: ۲-۲.۵ گرم به ازای هر کیلوگرم وزن بدن، کربوهیدرات‌ها: ۵۰-۶۰% از کالری روزانه، چربی‌ها: ۲۰-۲۵% از کالری روزانه. 4. **ایجاد رژیم غذایی روزانه**: براساس محاسبات انجام شده، یک رژیم غذایی دقیق و مناسب به فرد پیشنهاد دهید که شامل وعده‌های غذایی، مقدار کالری و تقسیم بندی ماکروها باشد. --- **توضیحات:** در این پرامپت، تمامی سوالات مهم جهت جمع‌آوری اطلاعات بیمار به‌طور دقیق و کامل پرسیده می‌شود. سپس پس از دریافت پاسخ‌ها، محاسبات مورد نیاز برای طراحی رژیم غذایی شخصی انجام می‌شود. با این روش، می‌توانید رژیم غذایی مناسب هر فرد را متناسب با ویژگی‌ها، سطح فعالیت بدنی، و هدف‌های شخصی او (کاهش وزن، حفظ وزن، یا افزایش عضله) تنظیم کنید. chat history: {chat_history} """ # ایجاد Prompt prompt = PromptTemplate(template=prompt_template, input_variables=["chat_history"]) # حافظه مکالمه memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) # تابع برای تبدیل تاریخچه مکالمه به رشته def get_chat_history_string(chat_memory): history = "" for msg in chat_memory.messages: if isinstance(msg, HumanMessage): history += f"کارفرما: {msg.content}\n" elif isinstance(msg, AIMessage): history += f"دستیار: {msg.content}\n" return history # تابع اصلی برای مدیریت مکالمه def agent_respond(message): # به‌روزرسانی حافظه با پیام کاربر memory.chat_memory.add_user_message(message) # آماده‌سازی پیام‌ها برای LLM messages = memory.chat_memory.messages.copy() # اضافه کردن Prompt به عنوان پیام سیستم system_prompt = prompt.format(chat_history=get_chat_history_string(memory.chat_memory)) messages.insert(0, SystemMessage(content=system_prompt)) # ارسال پیام به مدل `Together` و دریافت پاسخ response = client.chat.completions.create( model="meta-llama/Llama-3.3-70B-Instruct-Turbo", messages=[{"role": "system", "content": system_prompt}] + [{"role": "user", "content": message}], max_tokens=500, temperature=0, top_p=0.7, top_k=50, repetition_penalty=1, stop=["<|eot_id|>", "<|eom_id|>"], _gl="1*1kgd2gr*_gcl_au*NzkwMDYxMTc0LjE3MzMzOTYxOTM.", stream=True ) # دریافت و نمایش پاسخ مدل response_content = "" for token in response: if hasattr(token, 'choices'): response_content += token.choices[0].delta.content memory.chat_memory.add_ai_message(response_content) return response_content def clear_memory(): memory.chat_memory.clear() return [], "" def save_chat_history(): chat_history = get_chat_history_string(memory.chat_memory) file_path = "/tmp/chat_history.txt" # مسیر موقت برای Hugging Face Spaces with open(file_path, "w", encoding="utf-8") as file: file.write(chat_history) return file_path with gr.Blocks() as demo: chatbot = gr.Chatbot() msg = gr.Textbox(show_label=False, placeholder="پیامتان را وارد کنید...") with gr.Row(): submit_btn = gr.Button("ارسال") clear_btn = gr.Button("🧹 پاک کردن حافظه") download_btn = gr.Button("📥 دانلود تاریخچه چت") download_link = gr.File(label="دانلود فایل تاریخچه چت") # برای نمایش لینک دانلود def fix_bidi_text(text): RLE = '\u202B' # Right-To-Left Embedding PDF = '\u202C' # Pop Directional Formatting return f"{RLE}{text}{PDF}" def respond(message, chat_history): bot_response = agent_respond(message) fixed_message = fix_bidi_text(message) fixed_bot_response = fix_bidi_text(bot_response) chat_history.append((fixed_message, fixed_bot_response)) return chat_history, "" def download_chat_history(): file_path = save_chat_history() return file_path # بازگرداندن مسیر فایل submit_btn.click(respond, [msg, chatbot], [chatbot, msg]) msg.submit(respond, [msg, chatbot], [chatbot, msg]) clear_btn.click(clear_memory, inputs=None, outputs=[chatbot, msg]) download_btn.click(download_chat_history, inputs=None, outputs=download_link) # # اجرای برنامه Gradio if __name__ == "__main__": demo.launch(share=True)