my_7z_pack / image-caption-llama.cpp-api /get_latest_release.py
earth-demon's picture
Upload 8 files
dfc4c47
raw
history blame
4.18 kB
import os
import time
import requests
# 是否启用 SOCKS5 代理
USE_PROXY = True
# SOCKS5 代理地址
SOCKS5_PROXY = "192.168.2.205:1080"
# 代理探测重试配置
MAX_RETRIES = 3 # 最大重试次数
RETRY_DELAY = 2 # 每次失败后等待秒数
# GitHub 仓库信息
REPO = "ggml-org/llama.cpp"
# 构造代理字典 (使用 socks5h 以便在远程进行 DNS 解析)
PROXIES = (
{
"http": f"socks5h://{SOCKS5_PROXY}",
"https": f"socks5h://{SOCKS5_PROXY}",
}
if USE_PROXY
else None
)
def check_proxy():
"""探测 SOCKS5 代理是否正常,包含重试机制"""
if not USE_PROXY:
return True
print(f"SOCKS5 {SOCKS5_PROXY}")
for i in range(1, MAX_RETRIES + 1):
try:
# 探测目标选择 github.com,确保代理能上外网
# 使用 HEAD 请求,设置 5 秒超时
response = requests.head("https://github.com", proxies=PROXIES, timeout=3)
if response.status_code < 400:
print(f"第 {i} 次尝试,代理连接成功!")
return True
else:
print(f"第 {i} 次尝试,状态码异常 ({response.status_code})")
except Exception as e:
print(f"第 {i} 次尝试,失败 (错误: {e})")
# 如果不是最后一次尝试,则等待后再试
if i < MAX_RETRIES:
print(f"等待 {RETRY_DELAY} 秒后重试...")
time.sleep(RETRY_DELAY)
return False
def get_latest_release():
"""获取最新版本的 tag 名称"""
api_url = f"https://api.github.com/repos/{REPO}/releases/latest"
print(f"\n正在从 GitHub API 获取 {REPO} 的最新版本...")
try:
response = requests.get(api_url, proxies=PROXIES, timeout=15)
response.raise_for_status()
data = response.json()
return data["tag_name"]
except Exception as e:
print(f"获取版本信息失败: {e}")
return None
def download_file(url, filename):
"""下载文件并显示进度"""
print(f"\n准备下载: {filename}")
try:
with requests.get(url, proxies=PROXIES, stream=True, timeout=30) as r:
r.raise_for_status()
total_size = int(r.headers.get("content-length", 0))
with open(filename, "wb") as f:
chunk_size = 8192
downloaded = 0
for chunk in r.iter_content(chunk_size=chunk_size):
f.write(chunk)
downloaded += len(chunk)
if total_size > 0:
done = int(50 * downloaded / total_size)
print(
f"\r进度: [{'█' * done}{'.' * (50 - done)}] {downloaded/(1024*1024):.2f}MB / {total_size/(1024*1024):.2f}MB",
end="",
)
print("\n下载完成!")
except Exception as e:
print(f"\n下载失败: {e}")
def main():
# 0. 代理预热/探测
if USE_PROXY:
if not check_proxy():
print("\n[错误] 经过多次尝试,代理服务器仍无法正常工作。")
print(
"检查确认:1. SOCKS5 服务已启动;2. 地址和端口正确;3. 网络路径通畅。"
)
return
# 1. 获取最新版本号
tag = get_latest_release()
if not tag:
return
print(f"检测到最新版本: {tag}")
# 2. 定义要下载的文件列表
files_to_download = [
"cudart-llama-bin-win-cuda-13.1-x64.zip",
f"llama-{tag}-bin-win-cuda-13.1-x64.zip",
]
# 3. 执行下载
base_url = f"https://github.com/{REPO}/releases/download/{tag}"
for file_name in files_to_download:
download_url = f"{base_url}/{file_name}"
if os.path.exists(file_name):
print(f"\n文件 {file_name} 已存在,跳过。")
continue
download_file(download_url, file_name)
if __name__ == "__main__":
try:
main()
except Exception as e:
print(f"\n运行出错: {e}")
input(f"\n任务结束,按回车键退出...")