diff --git a/app/services/grok/services/image_edit.py b/app/services/grok/services/image_edit.py index d3c9c2a..84d534a 100644 --- a/app/services/grok/services/image_edit.py +++ b/app/services/grok/services/image_edit.py @@ -212,6 +212,32 @@ def _normalize_asset_url(file_uri: str) -> str: return f"https://assets.grok.com/{raw}" +def _log_final_image_edit_payload( + *, + prompt_text: str, + file_attachments: List[str], + model_config_override: dict, + tool_overrides: dict, + stream: bool, +) -> None: + payload = { + "message": str(prompt_text or ""), + "fileAttachments": [ + str(item or "").strip() + for item in (file_attachments or []) + if str(item or "").strip() + ], + "toolOverrides": tool_overrides or {}, + "modelConfigOverride": model_config_override or {}, + "stream": bool(stream), + } + try: + payload_text = orjson.dumps(payload, option=orjson.OPT_INDENT_2).decode("utf-8") + except Exception: + payload_text = str(payload) + logger.info(f"Image edit upstream payload before send:\n{payload_text}") + + def _is_assets_content_url(url: str) -> bool: raw = str(url or "").strip() if not raw: @@ -937,6 +963,13 @@ class ImageEditService: }, } } + _log_final_image_edit_payload( + prompt_text=prompt_text, + file_attachments=file_attachments, + model_config_override=model_config_override, + tool_overrides=tool_overrides, + stream=stream, + ) if stream: response = await GrokChatService().chat( token=current_token, diff --git a/app/services/grok/services/video.py b/app/services/grok/services/video.py index adc6825..37cfa64 100644 --- a/app/services/grok/services/video.py +++ b/app/services/grok/services/video.py @@ -111,6 +111,32 @@ def _normalize_assets_url(value: str) -> str: return f"https://assets.grok.com/{raw}" +def _log_final_video_payload( + *, + message: str, + file_attachments: list[str] | None = None, + tool_overrides: dict | None = None, + model_config_override: dict | None = None, + mode: str | None = None, +) -> None: + payload = { + "message": str(message or ""), + "fileAttachments": [ + str(item or "").strip() + for item in (file_attachments or []) + if str(item or "").strip() + ], + "toolOverrides": tool_overrides or {}, + "modelConfigOverride": model_config_override or {}, + "mode": mode, + } + try: + payload_text = orjson.dumps(payload, option=orjson.OPT_INDENT_2).decode("utf-8") + except Exception: + payload_text = str(payload) + logger.info(f"Video upstream payload before send:\n{payload_text}") + + def _classify_video_error(exc: Exception) -> tuple[str, str, int]: """将底层异常归一化为用户可读错误。""" text = str(exc or "").lower() @@ -486,6 +512,13 @@ class VideoService: moderated_hit = False try: async with _get_video_semaphore(): + _log_final_video_payload( + message=message, + file_attachments=file_attachments, + tool_overrides={"videoGen": True}, + model_config_override=model_config_override, + mode=official_mode, + ) stream_response = await AppChatReverse.request( session, token, @@ -577,6 +610,13 @@ class VideoService: moderated_hit = False try: async with _get_video_semaphore(): + _log_final_video_payload( + message=message, + file_attachments=[], + tool_overrides={"videoGen": True}, + model_config_override=model_config_override, + mode=official_mode, + ) stream_response = await AppChatReverse.request( session, token, @@ -671,6 +711,13 @@ class VideoService: moderated_hit = False try: async with _get_video_semaphore(): + _log_final_video_payload( + message=message, + file_attachments=[], + tool_overrides={"videoGen": True}, + model_config_override=model_config_override, + mode=official_mode, + ) stream_response = await AppChatReverse.request( session, token, @@ -801,6 +848,13 @@ class VideoService: moderated_hit = False try: async with _get_video_semaphore(): + _log_final_video_payload( + message=message, + file_attachments=[], + tool_overrides={"videoGen": True}, + model_config_override=model_config_override, + mode=official_mode, + ) stream_response = await AppChatReverse.request( session, token, @@ -936,6 +990,13 @@ class VideoService: moderated_hit = False try: async with _get_video_semaphore(): + _log_final_video_payload( + message=message, + file_attachments=file_attachments, + tool_overrides={"videoGen": True}, + model_config_override=model_config_override, + mode=mode, + ) stream_response = await AppChatReverse.request( session, token,