尚未检测到更新。GitHub 发布版本后会显示在这里。
Let your AI agents call your iPhone, and talk back. Message calls and full duplex live calls. On-device speech, MCP, self-hosted backend.
翻译准备中
正在加载完整 README。
查看完整 README ↗Let your AI agents call your iPhone, and talk back. When an agent finds an outage or needs a decision, your phone rings like a real call. It reads the message aloud, or you talk it through with the agent in a full duplex voice call.
Download on the App Store · Website
Two kinds of calls:
"live": true. Your agent answers the voice agent's questions during the call, over MCP tools or webhooks. See Live calls.Live calls use minutes from a subscription in the app (Settings → Live Calls). When the minutes run out, the app shows the plans, and an agent that tries to start a live call is told where you can subscribe.
The iPhone app is on the App Store. You can also build it from source.
ios/: SwiftUI app (iOS 17+) with CallKit, PushKit and on-device speech.relay/: Bun server and website for accounts, agents, calls, VoIP push, chat proxy and MCP.plugins/herb/: plugin for Codex, Claude Code and Grok Bot.Sign up on the website or in the app. An account is a key, with no email or password. If you lose the key, create a new account. One account can have several phones, and every phone rings.
Full documentation: herb.grosst.cc/docs, also as llms.txt and llms-full.txt for language models.
Add https://herb.grosst.cc/mcp to ChatGPT, Claude, Grok Bot or any MCP client. It opens a sign-in page where you enter your key and tap Connect. See the plugin guide.
Over HTTP, with an API token from the website or app:
# Just ring
curl -X POST https://herb.grosst.cc/v1/call -H "Authorization: Bearer $TOKEN"
# Ring and speak
curl https://herb.grosst.cc/v1/call \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"text":"Production is down. The payments API has been failing for five minutes.","language":"en","title":"Production down","idempotency_key":"incident-2291"}'
Instead of text you can send audio_base64 and audio_mime (mp3, m4a, aac or wav, up to 10 MB). Status: GET /v1/calls/<id>.
Statuses: ringing, answered, played, ended, declined, missed, failed. played means the message finished playing, not that it was heard. ended is for live calls.
Limits: 6 calls per minute per agent, 200 calls per day per account, 50 agents per account. Uploaded audio is kept for a day, call history for 30 days.
Supertonic 3 runs on the phone: voice Lily (F2), 8 steps, speed 1.2. The app downloads it (about 380 MB) in Settings, so the app itself stays small; until then the iOS voice reads messages. Text is split into phrases. The first is generated while the phone rings, the rest during playback. If the model fails or takes over 10 seconds, the iOS voice reads the text.
The server accepts any text. Agents add stress marks (U+0301) for Russian and Ukrainian, because the voice mispronounces words without them. Without language the phone detects the language.
Open ios/Herb.xcodeproj, set your team and bundle ID, then run on an iPhone.
Herb is fully self-hostable. The backend is one Bun process with a SQLite file, and it also serves the website.
cd relay
bun install
cp .env.example .env
bun run start
Put it behind HTTPS and set HERB_PUBLIC_URL. On the app's sign-in screen, enter your address under Server. The website is served from the same address. Without APNS_* calls ring only while the app is open. relay/deploy/ has systemd and nginx templates.
Chat connects to your own services, so it is set up on the server only:
bun run cli agents <account-key>
bun run cli chat <agent-id> --chat-url http://127.0.0.1:8642/v1 --chat-model hermes-agent --chat-key-env HERMES_API_KEY
cd relay && bun test && bun run check