22Firmware.ai Quota Tracking Mixin
33
44Provides quota tracking for the Firmware.ai provider using their quota usage API.
5- Firmware.ai uses a 5-hour rolling window quota system where:
6- - `used` is already a ratio (0 to 1) indicating quota utilization
7- - `reset` is an ISO 8601 UTC timestamp, or null when no active window
5+ Firmware.ai uses a credit-based quota system where:
6+ - `credits` is the remaining credit balance (absolute value, e.g. 31.95)
87
98API Details:
109- Endpoint: GET https://app.firmware.ai/api/v1/quota
1110- Auth: Authorization: Bearer <api_key>
12- - Response: { used : float, reset: string|null }
11+ - Response: { credits : float }
1312
1413Required from provider:
1514 - self.api_base: str (API base URL)
@@ -33,9 +32,8 @@ class FirmwareQuotaTracker:
3332 Mixin class providing quota tracking functionality for Firmware.ai provider.
3433
3534 This mixin adds the following capabilities:
36- - Fetch quota usage from the Firmware.ai API
37- - Track 5-hour rolling window quota limits
38- - Parse ISO 8601 reset timestamps
35+ - Fetch credit balance from the Firmware.ai API
36+ - Track remaining credits
3937
4038 Usage:
4139 class FirmwareProvider(FirmwareQuotaTracker, ProviderInterface):
@@ -76,10 +74,10 @@ async def fetch_quota_usage(
7674 {
7775 "status": "success" | "error",
7876 "error": str | None,
79- "used ": float, # 0.0 to 1.0 (from API directly)
80- "remaining_fraction": float, # 1.0 - used
81- "reset_at": float | None, # Unix timestamp (seconds )
82- "has_active_window": bool, # True if reset is not null
77+ "credits ": float, # Remaining credit balance
78+ "remaining_fraction": float, # 1.0 if credits > 0, else 0.0
79+ "reset_at": float | None, # Always None (no rolling window )
80+ "has_active_window": bool, # Always False (credit-based)
8381 "fetched_at": float,
8482 }
8583 """
@@ -103,35 +101,30 @@ async def fetch_quota_usage(
103101 response .raise_for_status ()
104102 data = response .json ()
105103
106- # Parse response - API returns ratio directly
107- used_raw = data .get ("used " )
108- # Validate used is numeric
109- if not isinstance (used_raw , (int , float )):
104+ # Parse response - API returns absolute credit balance
105+ credits_raw = data .get ("credits " )
106+ # Validate credits is numeric
107+ if not isinstance (credits_raw , (int , float )):
110108 lib_logger .warning (
111- f"Firmware.ai quota API returned non-numeric 'used ' value: { used_raw } "
109+ f"Firmware.ai quota API returned non-numeric 'credits ' value: { credits_raw } "
112110 )
113- used = 0.0
111+ credits_balance = 0.0
114112 else :
115- used = float (used_raw )
116- reset_iso = data .get ("reset" )
113+ credits_balance = float (credits_raw )
117114
118- # Calculate remaining (inverse of used), clamped to 0.0-1.0
119- remaining_fraction = max (0.0 , min (1.0 , 1.0 - used ))
115+ # Credit-based system: available if credits > 0
116+ # remaining_fraction is 1.0 if credits available, 0.0 if exhausted
117+ remaining_fraction = 1.0 if credits_balance > 0.0 else 0.0
120118
121- # Parse ISO 8601 reset timestamp
122- reset_at = None
123- if reset_iso is not None :
124- reset_at = self ._parse_iso_timestamp (reset_iso )
125- # Only mark active window if we successfully parsed the timestamp
126- has_active_window = reset_at is not None
119+ # Parse optional reset/reload date (ISO 8601 string)
120+ reset_date = data .get ("reset" ) # e.g., "2023-04-01T00:00:00.000Z"
127121
128122 return {
129123 "status" : "success" ,
130124 "error" : None ,
131- "used " : used ,
125+ "credits " : credits_balance ,
132126 "remaining_fraction" : remaining_fraction ,
133- "reset_at" : reset_at ,
134- "has_active_window" : has_active_window ,
127+ "reset_date" : reset_date , # ISO 8601 string or None
135128 "fetched_at" : time .time (),
136129 }
137130
@@ -193,10 +186,22 @@ def get_remaining_fraction(self, usage_data: Dict[str, Any]) -> float:
193186 usage_data: Response from fetch_quota_usage()
194187
195188 Returns:
196- Remaining fraction (0.0 to 1.0)
189+ Remaining fraction (0.0 or 1.0 for credit-based system )
197190 """
198191 return usage_data .get ("remaining_fraction" , 0.0 )
199192
193+ def get_credits_balance (self , usage_data : Dict [str , Any ]) -> float :
194+ """
195+ Get the remaining credit balance from usage data.
196+
197+ Args:
198+ usage_data: Response from fetch_quota_usage()
199+
200+ Returns:
201+ Remaining credits (absolute value)
202+ """
203+ return usage_data .get ("credits" , 0.0 )
204+
200205 def get_reset_timestamp (self , usage_data : Dict [str , Any ]) -> Optional [float ]:
201206 """
202207 Get the next reset timestamp from usage data.
@@ -235,8 +240,7 @@ async def refresh_quota_usage(
235240
236241 lib_logger .debug (
237242 f"Firmware.ai quota for { credential_identifier } : "
238- f"{ usage_data ['remaining_fraction' ] * 100 :.1f} % remaining, "
239- f"active_window={ usage_data ['has_active_window' ]} "
243+ f"{ usage_data .get ('credits' , 0.0 ):.2f} credits remaining"
240244 )
241245
242246 return usage_data
0 commit comments