AI Act Art. 50 disclosures
EU AI Act Regulation (EU) 2024/1689 Article 50 transparency obligations enter force 2026-08-02. This module ships the active runtime primitives that emit disclosure markup at request time:
- b.ai.disclosure.chatbot(session, opts) — Art. 50(1). Operators interacting with natural persons must disclose the AI nature of the interaction. Returns the disclosure payload (visible text / structured metadata) to wire into the response.
- b.ai.disclosure.deepfake(content, opts) — Art. 50(4). Operators emitting AI-generated / AI-manipulated content (image / audio / video / text) must label the output as synthetic. Returns the disclosure payload + suggested embedding points (visible label / C2PA metadata / both).
- b.ai.disclosure.emotion(opts) — Art. 50(3). Emotion- recognition / biometric-categorisation systems must inform the natural person of operation. Returns the notice payload.
Cross-jurisdiction: - California AB-853 (effective 2026) — watermarking on AI-generated content. The deepfake primitive emits both AI Act Art. 50(4) AND AB-853 markup when jurisdiction: "us-ca" is requested. - China CAC GenAI Measures — content review marker. Same primitive handles the cross-walk via the jurisdiction: "cn" opt.
Composition: - b.audit-sign chains every disclosure emission so the Art. 50 compliance trail is tamper-evident. - b.agent.idempotency (v0.9.22) ensures the chatbot first-contact disclosure isn't double-emitted across retry / reconnect. - b.contentCredentials (v0.12.21 — deferred) will wire C2PA manifest emission alongside the visible label.
Out of scope (this patch): - C2PA manifest emission — defers to v0.12.21 b.contentCredentials. - Watermark frame embedding into image/audio/video bytes — operator's encoder pipeline (this primitive supplies the label markup; the operator chooses the embed point). - Real-time prohibited-content moderation — orthogonal, composes with b.ai.input.refuseIfMalicious.
b.ai.disclosure.chatbot(session, opts) #
{
placement: "first-message" | "always" | "on-request", // default "first-message"
language: string, // BCP 47 tag; defaults to en
text: string, // override the default disclosure text
jurisdiction: string, // "eu" (default) | "us-ca" | "cn"
audit: object, // b.audit instance for tamper-evident logging
correlationId: string, // audit chain correlation
}
EU AI Act Art. 50(1) first-contact disclosure. Operators interacting with natural persons via an AI system must inform the person they are interacting with AI unless it is obvious from the circumstances (Art. 50(1) carve-out). This primitive returns the disclosure payload + emits an audit event per emission so the compliance trail is tamper-evident under b.audit-sign.
var disclosure = b.ai.disclosure.chatbot({ id: "session-42" }, {
placement: "first-message",
language: "en",
});
// disclosure.text → "You are interacting with an AI system."
// disclosure.shouldEmit → true (first contact)
// operator wires disclosure.text into the response payload
b.ai.disclosure.deepfake(content, opts) #
{
contentType: "image" | "audio" | "video" | "text", // required
placement: "label" | "metadata" | "both", // default "both"
jurisdiction: string, // "eu" (default) | "us-ca" | "cn"
language: string, // BCP 47 tag; defaults to en
text: string, // override the default disclosure text
audit: object,
correlationId: string,
}
EU AI Act Art. 50(4) synthetic-content disclosure. Operators emitting AI-generated or AI-manipulated content (image / audio / video / text) must label the output as synthetic in a clear and machine-readable manner. This primitive returns the disclosure payload (visible label + structured metadata) the operator wires into the encoder / response pipeline. C2PA manifest emission is handled by b.contentCredentials; this primitive supplies the label markup and the metadata schema that the C2PA adapter consumes.
var disclosure = b.ai.disclosure.deepfake(imageBytes, {
contentType: "image",
placement: "both",
jurisdiction: "us-ca",
});
// disclosure.label → "This content has been generated ..."
// disclosure.metadata → { ai_generated: true, schema: "c2pa-v1.4-ready" }
// disclosure.crossWalk → ["eu-ai-act/Art. 50(4)", "us-ca/AB-853 §22949.91"]
b.ai.disclosure.emotion(opts) #
{
language: string,
text: string,
systemType: "emotion" | "biometric-categorisation", // default "emotion"
audit: object,
correlationId: string,
}
EU AI Act Art. 50(3) emotion-recognition / biometric- categorisation disclosure. Operators deploying these systems must inform the natural person of operation. Returns the notice payload the operator wires into the consent / pre-interaction flow.
var notice = b.ai.disclosure.emotion({ systemType: "emotion" });
// notice.text → "This system uses AI to recognise emotions ..."
// notice.article → "Art. 50(3)"
b.ai.disclosure.applyAll(scenario) #
{
scenario.kinds: ["chatbot", "deepfake", "emotion"] // required (subset)
scenario.session: object, // required when "chatbot" is included
scenario.content: string | Buffer, // required when "deepfake" is included
scenario.contentType: string, // required when "deepfake" is included
scenario.jurisdiction: string, // forwarded to all
scenario.language: string,
scenario.audit: object,
scenario.correlationId: string,
}
Bundles multiple Art. 50 disclosures into a single call. Operators with mixed-modality AI systems (e.g. a chatbot that also generates images) declare which obligations apply via scenario.kinds and the primitive composes the per-obligation emit calls in one pass. Returns { disclosures: { chatbot?, deepfake?, emotion? } } with each entry being the per- primitive emission payload.
var bundle = b.ai.disclosure.applyAll({
kinds: ["chatbot", "deepfake"],
session: { id: "s1" },
content: imageBytes,
contentType: "image",
jurisdiction: "us-ca",
});
// bundle.disclosures.chatbot.text → "You are interacting with an AI system."
// bundle.disclosures.deepfake.label → "This content has been ..."
Last updated 2026-08-08T16:39:49.652Z by seeder.