@@ -53,6 +53,16 @@ def __str__(self) -> str:
5353 return f"{ super ().__str__ ()} (Status: { self .status_code } , Response: { self .response_text or 'N/A' } )"
5454
5555
56+ def _normalize_secret_resource_id (key_name : str ) -> str :
57+ """
58+ Normalize a secret's resource ID for Fireworks paths:
59+ - Lowercase
60+ - Replace underscores with hyphens
61+ - Leave other characters as-is (server enforces allowed set)
62+ """
63+ return key_name .lower ().replace ("_" , "-" )
64+
65+
5666def create_or_update_fireworks_secret (
5767 account_id : str ,
5868 key_name : str , # This is the identifier for the secret, e.g., "my-eval-api-key"
@@ -95,8 +105,9 @@ def create_or_update_fireworks_secret(
95105 # Let's assume for POST, we send 'keyName' and 'value'.
96106 # For PATCH, the path contains {secret_id} which is the key_name. The body is also gatewaySecret.
97107
98- # Check if secret exists using GET (path uses secret_id which is our key_name)
99- get_url = f"{ resolved_api_base .rstrip ('/' )} /v1/accounts/{ resolved_account_id } /secrets/{ key_name } "
108+ # Check if secret exists using GET (path uses normalized resource id)
109+ resource_id = _normalize_secret_resource_id (key_name )
110+ get_url = f"{ resolved_api_base .rstrip ('/' )} /v1/accounts/{ resolved_account_id } /secrets/{ resource_id } "
100111 secret_exists = False
101112 try :
102113 response = requests .get (get_url , headers = headers , timeout = 10 )
@@ -120,7 +131,7 @@ def create_or_update_fireworks_secret(
120131
121132 if secret_exists :
122133 # Update existing secret (PATCH)
123- patch_url = f"{ resolved_api_base .rstrip ('/' )} /v1/accounts/{ resolved_account_id } /secrets/{ key_name } "
134+ patch_url = f"{ resolved_api_base .rstrip ('/' )} /v1/accounts/{ resolved_account_id } /secrets/{ resource_id } "
124135 # Body for PATCH requires 'keyName' and 'value'.
125136 # Transform key_name for payload: uppercase and underscores
126137 payload_key_name = key_name .upper ().replace ("-" , "_" )
@@ -148,16 +159,14 @@ def create_or_update_fireworks_secret(
148159 else :
149160 # Create new secret (POST)
150161 post_url = f"{ resolved_api_base .rstrip ('/' )} /v1/accounts/{ resolved_account_id } /secrets"
151- # Body for POST is gatewaySecret. 'name' field in payload is tricky .
162+ # Body for POST is gatewaySecret. 'name' field in payload is the resource path .
152163 # Let's assume for POST, the 'name' in payload can be omitted or is the key_name.
153164 # The API should ideally use 'keyName' from URL or a specific 'secretId' in payload for creation if 'name' is server-assigned.
154165 # Given the Swagger, 'name' is required in gatewaySecret.
155166 # Let's try with 'name' being the 'key_name' for the payload, as the full path is not known yet.
156167 # This might need adjustment based on actual API behavior.
157168 # Construct the full 'name' path for the POST payload as per Swagger's title for 'name'
158- full_resource_name_for_payload = (
159- f"accounts/{ resolved_account_id } /secrets/{ key_name } " # Path uses lowercase-hyphenated key_name
160- )
169+ full_resource_name_for_payload = f"accounts/{ resolved_account_id } /secrets/{ resource_id } "
161170
162171 # Transform key_name for payload "keyName" field: uppercase and underscores
163172 payload_key_name = key_name .upper ().replace ("-" , "_" )
@@ -209,7 +218,8 @@ def get_fireworks_secret(
209218 return None
210219
211220 headers = {"Authorization" : f"Bearer { resolved_api_key } " }
212- url = f"{ resolved_api_base .rstrip ('/' )} /v1/accounts/{ resolved_account_id } /secrets/{ key_name } "
221+ resource_id = _normalize_secret_resource_id (key_name )
222+ url = f"{ resolved_api_base .rstrip ('/' )} /v1/accounts/{ resolved_account_id } /secrets/{ resource_id } "
213223
214224 try :
215225 response = requests .get (url , headers = headers , timeout = 10 )
@@ -245,7 +255,8 @@ def delete_fireworks_secret(
245255 return False
246256
247257 headers = {"Authorization" : f"Bearer { resolved_api_key } " }
248- url = f"{ resolved_api_base .rstrip ('/' )} /v1/accounts/{ resolved_account_id } /secrets/{ key_name } "
258+ resource_id = _normalize_secret_resource_id (key_name )
259+ url = f"{ resolved_api_base .rstrip ('/' )} /v1/accounts/{ resolved_account_id } /secrets/{ resource_id } "
249260
250261 try :
251262 response = requests .delete (url , headers = headers , timeout = 30 )
0 commit comments