Skip to main content

strands-emotiv

strands-emotiv

An agent that can feel the person it's talking to.
EPOC X → Cortex → Strands tools · live brain dashboard · LeRobot v3 datasets.
docs · soul · dataset

▶ I put my brain on a dashboard and gave my AI agent a nervous system
how it works

2019: how do I control X with my mind? Blink = click. A slower keyboard. 2026: what does an agent become when it can feel you?

It notices when you tense up, go quiet, or light up, and changes how it talks.

Run

pip install strands-emotiv            # or: uv tool install strands-emotiv
export EMOTIV_CLIENT_ID= EMOTIV_CLIENT_SECRET=   # free Basic license
strands-emotiv doctor                 # Cortex ✓ headset ✓ streams ✓
strands-emotiv dashboard              # → localhost:8765

Use the USB dongle; the cable only charges. No headset: --fake replays 865 real samples.

What the agent sees

One line per turn. The dashboard shows the exact same line.

[brain: focus 0.71↑ · stress 0.22↓ · alpha dominant O1/O2 · still 38s · CQ 13/14 good]
you it
stress ↑, build failed 3 lines, 1 next step, no questions
alpha up, still 40 s stays quiet
CQ < 10/14 "I can't see your brain right now"

14 electrode head map: all green says CQ 14/14, T7 dries and the line keeps talking at 13/14, six dry crosses the 10/14 gate and the line becomes the refusal. Absent is not zero.

Three speeds, never mixed: reflex ≤100 ms (blink · clench = veto) · ambient ~10 s (the line) · intent opt-in (one trained yes).

Three speeds replayed from 10.53 s of real EPOC X signal: reflex blinks at 0.03 s, 1.78 s and a held wink at 5.25 s; the ambient line emitted at the 9.96 s metrics tick; the intent lane stays dormant

Dashboard

Left = you: skull with 14 live electrodes, 5 band topomaps, 10-min waterfall, head trail. Right = the agent: the line it reads, event river, metric radar, sonification, consent. Bottom: streaming chat. Under each message, the line it saw when you sent it.

The dataset

▶ watch an ECoT episode get recorded live
1 min: recording an episode on the dashboard

Embodied chain-of-thought, brain edition: observation = band power · CQ · motion · metrics · facial · events @ 8 Hz. action = what the agent said. reward = your brain after the answer (Δstress, Δengagement across the turn boundary). LeRobot v3.0, trains with stock tooling.

One recorded turn replayed verbatim: AF3 band power flows in (theta dominant), the ambient line assembles, the agent answers, the action is stamped into the episode as an amber frame, the post-roll waits for the next met tick, and REWARD backfills as nan because none arrived in time. Absent is not zero

from lerobot.datasets.lerobot_dataset import LeRobotDataset
ds = LeRobotDataset("cagataydev/emotiv-ecot")        # private
ds[80]["observation.state"].shape                    # [70]  14 ch × θ α βL βH γ
ds[80]["task"]
# TASK: One sentence: how does my brain look right now? | AMBIENT: [brain: theta dominant · CQ 13/14 good]
# | PLAN: Calm and settled… | TOOL: none | ACT: Calm and settled… | REWARD: Δstress=…

That's a real frame from the first live episode. ● REC in the header → talk → Publish.

Tools

from strands_emotiv.tools import brain_snapshot, brain_bands, head_pose, contact_quality, wait_for_brain_event
agent("wait until I blink twice, then tell me what my alpha did")

Every agent action stamps the EEG record (injectMarker). The loop closes both ways.

MIT · Cagatay Cali · 2019 → 2026

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

strands_emotiv-0.1.5.tar.gz (453.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

strands_emotiv-0.1.5-py3-none-any.whl (345.0 kB view details)

Uploaded Python 3

File details

Details for the file strands_emotiv-0.1.5.tar.gz.

File metadata

  • Download URL: strands_emotiv-0.1.5.tar.gz
  • Upload date:
  • Size: 453.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for strands_emotiv-0.1.5.tar.gz
Algorithm Hash digest
SHA256 b63f2d7785ea70a029220c743563e0e0cd4171e987e91ca1365232cef1aa7e6f
MD5 1860724da6f31ee6b4e0309154122b2e
BLAKE2b-256 941719f08bb399c5b4d061647f4b3086bc9294284774ace401627a80e43745d7

See more details on using hashes here.

File details

Details for the file strands_emotiv-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: strands_emotiv-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 345.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for strands_emotiv-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 9cb1f7c3b0bae0493bff34281ae5075702470e169e5e9b6ce434c2f37840d94d
MD5 f53b8227bac394b94b512acbecc7803d
BLAKE2b-256 44d4775e06dc8df668ac0b810815577be3ae84920361c80e9b8bfdeacf419370

See more details on using hashes here.

Release history Release notifications | RSS feed

0.2.1

2 files

0.2.0

2 files

This release

0.1.5 This release

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page