File size: 5,629 Bytes
ad87178
6341792
 
35c3d0c
 
 
9aa2922
4a9ccb9
6341792
 
35c3d0c
6341792
 
 
896ef55
4a9ccb9
35c3d0c
 
4a9ccb9
9aa2922
35c3d0c
 
3df797e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35c3d0c
5c02a22
35c3d0c
 
 
 
5c02a22
896ef55
4a9ccb9
35c3d0c
 
 
2822844
35c3d0c
 
 
 
 
 
 
 
4a9ccb9
35c3d0c
 
 
 
 
 
36bf041
c86406f
35c3d0c
 
 
4a9ccb9
 
 
 
 
 
 
35c3d0c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
896ef55
 
6341792
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
import gradio as gr
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
from fpdf import FPDF
import tempfile
import os

# مدل LLaMA-3 از طریق Together API
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


# تابع ساخت PDF فارسی راست‌چین
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)

    # تنظیم راست‌چین با align=R
    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()