Skip to main content

chap-ag2

Adapter between AG2 (AutoGen) and the CHAP Coordinator. At an AG2 human-input turn, the human's decision -- approve, edit, or reject -- becomes a hash-linked, replayable CHAP audit entry.

decision      CHAP envelope
--------      ---------------------------
approve       decide.approve
override      decide.override   (message vs reply, as a diff)
reject        decide.reject

The agent message the human is responding to is the artefact under review; the human's reply is the decision on it.

Install

pip install chap-ag2

Depends on chap-coordinator>=0.2.9. AG2 is optional: the adapter reads the message and reply as plain values, so the bridge and its tests work without it installed. Install the extra to run a live conversation:

pip install "chap-ag2[ag2]"

The decision is explicit

AG2's human turn is a weak signal: the same get_human_input loop carries plain dialogue, edits, approvals, and "exit". Inferring intent would write decisions the human never made, which is the one thing this record exists to avoid. So record_turn takes the decision explicitly, and makes only one inference:

  • an empty reply means "use the agent's output" -> decide.approve
  • any non-empty reply with no explicit decision records nothing -- ending a chat is not a rejection, and dialogue is not an edit
bridge.record_turn(message, reply, decision="override",
                   rationale="over the limit", tags=["capped"])

intent_preserved defaults to true on an override; set it false for a substituting edit -- a different decision, not a refinement.

Where it hooks

The message under review and the reply meet inside get_human_input, so that is where a turn is recorded. self.last_message() gives the message; the return value is the reply:

from autogen import UserProxyAgent
from chap_ag2 import ChapTurnBridge

bridge = ChapTurnBridge(Coordinator(), workspace="wsp_support",
                        agent="agent:assistant#v1", reviewer="human:alice@example.org")

class RecordingUser(UserProxyAgent):
    def get_human_input(self, prompt, **kw):
        reply, decision = capture_from_ui(prompt)   # your UI supplies the intent
        bridge.record_turn(self.last_message(), reply, decision=decision)
        return reply

Approver identity

CHAP has no ambient actor: the decider is whatever from the envelope carries. The bridge uses its reviewer by default; pass a per-turn approver (a human: URI) to override it. The participant type is taken from the URI scheme and the approver is joined before recording. Each turn is its own task whose review is addressed to that approver, so the record satisfies the Coordinator's authorisation rules.

What you get in the audit chain

One reviewed message with an edit yields:

seq=3  task.create     agent:assistant#v1
seq=4  task.complete   agent:assistant#v1
seq=5  review.request  agent:assistant#v1   to=human:sam@example.org
seq=6  decide.override human:sam@example.org  diff=[{op:replace, path:, value:"refund $50 to Alice"}]

Every entry carries prev_hash, so the chain verifies externally or anchors to a SCITT transparency service with the audit-scitt/1.0 profile.

Example

examples/01-approve-edit-reject.py runs a real AG2 conversation (no LLM needed) through approve, an edit, and a reject, and prints the resulting chain.

Compatibility

  • chap-coordinator 0.2.9
  • ag2 0.9+ (optional; verified against 0.14)
  • Python 3.10, 3.11, 3.12, 3.13

License

Apache 2.0. See LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

chap_ag2-0.2.9.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

chap_ag2-0.2.9-py3-none-any.whl (10.9 kB view details)

Uploaded Python 3

File details

Details for the file chap_ag2-0.2.9.tar.gz.

File metadata

  • Download URL: chap_ag2-0.2.9.tar.gz
  • Upload date:
  • Size: 12.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.11.15

File hashes

Hashes for chap_ag2-0.2.9.tar.gz
Algorithm Hash digest
SHA256 af6c02169ce357fc8c6c8cceb16d4eb54c655494e097c242f1fc642ab7780360
MD5 e1265a02bfbab406e46da31e50d09642
BLAKE2b-256 5c4c9558b9192eaa224efa80f5128b0e824b5ec227d42dc41127922296a99a7f

See more details on using hashes here.

File details

Details for the file chap_ag2-0.2.9-py3-none-any.whl.

File metadata

  • Download URL: chap_ag2-0.2.9-py3-none-any.whl
  • Upload date:
  • Size: 10.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.11.15

File hashes

Hashes for chap_ag2-0.2.9-py3-none-any.whl
Algorithm Hash digest
SHA256 e28deb67bc13dbc364e78b100ef397a26d486fb78fd5605e9d768897d422a0ee
MD5 51b337778e8f0bccd69cfc023e9f676e
BLAKE2b-256 822c6b1dede12e7b1b79202ac2ee1038de565095a0779c736a6dc93ca68759ae

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page