click.aligned.chat.message

aligned.click

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "main": {
      "description": "One turn of a published conversation with an agent. Records are created as the conversation happens and never rewritten, so the record key's TID ordering is the reading order.",
      "key": "tid",
      "record": {
        "properties": {
          "createdAt": {
            "description": "When the turn happened.",
            "format": "datetime",
            "type": "string"
          },
          "mentions": {
            "description": "atproto accounts this turn is about, as DIDs. Deliberately not strongRefs to their profile records: a person is not a version of their bio, and pinning one would make a turn about someone go stale the next time they change their avatar. A DID is the identity, and it is the identity that was being discussed.",
            "items": {
              "format": "did",
              "type": "string"
            },
            "maxLength": 50,
            "type": "array"
          },
          "model": {
            "description": "The model that produced an assistant turn, e.g. 'greenpt/minimax-m2.5'. Present on assistant turns so a reader never has to guess whether they are reading a person or a machine, and can tell which machine.",
            "type": "string"
          },
          "refs": {
            "description": "Records this turn is about, as strong references. Pointed at, never copied: a copy would survive the author deleting the original, and it should not. A strongRef pins the CID, so a reader gets the version that was actually discussed and can tell when it has since changed — which is what you want for a post, whose text is the thing.",
            "items": {
              "ref": "com.atproto.repo.strongRef",
              "type": "ref"
            },
            "maxLength": 50,
            "type": "array"
          },
          "role": {
            "description": "Who is speaking.",
            "knownValues": [
              "user",
              "assistant"
            ],
            "type": "string"
          },
          "session": {
            "description": "The click.aligned.chat.session this turn belongs to. A plain at-uri, deliberately not a strongRef: the session may be retitled later, and a strongRef would pin a CID that then no longer exists.",
            "format": "at-uri",
            "type": "string"
          },
          "steps": {
            "description": "The tools the agent called on this turn, in order. Published because the point of a conversation like this is usually *how* the answer was reached; a reply with the working removed is the least interesting part of it.",
            "items": {
              "ref": "#step",
              "type": "ref"
            },
            "maxLength": 100,
            "type": "array"
          },
          "text": {
            "description": "What was said. The assistant's own words, so they are stored rather than referenced — there is nowhere else they exist.",
            "maxGraphemes": 15000,
            "maxLength": 60000,
            "type": "string"
          }
        },
        "required": [
          "session",
          "role",
          "text",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    },
    "step": {
      "description": "One tool call. The name and a short summary of what it was for — never the output, which is often large, often private, and reproducible by anyone holding the same tools.",
      "properties": {
        "failed": {
          "description": "Whether the call errored. Published rather than hidden: a workflow that shows only the calls that worked is a misleading picture of working with an agent.",
          "type": "boolean"
        },
        "summary": {
          "description": "One line on what it was called for or what came back.",
          "maxGraphemes": 250,
          "maxLength": 1000,
          "type": "string"
        },
        "tool": {
          "description": "Tool name as the agent called it, e.g. 'search-posts'.",
          "maxGraphemes": 64,
          "maxLength": 320,
          "type": "string"
        }
      },
      "required": [
        "tool"
      ],
      "type": "object"
    }
  },
  "id": "click.aligned.chat.message",
  "lexicon": 1
}

Validate Record

Validate a record against click.aligned.chat.message

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:kdnkzvtg6nugup477ev22xfa
CID
bafyreigvs6ir7ovwezf7zmvim3tbaht7ohxmkfq4pi7yasurf7ukicn254
Indexed At
2026-07-29 06:38 UTC
AT-URI
at://did:plc:kdnkzvtg6nugup477ev22xfa/com.atproto.lexicon.schema/click.aligned.chat.message

Version History (2 versions)

Similar Lexicons

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • click.aligned.chat.session recordnot from the namespace authority

    A published conversation with an agent. The container only: the turns are separate click.aligned.chat.message records pointing back at this one, so a session grows without ever being rewritten.

  • One turn in a conversation. A reply uses its parent's key plus '.r' and the generation attempt, e.g. '.r0', '.r1'.

  • xyz.quasigod.lab.letta.message recordnot from the namespace authority

    A letta message within a conversation. Core fields are navigable atproto data; `message` carries the full letta message state.

  • A chat post. Conversations, dialogues, transcripts.

Lexicon Garden

@