Spaces:
Runtime error
Runtime error
| import requests | |
| import logging | |
| from modules.presets import ( | |
| timeout_all, | |
| USAGE_API_URL, | |
| BALANCE_API_URL, | |
| standard_error_msg, | |
| connection_timeout_prompt, | |
| error_retrieve_prompt, | |
| read_timeout_prompt | |
| ) | |
| from . import shared | |
| from modules.config import retrieve_proxy | |
| import os, datetime | |
| def get_billing_data(openai_api_key, billing_url): | |
| headers = { | |
| "Content-Type": "application/json", | |
| "Authorization": f"Bearer {openai_api_key}" | |
| } | |
| timeout = timeout_all | |
| with retrieve_proxy(): | |
| response = requests.get( | |
| billing_url, | |
| headers=headers, | |
| timeout=timeout, | |
| ) | |
| if response.status_code == 200: | |
| data = response.json() | |
| return data | |
| else: | |
| raise Exception(f"API request failed with status code {response.status_code}: {response.text}") | |
| def get_usage(openai_api_key): | |
| try: | |
| curr_time = datetime.datetime.now() | |
| last_day_of_month = get_last_day_of_month(curr_time).strftime("%Y-%m-%d") | |
| first_day_of_month = curr_time.replace(day=1).strftime("%Y-%m-%d") | |
| usage_url = f"{shared.state.usage_api_url}?start_date={first_day_of_month}&end_date={last_day_of_month}" | |
| try: | |
| usage_data = get_billing_data(openai_api_key, usage_url) | |
| except Exception as e: | |
| logging.error(f"获取API使用情况失败:"+str(e)) | |
| return f"**获取API使用情况失败**" | |
| rounded_usage = "{:.5f}".format(usage_data['total_usage']/100) | |
| return f"**本月使用金额** \u3000 ${rounded_usage}" | |
| except requests.exceptions.ConnectTimeout: | |
| status_text = standard_error_msg + connection_timeout_prompt + error_retrieve_prompt | |
| return status_text | |
| except requests.exceptions.ReadTimeout: | |
| status_text = standard_error_msg + read_timeout_prompt + error_retrieve_prompt | |
| return status_text | |
| except Exception as e: | |
| logging.error(f"获取API使用情况失败:"+str(e)) | |
| return standard_error_msg + error_retrieve_prompt | |
| def get_last_day_of_month(any_day): | |
| # The day 28 exists in every month. 4 days later, it's always next month | |
| next_month = any_day.replace(day=28) + datetime.timedelta(days=4) | |
| # subtracting the number of the current day brings us back one month | |
| return next_month - datetime.timedelta(days=next_month.day) |