|
import gradio as gr |
|
from langchain.chat_models import ChatOpenAI |
|
from langchain.schema import HumanMessage |
|
from reportlab.pdfgen import canvas |
|
from reportlab.lib.pagesizes import A4 |
|
from reportlab.pdfbase import pdfmetrics |
|
from reportlab.pdfbase.ttfonts import TTFont |
|
from bidi.algorithm import get_display |
|
import arabic_reshaper |
|
import os |
|
|
|
|
|
llm = ChatOpenAI( |
|
base_url="https://api.together.xyz/v1", |
|
api_key="0291f33aee03412a47fa5d8e562e515182dcc5d9aac5a7fb5eefdd1759005979", |
|
model="meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", |
|
max_tokens=1024 |
|
) |
|
|
|
def generate_report(operation_data, max_tokens, temperature, top_p): |
|
system_prompt = """تو یک افسر گزارشنویس نظامی هستی. وظیفه تو تهیه یک گزارش رسمی، دقیق، ساختاریافته و حرفهای از عملیات نظامی بر اساس دادههای ارائهشده است. اگر اطلاعاتی در متن وجود نداشت، صراحتاً بنویس «ذکر نشده است». |
|
لطفاً گزارش را دقیقاً در قالب فرمتیافته زیر تولید کن، با استفاده از نشانهگذاری واضح (مانند ایموجیها و خطوط جداکننده) تا خروجی قابلخواندن و رسمی باشد: |
|
━━━━━━━━━━━━━━━━━━━━━━ |
|
📄 گزارش رسمی عملیات نظامی |
|
🕒 تاریخ و ساعت شروع عملیات: |
|
[اگر در متن بود بنویس، در غیر این صورت بنویس: ذکر نشده است] |
|
🕓 تاریخ و ساعت پایان عملیات: |
|
[اگر در متن بود بنویس، در غیر این صورت بنویس: ذکر نشده است] |
|
📍 مکان عملیات: |
|
[نام مکان عملیات یا بنویس: ذکر نشده است] |
|
🪖 واحدهای شرکتکننده: |
|
[نام گردانها یا یگانها یا بنویس: ذکر نشده است] |
|
🎯 هدف عملیات: |
|
[اهداف اصلی عملیات یا بنویس: ذکر نشده است] |
|
📝 شرح عملیات: |
|
[شرح مختصر عملیات شامل مسیر، تاکتیک، درگیریها و روند پیشروی] |
|
🏁 نتیجه عملیات: |
|
[پیروزی، شکست، توقف، عقبنشینی یا ذکر نشده است] |
|
🩻 تلفات نیروهای خودی: |
|
[تعداد شهدا، مجروحین یا بنویس: ذکر نشده است] |
|
🚫 تلفات دشمن: |
|
[در صورت موجود بودن، ذکر شود - در غیر این صورت بنویس: ذکر نشده است] |
|
🛠️ تجهیزات استفادهشده یا از دسترفته: |
|
[مثلاً تانک، پهپاد، سلاح خاص یا ذکر نشده است] |
|
🗒️ یادداشتهای اضافی: |
|
[شرایط خاص، اطلاعات پشتیبانی، آبوهوا، یا بنویس: ذکر نشده است] |
|
━━━━━━━━━━━━━━━━━━━━━━ |
|
✅ این گزارش بر اساس اطلاعات خام ارائهشده تولید شده و ممکن است برخی جزئیات در دسترس نبوده باشند. |
|
""" |
|
|
|
|
|
|
|
messages = [ |
|
HumanMessage(content=f"{system_prompt}\n\n{operation_data}") |
|
] |
|
|
|
|
|
response = llm(messages) |
|
return response.content |
|
|
|
|
|
def export_to_pdf(): |
|
reshaped_text = arabic_reshaper.reshape(response.content) |
|
bidi_text = get_display(reshaped_text) |
|
|
|
output_path = "military_report.pdf" |
|
|
|
pdfmetrics.registerFont(TTFont('Vazir', 'Vazir.ttf')) |
|
|
|
c = canvas.Canvas(output_path, pagesize=A4) |
|
c.setFont("Vazir", 12) |
|
|
|
width, height = A4 |
|
x = width - 40 |
|
y = height - 40 |
|
|
|
for line in bidi_text.split('\n'): |
|
reshaped = arabic_reshaper.reshape(line) |
|
bidi_line = get_display(reshaped) |
|
c.drawRightString(x, y, bidi_line) |
|
y -= 18 |
|
|
|
c.save() |
|
return output_path |
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("## گزارشنویس هوش مصنوعی عملیات نظامی") |
|
operation_input = gr.Textbox(label="اطلاعات عملیات نظامی", lines=10) |
|
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") |
|
|
|
output_text = gr.Textbox(label="📄 گزارش رسمی تولید شده", lines=15) |
|
|
|
generate_button = gr.Button("تولید گزارش") |
|
pdf_output = gr.File(label="📥 دانلود گزارش PDF") |
|
|
|
def wrapper(operation_data, max_tokens, temperature, top_p): |
|
report = generate_report(operation_data, max_tokens, temperature, top_p) |
|
return report |
|
|
|
generate_button.click( |
|
fn=wrapper, |
|
inputs=[operation_input, max_tokens, temperature, top_p], |
|
outputs=output_text |
|
) |
|
|
|
download_button = gr.Button("📤 دانلود PDF") |
|
download_button.click(fn=export_to_pdf, outputs=pdf_output) |
|
|
|
if __name__ == "__main__": |
|
demo.launch() |