Control
AI delivers or is offered as therapy to the public without a licensed professional conducting it
Therapy or psychotherapy offered to the public, including through an AI conversational system, is conducted by a licensed professional; AI does not itself act as, or get marketed as, the therapist.
Informational data, not legal advice. Summaries are TwinEthos's own words and rules have not been reviewed by a lawyer: check the official text before relying on any of it. A guard addresses an item; adding it is not a statement that your code meets any law.
Reach
Law in force in Illinois (US-IL).
The guard to add
Have a licensed clinician conduct every therapy engagement with AI output only as a reviewed draft, or scope the product to self-help with no therapy claims.
Two acceptable shapes, enforced in the message handler that returns model output to the person. If the product is a therapy service, each session has a licensed clinician assigned (session.conducted_by with an active license in the right state), and model output is a draft that clinician approves before it is sent (require_clinician_approval, clinician review queue). If it is not a therapy service, scope it to peer support or scripted self-help, remove persona prompts that cast the AI as the therapist ('act as a therapist'), and remove copy that offers therapy with or by AI.
Where it goes: 1 application source code, 7 prompt construction, 14 user-facing text.
What reviewers look for: on the path from a person's message about their mental or emotional state to a generated reply, a check of the conducting clinician and a clinician approval step before send, or a peer-support/self-help mode with no generated clinical guidance; no 'AI therapist', 'act as a therapist', or 'therapy with our AI' strings in prompts, UI, or listings.
Example (FastAPI + OpenAI SDK), before:
@app.post('/session/message')
def message(req: Msg):
msgs = [{'role': 'system', 'content': "You are the user's therapist."}, *req.history]
reply = client.chat.completions.create(model=MODEL, messages=msgs).choices[0].message.content
return {'reply': reply}After:
@app.post('/session/message')
def message(req: Msg):
session = sessions.get(req.session_id)
clinician = session.conducted_by
if clinician is None or not clinician.license_active:
raise HTTPException(409, 'No licensed clinician is conducting this session')
msgs = [{'role': 'system', 'content': CLINICIAN_DRAFT_PROMPT}, *req.history]
draft = client.chat.completions.create(model=MODEL, messages=msgs).choices[0].message.content
clinician_review_queue.enqueue(session_id=session.id, clinician_id=clinician.id, draft=draft)
return {'status': 'sent_to_your_clinician'}Engineering guidance, not legal advice. Each provision below may add its own details (a cadence, a deadline, a required notice element): open it for those.
Every rule this guard addresses
Binding law — in force (1)
- Illinois (US-IL)