CLI
Our framework supports a CLI for scalable experiments.
Note
The CLI is currently provided through make commands. We plan to distribute it as a npm package in the future.
Generating meetings
You can synthetically generate meetings (i.e., participants and meeting goals) with an LLM using the make gen-meetings command:
# Generate a meeting with three participants
make gen-meetings \
INSTRUCTION="3 people touring Kyoto" \
GEN_MODEL=openai/gpt-5.4-mini \
OUTPUT=kyoto_tours.json
# Generate 5 meetings with 4 participants each
make gen-meetings \
INSTRUCTION="Barcelona tour" \
GEN_MODEL=openai/gpt-5.4-mini \
OUTPUT=barcelona_tours.json \
NUM_MEETINGS=5 \
NUM_PARTICIPANTS=4
The available variables are listed below:
INSTRUCTIONrequired
Text instruction for scenario generation.
GEN_MODELrequired
LLM used for generation (e.g., openai/gpt-5.4-mini).
OUTPUTrequired
JSON file to save the generated meeting(s) to.
NUM_MEETINGSdefault: 1
Number of meetings to generate.
NUM_PARTICIPANTSdefault: 3
Number of participants per meeting.
TEMPERATUREdefault: 1.0
Sampling temperature for the generation LLM.
SEEDdefault: None
Random seed for the generation LLM.
MAX_RETRIESdefault: 5
Max retries per meeting generation.
MAX_TOTAL_ATTEMPTSdefault: NUM_MEETINGS * 3
Max total attempts across all meetings.
ALIGNMENTdefault: mixed
Participant preference relation: aligned | mixed | conflicting.
Running meetings
The make run-meetings command runs the meetings in a JSON file generated by make gen-meetings:
# Run all meetings in a JSON file
make run-meetings \
MEETING=kyoto_tours.json \
MODEL=openai/gpt-5.4-mini \
OUTPUT=kyoto_results.json
# Run only the first meeting with a turn limit
make run-meetings \
MEETING=barcelona_tours.json \
MODEL=openai/gpt-5.4-mini \
OUTPUT=barcelona_results.json \
MAX_TURNS=50 \
INDEX=0
The available variables are listed below:
MEETINGrequired
JSON file generated by make gen-meetings.
MODELrequired
LLM(s) that instantiate the participants. A space-separated list (e.g., MODEL="vllm/0/Qwen/Qwen3-8B openai/gpt-5.4-mini") is assigned to the participants in order, cycling when there are fewer models than participants.
OUTPUTrequired
JSON file to save the analytics of all meetings to.
MAX_TURNSdefault: 100
Maximum number of turns per meeting.
TURN_RULEdefault: round_robin
Turn rule for the conversation phase: round_robin | random | inviting | facilitating.
VOTING_RULEdefault: majority
Voting rule for the voting phase: majority | unanimous | most_pleasure | least_misery | single_decider.
VOTE_TURN_RULEdefault: round_robin
Turn rule for the voting phase: round_robin | random | inviting | facilitating.
TIME_LIMITdefault: unlimited
Time limit per meeting in seconds.
VOLUNTEER_MODEdefault: false
Whether to allow participants to skip their own turn: true | false.
BALANCED_TURNSdefault: true
Balance speaking turns across participants: true | false.
ENABLE_POST_EVALdefault: true
Whether the participants self-evaluate the final itinerary at the end of each meeting when consensus is reached: true | false. The results are stored in the analytics as post_consensus_evaluations.
SINGLE_DECIDERdefault: None
The participant who acts as the designated decider in each meeting: a 0-based index (e.g., SINGLE_DECIDER=0 designates the first participant) or SINGLE_DECIDER=facilitator, which picks the participant with the facilitator role and falls back to the first participant if there is none. Used with VOTING_RULE=single_decider.
TRAVEL_DATEdefault: None
Constraint: travel date (e.g., 2026-08-01).
TIME_WINDOW_STARTdefault: None
Constraint: tour start time (e.g., 09:00).
TIME_WINDOW_ENDdefault: None
Constraint: tour end time (e.g., 18:00).
BUDGETdefault: None
Constraint: budget per participant (e.g., $600).
TEMPERATUREdefault: 0.7
Sampling temperature(s) for the participant LLMs. A space-separated list (e.g., TEMPERATURE="0.7 1.0") is assigned to the participants in order, cycling when there are fewer values than participants.
SEEDdefault: 42
Random seed(s) for the participant LLMs. A space-separated list (e.g., SEED="42 43") is assigned to the participants in order, cycling when there are fewer values than participants.
INDEXdefault: run all
Run only the meeting at this index (0-based).
Post evaluation
The make post-eval command lets the participants themselves evaluate finished meetings afterwards. Each participant is re-instantiated with the same persona and LLM used during the meeting (recorded in the results file), and scores the final adopted itinerary against their own goals and preferences (1–10, with a reason).
Note that make run-meetings already runs this self-evaluation by default at the end of each meeting when consensus is reached (stored as post_consensus_evaluations in the analytics). Use make post-eval when you disabled it with ENABLE_POST_EVAL=false, or when you simply want to run the post evaluation again:
# Participants self-evaluate all finished meetings
make post-eval \
MEETING=kyoto_tours.json \
RESULTS=kyoto_results.json \
OUTPUT=kyoto_eval.json
The available variables are listed below:
MEETINGrequired
JSON file generated by make gen-meetings (meeting definitions).
RESULTSrequired
JSON file produced by make run-meetings (analytics of finished meetings).
OUTPUTrequired
JSON file to save the evaluations to.
INDEXdefault: evaluate all
Evaluate only the meeting at this index (0-based).
Running scripts
The make run command executes a Python script inside the backend container, so make up must be running first. See the Python API page for how to write meeting scripts.
# Run a meeting script
make run SCRIPT=examples/barcelona.py
# Run a meeting script with arguments
make run SCRIPT=examples/barcelona.py ARGS="--max-turns 10"
The available variables are listed below:
SCRIPTrequired
Path to the Python script to execute (e.g., examples/barcelona.py).
ARGSdefault: None
Arguments passed to the script (e.g., ARGS="--max-turns 10"). Available arguments depend on the script.