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.