File size: 5,316 Bytes
40da04c
a0a648c
cfecbd0
256ba91
a0a648c
 
 
cfecbd0
8d6b511
cfecbd0
40da04c
 
 
 
 
a0a648c
40da04c
 
 
 
8d6b511
cfecbd0
a0a648c
40da04c
a0a648c
 
 
 
 
 
 
 
 
40da04c
8d6b511
fd96a70
 
 
 
db982f4
 
cfecbd0
db982f4
 
 
 
40da04c
cfecbd0
256ba91
 
cfecbd0
a0a648c
40da04c
a0a648c
 
fd96a70
256ba91
 
 
a0a648c
fd96a70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a0a648c
 
 
 
 
fd96a70
a0a648c
fd96a70
 
 
a0a648c
fd96a70
8d6b511
cfecbd0
8d6b511
fd96a70
40da04c
a0a648c
256ba91
 
 
40da04c
256ba91
fd96a70
a0a648c
cfecbd0
40da04c
a0a648c
8d6b511
40da04c
cfecbd0
40da04c
 
 
8d6b511
cfecbd0
fd96a70
8d6b511
a0a648c
cfecbd0
a0a648c
 
 
 
 
fd96a70
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
# app.py
import os
import pandas as pd
import gradio as gr
import comtradeapicall
from huggingface_hub import InferenceClient
from deep_translator import GoogleTranslator
import spaces  # برای مدیریت GPU کرایه‌ای

# --- بارگذاری HS DATA از CSV گیت‌هاب ---
HS_CSV_URL = (
    "https://raw.githubusercontent.com/"
    "datasets/harmonized-system/master/data/harmonized-system.csv"
)
hs_df = pd.read_csv(HS_CSV_URL, dtype=str)

def get_product_name(hs_code: str) -> str:
    code4 = str(hs_code).zfill(4)
    row = hs_df[hs_df["hscode"] == code4]
    return row.iloc[0]["description"] if not row.empty else "–"

# --- تابع دریافت واردات و پردازش ستون‌ها ---
def get_importers(hs_code: str, year: str, month: str):
    product_name = get_product_name(hs_code)
    period = f"{year}{int(month):02d}"
    df = comtradeapicall.previewFinalData(
        typeCode='C', freqCode='M', clCode='HS', period=period,
        reporterCode=None, cmdCode=hs_code, flowCode='M',
        partnerCode=None, partner2Code=None,
        customsCode=None, motCode=None,
        maxRecords=500, includeDesc=True
    )
    if df is None or df.empty:
        return product_name, pd.DataFrame()

    # شناسایی ستون‌های مورد نیاز
    code_col = next((c for c in df.columns if 'code' in c.lower()), None)
    title_col = next((c for c in df.columns if 'title' in c.lower()), None)
    value_col = next((c for c in df.columns if 'value' in c.lower()), None)
    if not (code_col and title_col and value_col):
        return product_name, df

    df_sorted = df.sort_values(value_col, ascending=False).head(10)
    out = df_sorted[[code_col, title_col, value_col]]
    out.columns = ['کد کشور', 'نام کشور', 'ارزش CIF']
    return product_name, out

# --- تابع تولید مشاوره تخصصی با GPU کرایه‌ای ---
hf_token = os.getenv("HF_API_TOKEN")
client = InferenceClient(token=hf_token)
translator = GoogleTranslator(source='en', target='fa')

@spaces.GPU
def provide_advice(table_data: pd.DataFrame, hs_code: str, year: str, month: str):
    if table_data is None or table_data.empty:
        return "<div dir=\"rtl\" style=\"text-align: right; font-family: IRANSans;\">ابتدا نمایش داده‌های واردات را انجام دهید.</div>"

    df_limited = table_data.head(10)
    table_str = df_limited.to_string(index=False)
    period = f"{year}/{int(month):02d}"
    prompt = f"""
لطفاً یک گزارش تحلیلی به زبان فارسی و با چینش راست‌به‌چپ تولید کن، شامل دو بخش:
1. جدول خلاصه (Markdown) 10 کشور برتر با ستون‌های رتبه، نام کشور، ارزش CIF و سه تأمین‌کننده برتر.
2. نکات کلیدی و پیشنهادات به‌صورت بولت‌پوینت با تراز راست.

- متن خروجی را درون یک <div dir=\"rtl\" style=\"text-align: right; font-family: IRANSans;\"> قرار بده.

داده‌ها:
{table_str}
""" 10 کشور برتر با ستون‌های رتبه، نام کشور، ارزش CIF و سه تأمین‌کننده برتر."
        "\n2. نکات کلیدی و پیشنهادات به‌صورت بولت‌پوینت با تراز راست."
        "\n
- متن خروجی را درون یک <div dir=\\\"rtl\\\" style=\\\"text-align: right; font-family: IRANSans;\\\"> قرار بده."
        f"\n
داده‌ها:\n{table_str}"
    )
    try:
        outputs = client.text_generation(
            prompt=prompt,
            model="mistralai/Mixtral-8x7B-Instruct-v0.1",
            max_new_tokens=2048
        )
        persian = translator.translate(outputs)
        # قرار دادن در کانتینر HTML راست‌چین
        return f"<div dir=\"rtl\" style=\"text-align: right; font-family: IRANSans;\">{persian}</div>"
    except Exception as e:
        return f"<div dir=\"rtl\" style=\"text-align: right; font-family: IRANSans;\">خطا در تولید مشاوره: {e}</div>"

# --- رابط کاربری Gradio ---
with gr.Blocks() as demo:
    gr.Markdown("<div dir=\"rtl\" style=\"text-align: right; font-family: IRANSans;\"><h2>تحلیل واردات بر اساس کد HS و ارائه مشاوره تخصصی</h2></div>", elem_id="title")

    with gr.Row():
        inp_hs = gr.Textbox(label="کد HS", placeholder="مثلاً 1006")
        inp_year = gr.Textbox(label="سال", placeholder="مثلاً 2023")
        inp_month = gr.Textbox(label="ماه", placeholder="مثلاً 1 تا 12")

    btn_show = gr.Button("نمایش داده‌های واردات")
    out_name = gr.Markdown(label="**<div dir=\"rtl\" style=\"text-align: right; font-family: IRANSans;\">نام محصول</div>")
    out_table = gr.Dataframe(
        datatype="pandas",
        interactive=True
    )

    btn_show.click(
        fn=get_importers,
        inputs=[inp_hs, inp_year, inp_month],
        outputs=[out_name, out_table]
    )

    btn_advice = gr.Button("ارائه مشاوره تخصصی")
    out_advice = gr.HTML()

    btn_advice.click(
        fn=provide_advice,
        inputs=[out_table, inp_hs, inp_year, inp_month],
        outputs=out_advice
    )

if __name__ == "__main__":
    demo.launch()