click.aligned.chat.message
Schema Diff
+8 -3
Compatibility Analysis
Backward Compatible
Backward compatible. 2 non-breaking changes.
Non-Breaking Changes (2)
- AddedVertex AddedVertex { vertex_id: "click.aligned.chat.message:body.withheld" }
- AddedEdge AddedEdge { src: "click.aligned.chat.message:body", tgt: "click.aligned.chat.message:body.withheld", kind: "prop", name: Some("withheld") }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "click.aligned.chat.message:body.withheld" }
Additional Notes
- Non-breaking: AddedEdge { src: "click.aligned.chat.message:body", tgt: "click.aligned.chat.message:body.withheld", kind: "prop", name: Some("withheld") }
1
1
{
2
2
"id": "click.aligned.chat.message",
3
3
"defs": {
4
4
"main": {
5
5
"key": "tid",
6
6
"type": "record",
7
7
"record": {
8
8
"type": "object",
9
9
"required": [
10
10
"session",
11
11
"role",
12
12
"text",
13
13
"createdAt"
14
14
],
15
15
"properties": {
16
16
"refs": {
17
17
"type": "array",
18
18
"items": {
19
19
"ref": "com.atproto.repo.strongRef",
20
20
"type": "ref"
21
21
},
22
22
"maxLength": 50,
23
23
"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."
24
24
},
25
25
"role": {
26
26
"type": "string",
27
27
"description": "Who is speaking.",
28
28
"knownValues": [
29
29
"user",
30
30
"assistant"
31
31
]
32
32
},
33
33
"text": {
34
34
"type": "string",
35
35
"maxLength": 60000,
36
-
"description": "What was said. The assistant's own words, so they are stored rather than referenced — there is nowhere else they exist.",
36
+
"description": "What was said. The assistant's own words, so they are stored rather than referenced — there is nowhere else they exist. Runs of █ are redactions: spans the author covered rather than withhold the whole turn over, of a fixed width so the bar does not say how long the words were. The covered words were never published and are not recoverable from this record; a viewer that does nothing special shows the bars as text, which is the honest reading.",
37
37
"maxGraphemes": 15000
38
38
},
39
39
"model": {
40
40
"type": "string",
41
41
"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."
42
42
},
43
43
"steps": {
44
44
"type": "array",
45
45
"items": {
46
46
"ref": "#step",
47
47
"type": "ref"
48
48
},
49
49
"maxLength": 100,
50
50
"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."
51
51
},
52
52
"session": {
53
53
"type": "string",
54
54
"format": "at-uri",
55
55
"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."
56
56
},
57
57
"mentions": {
58
58
"type": "array",
59
59
"items": {
60
60
"type": "string",
61
61
"format": "did"
62
62
},
63
63
"maxLength": 50,
64
64
"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."
65
65
},
66
+
"withheld": {
67
+
"type": "boolean",
68
+
"description": "This turn happened and its content was not published. Every turn of a published conversation gets a record, so one published in part has visible holes rather than invisible ones — an answer to a question that was held back would otherwise read as an answer to whatever came before it. A conversation nobody published has no records at all, withheld ones included: a record saying only that somebody spoke at a time is a hole in nothing. Stated rather than inferred from an empty `text`, so a reader never has to guess whether a turn was withheld or simply empty. Absent means published."
69
+
},
66
70
"createdAt": {
67
71
"type": "string",
68
72
"format": "datetime",
69
73
"description": "When the turn happened."
70
74
}
71
-
}
75
+
},
76
+
"description": "One turn of a conversation, in the repo of the person who had it. Written when they publish some part of that conversation, carrying its content only if this turn was one of the parts — so within a conversation that is public at all, the shape is public and the words are by decision."
72
77
},
73
-
"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."
78
+
"description": "One turn of a published conversation with an agent. Records exist only for a conversation somebody published; within one, every turn has a record, in order, so the record key's TID ordering is the reading order."
74
79
},
75
80
"step": {
76
81
"type": "object",
77
82
"required": [
78
83
"tool"
79
84
],
80
85
"properties": {
81
86
"tool": {
82
87
"type": "string",
83
88
"maxLength": 320,
84
89
"description": "Tool name as the agent called it, e.g. 'search-posts'.",
85
90
"maxGraphemes": 64
86
91
},
87
92
"failed": {
88
93
"type": "boolean",
89
94
"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."
90
95
},
91
96
"summary": {
92
97
"type": "string",
93
98
"maxLength": 1000,
94
99
"description": "One line on what it was called for or what came back.",
95
100
"maxGraphemes": 250
96
101
}
97
102
},
98
103
"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."
99
104
}
100
105
},
101
106
"$type": "com.atproto.lexicon.schema",
102
107
"lexicon": 1
103
108
}