|
import gradio as gr |
|
from langchain.chat_models import ChatOpenAI |
|
from langchain.schema import HumanMessage |
|
from fpdf import FPDF |
|
import tempfile |
|
import os |
|
|
|
|
|
llm = ChatOpenAI( |
|
base_url="https://api.together.xyz/v1", |
|
api_key="0291f33aee03412a47fa5d8e562e515182dcc5a7fb5eefdd1759005979", |
|
model="meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", |
|
max_tokens=1024 |
|
) |
|
|
|
|
|
generated_report_text = "" |
|
|
|
|
|
def generate_report(operation_data, max_tokens, temperature, top_p): |
|
global generated_report_text |
|
|
|
system_prompt = """تو یک افسر گزارشنویس نظامی هستی. وظیفه تو تهیه یک گزارش رسمی، دقیق، ساختاریافته و حرفهای از عملیات نظامی بر اساس دادههای ارائهشده است. اگر اطلاعاتی در متن وجود نداشت، صراحتاً بنویس «ذکر نشده است». |
|
|
|
لطفاً گزارش را دقیقاً در قالب فرمتیافته زیر تولید کن، با استفاده از نشانهگذاری واضح (مانند ایموجیها و خطوط جداکننده) تا خروجی قابلخواندن و رسمی باشد: |
|
|
|
━━━━━━━━━━━━━━━━━━━━━━ |
|
📄 گزارش رسمی عملیات نظامی |
|
|
|
🕒 تاریخ و ساعت شروع عملیات: |
|
[اگر در متن بود بنویس، در غیر این صورت بنویس: ذکر نشده است] |
|
|
|
🕓 تاریخ و ساعت پایان عملیات: |
|
[اگر در متن بود بنویس، در غیر این صورت بنویس: ذکر نشده است] |
|
|
|
📍 مکان عملیات: |
|
[نام مکان عملیات یا بنویس: ذکر نشده است] |
|
|
|
🪖 واحدهای شرکتکننده: |
|
[نام گردانها یا یگانها یا بنویس: ذکر نشده است] |
|
|
|
🎯 هدف عملیات: |
|
[اهداف اصلی عملیات یا بنویس: ذکر نشده است] |
|
|
|
📝 شرح عملیات: |
|
[شرح مختصر عملیات شامل مسیر، تاکتیک، درگیریها و روند پیشروی] |
|
|
|
🏁 نتیجه عملیات: |
|
[پیروزی، شکست، توقف، عقبنشینی یا ذکر نشده است] |
|
|
|
🩻 تلفات نیروهای خودی: |
|
[تعداد شهدا، مجروحین یا بنویس: ذکر نشده است] |
|
|
|
🚫 تلفات دشمن: |
|
[در صورت موجود بودن، ذکر شود - در غیر این صورت بنویس: ذکر نشده است] |
|
|
|
🛠️ تجهیزات استفادهشده یا از دسترفته: |
|
[مثلاً تانک، پهپاد، سلاح خاص یا ذکر نشده است] |
|
|
|
🗒️ یادداشتهای اضافی: |
|
[شرایط خاص، اطلاعات پشتیبانی، آبوهوا، یا بنویس: ذکر نشده است] |
|
|
|
━━━━━━━━━━━━━━━━━━━━━━ |
|
✅ این گزارش بر اساس اطلاعات ارائهشده تولید شده و ممکن است برخی جزئیات در دسترس نبوده باشند. |
|
""" |
|
messages = [HumanMessage(content=f"{system_prompt}\n\n{operation_data}")] |
|
response = llm(messages) |
|
generated_report_text = response.content |
|
return generated_report_text |
|
|
|
|
|
|
|
def download_pdf(): |
|
global generated_report_text |
|
|
|
font_path = "Vazir-Black.ttf" |
|
if not os.path.exists(font_path): |
|
return "❌ فونت فارسی Vazir پیدا نشد. لطفاً در مسیر fonts/Vazir.ttf قرار دهید." |
|
|
|
pdf = FPDF() |
|
pdf.add_page() |
|
pdf.add_font("Vazir", "", font_path, uni=True) |
|
pdf.set_font("Vazir", size=12) |
|
|
|
|
|
for line in generated_report_text.split("\n"): |
|
pdf.multi_cell(0, 10, line.strip(), align="R") |
|
|
|
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") |
|
pdf.output(temp_file.name) |
|
return temp_file.name |
|
|
|
|
|
with gr.Blocks(title="🛡️ گزارشنویس هوش مصنوعی عملیات نظامی") as demo: |
|
gr.Markdown("## 🛡️ گزارشنویس عملیات نظامی با هوش مصنوعی\nاطلاعات خام عملیات نظامی را وارد کن تا گزارش رسمی، خلاصه و حرفهای تولید شود.") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
input_text = gr.Textbox(label="📝 اطلاعات عملیات نظامی", lines=10, placeholder="مثلاً: در ساعت ۵ صبح، گردان الف از محور غربی وارد منطقه شد...") |
|
|
|
with gr.Column(scale=1): |
|
output_report = gr.Code(label="📄 گزارش رسمی تولید شده", language="markdown") |
|
|
|
max_tokens = gr.Slider(128, 2048, value=1024, step=64, label="🎛️ حداکثر توکن خروجی") |
|
temperature = gr.Slider(0.1, 1.5, value=0.7, step=0.1, label="🔥 دمای خلاقیت (temperature)") |
|
top_p = gr.Slider(0.1, 1.0, value=0.95, step=0.05, label="🎯 Top-p") |
|
|
|
generate_btn = gr.Button("🚀 تولید گزارش") |
|
download_button = gr.Button("📥 دانلود PDF گزارش") |
|
file_output = gr.File(label="📎 فایل PDF برای دانلود") |
|
|
|
generate_btn.click( |
|
fn=generate_report, |
|
inputs=[input_text, max_tokens, temperature, top_p], |
|
outputs=output_report |
|
) |
|
|
|
download_button.click( |
|
fn=download_pdf, |
|
inputs=[], |
|
outputs=file_output |
|
) |
|
|
|
if __name__ == "__main__": |
|
demo.launch() |
|
|