Spaces:
Sleeping
Sleeping
File size: 5,153 Bytes
da55789 df57048 da95215 da55789 f7eee22 90cd043 f7eee22 da95215 90cd043 f7eee22 90cd043 f7eee22 90cd043 da55789 df57048 da55789 90cd043 df57048 da55789 df57048 90cd043 df57048 da55789 df57048 da55789 f7eee22 da55789 da95215 f7eee22 90cd043 da95215 f7eee22 da95215 f7eee22 90cd043 da95215 90cd043 df57048 90cd043 da95215 90cd043 da95215 90cd043 da95215 90cd043 da95215 90cd043 da55789 90cd043 849bf67 da95215 849bf67 da55789 849bf67 | 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 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | #!/usr/bin/env python3
import os
import sys
import sqlite3
import json
import urllib.request
import subprocess
from datetime import datetime
DB_PATH = "/app/server/data/freeapi.db"
BAILIAN_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1/models"
def get_table_columns(conn, table):
cursor = conn.execute(f"PRAGMA table_info({table})")
return [row[1] for row in cursor.fetchall()]
def ensure_provider_table(conn):
# 检查是否存在 providers 或 channels 表,如果没有则创建
cursor = conn.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name IN ('providers', 'channels')")
tables = [row[0] for row in cursor.fetchall()]
if 'providers' in tables:
return 'providers'
elif 'channels' in tables:
return 'channels'
else:
cursor.execute("""
CREATE TABLE providers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
base_url TEXT,
api_key TEXT,
created_at TEXT
)
""")
conn.commit()
return 'providers'
def get_or_create_bailian_provider(conn, provider_table):
cursor = conn.cursor()
cursor.execute(f"SELECT id FROM {provider_table} WHERE base_url LIKE '%dashscope.aliyuncs.com%' LIMIT 1")
row = cursor.fetchone()
if row:
return row[0]
cursor.execute(f"""
INSERT INTO {provider_table} (name, base_url, api_key, created_at)
VALUES (?, ?, ?, ?)
""", ("Bailian", BAILIAN_URL, "", datetime.utcnow().isoformat()))
conn.commit()
return cursor.lastrowid
def main():
api_key = os.getenv("BAILIAN_API_KEY")
if not api_key:
print("⚠️ BAILIAN_API_KEY not set, skipping model sync")
return 0
# 获取模型列表
req = urllib.request.Request(BAILIAN_URL)
req.add_header("Authorization", f"Bearer {api_key}")
try:
with urllib.request.urlopen(req, timeout=30) as response:
data = json.loads(response.read().decode('utf-8'))
models = [item["id"] for item in data.get("data", [])]
if not models:
print("⚠️ No models found")
return 1
except Exception as e:
print(f"❌ Failed to fetch models: {e}")
return 1
conn = sqlite3.connect(DB_PATH)
provider_table = ensure_provider_table(conn)
provider_id = get_or_create_bailian_provider(conn, provider_table)
# 获取 models 表的列
model_columns = get_table_columns(conn, "models")
print(f"models table columns: {model_columns}")
# 根据实际列名动态构建插入语句
# 我们期望的映射:模型ID -> 可能的列名
id_col_candidates = ['model_id', 'id', 'name']
id_col = None
for col in id_col_candidates:
if col in model_columns:
id_col = col
break
if not id_col:
print("❌ models table missing id column")
return 1
# 其他可用列
insert_cols = [id_col]
if 'platform' in model_columns:
insert_cols.append('platform')
if 'provider_id' in model_columns:
insert_cols.append('provider_id')
if 'enabled' in model_columns:
insert_cols.append('enabled')
if 'created_at' in model_columns:
insert_cols.append('created_at')
# 如果有 display_name 列,可以用作显示名称
if 'display_name' in model_columns:
insert_cols.append('display_name')
if not insert_cols:
print("❌ No columns to insert")
return 1
placeholders = ','.join(['?' for _ in insert_cols])
cursor = conn.cursor()
added = 0
for model_id in models:
# 检查是否存在
cursor.execute(f"SELECT 1 FROM models WHERE {id_col} = ?", (model_id,))
if cursor.fetchone():
print(f"⏭️ Already exists: {model_id}")
continue
values = []
for col in insert_cols:
if col == id_col:
values.append(model_id)
elif col == 'platform':
values.append('bailian')
elif col == 'provider_id':
values.append(provider_id)
elif col == 'enabled':
values.append(1)
elif col == 'created_at':
values.append(datetime.utcnow().isoformat())
elif col == 'display_name':
values.append(model_id) # 或更友好的名称
sql = f"INSERT INTO models ({','.join(insert_cols)}) VALUES ({placeholders})"
cursor.execute(sql, values)
added += 1
print(f"➕ Added model: {model_id}")
conn.commit()
conn.close()
print(f"✅ Sync completed. New models added: {added}")
if added > 0:
print("Triggering immediate backup to persist new models...")
backup_script = "/app/scripts/backup_to_dataset.py"
if os.path.exists(backup_script):
subprocess.run(["python3", backup_script])
else:
print("Backup script not found, skipping immediate backup.")
return 0
if __name__ == "__main__":
sys.exit(main()) |