@4via6/relay 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -48
- package/dist/auth.d.ts +1 -0
- package/dist/auth.js +6 -3
- package/dist/auth.js.map +1 -1
- package/dist/bot.js +2 -1
- package/dist/bot.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +110 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/admin.js +134 -29
- package/dist/commands/admin.js.map +1 -1
- package/dist/commands/media.js +10 -7
- package/dist/commands/media.js.map +1 -1
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.js +16 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +11 -0
- package/dist/config/loader.js +161 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +32 -0
- package/dist/config/schema.js +32 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/setup.d.ts +3 -0
- package/dist/config/setup.js +142 -0
- package/dist/config/setup.js.map +1 -0
- package/dist/daemon.d.ts +5 -0
- package/dist/daemon.js +215 -0
- package/dist/daemon.js.map +1 -0
- package/dist/index.js +33 -29
- package/dist/index.js.map +1 -1
- package/dist/providers/claude.js +35 -33
- package/dist/providers/claude.js.map +1 -1
- package/dist/providers/codex.js +33 -31
- package/dist/providers/codex.js.map +1 -1
- package/dist/providers/index.js +2 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/opencode.js +8 -5
- package/dist/providers/opencode.js.map +1 -1
- package/dist/session.js +3 -2
- package/dist/session.js.map +1 -1
- package/dist/update.d.ts +1 -0
- package/dist/update.js +132 -0
- package/dist/update.js.map +1 -0
- package/dist/utils/files.js +2 -1
- package/dist/utils/files.js.map +1 -1
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.js +15 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/store.js +1 -0
- package/dist/utils/store.js.map +1 -1
- package/dist/utils/stream.js +6 -3
- package/dist/utils/stream.js.map +1 -1
- package/dist/utils/stt.js +27 -16
- package/dist/utils/stt.js.map +1 -1
- package/dist/utils/system-prompt.js +16 -5
- package/dist/utils/system-prompt.js.map +1 -1
- package/dist/utils/timeout.js +2 -3
- package/dist/utils/timeout.js.map +1 -1
- package/docs/commands.md +7 -15
- package/docs/configuration.md +122 -108
- package/docs/features.md +70 -36
- package/docs/getting-started.md +75 -30
- package/docs/providers.md +18 -32
- package/docs/troubleshooting.md +126 -75
- package/package.json +4 -3
- package/.env.example +0 -50
package/dist/utils/stt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stt.js","sourceRoot":"","sources":["../../src/utils/stt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stt.js","sourceRoot":"","sources":["../../src/utils/stt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFileSync, existsSync, watchFile, unwatchFile } from "fs";
|
|
2
|
-
import { resolve } from "path";
|
|
2
|
+
import { resolve, join } from "path";
|
|
3
|
+
import { getConfig } from "../config/index.js";
|
|
3
4
|
const DEFAULT_SYSTEM_PROMPT = `You are a coding assistant accessed through a Telegram bot. Your responses are delivered as Telegram messages, so keep them concise and under 4000 characters when possible — use Markdown formatting (bold, inline code, code blocks) for readability. Focus on actionable, practical answers: provide code, commands, or direct solutions rather than lengthy explanations. Messages may originate from voice transcriptions, so interpret the user's intent generously even if the wording is imprecise or contains transcription artifacts.`;
|
|
4
5
|
let cachedPrompt = null;
|
|
5
6
|
let watchedPath = null;
|
|
@@ -56,9 +57,19 @@ export function unwatchSystemPrompt() {
|
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
59
|
function resolvePromptPath() {
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
const config = getConfig();
|
|
61
|
+
// 1. Explicit path from config
|
|
62
|
+
if (config.systemPromptFile)
|
|
63
|
+
return resolve(config.systemPromptFile);
|
|
64
|
+
// 2. .relay/SKILL.md
|
|
65
|
+
const relaySkill = join(config.dataDir || ".relay", "SKILL.md");
|
|
66
|
+
if (existsSync(relaySkill))
|
|
67
|
+
return resolve(relaySkill);
|
|
68
|
+
// 3. ./SKILL.md in cwd (backward compat)
|
|
69
|
+
const cwdSkill = resolve("SKILL.md");
|
|
70
|
+
if (existsSync(cwdSkill))
|
|
71
|
+
return cwdSkill;
|
|
72
|
+
// 4. Return the .relay/SKILL.md path anyway (for watch setup)
|
|
73
|
+
return resolve(relaySkill);
|
|
63
74
|
}
|
|
64
75
|
//# sourceMappingURL=system-prompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/utils/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/utils/system-prompt.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/timeout.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import { getConfig } from "../config/index.js";
|
|
2
2
|
export function getPromptTimeout() {
|
|
3
|
-
|
|
4
|
-
return env ? Number(env) : DEFAULT_PROMPT_TIMEOUT;
|
|
3
|
+
return getConfig().promptTimeoutMs;
|
|
5
4
|
}
|
|
6
5
|
export async function withTimeout(promise, ms, label = "Operation") {
|
|
7
6
|
let timer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../src/utils/timeout.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../src/utils/timeout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,UAAU,gBAAgB;IAC9B,OAAO,SAAS,EAAE,CAAC,eAAe,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAmB,EACnB,EAAU,EACV,QAAgB,WAAW;IAE3B,IAAI,KAAoC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC/C,KAAK,GAAG,UAAU,CAChB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAC7E,EAAE,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAChD,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAM,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
package/docs/commands.md
CHANGED
|
@@ -202,27 +202,19 @@ List all available OpenCode commands that can be used with `/cmd`.
|
|
|
202
202
|
|
|
203
203
|
### `/models`
|
|
204
204
|
|
|
205
|
-
List all available models
|
|
205
|
+
List all available models with an interactive inline keyboard. Tap a model button to select it instantly.
|
|
206
|
+
|
|
207
|
+
Each model shows capability badges:
|
|
206
208
|
|
|
207
209
|
- `[reasoning]` -- The model supports extended thinking/reasoning
|
|
208
210
|
- `[vision]` -- The model accepts image input
|
|
209
|
-
-
|
|
210
|
-
|
|
211
|
-
Example output:
|
|
211
|
+
- `✓` prefix -- Currently selected model
|
|
212
212
|
|
|
213
|
-
|
|
214
|
-
Available Models
|
|
215
|
-
|
|
216
|
-
anthropic
|
|
217
|
-
claude-sonnet-4-20250514 [reasoning] [active]
|
|
218
|
-
claude-opus-4-20250514 [reasoning]
|
|
219
|
-
claude-haiku-4-20250514
|
|
213
|
+
Models are grouped by provider with header rows. If there are more than 8 models, pagination buttons (`« Prev` / `Next »`) appear at the bottom.
|
|
220
214
|
|
|
221
|
-
|
|
222
|
-
deepseek/deepseek-r1 [reasoning]
|
|
223
|
-
```
|
|
215
|
+
Tapping a model button switches to that model immediately and shows a confirmation with capabilities.
|
|
224
216
|
|
|
225
|
-
All providers fetch models dynamically from their respective APIs.
|
|
217
|
+
All providers fetch models dynamically from their respective APIs. If the provider API key is not set, no models are listed.
|
|
226
218
|
|
|
227
219
|
### `/model [provider/model]`
|
|
228
220
|
|
package/docs/configuration.md
CHANGED
|
@@ -1,88 +1,108 @@
|
|
|
1
1
|
# Configuration Reference
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Relay uses a JSON config file at `.relay/config.json`. Run `relay onboard` for the interactive wizard, or pass settings via CLI flags.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Setup
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
```bash
|
|
8
|
+
relay onboard # Interactive wizard
|
|
9
|
+
relay --bot-token=xxx --allowed-user-id=123 --provider=opencode # CLI flags
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Config resolution order: **CLI flags > config file > defaults**.
|
|
13
|
+
|
|
14
|
+
## Subcommands
|
|
15
|
+
|
|
16
|
+
| Command | Description |
|
|
17
|
+
|---------|-------------|
|
|
18
|
+
| `relay onboard` | Interactive configuration wizard |
|
|
19
|
+
| `relay start` | Start the bot as a background daemon |
|
|
20
|
+
| `relay stop` | Stop the background daemon |
|
|
21
|
+
| `relay restart` | Restart the background daemon |
|
|
22
|
+
| `relay logs` | Tail daemon logs (Ctrl+C to exit) |
|
|
23
|
+
| `relay status` | Show daemon status (PID, uptime, memory) |
|
|
24
|
+
| `relay update` | Update Relay to the latest version |
|
|
25
|
+
|
|
26
|
+
## CLI Flags
|
|
27
|
+
|
|
28
|
+
| Flag | Description |
|
|
29
|
+
|------|-------------|
|
|
30
|
+
| `--help`, `-h` | Show help |
|
|
31
|
+
| `--version`, `-v` | Show version |
|
|
32
|
+
| `--bot-token` | Telegram bot token |
|
|
33
|
+
| `--allowed-user-id` | Telegram user ID |
|
|
34
|
+
| `--provider` | Provider: `opencode`, `claude`, `codex` |
|
|
35
|
+
| `--bot-mode` | `polling` or `webhook` |
|
|
36
|
+
| `--webhook-url` | Webhook URL (when `--bot-mode=webhook`) |
|
|
37
|
+
| `--webhook-port` | Webhook port (default: 3000) |
|
|
38
|
+
| `--webhook-secret` | Webhook secret token |
|
|
39
|
+
| `--streaming-enabled` | `true` or `false` |
|
|
40
|
+
| `--stream-edit-interval-ms` | Stream edit interval in ms |
|
|
41
|
+
| `--prompt-timeout-ms` | Prompt timeout in ms |
|
|
42
|
+
| `--log-level` | `debug`, `info`, `warn`, `error` |
|
|
43
|
+
| `--data-dir` | Data directory (default: `.relay/`) |
|
|
44
|
+
| `--system-prompt-file` | Custom system prompt file path |
|
|
45
|
+
|
|
46
|
+
## Core Settings
|
|
47
|
+
|
|
48
|
+
| Config field | CLI flag | Default | Description |
|
|
49
|
+
|-------------|----------|---------|-------------|
|
|
50
|
+
| `botToken` | `--bot-token` | -- | Telegram bot token from [@BotFather](https://t.me/BotFather) |
|
|
51
|
+
| `allowedUserId` | `--allowed-user-id` | -- | Your Telegram user ID |
|
|
52
|
+
| `provider` | `--provider` | `opencode` | Coding agent: `opencode`, `claude`, or `codex` |
|
|
12
53
|
|
|
13
54
|
## Provider Configuration
|
|
14
55
|
|
|
15
|
-
Each provider has its own
|
|
56
|
+
Each provider has its own settings. Provider API keys (like `ANTHROPIC_API_KEY`) are configured in your coding agent's environment, not in Relay.
|
|
57
|
+
|
|
58
|
+
See [Providers](providers.md) for detailed setup.
|
|
16
59
|
|
|
17
60
|
### OpenCode
|
|
18
61
|
|
|
19
|
-
|
|
|
20
|
-
|
|
21
|
-
| `
|
|
22
|
-
| `
|
|
23
|
-
| `
|
|
24
|
-
| `
|
|
25
|
-
| `
|
|
62
|
+
| Config field | CLI flag | Default | Description |
|
|
63
|
+
|-------------|----------|---------|-------------|
|
|
64
|
+
| `opencodeMode` | `--opencode-mode` | `start` | `start` spawns a local server, `connect` connects to a remote URL |
|
|
65
|
+
| `opencodeUrl` | `--opencode-url` | `http://localhost:4096` | Server URL (used when mode=`connect`) |
|
|
66
|
+
| `opencodeHostname` | `--opencode-hostname` | `127.0.0.1` | Bind address (used when mode=`start`) |
|
|
67
|
+
| `opencodePort` | `--opencode-port` | `4096` | Port number (used when mode=`start`) |
|
|
68
|
+
| `opencodeModel` | `--opencode-model` | Server default | Model override, e.g. `anthropic/claude-sonnet-4-20250514` |
|
|
26
69
|
|
|
27
70
|
### Claude Code
|
|
28
71
|
|
|
29
|
-
|
|
|
30
|
-
|
|
31
|
-
| `
|
|
32
|
-
| `
|
|
33
|
-
| `
|
|
34
|
-
| `CLAUDE_CWD` | No | Current directory | Working directory for Claude |
|
|
72
|
+
| Config field | CLI flag | Default | Description |
|
|
73
|
+
|-------------|----------|---------|-------------|
|
|
74
|
+
| `claudeModel` | `--claude-model` | `sonnet` | Model name or ID |
|
|
75
|
+
| `claudePermissionMode` | `--claude-permission-mode` | `acceptEdits` | How Claude handles file edits |
|
|
76
|
+
| `claudeCwd` | `--claude-cwd` | Current directory | Working directory |
|
|
35
77
|
|
|
36
78
|
### OpenAI Codex
|
|
37
79
|
|
|
38
|
-
|
|
|
39
|
-
|
|
40
|
-
| `
|
|
41
|
-
| `
|
|
42
|
-
| `CODEX_CWD` | No | Current directory | Working directory for Codex |
|
|
80
|
+
| Config field | CLI flag | Default | Description |
|
|
81
|
+
|-------------|----------|---------|-------------|
|
|
82
|
+
| `codexModel` | `--codex-model` | `o3` | Model name or ID |
|
|
83
|
+
| `codexCwd` | `--codex-cwd` | Current directory | Working directory |
|
|
43
84
|
|
|
44
85
|
## Bot Mode
|
|
45
86
|
|
|
46
|
-
|
|
|
47
|
-
|
|
48
|
-
| `
|
|
49
|
-
| `
|
|
50
|
-
| `
|
|
51
|
-
| `
|
|
52
|
-
|
|
53
|
-
### Long Polling (default)
|
|
54
|
-
|
|
55
|
-
The bot connects to Telegram and pulls updates. Simple to set up, works behind NATs/firewalls.
|
|
56
|
-
|
|
57
|
-
```env
|
|
58
|
-
BOT_MODE=polling
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### Webhook Mode
|
|
62
|
-
|
|
63
|
-
The bot runs an HTTP server and Telegram pushes updates to it. Lower latency and better for production deployments.
|
|
64
|
-
|
|
65
|
-
```env
|
|
66
|
-
BOT_MODE=webhook
|
|
67
|
-
WEBHOOK_URL=https://your-server.com/bot
|
|
68
|
-
WEBHOOK_PORT=3000
|
|
69
|
-
WEBHOOK_SECRET=your-random-secret
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
Requirements:
|
|
73
|
-
- A public HTTPS URL that Telegram can reach
|
|
74
|
-
- The port must be accessible (default: 3000)
|
|
87
|
+
| Config field | CLI flag | Default | Description |
|
|
88
|
+
|-------------|----------|---------|-------------|
|
|
89
|
+
| `botMode` | `--bot-mode` | `polling` | `polling` or `webhook` |
|
|
90
|
+
| `webhookUrl` | `--webhook-url` | -- | Public URL for webhook (required when mode=`webhook`) |
|
|
91
|
+
| `webhookPort` | `--webhook-port` | `3000` | Webhook HTTP server port |
|
|
92
|
+
| `webhookSecret` | `--webhook-secret` | -- | Secret token for webhook verification |
|
|
75
93
|
|
|
76
94
|
## Data Persistence
|
|
77
95
|
|
|
78
|
-
|
|
|
79
|
-
|
|
80
|
-
| `
|
|
96
|
+
| Config field | CLI flag | Default | Description |
|
|
97
|
+
|-------------|----------|---------|-------------|
|
|
98
|
+
| `dataDir` | `--data-dir` | `.relay/` | Directory for persisted bot state |
|
|
81
99
|
|
|
82
|
-
Relay persists session state, model selection, and provider-specific data to disk so they survive restarts. The `.relay/` directory is created automatically
|
|
100
|
+
Relay persists session state, model selection, and provider-specific data to disk so they survive restarts. The `.relay/` directory is created automatically.
|
|
83
101
|
|
|
84
102
|
Files stored:
|
|
103
|
+
- `config.json` — Your configuration (0600 permissions)
|
|
85
104
|
- `session.json` — Active session ID and selected model
|
|
105
|
+
- `SKILL.md` — Custom system prompt (optional, create manually)
|
|
86
106
|
- `claude-mcp.json` — Claude provider MCP server configurations
|
|
87
107
|
- `codex-threads.json` — Codex provider thread ID mappings
|
|
88
108
|
|
|
@@ -90,71 +110,65 @@ The directory is excluded from git via `.gitignore`.
|
|
|
90
110
|
|
|
91
111
|
## Streaming
|
|
92
112
|
|
|
93
|
-
|
|
|
94
|
-
|
|
95
|
-
| `
|
|
96
|
-
| `
|
|
97
|
-
|
|
98
|
-
When streaming is enabled, the bot sends a "Thinking..." placeholder and progressively updates it as the AI generates its response. This works with all three providers.
|
|
113
|
+
| Config field | CLI flag | Default | Description |
|
|
114
|
+
|-------------|----------|---------|-------------|
|
|
115
|
+
| `streamingEnabled` | `--streaming-enabled` | `false` | Enable progressive message editing |
|
|
116
|
+
| `streamEditIntervalMs` | `--stream-edit-interval-ms` | `2000` | Update interval (ms) while streaming |
|
|
99
117
|
|
|
100
118
|
## Timeout
|
|
101
119
|
|
|
102
|
-
|
|
|
103
|
-
|
|
104
|
-
| `
|
|
120
|
+
| Config field | CLI flag | Default | Description |
|
|
121
|
+
|-------------|----------|---------|-------------|
|
|
122
|
+
| `promptTimeoutMs` | `--prompt-timeout-ms` | `300000` | Max wait time for provider response (5 min) |
|
|
105
123
|
|
|
106
|
-
|
|
124
|
+
## Logging
|
|
107
125
|
|
|
108
|
-
|
|
126
|
+
| Config field | CLI flag | Default | Description |
|
|
127
|
+
|-------------|----------|---------|-------------|
|
|
128
|
+
| `logLevel` | `--log-level` | `info` | Log level: `debug`, `info`, `warn`, `error` |
|
|
109
129
|
|
|
110
|
-
|
|
111
|
-
|----------|---------|-------------|
|
|
112
|
-
| `SYSTEM_PROMPT_FILE` | `skill.md` | Path to your custom system prompt file |
|
|
130
|
+
Relay uses structured JSON logging via pino. Set to `debug` for verbose output when troubleshooting.
|
|
113
131
|
|
|
114
|
-
|
|
132
|
+
## System Prompt
|
|
133
|
+
|
|
134
|
+
| Config field | CLI flag | Default | Description |
|
|
135
|
+
|-------------|----------|---------|-------------|
|
|
136
|
+
| `systemPromptFile` | `--system-prompt-file` | -- | Path to custom system prompt file |
|
|
115
137
|
|
|
116
|
-
The
|
|
138
|
+
The bot looks for a system prompt in this order:
|
|
139
|
+
1. Explicit path from `systemPromptFile` config
|
|
140
|
+
2. `.relay/SKILL.md` if it exists
|
|
141
|
+
3. `./SKILL.md` in the current directory (backward compatibility)
|
|
142
|
+
4. Built-in default prompt
|
|
117
143
|
|
|
118
|
-
|
|
144
|
+
The file is watched for changes and reloaded automatically. Use `/system reload` to force a reload.
|
|
119
145
|
|
|
120
146
|
## Voice / Speech-to-Text
|
|
121
147
|
|
|
122
|
-
|
|
|
123
|
-
|
|
124
|
-
| `
|
|
125
|
-
| `
|
|
126
|
-
| `
|
|
127
|
-
| `
|
|
128
|
-
| `
|
|
129
|
-
| `
|
|
148
|
+
| Config field | CLI flag | Default | Description |
|
|
149
|
+
|-------------|----------|---------|-------------|
|
|
150
|
+
| `sttProvider` | `--stt-provider` | `auto` | STT provider: `groq`, `openai`, `assemblyai`, or `auto` |
|
|
151
|
+
| `groqApiKey` | `--groq-api-key` | -- | Groq API key for Whisper |
|
|
152
|
+
| `openaiSttApiKey` | `--openai-stt-api-key` | -- | OpenAI API key for speech-to-text |
|
|
153
|
+
| `assemblyaiApiKey` | `--assemblyai-api-key` | -- | AssemblyAI API key |
|
|
154
|
+
| `groqSttModel` | -- | `whisper-large-v3-turbo` | Groq transcription model |
|
|
155
|
+
| `openaiSttModel` | -- | `gpt-4o-mini-transcribe` | OpenAI transcription model |
|
|
130
156
|
|
|
131
|
-
Set at least one API key to enable voice message support. When `
|
|
157
|
+
Set at least one API key during `relay onboard` to enable voice message support. When `sttProvider` is `auto` (default), the cheapest available provider is selected:
|
|
132
158
|
|
|
133
159
|
1. **Groq** (fastest, has a free tier)
|
|
134
160
|
2. **AssemblyAI**
|
|
135
161
|
3. **OpenAI**
|
|
136
162
|
|
|
137
|
-
## Example
|
|
138
|
-
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
# Bot mode (polling or webhook)
|
|
149
|
-
BOT_MODE=polling
|
|
150
|
-
|
|
151
|
-
# Streaming
|
|
152
|
-
STREAMING_ENABLED=true
|
|
153
|
-
STREAM_EDIT_INTERVAL_MS=2000
|
|
154
|
-
|
|
155
|
-
# Timeout
|
|
156
|
-
PROMPT_TIMEOUT_MS=300000
|
|
157
|
-
|
|
158
|
-
# Voice (set at least one for voice support)
|
|
159
|
-
GROQ_API_KEY=gsk_...
|
|
163
|
+
## Example Config
|
|
164
|
+
|
|
165
|
+
```json
|
|
166
|
+
{
|
|
167
|
+
"botToken": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
|
|
168
|
+
"allowedUserId": 987654321,
|
|
169
|
+
"provider": "opencode",
|
|
170
|
+
"streamingEnabled": true,
|
|
171
|
+
"logLevel": "info",
|
|
172
|
+
"groqApiKey": "gsk_..."
|
|
173
|
+
}
|
|
160
174
|
```
|
package/docs/features.md
CHANGED
|
@@ -24,13 +24,21 @@ Relay streams AI responses in real time. As the AI generates text, the Telegram
|
|
|
24
24
|
|
|
25
25
|
### Configuration
|
|
26
26
|
|
|
27
|
-
Streaming is
|
|
27
|
+
Streaming is configured during `relay onboard`, or via CLI flag:
|
|
28
28
|
|
|
29
|
-
```
|
|
30
|
-
|
|
29
|
+
```bash
|
|
30
|
+
relay --streaming-enabled=true
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
Or set it in `.relay/config.json`:
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"streamingEnabled": true
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
When disabled (default), the bot waits for the complete response before sending a single message.
|
|
34
42
|
|
|
35
43
|
---
|
|
36
44
|
|
|
@@ -68,12 +76,14 @@ Send voice notes to the bot and they'll be transcribed and processed as text inp
|
|
|
68
76
|
|
|
69
77
|
### Setup
|
|
70
78
|
|
|
71
|
-
Configure at least one speech-to-text provider
|
|
79
|
+
Configure at least one speech-to-text provider during `relay onboard`, or set keys in `.relay/config.json`:
|
|
72
80
|
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"groqApiKey": "gsk_...",
|
|
84
|
+
"openaiSttApiKey": "sk-...",
|
|
85
|
+
"assemblyaiApiKey": "..."
|
|
86
|
+
}
|
|
77
87
|
```
|
|
78
88
|
|
|
79
89
|
If multiple providers are configured, the cheapest available one is selected automatically.
|
|
@@ -194,25 +204,17 @@ Relay supports switching between AI models at runtime.
|
|
|
194
204
|
|
|
195
205
|
### Listing available models
|
|
196
206
|
|
|
197
|
-
Use `/models` to see all
|
|
207
|
+
Use `/models` to see all available models as an interactive inline keyboard. Models are grouped by provider, with capability badges shown next to each name. The currently active model is marked with a `✓` prefix.
|
|
198
208
|
|
|
199
|
-
|
|
200
|
-
Available Models
|
|
209
|
+
Tap any model button to switch to it instantly — no need to type a command.
|
|
201
210
|
|
|
202
|
-
|
|
203
|
-
claude-sonnet-4-20250514 [reasoning] [active]
|
|
204
|
-
claude-opus-4-20250514 [reasoning]
|
|
205
|
-
claude-haiku-4-20250514
|
|
206
|
-
|
|
207
|
-
openrouter
|
|
208
|
-
deepseek/deepseek-r1 [reasoning]
|
|
209
|
-
```
|
|
211
|
+
If there are more than 8 models, pagination buttons (`« Prev` / `Next »`) appear at the bottom.
|
|
210
212
|
|
|
211
213
|
### Capability badges
|
|
212
214
|
|
|
213
215
|
- `[reasoning]` — The model supports extended thinking/reasoning
|
|
214
216
|
- `[vision]` — The model accepts image input
|
|
215
|
-
-
|
|
217
|
+
- `✓` prefix — Currently selected model
|
|
216
218
|
|
|
217
219
|
### Switching models
|
|
218
220
|
|
|
@@ -236,8 +238,10 @@ Capabilities: reasoning, vision
|
|
|
236
238
|
### Provider behavior
|
|
237
239
|
|
|
238
240
|
- **OpenCode**: Lists all models from all configured providers dynamically
|
|
239
|
-
- **Claude**: Fetches available models dynamically from the Anthropic API
|
|
240
|
-
- **Codex**: Fetches available models dynamically from the OpenAI API
|
|
241
|
+
- **Claude**: Fetches available models dynamically from the Anthropic API — requires `ANTHROPIC_API_KEY` in the environment
|
|
242
|
+
- **Codex**: Fetches available models dynamically from the OpenAI API — requires `CODEX_API_KEY` or `OPENAI_API_KEY` in the environment
|
|
243
|
+
|
|
244
|
+
If the provider API key is not set or the API call fails, no models are listed.
|
|
241
245
|
|
|
242
246
|
---
|
|
243
247
|
|
|
@@ -247,14 +251,26 @@ Customize the AI's behavior with a system prompt file.
|
|
|
247
251
|
|
|
248
252
|
### Default behavior
|
|
249
253
|
|
|
250
|
-
The bot
|
|
254
|
+
The bot looks for a system prompt in this order:
|
|
255
|
+
1. Explicit path from `systemPromptFile` in config
|
|
256
|
+
2. `.relay/SKILL.md` if it exists
|
|
257
|
+
3. `./SKILL.md` in the current directory (backward compatibility)
|
|
258
|
+
4. Built-in default prompt
|
|
251
259
|
|
|
252
260
|
### Custom prompt file
|
|
253
261
|
|
|
254
|
-
Set a custom path
|
|
262
|
+
Set a custom path in `.relay/config.json`:
|
|
255
263
|
|
|
256
|
-
```
|
|
257
|
-
|
|
264
|
+
```json
|
|
265
|
+
{
|
|
266
|
+
"systemPromptFile": "prompts/my-prompt.md"
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
Or via CLI flag:
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
relay --system-prompt-file=prompts/my-prompt.md
|
|
258
274
|
```
|
|
259
275
|
|
|
260
276
|
### Hot reload
|
|
@@ -397,10 +413,18 @@ Relay automatically persists critical state to disk so it survives bot restarts
|
|
|
397
413
|
|
|
398
414
|
### Configuration
|
|
399
415
|
|
|
400
|
-
Override the data directory
|
|
416
|
+
Override the data directory in `.relay/config.json`:
|
|
417
|
+
|
|
418
|
+
```json
|
|
419
|
+
{
|
|
420
|
+
"dataDir": "/path/to/custom/data"
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
Or via CLI flag:
|
|
401
425
|
|
|
402
|
-
```
|
|
403
|
-
|
|
426
|
+
```bash
|
|
427
|
+
relay --data-dir=/path/to/custom/data
|
|
404
428
|
```
|
|
405
429
|
|
|
406
430
|
Default: `.relay/` in the project root.
|
|
@@ -413,11 +437,21 @@ For production deployments, you can run Relay in webhook mode instead of long-po
|
|
|
413
437
|
|
|
414
438
|
### Setup
|
|
415
439
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
440
|
+
Configure webhook mode during `relay onboard`, or set it in `.relay/config.json`:
|
|
441
|
+
|
|
442
|
+
```json
|
|
443
|
+
{
|
|
444
|
+
"botMode": "webhook",
|
|
445
|
+
"webhookUrl": "https://your-server.com/bot",
|
|
446
|
+
"webhookPort": 3000,
|
|
447
|
+
"webhookSecret": "your-random-secret"
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
Or via CLI flags:
|
|
452
|
+
|
|
453
|
+
```bash
|
|
454
|
+
relay --bot-mode=webhook --webhook-url=https://your-server.com/bot --webhook-port=3000
|
|
421
455
|
```
|
|
422
456
|
|
|
423
457
|
### Requirements
|
|
@@ -434,7 +468,7 @@ WEBHOOK_SECRET=your-random-secret
|
|
|
434
468
|
|
|
435
469
|
### Switching back to polling
|
|
436
470
|
|
|
437
|
-
Set `
|
|
471
|
+
Set `botMode` to `polling` in your config (or remove it — polling is the default). The bot will clear any stale webhook before starting long-polling.
|
|
438
472
|
|
|
439
473
|
### Benefits over polling
|
|
440
474
|
|