File size: 2,984 Bytes
51f323f
 
0a2bede
a088502
14640e3
a088502
 
 
51f323f
 
14640e3
51f323f
 
 
0a2bede
ca78357
0a2bede
14640e3
ca78357
51f323f
 
 
14640e3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0a2bede
51f323f
 
 
 
 
 
 
 
 
ca78357
51f323f
 
 
 
 
 
 
 
14640e3
 
51f323f
14640e3
51f323f
14640e3
ca78357
51f323f
ca78357
14640e3
ca78357
14640e3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ca78357
 
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
import os
import pandas as pd
from huggingface_hub import hf_hub_download, upload_file, login
from dotenv import load_dotenv
from config import DATASET_REPO_ID

# Load .env at import time so HF_TOKEN works in local dev
load_dotenv()

# --- 配置區 ---
# DATASET_REPO_ID 已從 config 匯入
CSV_FILENAME = "baseline_logs.csv"
HF_TOKEN = os.getenv("HF_TOKEN")

# 🌟 批次上傳門檻 (每累積幾筆資料才備份到雲端一次)
BATCH_SIZE = 30  
unsynced_count = 0  
pending_logs = []  # 用於存放尚未寫入 CSV 的紀錄

if HF_TOKEN:
    login(token=HF_TOKEN)

def sync_from_hf():
    """從雲端下載最新的 CSV 並回傳 DataFrame (系統啟動時只會呼叫一次)"""
    try:
        from config import MODEL_FILES
        local_path = MODEL_FILES["baseline_logs"]
        path = hf_hub_download(
            repo_id=DATASET_REPO_ID,
            filename=CSV_FILENAME,
            repo_type="dataset",
            token=HF_TOKEN
        )
        # 同步回本地
        df = pd.read_csv(path)
        df.to_csv(local_path, index=False)
        print(f"✅ 已從 Hugging Face 同步最新資料庫 ({len(df)} 筆)")
        return df
    except Exception as e:
        print(f"⚠️ 無法下載雲端資料,可能為首次運行或權限不足: {e}")
        return None

def upload_to_hf():
    """將本地的 CSV 檔案同步回雲端"""
    try:
        upload_file(
            path_or_fileobj=CSV_FILENAME,
            path_in_repo=CSV_FILENAME,
            repo_id=DATASET_REPO_ID,
            repo_type="dataset",
            token=HF_TOKEN,
            commit_message=f"System auto-log batch update ({BATCH_SIZE} logs)"
        )
        return True
    except Exception as e:
        print(f"❌ 雲端同步失敗: {e}")
        return False

def push_new_log(new_log_dict):
    """
    接收新紀錄並計數。達到 BATCH_SIZE 門檻時才執行「本地寫入」與「雲端上傳」。
    有效避免頻繁 IO 與 429 Rate Limit。
    """
    global unsynced_count, pending_logs
    
    pending_logs.append(new_log_dict)
    unsynced_count += 1
    
    if unsynced_count >= BATCH_SIZE:
        print(f"📦 已累積 {BATCH_SIZE} 筆操作,正在執行批次寫入與同步...")
        
        try:
            from config import MODEL_FILES
            local_path = MODEL_FILES["baseline_logs"]
            
            # 執行本地批次寫入
            new_df = pd.DataFrame(pending_logs)
            new_df.to_csv(local_path, mode='a', header=not os.path.exists(local_path), index=False)
            
            # 執行雲端同步
            success = upload_to_hf()
            
            if success:
                print("✅ 批次寫入與雲端同步成功!")
                unsynced_count = 0  
                pending_logs = []  # 清空緩存
            return success
        except Exception as e:
            print(f"❌ 批次寫入失敗: {e}")
            return False
        
    return True