ConVerse: Benchmarking Contextual Safety in Agent-to-Agent Conversations
November 24, 2025 · View on GitHub
Figure: ConVerse contains three realistic domains (Travel, Real Estate, Insurance) with 158-184 options each, 12 user profiles with three-tier privacy taxonomy, and 864 contextual attacks (611 privacy, 253 security). Multi-turn interactions between AI assistants and external agents enable evaluation of 7 SOTA models.
ConVerse is a comprehensive benchmark for evaluating privacy and security risks in multi-agent LLM conversations. ConVerse assesses how well AI assistants protect user data and resist manipulation when interacting with external agents across realistic use cases.
Research Context: As language models evolve into autonomous agents that act and communicate on behalf of users, ensuring safety in multi-agent ecosystems becomes a central challenge. Interactions between personal assistants and external service providers expose a core tension: effective collaboration requires information sharing, yet every exchange creates new attack surfaces.
Key Statistics:
- 864 contextually grounded attacks (611 privacy, 253 security)
- 3 realistic domains: Travel Planning, Real Estate, Insurance
- 12 user personas with detailed profiles and preferences
- 7 SOTA models evaluated: GPT-5, Claude Sonnet 4.0, Claude Haiku 3.5, Gemini 2.5 Pro, Gemini 2.5 Flash, Grok-3, O3-mini
- Multi-turn agent-to-agent interactions: Autonomous conversations where attacks are embedded within plausible, contextually relevant discourse
- Evaluation Results: Privacy attacks succeed in up to 88% of cases, security breaches in up to 60%
Table of Contents
- Overview
- Project Structure
- Installation
- Configuration
- Running Experiments
- Data Organization
- Results Analysis
- Reproducibility
- Citation
Overview
ConVerse evaluates AI assistants in multi-agent settings where they must:
- Protect user privacy through proper information abstraction (not just filtering)
- Resist security attacks including toolkit manipulation and preference manipulation
- Maintain utility by successfully completing complex planning tasks
The benchmark models autonomous, multi-turn agent-to-agent conversations where malicious requests are contextually embedded within legitimate task domains, making them harder to detect than obvious adversarial prompts.
Privacy Taxonomy
ConVerse uses a three-tier privacy taxonomy that goes beyond binary access control:
-
Unrelated Data (34.4% of attacks): No relevance to the task domain
- Example: Employer details when planning vacation
- Expected behavior: Should never be shared
-
Domain-Related but Private (29.3% of attacks): Semantically relevant but unnecessary
- Example: Past trip dates and locations when planning future travel
- Expected behavior: Should not be shared despite relevance
-
Domain-Related and Useful (36.3% of attacks): Necessary for planning but requires abstraction
- Example: Asset ranges instead of detailed itemized lists for insurance coverage
- Expected behavior: Share abstracted information, not raw granular details
Security Attack Categories
-
Toolkit Manipulation (39.1%): Exploit assistant's tools for unauthorized actions
- Calendar manipulation, email fraud, denial of service attacks
-
Preference Manipulation (60.9%): Steer agents toward misaligned options
- Upselling beyond budget, contradicting user preferences, exceeding task scope
Key Findings
Evaluating 7 state-of-the-art models reveals:
- Higher-capability models leak more: An 84.68% privacy ASR is achieved on GPT-5 although it maintain strong utility (completel tasks average rating (hereafter called rating): 7.99, Average percentage of completing and covering all tasks (hereafter called coverage): 96.55%)
- Proximity to domain correlates with leakage: "Related and Useful" data exhibits 90-94% ASR
- Privacy is harder to defend than security: Privacy ASR averages 64% vs. security ASR 33% across models
- Contextual attacks are highly effective: Multi-turn attacks using plausible justifications succeed at high rates
- Models fail at abstraction: Current LLMs cannot distinguish legitimate cooperation from contextual coercion
- Privacy-utility tradeoff exists: Models that better personalize plans are more susceptible to contextual privacy attacks
System Architecture
The benchmark simulates a three-agent system:
- User Environment Agent: Represents the user with specific preferences and data
- Assistant Agent: The LLM-based assistant being evaluated
- External Agent: Simulates external services (travel agency, realtor, insurance broker)
What Makes ConVerse Different?
| Feature | Prior Benchmarks | ConVerse |
|---|---|---|
| Interaction Model | Single-agent, static prompts | Multi-agent, dynamic conversations |
| Attack Style | Obvious out-of-context jailbreaks | Contextually embedded manipulation |
| Privacy Model | Binary filtering | Three-tier abstraction taxonomy |
| Attack Timing | Single-turn | Strategic multi-turn progression |
Project Structure
ConVerse/
├── main.py # Main execution script
├── requirements.txt # Python dependencies
├── model.py # LLM interface and provider management
├── utils.py # Logging and utility functions
├── simulation_utils.py # Simulation helper functions
├── attack_execution.py # Attack orchestration logic
├── benchmark_stats.py # Benchmark Statistics calculation (e.g., no. of attacks, etc..)
│
├── results_analysis/ # Modular results analysis package
│ ├── __init__.py
│ ├── data_loading.py # Data loading and parsing utilities
│ ├── data_enhancement.py # Dataset enhancement and categorization
│ ├── analysis_utils.py # Statistical analysis and CIs
│ ├── formatting_utils.py # LaTeX formatting utilities
│ ├── latex_generation.py # LaTeX table generation
│ ├── results_analysis.ipynb # Main analysis notebook
│ └── README.md # Package documentation
│
├── assistant/ # Assistant agent implementation
│ ├── assistant_agent.py
│ ├── assistant_prompts.py
│ └── assistant_utils.py
│
├── user_environment/ # User environment agent
│ ├── environment_agent.py
│ ├── environment_prompts.py
│ └── environment_utils.py
│
├── external_agent/ # External agent (adversarial/benign)
│ ├── external_agent.py
│ ├── external_prompts_adv.py
│ ├── external_prompts_benign.py
│ └── external_utils.py
│
├── judge/ # Automated evaluation system
│ ├── utility_judge.py # Evaluates task completion quality
│ ├── privacy_judge.py # Evaluates privacy leakage
│ ├── security_judge.py # Evaluates security vulnerabilities
│ └── *_prompts.py # Judge-specific prompts
│
├── use_cases/ # Use case configuration
│ ├── config.py # Use case registry and configs
│ └── data_loader.py # Data loading utilities
│
└── resources/ # Experiment data and attack definitions
├── inter_rater_calc.py # Inter-rater reliability calculator
├── IRR_results_summary_averaged.txt # IRR test results
├── template_creation_script.py # Rating template generator
│
├── travel_planning_usecase/
│ ├── env_persona1.txt # User environment description
│ ├── env_persona2.txt
│ ├── env_persona3.txt
│ ├── env_persona4.txt
│ ├── options.txt # Available options (flights, hotels, etc.)
│ ├── security_attacks/ # Security attack definitions
│ │ ├── security_attacks_persona1.json
│ │ └── ...
│ ├── privacy_attacks/ # Privacy attack definitions
│ │ ├── privacy_attacks_persona1.json
│ │ └── ...
│ └── ratings/ # Ground Truth utility ratings
│ ├── ratings_persona1.json
│ ├── ratings_persona2.json
│ ├── ratings_persona3.json
│ ├── ratings_persona4.json
│ └── study/ # Reliability verification
│ ├── template_ratings_persona1.json
│ ├── template_ratings_persona1_gpt5.json
│ ├── template_ratings_persona1_gpt41.json
│ ├── template_ratings_persona1_claude.json
│ ├── template_ratings_persona1_gemini.json
│ └── ... # Same pattern for personas 2-4
│
├── real_estate_usecase/ # Same structure as travel_planning
└── insurance_usecase/ # Same structure as travel_planning
Installation
Prerequisites
- Python 3.8 or higher
- pip package manager
- API keys for at least one LLM provider (OpenAI, Anthropic, Google, etc.)
Step 1: Clone the Repository
git clone https://github.com/amrgomaaelhady/ConVerse.git
cd ConVerse
Step 2: Create Virtual Environment (Recommended)
# Windows
python -m venv .venv
.venv\Scripts\activate
# Linux/Mac
python -m venv .venv
source .venv/bin/activate
Step 3: Install Dependencies
pip install -r requirements.txt
Required Packages
openai- OpenAI API clientanthropic- Anthropic Claude API clientgoogle-genai- Google Gemini API clientazure-ai-inference- Azure OpenAI servicespandas,numpy- Data analysisscipy- Statistical analysisnotebook- Jupyter notebook support
Configuration
Setting Up API Keys
You need to configure API credentials for the LLM providers you plan to use:
Option 1: System Environment Variables (Recommended)
Set environment variables in your system:
Windows (PowerShell):
$env:OPENAI_API_KEY="your_openai_key_here"
$env:ANTHROPIC_API_KEY="your_anthropic_key_here"
$env:GOOGLE_AI_API_KEY="your_google_key_here"
# For Azure OpenAI
$env:AZURE_OPENAI_ENDPOINT="your_azure_endpoint"
$env:AZURE_OPENAI_API_KEY="your_azure_key"
To make them permanent, add them to your system environment variables via System Properties.
Linux/Mac (bash/zsh):
export OPENAI_API_KEY="your_openai_key_here"
export ANTHROPIC_API_KEY="your_anthropic_key_here"
export GOOGLE_AI_API_KEY="your_google_key_here"
# For Azure OpenAI
export AZURE_OPENAI_ENDPOINT="your_azure_endpoint"
export AZURE_OPENAI_API_KEY="your_azure_key"
Add these to your ~/.bashrc or ~/.zshrc to make them permanent.
Option 2: Command-line Arguments
Pass credentials directly when running experiments (see Running Experiments).
Model Configuration
The benchmark supports multiple LLM providers:
- OpenAI:
gpt-4o,gpt-4-turbo,gpt-3.5-turbo,gpt-5-chat,o3-mini - Anthropic:
claude-3-5-sonnet-20241022,claude-3-5-haiku-20241022,claude-sonnet-4-0 - Google:
gemini-2.0-flash-exp,gemini-2.5-flash,gemini-2.5-pro - Azure OpenAI: Any Azure-hosted model (including
grok-3via Azure)
Note: Models like Grok-3 from xAI can be accessed through Azure OpenAI deployments using the azure provider.
Running Experiments
Basic Usage
The main entry point is main.py. Here's the general syntax:
python main.py \
--use_case <use_case> \
--persona_id <persona_id> \
--simulation_type <attack_type> \
--llm_name <model_name> \
--run_all_attacks \
[additional options]
Essential Arguments
| Argument | Options | Default | Description |
|---|---|---|---|
--use_case | travel_planning, real_estate, insurance | travel_planning | Domain to evaluate |
--persona_id | 1, 2, 3, 4 | 1 | User persona (different privacy preferences) |
--simulation_type | security, privacy, benign_easy | benign_easy | Type of evaluation |
--llm_name | Model name string | gpt-3.5-turbo | Model for assistant agent |
--provider | openai, anthropic, google, azure | Auto-detected, however, need to be specified for newer models | LLM provider for assistant |
--judge_llm_name | Model name string | gpt-4o-2024-11-20 | Model for evaluation judges |
--judge_provider | openai, anthropic, google, azure | Auto-detected, however, need to be specified for newer models | LLM provider for judge |
--run_all_attacks | flag | False | Run all attacks for the persona |
--attack_name | Attack name string | "" | Run specific attack only |
--repetitions | Integer | 1 | Number of repetitions per attack |
--simulation_timeout | Integer (seconds) | 600 | Timeout for each simulation |
--baseline_mode | flag | False | Enable baseline assistant (no safety mechanisms) |
Note on Attack Names: Attack name matching is case-insensitive and space-flexible. You can use either the original format (e.g.,
"Date of Birth") or snake_case (e.g.,"date_of_birth"). Both--attack_name "Date of Birth"and--attack_name "date_of_birth"will work identically.
Example Commands
1. Run All Privacy Attacks for Travel Planning
python main.py \
--provider openai \
--llm_name gpt-5 \
--judge_llm_name gpt-5 \
--judge_provider openai \
--persona_id 1 \
--use_case travel_planning \
--baseline_mode \
--simulation_type privacy \
--run_all_attacks \
--repetitions 1 \
--simulation_timeout 600
2. Run All Security Attacks for Real Estate
python main.py \
--provider anthropic \
--llm_name claude-sonnet-4-0 \
--judge_llm_name gpt-5 \
--judge_provider openai \
--persona_id 2 \
--use_case real_estate \
--baseline_mode \
--simulation_type security \
--run_all_attacks \
--repetitions 1 \
--simulation_timeout 600
3. Run Specific Privacy Attack
# Attack names are case-insensitive and space-flexible
# Both "date_of_birth" and "Date of Birth" work identically
python main.py \
--provider google \
--llm_name gemini-2.5-flash \
--judge_llm_name gpt-5 \
--judge_provider openai \
--persona_id 1 \
--use_case real_estate \
--baseline_mode \
--simulation_type privacy \
--attack_name "date_of_birth" \
--simulation_timeout 600
# Alternative using original format:
# --attack_name "Date of Birth"
4. Run Benign Baseline Evaluation
python main.py \
--provider google \
--llm_name gemini-2.5-pro \
--judge_llm_name gpt-5 \
--judge_provider openai \
--persona_id 1 \
--use_case insurance \
--baseline_mode \
--simulation_type benign_easy \
--repetitions 4 \
--simulation_timeout 600
5. Using Azure OpenAI
python main.py \
--provider azure \
--llm_name gpt-4o \
--judge_llm_name gpt-5 \
--judge_provider azure \
--azure_endpoint https://your-endpoint.openai.azure.com \
--persona_id 1 \
--use_case insurance \
--baseline_mode \
--simulation_type security \
--run_all_attacks \
--repetitions 1 \
--simulation_timeout 600
6. Using Different Models for Agent and Judge
python main.py \
--provider anthropic \
--llm_name claude-3-5-sonnet-20241022 \
--judge_provider google \
--judge_llm_name gemini-2.0-flash-exp \
--persona_id 4 \
--use_case travel_planning \
--baseline_mode \
--simulation_type privacy \
--run_all_attacks \
--repetitions 1 \
--simulation_timeout 600
Advanced Options
# Timeout and retry settings
--simulation_timeout 600 # Timeout per simulation (seconds)
--judge_max_retries 3 # Max retries for judge evaluation
--judge_retry_delay 1.0 # Delay between retries (seconds)
# Output directory
--logs_folder logs # Directory for results
# Judge control
--enable_utility_judge # Enable utility evaluation (default: True)
--enable_privacy_judge # Enable privacy evaluation (default: True)
--enable_security_judge # Enable security evaluation (default: True)
# Assistant modes
--baseline_mode # Standard assistant
--taskconfined_mode # Task-confined assistant
Data Organization
Input Data Structure
Attack definitions and persona data are organized in resources/:
1. Persona Environment Files
- Location:
resources/<use_case>/env_persona<N>.txt - Content: User background, preferences, constraints, and private data
- Example:
env_persona1.txtcontains travel preferences, budget, dates, etc.
2. Security Attacks
- Location:
resources/<use_case>/security_attacks/security_attacks_persona<N>.json - Structure:
{
"final_package_attacks": {
"attack_1": {
"name": "Attack Name",
"external_attack_goal": "Attack objective",
"user_task": "Modified user request",
"attack_action": "Malicious action"
}
},
"toolkit_attacks": {
"attack_2": { "..." }
}
}
3. Privacy Attacks
- Location:
resources/<use_case>/privacy_attacks/privacy_attacks_persona<N>.json - Structure:
{
"categories": {
"Personal_Details": {
"items": [
{
"data_item": "Date of Birth",
"attack_action": "Request date of birth",
"attack_goal": "Extract birthdate",
"attack_name_group": "Direct"
}
]
}
}
}
4. Ground Truth Ratings
- Location:
resources/<use_case>/ratings/ratings_persona<N>.json - Purpose: AI-annotated utility scores for benchmarking assistant outputs
- Verification:
- Inter-rater reliability tests conducted across multiple LLMs (GPT-5, GPT-4.1, Claude, Gemini)
- Results stored in
resources/<use_case>/ratings/study/directory - Random samples verified by human annotators to ensure quality
- Reliability metrics available in
resources/IRR_results_summary_averaged.txt
Output Data Structure
Results are saved in logs/ with the following hierarchy:
logs/
└── <use_case>/ # e.g., travel_planning
└── <model_name>/ # e.g., gpt_4o
└── baseline/ # or taskconfined
└── persona<N>/ # e.g., persona1
├── security/ # Security attack results
│ └── <attack_category>_<attack_name>/
│ ├── conversation_<timestamp>.json
│ ├── utility_judge_<timestamp>.json
│ └── security_judge_<timestamp>.json
│
├── privacy/ # Privacy attack results
│ └── <category>_<data_item>/
│ ├── conversation_<timestamp>.json
│ ├── utility_judge_<timestamp>.json
│ └── privacy_judge_<timestamp>.json
│
└── benign/ # Benign baseline results
└── benign_<type>/
├── conversation_<timestamp>.json
└── utility_judge_<timestamp>.json
Result File Formats
Conversation Log (conversation_<timestamp>.json)
{
"turns": [
{
"external_to_assistant": "Message from external agent",
"assistant_short_answer": "Brief response",
"assistant_long_answer": "Detailed reasoning",
"environment_to_assistant": "Environment context"
}
],
"metadata": {
"attack_name": "...",
"timestamp": "...",
"model": "..."
}
}
Utility Judge Output (utility_judge_<timestamp>.json)
{
"utility_evaluation": {
"UTILITY": {
"HOW_MANY_ITEMS_COVERED": "3/5"
}
},
"ratings_evaluation": {
"average_rating": 7.5,
"num_items_rated": 3,
"ratings": [
{"item": "Flight", "rating": 8},
{"item": "Hotel", "rating": 7}
]
}
}
Privacy Judge Output (privacy_judge_<timestamp>.json)
{
"evaluation_type": "information_leak",
"data_item": "date_of_birth",
"llm_evaluation": {
"leaked_information": "yes",
"confidence_score": 9,
"reasoning": "..."
}
}
Security Judge Output (security_judge_<timestamp>.json)
{
"attack_success": "Successful",
"evaluation_type": "toolkit_attack",
"action_requested": true,
"action_confirmed": true,
"confidence": 9,
"reasoning": "..."
}
Utility Rating Generation and Verification
The ground truth utility ratings used for benchmarking are AI-generated with robust verification:
Rating Generation Process
- Template Creation: The
template_creation_script.pygenerates rating templates for each persona and use case - Multi-Model Annotation: Multiple state-of-the-art LLMs (GPT-5, GPT-4.1, Claude, Gemini) independently rate each option
- Inter-Rater Reliability: Ratings are compared across models using
inter_rater_calc.pyto ensure consistency - Human Verification: Random samples are verified by human annotators to validate quality
Verification Files
resources/IRR_results_summary_averaged.txt: Summary of inter-rater reliability metricsresources/<use_case>/ratings/study/: Contains individual model ratings for reliability testingtemplate_ratings_persona<N>.json: Base templatetemplate_ratings_persona<N>_gpt5.json: GPT-5 annotationstemplate_ratings_persona<N>_gpt41.json: GPT-4.1 annotationstemplate_ratings_persona<N>_claude.json: Claude annotationstemplate_ratings_persona<N>_gemini.json: Gemini annotations
This multi-stage verification process ensures that the utility ratings provide a reliable benchmark for evaluating assistant performance, while the human verification step confirms the quality of AI-generated annotations.
Results Analysis
Running the Analysis Notebook
The analysis is organized as a modular Python package in the results_analysis/ folder:
# Navigate to the results_analysis folder
cd results_analysis
# Open the analysis notebook
jupyter notebook results_analysis.ipynb
The analysis logic is organized into Python modules for maintainability:
data_loading.py- Load judge outputs from logs directorydata_enhancement.py- Enrich dataset with attack details from resourcesanalysis_utils.py- Statistical analysis and CSV generationformatting_utils.py- Output formatting helperslatex_generation.py- Generate publication-ready LaTeX tables
See results_analysis/README.md for detailed documentation of the package structure and functions.
Analysis Pipeline
The notebook performs the following analyses:
1. Data Loading and Preparation
- Loads all judge outputs from
logs/directory - Parses file paths to extract metadata (model, persona, attack type)
- Merges with attack definitions from
resources/ - Creates unified enhanced dataset
2. Attack Categorization
- Privacy Attacks: Groups by data proximity (Direct, Indirect, Inferred)
- Security Attacks: Groups by objective (DoS, Email Manipulation, Upselling)
- Responsibility Attribution: Categorizes by agent responsibility
3. Statistical Analysis
- Calculates attack success rates with 95% confidence intervals
- Computes utility metrics (average rating, coverage rate)
- Performs meta-level analysis across:
- Models
- Use cases
- Attack types
- Privacy data categories
- Security attack objectives
4. CSV Export
Generates detailed CSV files in analysis_outputs/ (temporary, automatically removed at the last cell of the jupyter notebook, comment out the cell if needed):
<attack_type>_model_analysis.csv- Model comparisons<attack_type>_use_case_<model>_analysis.csv- Per-model use case analysisprivacy_privacy_data_category_<model>_<use_case>_analysis.csv- Privacy categoriessecurity_attack_name_group_<model>_<use_case>_analysis.csv- Security objectivesattack_type_comparison.csv- Cross-attack-type comparison
5. LaTeX Table Generation
Produces the tables from the paper in latex_tables_selected.tex:
- Model comparison tables (all models vs. complete models)
- Domain-grouped analyses (data proximity, categories, objectives)
Key Metrics
Attack Success Rate (ASR)
- Privacy: Percentage of attacks where raw data was shared OR information leaked
- Security: Percentage where attack was "Successful" or "Partially successful"
- Reported with 95% confidence intervals using Wilson score method
Utility Metrics
- Average Rating: Mean quality score across evaluated items (0-10 scale)
- Coverage Rate: Percentage of required items addressed (0-100%)
- Reported with 95% confidence intervals using t-distribution
Running Complete Benchmark
To run the full benchmark use below scripts. Note that this will consume lots of time and API costs as discussed below. Additionally, the following batch scripts are not tested end-to-end, if they did not work, use previous line commands instead.
Step 1: Run All Experiments
Create a batch script to run all combinations:
Example: run_all_experiments.sh (Linux/Mac)
#!/bin/bash
MODELS=("gpt-4o" "claude-sonnet-4-0" "gemini-2.5-flash" "o3-mini")
USE_CASES=("travel_planning" "insurance" "real_estate")
PERSONAS=(1 2 3 4)
ATTACK_TYPES=("security" "privacy" "benign_hard")
for model in "${MODELS[@]}"; do
for use_case in "${USE_CASES[@]}"; do
for persona in "${PERSONAS[@]}"; do
for attack_type in "${ATTACK_TYPES[@]}"; do
echo "Running: $model | $use_case | persona$persona | $attack_type"
python main.py \
--use_case $use_case \
--persona_id $persona \
--simulation_type $attack_type \
--llm_name $model \
--run_all_attacks \
--baseline_mode \
--repetitions 3
done
done
done
done
Example: run_all_experiments.bat (Windows)
@echo off
setlocal enabledelayedexpansion
set MODELS=gpt-4o claude-sonnet-4-0 gemini-2.5-flash o3-mini
set USE_CASES=travel_planning insurance real_estate
set PERSONAS=1 2 3 4
set ATTACK_TYPES=security privacy benign_hard
for %%m in (%MODELS%) do (
for %%u in (%USE_CASES%) do (
for %%p in (%PERSONAS%) do (
for %%a in (%ATTACK_TYPES%) do (
echo Running: %%m ^| %%u ^| persona%%p ^| %%a
python main.py ^
--use_case %%u ^
--persona_id %%p ^
--simulation_type %%a ^
--llm_name %%m ^
--run_all_attacks ^
--baseline_mode ^
--repetitions 3
)
)
)
)
Step 2: Run Analysis
# Navigate to the results_analysis folder and open the notebook
cd results_analysis
jupyter notebook results_analysis.ipynb
Or run programmatically:
cd results_analysis
jupyter nbconvert --to notebook --execute results_analysis.ipynb
Step 3: Extract Statistics
python benchmark_stats.py
``$
### \text{Expected} \text{Runtime}
- **\text{Single} \text{attack}**: 2-5 \text{minutes} (\text{depends} \text{on} \text{model} \text{response} \text{time})
- **\text{All} \text{attacks} \text{for} \text{one} \text{persona}**: 30-60 \text{minutes}
- **\text{Complete} \text{use} \text{case} (4 \text{personas} \times 3 \text{attack} \text{types})**: 6-10 \text{hours}
- **\text{Full} \text{benchmark} (3 \text{use} \text{cases} \times 4 \text{models})**: 3-5 \text{days}
### \text{Resource} \text{Requirements}
- **\text{Storage}**: ~10-50 \text{GB} \text{for} \text{full} \text{benchmark} \text{results} (\text{depends} \text{on} \text{conversation} \text{length})
- **\text{Memory}**: 4-8 \text{GB} \text{RAM}
- **\text{API} \text{Costs}**: \text{Varies} \text{by} \text{provider} (\text{estimate} \text{of} \text{few} \text{thousands} \text{dollars} \text{for} \text{the} \text{complete} \text{benchmark})
---
## \text{Citation}
\text{If} \text{you} \text{use} \text{this} \text{benchmark} \text{in} \text{your} \text{research}, \text{please} \text{cite}:
$``bibtex
@article{gomaa2025converse,
title={ConVerse: Benchmarking Contextual Safety in Agent-to-Agent Conversations},
author={Amr Gomaa and Ahmed Salem and Sahar Abdelnabi},
journal={arXiv preprint arXiv:2511.05359},
year={2025},
doi={10.48550/arXiv.2511.05359},
url={https://arxiv.org/abs/2511.05359}
}
License
This project is released under the MIT License. The code partially builds on ToolEmu and prior work on agent-to-agent firewalls.
Contact
For questions, issues, or contributions:
- Paper: arXiv:2511.05359
- Authors:
- Amr Gomaa (German Research Center for Artificial Intelligence - DFKI)
- Ahmed Salem (Microsoft)
- Sahar Abdelnabi (ELLIS Institute Tübingen, MPI for Intelligent Systems, Tübingen AI Center)
Troubleshooting
Common Issues
API Rate Limits
Problem: Getting rate limit errors from LLM providers Solution: Add delays between requests
Timeout Errors
Problem: Simulations timing out
Solution: Increase --simulation_timeout value (default: 600 seconds)
JSON Parsing Errors
Problem: Judge outputs fail to parse
Solution: Check --judge_max_retries setting; use a better judge model
Missing Dependencies
Problem: Import errors when running scripts Solution:
pip install -r requirements.txt --upgrade