Skip to content

Commit 66375d9

Browse files
committed
feat: enhance get_acs_result.py with job duration calculation and improve logging while fixing download functionality for improved reliability
1 parent c3fad11 commit 66375d9

2 files changed

Lines changed: 64 additions & 31 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,4 @@ evalate_threads/quick_test.py
2222
evalate_threads/test_adk_intergration.py
2323
evaluation_results.json
2424
output.zip
25+
log

scripts/get_acs_result.py

Lines changed: 63 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,51 @@
22
import json
33
import os
44
import sys
5+
from datetime import datetime
56

67
import requests
78
from dotenv import find_dotenv, load_dotenv
89
from toolsy.logger import init_colored_logger
910

11+
from agents.matmaster_agent.utils.job_utils import mapping_status
1012
from scripts.constant import FILE_TOKEN_API, JOB_DETAIL_API
1113

1214
load_dotenv(find_dotenv())
1315

1416
logger = init_colored_logger(__name__)
1517

1618

17-
def download_file(url, output_path):
18-
"""下载文件并显示进度"""
19-
response = requests.get(url, stream=True)
20-
response.raise_for_status()
19+
def get_duration(create_time, update_time):
20+
"""
21+
计算两个时间戳之间的时间差,格式化为时-分-秒
2122
23+
Args:
24+
create_time (str): 创建时间,ISO 8601格式
25+
update_time (str): 更新时间,ISO 8601格式
26+
27+
Returns:
28+
str: 时间差,格式为"时-分-秒"
29+
"""
30+
# 解析时间字符串为datetime对象
31+
create_dt = datetime.fromisoformat(create_time)
32+
update_dt = datetime.fromisoformat(update_time)
33+
34+
# 计算时间差
35+
time_diff = update_dt - create_dt
36+
37+
# 提取总秒数
38+
total_seconds = int(time_diff.total_seconds())
39+
40+
# 计算小时、分钟、秒
41+
hours = total_seconds // 3600
42+
minutes = (total_seconds % 3600) // 60
43+
seconds = total_seconds % 60
44+
45+
# 格式化为时-分-秒
46+
return f"{hours:02d}:{minutes:02d}:{seconds:02d}"
47+
48+
49+
def download_file(response, output_path):
2250
total_size = int(response.headers.get('content-length', 0))
2351
downloaded_size = 0
2452

@@ -31,15 +59,7 @@ def download_file(url, output_path):
3159
progress = (downloaded_size / total_size) * 100
3260
print(f"\rDownload progress: {progress:.1f}%", end='', flush=True)
3361

34-
35-
def check_url_status(url):
36-
"""检查URL的HTTP状态码"""
37-
try:
38-
response = requests.head(url, timeout=10) # 使用HEAD方法,只获取头部信息
39-
return response.status_code
40-
except requests.exceptions.RequestException as e:
41-
print(f"Warning: Failed to check URL status: {e}")
42-
return None
62+
print()
4363

4464

4565
def main():
@@ -59,34 +79,40 @@ def main():
5979
os.remove(args.output)
6080

6181
# 调用API获取job信息
62-
logger.info(f"Fetching job information for ID: {args.job_id}")
82+
logger.info(f"Job ID: {args.job_id}")
6383

6484
try:
6585
response = requests.get(
6686
f"{JOB_DETAIL_API}/{args.job_id}?accessKey={os.getenv('MATERIALS_ACCESS_KEY')}"
6787
)
6888
response.raise_for_status()
69-
data = response.json()
89+
job_info = response.json()
7090
except requests.exceptions.RequestException as e:
7191
logger.error(f"Error: Failed to fetch data from API: {e}")
7292
sys.exit(1)
7393
except json.JSONDecodeError as e:
7494
logger.error(f"Error: Failed to parse JSON response: {e}")
7595
sys.exit(1)
7696

77-
logger.info(f"\n{json.dumps(data, indent=2, ensure_ascii=False)}")
97+
logger.debug(f"\n{json.dumps(job_info, indent=2, ensure_ascii=False)}")
7898

99+
create_time = job_info['data']['createTime']
100+
update_time = job_info['data']['updateTime']
101+
duration = get_duration(create_time, update_time)
102+
job_status = mapping_status(job_info['data']['status'])
103+
job_name = job_info['data']['jobName']
104+
logger.info(f"{job_name}[{job_status}] -- {duration}")
79105
# 解析JSON获取resultUrl
80-
if data.get('code') == 0:
81-
result_url = data.get('data', {}).get('resultUrl', '')
82-
elif data.get('code') == 6020:
83-
logger.error(f"API returned error code: {data.get('code')}")
106+
if job_info.get('code') == 0:
107+
result_url = job_info.get('data', {}).get('resultUrl', '')
108+
elif job_info.get('code') == 6020:
109+
logger.error(f"API returned error code: {job_info.get('code')}")
84110
sys.exit(-1)
85111
else:
86112
result_url = ''
87-
logger.error(f"API returned error code: {data.get('code')}")
113+
logger.error(f"API returned error code: {job_info.get('code')}")
88114

89-
# 获取log文件的token(可选操作)
115+
# 获取log文件的token
90116
token_data = {'filePath': 'log', 'jobId': args.job_id}
91117

92118
try:
@@ -99,8 +125,6 @@ def main():
99125
except requests.exceptions.RequestException:
100126
pass # 忽略token获取错误,因为这不是主要功能
101127

102-
logger.info(f"\n{json.dumps(token_data, indent=2)}")
103-
104128
log_token = token_data.get('data', {}).get('token', '')
105129
log_path = token_data.get('data', {}).get('path', '')
106130
log_host = token_data.get('data', {}).get('host', '')
@@ -109,29 +133,37 @@ def main():
109133
if log_host and log_path and log_token:
110134
log_url = f"{log_host}/api/download/{log_path}?token={log_token}"
111135

112-
# 检查log URL的状态
113-
status_code = check_url_status(log_url)
136+
log_response = requests.get(log_url, timeout=10)
137+
status_code = log_response.status_code
138+
114139
if status_code:
115140
if status_code == 400:
116141
logger.error('Warning: Log URL returned 400 Bad Request')
117142
elif status_code == 200:
118-
logger.info(f"\nlog_url: {log_url}")
143+
download_file(log_response, 'log')
144+
logger.info('Download `log` completed successfully')
119145
else:
120146
logger.error(f"Log URL returned status code: {status_code}")
121147
else:
122148
print('\nIncomplete log information - cannot construct log URL')
123149

150+
if job_status in ['Running', 'Finished']:
151+
return
152+
124153
# 下载结果文件
125154
if result_url and result_url != 'null':
126-
print(f"\nFound resultUrl: {result_url}")
127-
print(f"\nDownloading to: {args.output}")
155+
logger.info(f"Job Result Downloading to: {args.output}")
128156

129157
try:
130-
download_file(result_url, args.output)
158+
result_response = requests.get(result_url, stream=True)
159+
result_response.raise_for_status()
160+
download_file(result_response, args.output)
131161

132162
if os.path.exists(args.output) and os.path.getsize(args.output) > 0:
133163
file_size = os.path.getsize(args.output)
134-
print(f"Download completed successfully! File size: {file_size} bytes")
164+
logger.info(
165+
f"Download completed successfully! File size: {file_size} bytes"
166+
)
135167
else:
136168
print("Error: Download failed - file is empty or doesn't exist")
137169
sys.exit(1)

0 commit comments

Comments
 (0)