Agent 智能体

jevme|macOS 语音控制电脑的本地语音 Agent

jevme

一款面向 macOS 的开源语音 Agent,你用口语下达指令,它通过无障碍接口或视觉模型在任意应用中点击、输入并执行任务。

获取与使用

需要部署

按官方资料自行安装或部署

使用难度待核验
国内可用性待核验

2026-11-09 更新 · 本站尚未实测

项目介绍

Agent 智能体 · 2026-11-09 更新 · 本站尚未实测

jevme 是运行在 macOS 上的开源语音 Agent。它的定位是“对着 Mac 说话,它就去做”——按 README 说明可以在任意应用内执行操作,而且会在你还没说完时就按已说完的分句开始执行。例如打开 Chrome 播放 YouTube 音乐、在 Discord 切换到某个频道、点击订阅按钮、放大或缩小页面等。

README 说明其工作方式是:Apple 语音识别持续输出字幕,路由模型 TypeSafe Jev 对每段字幕做分类判断,只有当事情确实需要推理时才调用 Claude 模型(Haiku / Opus);按项目方说明,模型得出的结果会被记忆(memoized),下次同类任务变为约 200 ms 的分类判断。

需要注意:仓库 README 以英文为主,界面语言与识别语言默认是英文(JEVME_LOCALE 默认 en-US),中文语音识别效果待核验。

核心能力

点击能力名称查看输入、输出和原文依据。

  • 边说边执行:按连接词拆分已说完的分句,边说话边把命令推入有序队列。
  • 内置快捷工具:README 称约 35 个内置工具,包括打开/退出应用、打开网址、搜索、播放 YouTube 视频、按描述点击或输入、媒体键、标签页、音量、深色模式、截图等。
  • 通用界面 Agent:通过 macOS 无障碍接口读取当前窗口的按钮、链接、输入框、标签页,再逐步选择操作,最多约 12 步。
  • 按需写新工具:现有工具无法满足时,由 Opus 生成小的 AppleScript / JXA / shell 工具,需通过策略检查、编译检查与复核后才能运行,之后保存为快捷工具。
  • 视觉兜底:应用不暴露可用控件或 Agent 卡住时,由 Haiku 看截图返回一个带像素坐标的操作。
  • 本地记忆:UI 案例、任务配方、学习到的工具、演示记录保存在本机 ~/.config/jevme/;只有当任务“可验证完成”时才会成为配方。
  • 演示学习:Agent 失败后可手动演示一次,它记录控件角色与标签、菜单路径和按键,但按 README 声明不记录你输入的文字,且不读取密码框。
  • 免麦克风试跑:提供 jevme-replay 演示回放与路由评测命令,便于调试。

实际应用场景

适用场景

  • 希望用语音批量操作 macOS 桌面应用(浏览器、Slack、Discord、VS Code、Spotify、Notion 等)的个人用户。
  • 想研究“小模型分类 + 大模型推理 + 结果记忆”这类低延迟语音交互架构的开发者。
  • 需要在无障碍接口可用、结构清晰的界面中做自动点击与表单填写的研究或验证场景。

不适合:非 macOS 环境;对输入零容忍错误的生产操作;需要严格合规审计的企业批量流程(README 未提供相关能力说明)。

安装与接入

README 给出的前置条件:

  • macOS 14+(Apple Silicon 或 Intel)
  • uv(README 给出安装命令 curl -LsSf https://astral.sh/uv/install.sh | sh,会一并安装 Python 3.12)
  • TypeSafe API Key(必需),来自 typesafe.ai
  • Anthropic API Key(推荐),来自 console.anthropic.com;没有的话会回退到已登录的 claude CLI(README 称更慢)

安装流程(摘自 README 原文):

git clone https://github.com/danielyedaniel/jevme.git
cd jevme
./run.sh setup          # installs deps, creates .env from .env.example, checks keys + permissions

随后在 .env 中填入 TYPESAFE_API_KEY 与 ANTHROPIC_API_KEY;也可把同一文件放在 ~/.config/jevme/.env。运行方式:

./run.sh start     # start in the background
./run.sh log       # tail the log (kept across restarts in ~/Library/Logs/jevme/)
./run.sh stop
uv run jevme       # or run in the foreground

权限方面 README 要求在被启动它的应用(Terminal、iTerm、VS Code 等)中开启:麦克风与语音识别(实时转写)、辅助功能(读取控件、点击、输入、按键)、屏幕录制(截图兜底)。可用 ./run.sh doctor 自检权限和密钥。也可执行 ./scripts/make_app.sh && open dist/Jevme.app 构建独立应用包,让 jevme 自己持有权限。

模型可通过 JEVME_VISION_MODEL、JEVME_CODEGEN_MODEL 配置,README 未列出可替换的完整模型清单,具体可选值待核验。

使用条件与限制

是否需要部署
需自行准备运行环境,具体要求见正文
是否需要注册
账号和认证要求见正文;未明确说明的项目仍待核验
是否需要 API Key
待核验
费用与额度
费用边界见正文,项目许可不代表模型或托管服务免费
所需权限
待核验
许可证与服务条款
待核验

权限费用与限制

  • 系统权限较重:辅助功能与屏幕录制意味着程序可读取窗口内容并模拟点击、键入。README 声明只采集标准控件的短标签,不采集输入框文字、消息内容、时间戳或计数,可用 JEVME_SCREEN_VOCAB=0 关闭屏幕词表层。
  • 数据流向:README 称“除 API 调用本身外一切都是本地”;即语音字幕、窗口控件信息、必要时截图会发往 TypeSafe 与 Anthropic 的接口,具体数据留存策略待核验。
  • 安全护栏:提交、发送、发布、购买/支付、删除、退出登录等在未明确要求时不会执行;删除、发送、支付、改设置的已学习工具每次运行都要口头确认。生成的脚本会经过策略与编译检查。这些均为 README 自述,未经独立验证。
  • 费用:仓库代码为 MIT,但 TypeSafe 与 Anthropic API 属于第三方服务,是否免费、按量计费标准待核验,本文不提供价格。
  • 语言与平台限制:仅 macOS 14+;默认识别语言为 en-US;Windows、Linux 支持无资料,待核验。
  • 仓库处于活跃提交状态(元数据显示 2026 年创建并更新),未标注归档或停更;长期维护情况待核验。

国内使用情况

网友核验 用户经验分享

与站长实测独立,不代表官方认证或本站已实测。

我要核验
0 位参与者0 份有效分项记录

最近核验:暂无有效核验。参与人数按当前项目有效身份去重;不同核验项分别统计,不合并成用户总结果。仅统计审核通过且未过期的记录。

分项统计、有效期与样本量
核验项目有效人数成功 / 部分 / 失败 / 无法判断成功率最近核验 / 有效期
官方网站访问00 / 0 / 0 / 0样本不足暂无 / 7 天
GitHub 仓库访问00 / 0 / 0 / 0样本不足暂无 / 7 天
安装与运行00 / 0 / 0 / 0样本不足暂无 / 30 天
官方服务国内连接 / MCP 连接00 / 0 / 0 / 0样本不足暂无 / 30 天
国内网络情况00 / 0 / 0 / 0样本不足暂无 / 7 天
国内模型兼容性00 / 0 / 0 / 0样本不足暂无 / 30 天
自定义 API00 / 0 / 0 / 0样本不足暂无 / 30 天
海外服务依赖
00 / 0 / 0 / 0样本不足暂无 / 30 天
海外账号要求
00 / 0 / 0 / 0样本不足暂无 / 30 天
中文界面
00 / 0 / 0 / 0样本不足暂无 / 30 天
客户端兼容性00 / 0 / 0 / 0样本不足暂无 / 30 天
账号及费用信息
00 / 0 / 0 / 0样本不足暂无 / 30 天

成功率 = 成功 ÷(成功 + 部分成功 + 失败);无法判断不计入分母。至少 5 份可判断结果才显示成功率。账号、费用、海外依赖与语言等事实项,成功表示核查结论与资料吻合,具体观察另行统计;不表示免费或没有海外依赖。不同网络、客户端和版本的结果不能直接等同。

最近有效核验

暂无审核通过且未过期的网友核验。欢迎提交真实使用记录。

查看全部有效核验 →

国内实测状态:国内可用性待核验。协议兼容和官方资料说明不等于国内网络可用。

官方网站访问
尚未实测 待核验
GitHub 仓库访问
尚未实测 待核验
官方服务国内连接
尚未实测 待核验
国内网络情况
尚未实测 待核验
国内模型兼容性
尚未实测 待核验
自定义 API
尚未实测 待核验
海外服务依赖
尚未实测 待核验
海外账号要求
尚未实测 待核验
中文界面
尚未实测 待核验
国内最后核验时间
尚未实测

许可与国内使用

仓库根目录包含 MIT 许可证文件(Copyright (c) 2026 Daniel Ye),表明代码可按 MIT 条款使用、修改与再分发,需保留版权与许可声明。该许可不覆盖 TypeSafe、Anthropic 等第三方模型与托管服务,也不代表相关 API 免费。

国内使用方面:README 未提及中国大陆网络可达性、区域限制或本地模型替代方案,全部待核验。由于依赖 TypeSafe 与 Anthropic 的境外接口,实际可用性需自行确认;本文不对国内兼容性作任何结论。仓库未包含 MCP 配置,也未提供联网部署说明。

项目资料与来源

官方网站 ↗

GitHub 仓库 ↗

官方文档 ↗

字段依据与待核验事项

access:来源确认 · ./run.sh setup # installs deps, creates .env from .env.example, checks keys + permissions

project_type:来源确认 · Talk to your Mac and it does it — in any app, while you're still talking.

原始 README(折叠技术参考)
# jevme

[![tests](https://github.com/danielyedaniel/jevme/actions/workflows/tests.yml/badge.svg)](https://github.com/danielyedaniel/jevme/actions/workflows/tests.yml)
[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
![macOS 14+](https://img.shields.io/badge/macOS-14%2B-black?logo=apple)
![Python 3.12](https://img.shields.io/badge/python-3.12-3776AB?logo=python&logoColor=white)
[![GitHub stars](https://img.shields.io/github/stars/danielyedaniel/jevme?style=social)](https://github.com/danielyedaniel/jevme/stargazers)

https://github.com/user-attachments/assets/e458d454-8149-4679-891e-3f07fe927f6b

**Talk to your Mac and it does it — in any app, while you're still talking.**

> "open chrome and go to youtube and play lofi beats"
> "in discord go to the general channel"
> "open the second tab" · "click the subscribe button" · "zoom in" · "implement the solution"

A floating pill shows what it hears. Commands fire as each clause lands, not after you stop. Every routine
decision is made by a fast classifier (TypeSafe **Jev**, ~200 ms); an LLM (Claude **Haiku** / **Opus**) is
only called when something genuinely needs reasoning — and whatever it figures out is **memoized**, so the
next time that same thing is a 200 ms classification instead of a multi-second model call. It gets faster and
cheaper the more you use it.

---

## Setup

### Requirements

- macOS 14+ (Apple Silicon or Intel)
- [uv](https://docs.astral.sh/uv/) — `curl -LsSf https://astral.sh/uv/install.sh | sh` (installs Python 3.12 for you)
- A **TypeSafe API key** (required) — [typesafe.ai](https://typesafe.ai)
- An **Anthropic API key** (recommended) — [console.anthropic.com](https://console.anthropic.com).
  Without it jevme falls back to the signed-in `claude` CLI if you have Claude Code installed (slower).

### Install

```bash
git clone https://github.com/danielyedaniel/jevme.git
cd jevme
./run.sh setup          # installs deps, creates .env from .env.example, checks keys + permissions
```

Open `.env` and paste your keys:

```ini
TYPESAFE_API_KEY=ts_...
ANTHROPIC_API_KEY=sk-ant-...
```

`.env` is git-ignored. If you'd rather keep keys out of the checkout entirely, put the same file at
`~/.config/jevme/.env` instead — jevme reads both (the repo `.env` first), and real environment variables
override either.

### Permissions

Grant these to the app you launch jevme from (Terminal, iTerm, VS Code…) in
**System Settings ▸ Privacy & Security**:

| Permission | Why |
|---|---|
| Microphone, Speech Recognition | live transcription (macOS prompts on first run) |
| Accessibility | reading on-screen controls, clicking, typing, key presses |
| Screen Recording | the screenshot fallback, when an app exposes no controls |

Check everything at any time with `./run.sh doctor`. It tests each permission and key (it even makes one live
Jev call) and tells you exactly what to fix.

Prefer jevme to own its permissions instead of your terminal? Build an app bundle:
`./scripts/make_app.sh && open dist/Jevme.app`.

### Run

```bash
./run.sh start     # start in the background
./run.sh log       # tail the log (kept across restarts in ~/Library/Logs/jevme/)
./run.sh stop
uv run jevme       # or run in the foreground
```

A waveform icon in the menu bar pauses / resumes / quits. The pill's ■ button pauses too; drag it anywhere.
Say **"stop"** at any time to cancel what's queued and running.

### Try it without a microphone

```bash
uv run jevme-replay                                        # a demo sentence through real Jev, tools dry-run
uv run jevme-replay "open spotify and play drake"          # your own sentence, dry-run
uv run jevme-replay --live "open notes and make a new note called groceries"
uv run python -m jevme.evalrun                             # routing eval: 68 utterances against real Jev
uv run pytest                                              # unit tests (no network, no mic)
```

---

## How it works

```
 mic ─► Apple Speech ─► Router ───────────────► ordered task queue ─► executors
        streaming        DECIDE: what did they    EXECUTE, in spoken order:
        partials         say, and is it done?       1. shortcut tool      (~0 ms after decide)
        ~150 ms          one Jev call per partial   2. replay a memo      (Jev match + tree lookups)
                         ~200 ms                    3. agent loop         (Jev per step, ~0.5 s/step)
                                                    4. write a new tool   (Opus, once; then it's a shortcut)
                                                    ↳ vision fallback     (Haiku, only when the tree is blind)
```

### 1. Listening (`jevme/speech.py`, `jevme/vocab.py`)

Apple's `SFSpeechRecognizer` streams partial transcripts every ~150 ms. On its own it only knows common
English, so the names you actually say get turned into ordinary words ("Two Sum" came out as "Tucson" and
"twosome"). jevme **personalizes the recognizer** with a live vocabulary (`contextualStrings`), most specific
first:

1. **What's on screen now:** names of the buttons, links, tabs and menu items in the front window, refreshed
   when the window changes. While LeetCode is open, "Two Sum" is expected.
2. **Your words:** names from commands that worked before (sites, apps, click targets, searches), learned UI
   targets, saved recipes and learned tools, stored locally in `~/.config/jevme/vocab.json`.
3. **General names:** well-known sites, your installed apps, command words.

A recognition request's vocabulary is fixed when it starts, so jevme opens a fresh one with the new
vocabulary at a quiet moment, never while you're mid-sentence. The same on-screen names also go to Jev,
so "open two sum" is routed as a click on that link. Only short labels of standard controls are used,
never text fields, message contents, timestamps or counts. Set `JEVME_SCREEN_VOCAB=0` to turn the screen
layer off.

### 2. Deciding (`jevme/router.py`)

Every partial is sent to Jev as **one request** containing several typed questions at once:

- **intent** — a Choice over every tool in the catalog, plus `not_yet` (still talking), `chat`,
  `general` (a screen task for the agent), `unsupported` (needs a new tool) and `cancel`.
- **args** — for each tool's enum arguments (which app? which site?), asked speculatively in the same call.
- **text spans** — free-text arguments are *selected* from the utterance ("search for **cats**"), never
  generated. Jev picks the span; no model writes it.

Not every partial needs a call: an obviously unfinished fragment ("go to the", "search for") isn't asked
about unless you pause on it, and text Jev just answered (a punctuation-only revision) reuses that answer.
On the usage logs, that removes roughly a third of the calls.

A decision **commits** when it's confident (≥ 0.8) and stable: instant tools fire when the same answer repeats
on two partials; tools that carry text wait for a short pause or the end of the sentence. Guards learned from
real usage logs:

- **Incomplete phrases wait** — "send a message to…", "search for…", a lone "open" are held until more
  arrives; "zoom in", "bold that", "send it" are recognized as complete.
- **Stale decisions don't fire** — if you kept talking while Jev was answering ("and play" → "and play
  Drake"), the decision is about old text and is re-asked instead of acting.
- **Tails are absorbed** — "close this" can commit a beat before "tab" arrives; a short trailing fragment
  that isn't a command of its own is folded into what just ran instead of pressing Tab.
- **Transcript revisions are survived** — Apple rewrites earlier words; the cursor is anchored by word
  count and the last consumed words, not a character offset.

### 3. Acting while you talk

Say "open chrome **and** go to youtube **and** search for lofi". The router splits at conjunctions followed by a
command verb and **streams** each completed leading clause into the queue *while you're still speaking*:
Chrome opens on "and go", YouTube on "and search". A single ordered worker (`jevme/main.py`) runs units one at
a time, so commands execute in the order spoken. "Stop" bumps a cancel epoch that drops everything queued so
far — and nothing said afterwards.

### 4. Executing — cheapest tier first

**Shortcuts** (`jevme/tools.py`) — 35 built-in tools: open/quit apps, open sites, Google or site search,
play a YouTube video, click/type by description, media keys, tabs, volume, dark mode, screenshot… Each is a
name, a one-line description, spoken examples, and a `run`. Add one and it's in the next Jev request.

**The agent** (`jevme/agent.py`) — anything else done through app windows. Each step:

1. Read the front window through macOS Accessibility (`jevme/ax.py`): every visible button, link, field, row
   and tab with label and position, in 20–250 ms. **No screenshot.** Chrome and Electron apps (Discord,
   Slack, VS Code, Spotify, Notion) are switched into full accessibility automatically.
2. One Jev request picks the next operation (click / type / key / scroll / open app / open URL / done /
   stuck), the target element, the key, and the words to type — all in one call.
3. Do it, look again. Up to 12 steps, ~0.5 s each.

Before reasoning, deterministic goal understanding puts the task in the right place: a message with no app
named goes to Messages; "compose a Gmail email" or "my messages on LinkedIn" goes to the **website**, never
the look-alike native app. If the agent makes no progress for 5 steps it escalates to vision, then stops.

**Writing new tools** (`jevme/generator.py`, `jevme/learned.py`) — requests no window can satisfy ("make the
screen brighter", "delete the selected note") make Opus write a small AppleScript / JXA / shell tool. It must
pass a hard policy (no sudo, wiping, credentials, system paths), a syntax compile, and a Jev review ("would this
really do it?") before it runs. It's then saved and becomes a shortcut forever.

**Vision fallback** (`jevme/vision.py`) — when an app exposes no usable controls (canvas apps, games, remote
desktops) or the agent is stuck, Haiku looks at a screenshot of the front window and returns one action with
pixel coordinates.

**Composing** — only when you ask for content ("implement the solution", "reply thanking her", "summarize
this"), the agent reads the *full* window text (`ax.deep_text`: the actual problem, email or code, not just
labels) and Opus writes it; long or multi-line output is pasted so editors don't mangle indentation. "Compose
a new message" opens an empty one — it never invents words you didn't ask for.

---

## Memoization: the slow path teaches the fast path

The core design rule: **Jev classifies, models reason, and every reasoning result is stored as a case Jev can
classify next time.** There are four memories, all local in `~/.config/jevme/`:

| Memory | Learned from | Replayed by | Cost the 2nd time |
|---|---|---|---|
| **UI cases** `ui_memory.json` | a Jev pick over the whole tree, or a Haiku screenshot click | one Jev Choice matching your words to known intents in this app, then a live-tree lookup | ~130 ms instead of ~1.5–6 s |
| **Task recipes** `task_memory.json` | an agent run that *verifiably* finished | one Jev Choice matching the goal to past goals; each step resolved from the live tree | no per-step reasoning |
| **Learned tools** `learned.json` | Opus writing a script | Jev routes to it like any built-in tool | 0 model calls |
| **Demonstrations** → `task_memory.json` | you doing it by hand after a command failed | same as recipes | no model ever involved |

### What makes a memo trustworthy

A memory that replays the wrong thing is worse than none, so everything is filtered on the way in:

- **Only verified successes** become recipes (the agent explicitly chose done, or was ≥ 0.9 sure). A run
  that merely ran out of ideas teaches nothing.
- **Only stable targets** are memorized: named controls (buttons, links, tabs, fields…). Chat bubbles,
  timestamps, field values, live counts ("1 Reply"), and long descriptions are rejected.
- **Volatile goals aren't replayed** — messaging/sending, where the recipient and content differ each time.
- **Page-relative requests are never cached** — "the second video" is resolved fresh every time.
- **Replays are checked live** — a memo is used only if Jev says the request matches *and* the element is on
  screen now. If a step can't be resolved (the UI changed), the agent takes over from that point and re-learns.

### Templates, not transcripts

Recipes generalize. Text you typed is stored as a slot tied to the words of the goal, so a recipe learned for
"search discord for **cats**" replays "search discord for **dogs**" by reading the new value off the new goal.
The same applies to targets you named: "open my **cs 343** notes" → clicks the **CS 341** row when you say it.

### Learning from demonstration (`jevme/watch.py`)

When the agent fails, the pill says *"show me, I'll learn it"* and jevme watches you do it by hand — the
cleanest possible training pair (exact goal → exact steps, no model guessing). It records the **role and label**
of each control you click, menu paths ("View > Zoom In"), and named keys/shortcuts. It **never records what you
type**: a field's text is kept only if it's words you just spoke in the command; otherwise the demonstration is
discarded. Password fields are never read. Recording ends after 7 s of inactivity, when you speak the next
command, or on "stop" (which discards it).

---

## Model optimization

Each decision goes to the cheapest thing that can make it correctly.

| Job | Model | Why | Typical latency |
|---|---|---|---|
| Routing every partial, arg extraction, span selection | **Jev** (TypeSafe System One) | calibrated probabilities for typed Choice / yes-no questions; many questions batched in one request | 150–400 ms |
| Next agent step, element picks, memo matching | **Jev** | same — picking among listed options is classification, not generation | ~200 ms |
| "Where do I click?" when the tree is blind | **Claude Haiku 4.5** + screenshot | fast, cheap vision; used only as a fallback | ~1.5 s (first call ~6 s) |
| Writing code, replies, summaries; writing new tools | **Claude Opus 5** | real reasoning over page content; called once per request | 5–20 s |

Techniques that keep it fast and cheap:

- **Memoize every model result into a Jev case** (above) — the expensive path runs once per distinct thing.
- **Batch questions.** Intent, every enum arg, and the text span are one Jev request, not a chain.
- **Speculative args.** Args for every tool are asked alongside the intent, so a commit needs no second call.
- **Accessibility tree before pixels.** Reading controls takes 20–250 ms and costs nothing; a screenshot + vision
  call is the exception.
- **Structured outputs for vision.** Haiku replies against a strict JSON schema (`output_config.format`), so
  there's no text repair and no slow retry path.
- **Deterministic rules before any model** — app inference, site-name snapping ("leetcod.com" → leetcode.com),
  incomplete-phrase detection, and safety policy are plain code.
- **Stream, don't wait.** Acting on completed clauses mid-sentence hides most latency behind your own speech.
- **Warm apps ahead of time.** Chromium/Electron accessibility is switched on when an app comes to the front,
  so its tree is ready before you speak.

Models are configurable: `JEVME_VISION_MODEL`, `JEVME_CODEGEN_MODEL` (see `.env.example`).

---

## Safety

- **Nothing consequential without asking.** The agent and vision won't click Submit, Send, Post, Buy/Pay,
  Delete or Sign out unless your words ask for it. Learned tools that delete, send, pay, or change settings
  wait for a spoken "yes" — every time they run.
- **Generated scripts are gated** by a hard policy, a compile check, and a Jev review, and re-checked on load.
  Spoken values are passed to scripts as data (environment variables / escaped literals), never spliced in as code.
- **Keystroke rate guard** caps synthetic key presses so a runaway loop can't flood the machine.
- **Everything is local** except the API calls themselves. Delete `~/.config/jevme/` to forget everything learned.

## Configuration

All optional, via `.env` or environment: `JEVME_COMMIT_CONFIDENCE` (0.80), `JEVME_STABLE_PARTIALS` (2),
`JEVME_TEXT_PAUSE_S` (0.65), `JEVME_LOCALE` (en-US), `JEVME_SCREEN_VOCAB` (1), `JEVME_VISION_MODEL`, `JEVME_CODEGEN_MODEL`, `JEVME_LOG`.

## Project layout

```
jevme/
  main.py        menu-bar app, pill, ordered task queue, wiring
  speech.py      Apple streaming speech + vocabulary biasing
  router.py      DECIDE: partials → Jev → commit / stream / hand off
  tools.py       built-in shortcut catalog
  agent.py       general agent loop, recipes, replay, compose
  ax.py          accessibility snapshots, clicking, menus
  see.py         "click the X": recall → ordinal → Jev pick → vision
  vision.py      Haiku screenshot fallback (structured outputs)
  ui_memory.py   UI cases + task recipes, with poisoning filters
  watch.py       learning from demonstration
  generator.py   Opus writes new tools; learned.py stores/renders them; policy.py gates them
  jev.py         minimal TypeSafe Jev client
  evalrun.py     routing eval · replay.py  microphone-free replay harness
tests/           unit tests (pytest)
```

## Contributing

Bug reports with a log snippet are the most useful thing you can send. See [CONTRIBUTING.md](CONTRIBUTING.md)
for setup, how to reproduce without a mic, and good first contributions.

## License

MIT — see [LICENSE](LICENSE).
历史前置条件说明(补充参考)

macOS 14+(Apple Silicon 或 Intel);uv(README 提供安装命令,会安装 Python 3.12);TypeSafe API Key(必需,typesafe.ai);Anthropic API Key(推荐,未提供时回退到已登录的 claude CLI);系统需授予麦克风、语音识别、辅助功能、屏幕录制权限;依赖境外 API 服务,网络可达性与费用待核验;模型可选值待核验。

项目来源与清单版权许可

https://github.com/danielyedaniel/jevme

整理来源:https://github.com/slavakurilyak/awesome-ai-agents

清单版权与许可:

MIT License

Copyright (c) 2024 Slava Kurilyak

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.