@@ -56,7 +56,13 @@ def _extract_first_user_text(request_payload: Dict[str, Any]) -> str:
5656
5757
5858def _generate_request_id () -> str :
59- return f"agent/{ uuid .uuid4 ()} "
59+ """生成完整格式的 requestId,对齐参考实现:
60+ agent/{uuid}/{毫秒时间戳}/{trajectory_id}/{step}
61+ """
62+ trajectory_id = str (uuid .uuid4 ())
63+ step = 1
64+ ms = int (datetime .now (timezone .utc ).timestamp () * 1000 )
65+ return f"agent/{ uuid .uuid4 ()} /{ ms } /{ trajectory_id } /{ step } "
6066
6167
6268def _build_labels (model : str , trajectory_id : str , step : int ) -> Dict [str , str ]:
@@ -102,6 +108,7 @@ async def wrap_cli_request(
102108 gemini_request : Dict [str , Any ],
103109 model : str ,
104110 project_id : str ,
111+ enable_credit : bool = False ,
105112) -> Tuple [Dict [str , Any ], str ]:
106113 """
107114 将 Gemini 格式请求包装成 Antigravity CLI 格式。
@@ -143,14 +150,19 @@ async def wrap_cli_request(
143150 "model" : model ,
144151 "userAgent" : "antigravity" ,
145152 "requestType" : "agent" ,
146- "enabledCreditTypes" : ["GOOGLE_ONE_AI" ],
147153 }
154+ if enable_credit :
155+ payload ["enabledCreditTypes" ] = ["GOOGLE_ONE_AI" ]
148156 return payload , request_id
149157
150158
151159# ==================== 辅助函数 ====================
152160
153- def build_antigravity_headers (access_token : str , extra_headers : Optional [Dict [str , str ]] = None ) -> Dict [str , str ]:
161+ def build_antigravity_headers (
162+ access_token : str ,
163+ extra_headers : Optional [Dict [str , str ]] = None ,
164+ model_name : str = "" ,
165+ ) -> Dict [str , str ]:
154166 """构建 Antigravity CLI API 请求头。"""
155167 headers = {
156168 "User-Agent" : ANTIGRAVITY_USER_AGENT ,
@@ -159,11 +171,19 @@ def build_antigravity_headers(access_token: str, extra_headers: Optional[Dict[st
159171 "Accept" : "*/*" ,
160172 "Accept-Encoding" : "gzip" ,
161173 "Connection" : "close" ,
174+ "requestId" : f"req-{ uuid .uuid4 ()} " ,
162175 }
163176
164177 for key , value in _sanitize_antigravity_headers (extra_headers ).items ():
165178 headers .setdefault (key , value )
166179
180+ # 根据模型名称判断 request_type
181+ if model_name :
182+ if "image" in model_name .lower ():
183+ headers ["requestType" ] = "image_gen"
184+ else :
185+ headers ["requestType" ] = "agent"
186+
167187 return headers
168188
169189
@@ -237,6 +257,7 @@ async def stream_request(
237257 current_file , credential_data = cred_result
238258 access_token = credential_data .get ("access_token" ) or credential_data .get ("token" )
239259 project_id = credential_data .get ("project_id" , "" )
260+ enable_credit = bool (credential_data .get ("enable_credit" , False ))
240261
241262 if not access_token :
242263 log .error (f"[ANTIGRAVITY STREAM] No access token in credential: { current_file } " )
@@ -251,11 +272,11 @@ async def stream_request(
251272 antigravity_url = await get_antigravity_api_url ()
252273 target_url = f"{ antigravity_url } /v1internal:streamGenerateContent?alt=sse"
253274
254- auth_headers = build_antigravity_headers (access_token , headers )
275+ auth_headers = build_antigravity_headers (access_token , headers , model_name )
255276
256277 # 构建 CLI 格式请求体
257278 inner_request = body .get ("request" , body )
258- final_payload , _ = await wrap_cli_request (inner_request , model_name , project_id )
279+ final_payload , _ = await wrap_cli_request (inner_request , model_name , project_id , enable_credit )
259280
260281 # 3. 调用stream_post_async进行请求
261282 retry_config = await get_retry_config ()
@@ -513,6 +534,7 @@ async def non_stream_request(
513534 current_file , credential_data = cred_result
514535 access_token = credential_data .get ("access_token" ) or credential_data .get ("token" )
515536 project_id = credential_data .get ("project_id" , "" )
537+ enable_credit = bool (credential_data .get ("enable_credit" , False ))
516538
517539 if not access_token :
518540 log .error (f"[ANTIGRAVITY] No access token in credential: { current_file } " )
@@ -526,11 +548,11 @@ async def non_stream_request(
526548 antigravity_url = await get_antigravity_api_url ()
527549 target_url = f"{ antigravity_url } /v1internal:generateContent"
528550
529- auth_headers = build_antigravity_headers (access_token , headers )
551+ auth_headers = build_antigravity_headers (access_token , headers , model_name )
530552
531553 # 构建 CLI 格式请求体
532554 inner_request = body .get ("request" , body )
533- final_payload , _ = await wrap_cli_request (inner_request , model_name , project_id )
555+ final_payload , _ = await wrap_cli_request (inner_request , model_name , project_id , enable_credit )
534556
535557 # 3. 调用post_async进行请求
536558 retry_config = await get_retry_config ()
@@ -756,7 +778,7 @@ async def fetch_available_models() -> List[Dict[str, Any]]:
756778 return []
757779
758780 # 构建请求头
759- headers = build_antigravity_headers (access_token )
781+ headers = build_antigravity_headers (access_token , model_name = "agent" )
760782
761783 try :
762784 # 使用 POST 请求获取模型列表
@@ -840,7 +862,7 @@ async def fetch_quota_info(access_token: str) -> Dict[str, Any]:
840862 }
841863 """
842864
843- headers = build_antigravity_headers (access_token )
865+ headers = build_antigravity_headers (access_token , model_name = "agent" )
844866
845867 try :
846868 antigravity_url = await get_antigravity_api_url ()
0 commit comments