File size: 4,927 Bytes
80ef441
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2be08ff
80ef441
 
 
 
 
 
 
 
 
 
2be08ff
80ef441
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2be08ff
 
1ee54b7
80ef441
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2be08ff
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
# 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()

    # شناسایی ستون‌های مورد نیاز (کد کشور، نام کشور، ارزش)
    # ابتدا سعی در استفاده از ستون‌های استاندارد
    std_map = {
        'کد کشور': 'ptCode',
        'نام کشور': 'ptTitle',
        'ارزش CIF': 'TradeValue'
    }
    code_col = std_map['کد کشور'] if 'ptCode' in df.columns else next((c for c in df.columns if 'code' in c.lower()), None)
    title_col= std_map['نام کشور'] if 'ptTitle' in df.columns else next((c for c in df.columns if 'title' in c.lower()), None)
    value_col= std_map['ارزش CIF'] if 'TradeValue' in df.columns else next((c for c in df.columns if 'value' in c.lower()), None)

    if not (code_col and title_col and value_col):
        # اگر نتوانست ستون‌ها را شناسایی کند، برگرداندن DataFrame خام
        return product_name, df

    # محدودسازی به 10 کشور برتر بر اساس ستون value_col
    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 "ابتدا نمایش داده‌های واردات را انجام دهید."

    # محدودسازی تعداد ردیف‌های ورودی به 10 (در صورت بیشتر)
    df_limited = table_data.head(10)
    table_str = df_limited.to_string(index=False)
    period = f"{year}/{int(month):02d}"
    prompt = (
        f"The following table shows the top {len(df_limited)} countries by CIF value importing HS code {hs_code} during {period}:\n"
        f"{table_str}\n\n"
        "Please provide a detailed and comprehensive analysis of market trends, risks, "
        "and opportunities for a new exporter entering this market."
    )
    try:
        outputs = client.text_generation(
            prompt=prompt,
            model="mistralai/Mixtral-8x7B-Instruct-v0.1",
            max_new_tokens=1024
        )
        return translator.translate(outputs)
    except Exception as e:
        return f"خطا در تولید مشاوره: {e}"

# --- رابط کاربری Gradio ---
with gr.Blocks() as demo:
    gr.Markdown("## DIGINORON.COM ابزار هوش مصنوعی برای مشاوره صادرات کالا به کشورهای هدف")

    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="**نام محصول**")
    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.Textbox(label="مشاوره تخصصی", lines=8)

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

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