diff --git a/agent/agent_config.py b/agent/agent_config.py index 2fb45c0..9cd7412 100644 --- a/agent/agent_config.py +++ b/agent/agent_config.py @@ -81,12 +81,58 @@ class AgentConfig: 'shell_env': self.shell_env, } + @staticmethod + def _redact_image_data(messages): + """Return a copy of messages with image base64/data URL payloads truncated. + + Image content blocks can carry huge base64 strings; replace them with a short + placeholder so logs stay readable. + """ + if not isinstance(messages, list): + return messages + + def redact_value(value): + if isinstance(value, str) and value.startswith('data:'): + return value[:32] + '...[truncated]' + return value + + redacted_messages = [] + for message in messages: + if not isinstance(message, dict): + redacted_messages.append(message) + continue + content = message.get('content') + if not isinstance(content, list): + redacted_messages.append(message) + continue + redacted_content = [] + for block in content: + if isinstance(block, dict) and block.get('type') in ('image', 'image_url'): + new_block = block.copy() + if 'base64' in new_block: + new_block['base64'] = '[truncated]' + if 'image_url' in new_block: + image_url = new_block['image_url'] + if isinstance(image_url, dict): + new_block['image_url'] = {**image_url, 'url': redact_value(image_url.get('url'))} + else: + new_block['image_url'] = redact_value(image_url) + if 'url' in new_block: + new_block['url'] = redact_value(new_block['url']) + redacted_content.append(new_block) + else: + redacted_content.append(block) + redacted_messages.append({**message, 'content': redacted_content}) + return redacted_messages + def safe_print(self): """Safely log the configuration without printing sensitive information.""" safe_dict = self.to_dict().copy() if 'api_key' in safe_dict and isinstance(safe_dict['api_key'], str) and safe_dict['api_key'].startswith('sk-'): safe_dict['api_key'] = safe_dict['api_key'][:8] + '***' + safe_dict['api_key'][-6:] - logger.info(f"config={json.dumps(safe_dict, ensure_ascii=False, default=str)}") + if 'messages' in safe_dict: + safe_dict['messages'] = self._redact_image_data(safe_dict['messages']) + logger.info(f"config={json.dumps(safe_dict, ensure_ascii=False)}") @classmethod async def from_v1_request(cls, request, api_key: str, project_dir: Optional[str] = None, generate_cfg: Optional[Dict] = None, messages: Optional[List] = None):