Note
このドキュメントは2026-02-27 02:12にPLaMo Translation Modelを使用して自動翻訳されました。
FEP-171b: 会話コンテナモデル
概要
本文書では、ActivityPubネットワークにおける会話管理のためのモデル仕様を規定する。このモデルは、[Streams]プロジェクト(https://codeberg.org/streams/streams)で実装されているConversation Containersの設計思想に基づいている。
本モデルにおいて、会話は単一のアクターによって制御されるコレクションとして表現される。このような会話は特定の対象者に向けて行われ、必要に応じてモデレーション機能を適用することが可能である。
要件
本文書中で使用する「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」の各用語は、RFC-2119に準拠して解釈されるものとする。
コンテナモデル
会話コンテナはコレクションとして実装される。このコレクション内の各アイテムは「Add」アクティビティであり、objectフィールドには別のアクティビティ(例:Create、Update、Delete、Like、Dislike、EmojiReact、またはAnnounce)が含まれる。会話の所有者は他の参加者に対して「Add」アクティビティを配布することで、各参加者が持つ会話ビューの同期を維持する。
sequenceDiagram
actor Alice
actor Bob
actor Charlie
Note right of Alice: Aliceが投稿を作成することで会話を開始する
Alice ->> Bob: Add(Create(Note))
Alice ->> Charlie: Add(Create(Note))
Note left of Bob: Bobが投稿にリアクションする
Bob ->> Alice: Like(Note)
Note right of Alice: Aliceはアクティビティを受信後、他の参加者へ配布する
Alice ->> Charlie: Add(Like(Note))
コンテナコレクション
- コレクションタイプは必ず
OrderedCollectionでなければならない。 - コレクション内のアイテムは時系列順に配置されなければならない。
- コレクションには会話所有者の
idを含むattributedToプロパティが必須である。 - コレクションにはオプションとして
collectionOfプロパティを設定可能で、その値はActivityとする。
会話の対象者はこのコンテナコレクションにアクセスできる必要がある。サーバーがアクティビティを保存せずに転送する場合、コレクションを公開しないことも許容される。ただし、この場合は他サーバーによる会話履歴の補完機能が制限されることになる。
対象者に含まれないアクターに対しては、当該コレクションへのアクセスを拒否しなければならない。
[!NOTE] 本文書の改訂版では、より説明的なコレクションタイプ(例:
ConversationContainer)への変更を検討可能である。これにより、Add.target.type属性値によって会話コンテナに属する「Add」アクティビティを識別できるようになる。[!NOTE] 会話コンテナコレクションに加え、実装者は投稿を含む会話ツリーを表現する別のコレクションを提供することも可とする。
会話へのアクティビティ追加
会話所有者は任意のアクティビティを会話に追加できる。ただし、当該アクティビティにcontextプロパティが存在する場合、その値は会話コンテナのIDと完全に一致している必要がある。
アクティビティが会話に追加される際、所有者はその対象者(通常は最上位投稿によって定義)に対して「Add」アクティビティを送信する。
会話所有者が公開する「Add」アクティビティには、必ず以下の内容を含むtargetプロパティを設定すること:
type:OrderedCollectionid: 会話コンテナのIDattributedTo: コレクション所有者のID
会話所有者によって公開された「Add」アクティビティは、必ず会話コンテナコレクションに追加されなければならない。
[!NOTE] 「Add」アクティビティの
targetが別の「Add」アクティビティ群からなるコレクションである「会話アウトボックス」モデルは、Addアクティビティに関するActivityStreams定義と整合しない。同定義では「Addアクティビティはアクターがその対象物をターゲットに追加したことを示す」と規定されている。
最上位投稿
最上位投稿の著者が必ずしも会話所有者である必要はない。特にグループが所有者の場合、そのメンバーであれば誰でも会話を開始できる。
最上位投稿にはcontextHistoryプロパティが必須であり、これは会話コンテナを参照するものとする。このプロパティが存在することは、当該実装者が会話コンテナを採用していることを示している。
[!NOTE]
contextHistoryプロパティに加え、実装者はオプションとして投稿コレクションを参照するcontextプロパティを追加することも可能である。
インタラクション処理
対象者にかかわらず、会話内のすべてのアクティビティは必ず会話所有者にのみ配信されなければならない。
会話参加者は、所有者によって会話に追加されていないアクティビティを拒否する必要がある。
返信先の対象者は、その会話ルートからコピーされたものでなければならない。
異なる対象者向けの返信を作成する場合、新規に会話を開始し、inReplyToフィールドではなくFEP-e232リンクを投稿に含めることで実現できる。
モデレーション機能
会話所有者が特定のアクティビティを会話に追加したくない場合、そのアクティビティは無視され、対応する「Add」アクティビティも公開されない。
以前に承認された投稿を会話から削除する場合、所有者は「Delete」アクティビティを発行する。このアクティビティのobjectフィールドには削除対象の投稿IDを指定する。その後、当該アクティビティは「Add」アクティビティでラップされ、会話対象者へ配布される。
[!NOTE] アクターは自らが作成していないオブジェクトを削除することはできない。将来の文書改訂版では、「Delete」を
Remove(target: Thread)に置き換えることが検討されている。
履歴補完機能
会話参加者は、会話コンテナコレクションを参照することで欠落しているアクティビティを取得可能である。
認証処理
ActivityPubサーバーが受信トレイで「Add」アクティビティを受領した場合、FEP-fe34に準拠した認証手順を実施しなければならない:
Add.objectが埋め込み形式でない場合、その内容をフェッチする。取得したアクティビティのロケーションが「Add.object」と同一オリジンである場合は、会話に追加する。Add.objectが埋め込み形式の場合、Add.actorとAdd.object.actorが同じオリジンであるかを確認する。- 両オリジンが一致する場合、
Add.objectを会話に追加する。 - オリジンが異なる場合で、FEP-8b32の整合性証明が存在する場合は、この証明を検証する。検証結果が有効であれば、
Add.objectを会話に追加する。 - 上記いずれにも該当しない場合、「Add」アクティビティは無視される。
実装事例
参考文献
- Christine Lemmer Webber, Jessica Tallon, ActivityPub, 2018
- Mike Macgirvin, Containers, 2024
- S. Bradner, Key words for use in RFCs to Indicate Requirement Levels, 1997
- Gregory Klyushnikov, FEP-400e: Publicly-appendable ActivityPub collections, 2021
- silverpill, FEP-e232: Object Links, 2022
- silverpill, FEP-fe34: Origin-based security model, 2024
- silverpill, FEP-8b32: Object Integrity Proofs, 2022
著作権
CC0 1.0 Universal(パブリックドメイン献呈)
本Fediverse Enhancement Proposalの著者らは、法律で認められる範囲内において、当該著作物に関するすべての著作権および関連権利を放棄している。