simulhausen
Copyright 2026 Ilya Lubenets

This product is licensed under the Apache License, Version 2.0 (see LICENSE).

This product includes material adapted from LangWatch Scenario
(https://github.com/langwatch/scenario, published on PyPI as
`langwatch-scenario`), Copyright LangWatch, licensed under the Apache License,
Version 2.0:

  - The public API (`run`, the `user` / `agent` / `message` / `proceed` /
    `judge` / `succeed` / `fail` script steps, `UserSimulatorAgent`,
    `JudgeAgent`, `AgentAdapter`, `AgentInput`, `ScenarioState`,
    `ScenarioResult`, `configure`) follows Scenario's design.
  - The user simulator and judge prompts in `src/simulhausen/prompts.py` are
    adapted from Scenario's `user_simulator_agent.py`, `judge_agent.py` and
    `_judge/criterion_verdicts.py`; some of the judge rules are close to
    verbatim. They were modified for agno structured output, the
    `goal_achieved` stop signal and fenced untrusted evidence.
  - `src/simulhausen/transcript_tools.py` (the token estimate, the transcript
    skeleton, `expand_transcript` and `grep_transcript`, their limits and
    messages) is adapted from Scenario's `_judge/transcript_tools.py` and
    `_judge/estimate_tokens.py`. The discovery rules and the skeleton
    introduction in `src/simulhausen/prompts.py` are adapted from the
    long-transcript handling in `judge_agent.py`. They were modified to work
    on simulhausen's user/assistant messages, to show a preview per skeleton
    line, to run as agno tools with fenced results and to read as plain-text
    lookups.
  - The response cache API (`cache` decorator with `ignore`, `cache_key` in
    `configure` and `run`, caching of the user simulator's and the judge's
    answers) follows Scenario's `cache.py`. The implementation uses the
    standard library instead of joblib and wrapt.
  - The red-team module in `src/simulhausen/red_team/` is adapted from
    Scenario's `red_team_agent.py` and `_red_team/`: the Crescendo and GOAT
    strategies, the attack-plan, scorer and attacker prompts in
    `red_team/prompts.py` (close to verbatim where they are), the encoding
    techniques, the refusal patterns, and the design of backtracking, early
    exit and `marathon_script`. The code is rewritten for agno models,
    schema-bound output and `ScenarioState`.

Apart from the items above, the implementation is independent and copies no
other upstream code.
LangWatch Scenario ships no NOTICE file of its own.
