@huynle/hub 0.11.0 → 0.11.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/CHANGELOG.md +26 -0
- package/README.md +19 -5
- package/package.json +1 -1
- package/packages/claude-code/package.json +1 -1
- package/packages/claude-code/src/sessions.ts +4 -1
- package/packages/cli/dist/hub-cli.js +240 -83
- package/packages/cli/package.json +1 -1
- package/packages/cli/src/cli.ts +12 -7
- package/packages/cli/src/decisions.ts +52 -4
- package/packages/cli/src/format.ts +9 -0
- package/packages/cli/src/mcp.ts +20 -4
- package/packages/cli/src/team-intake-mcp.ts +2 -1
- package/packages/cli/src/teams-mcp.ts +7 -3
- package/packages/codex/package.json +1 -1
- package/packages/codex/src/sessions.ts +14 -3
- package/packages/node/package.json +1 -1
- package/packages/preset/package.json +1 -1
- package/packages/protocol/package.json +1 -1
- package/packages/protocol/schema/api/v1/_root.json +119 -0
- package/packages/protocol/schema/api/v1/account.json +419 -0
- package/packages/protocol/schema/api/v1/decisions.json +635 -0
- package/packages/protocol/schema/api/v1/discovery.json +110 -0
- package/packages/protocol/schema/api/v1/events.json +679 -0
- package/packages/protocol/schema/api/v1/session-actions.json +660 -0
- package/packages/protocol/schema/api/v1/sessions.json +2055 -0
- package/packages/protocol/schema/api/v1/speech.json +492 -0
- package/packages/protocol/schema/api/v1/unspecified.json +282 -0
- package/packages/protocol/schema/app-delivery/v1.schema.json +67 -5
- package/packages/protocol/schema/app-front/v1.schema.json +7 -3
- package/packages/protocol/src/api-v1.ts +8 -0
- package/packages/protocol/src/index.ts +2 -0
- package/packages/protocol/src/teams.ts +13 -1
- package/packages/runtime-openshell/package.json +1 -1
- package/packages/runtime-sdk/package.json +1 -1
- package/packages/sdk/package.json +1 -1
- package/packages/sdk/src/app-front.ts +2 -2
- package/packages/sdk/src/ask-fields.ts +76 -0
- package/packages/sdk/src/client.ts +11 -2
- package/packages/sdk/src/envelope.ts +3 -2
- package/packages/sdk/src/index.ts +1 -0
- package/packages/sdk/src/team-intake.ts +6 -0
- package/packages/sdk/src/teams.ts +2 -0
- package/packages/sdk/src/types.ts +36 -4
- package/packages/sdk/src/wake.ts +9 -4
- package/packages/spoke-sdk/package.json +1 -1
- package/src/central/agent/agent-limits.ts +185 -0
- package/src/central/agent/app-decisions.ts +6 -5
- package/src/central/agent/decisions.ts +130 -9
- package/src/central/agent/delivery.ts +134 -22
- package/src/central/agent/errors.ts +2 -1
- package/src/central/agent/events.ts +20 -2
- package/src/central/agent/launch-engine.ts +6 -3
- package/src/central/agent/message-limits.ts +5 -2
- package/src/central/agent/message-routes.ts +33 -6
- package/src/central/agent/messages.ts +7 -0
- package/src/central/agent/placement.ts +4 -2
- package/src/central/agent/read-routes.ts +5 -0
- package/src/central/agent/routes.ts +2 -0
- package/src/central/agent/subscriptions.ts +13 -4
- package/src/central/api-v1.ts +115 -0
- package/src/central/artifacts/store.ts +4 -2
- package/src/central/concierge/board-results.ts +2 -1
- package/src/central/concierge/notifier.ts +4 -2
- package/src/central/config.ts +20 -6
- package/src/central/health/classify.ts +209 -0
- package/src/central/http.ts +285 -23
- package/src/central/recording/index.ts +2 -1
- package/src/central/recording/schema.ts +2 -1
- package/src/central/registry.ts +34 -3
- package/src/central/teams/budgets.ts +144 -0
- package/src/central/teams/hop-stalls.ts +14 -6
- package/src/central/teams/intake.ts +38 -6
- package/src/central/teams/involvement.ts +95 -0
- package/src/central/teams/item-decisions.ts +60 -0
- package/src/central/teams/item-eligibility.ts +35 -0
- package/src/central/teams/item-stalls.ts +87 -0
- package/src/central/teams/loops.ts +40 -0
- package/src/central/teams/progress.ts +154 -0
- package/src/central/teams/routes.ts +2 -2
- package/src/central/teams/store.ts +21 -5
- package/src/central/teams/validation.ts +17 -6
- package/src/central/workspaces/coordinator.ts +3 -1
- package/src/spoke/hub-tool.ts +26 -11
- package/web/dist/assets/{ArtifactPage-C5MMqXLN.js → ArtifactPage-TbFJi59n.js} +1 -1
- package/web/dist/assets/{ArtifactPane-CXSCmhyJ.js → ArtifactPane-7D-M-Ich.js} +1 -1
- package/web/dist/assets/{ArtifactWorkbench-S0RxNGWy.js → ArtifactWorkbench-DlCLEjut.js} +1 -1
- package/web/dist/assets/{Diagram-BGmyRb-R.js → Diagram-PvOPetOI.js} +1 -1
- package/web/dist/assets/{Library-CFmMbXEa.js → Library-Cdi83pOV.js} +2 -2
- package/web/dist/assets/{ProfilesDestination-7jpOc2HM.js → ProfilesDestination-cryC7P6j.js} +1 -1
- package/web/dist/assets/TeamsPage-B4xrlGhp.js +1 -0
- package/web/dist/assets/Watchtower-60B1JX_J.js +2 -0
- package/web/dist/assets/index-DA0gKIzv.js +33 -0
- package/web/dist/assets/live-B2IfKm37.js +5 -0
- package/web/dist/assets/{live-BUofsQpz.css → live-De-kd3eW.css} +1 -1
- package/web/dist/assets/{renderer2d-B2Nh39UN.js → renderer2d-CsZnF3_o.js} +1 -1
- package/web/dist/assets/{renderer3d-CTYbljHH.js → renderer3d-BIMA0wFn.js} +2 -2
- package/web/dist/assets/{safe-area-CkhEclGo.js → safe-area-dtrnw9NF.js} +1 -1
- package/web/dist/index.html +1 -1
- package/web/dist/assets/TeamsPage-C1NGrUR-.js +0 -1
- package/web/dist/assets/Watchtower-DnvlJaU0.js +0 -2
- package/web/dist/assets/index-Da8SKXMw.js +0 -33
- package/web/dist/assets/live-BmqLASSo.js +0 -5
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
{
|
|
2
|
+
"paths": {
|
|
3
|
+
"/api/v1/transcribe": {
|
|
4
|
+
"post": {
|
|
5
|
+
"operationId": "transcribe",
|
|
6
|
+
"tags": [
|
|
7
|
+
"speech"
|
|
8
|
+
],
|
|
9
|
+
"x-hub-access": "user",
|
|
10
|
+
"summary": "Speech to text",
|
|
11
|
+
"description": "Transcribes a recording with the user's speech-to-text settings. The body is the audio itself, at most 10 MB by default (the hub's HUB_MAX_AUDIO_BYTES); its Content-Type names the format (parameters such as `;codecs=opus` are ignored). Fails with 415 (code invalid) for a Content-Type the hub does not know, 400 invalid for an empty recording, 413 too_large over the limit, and 502 upstream_failed when the speech provider fails.",
|
|
12
|
+
"parameters": [
|
|
13
|
+
{
|
|
14
|
+
"name": "x-hub-recording",
|
|
15
|
+
"in": "header",
|
|
16
|
+
"required": false,
|
|
17
|
+
"description": "Voice recording (docs/voice-recording.md): the ID of a recording of this user that this request belongs to. Optional; without it nothing is recorded.",
|
|
18
|
+
"schema": {
|
|
19
|
+
"type": "string"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "x-hub-segment",
|
|
24
|
+
"in": "header",
|
|
25
|
+
"required": false,
|
|
26
|
+
"description": "Voice recording: the segment number of this audio in the recording named by x-hub-recording; the segment is then kept for the recording (no second upload).",
|
|
27
|
+
"schema": {
|
|
28
|
+
"type": "string"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"requestBody": {
|
|
33
|
+
"required": true,
|
|
34
|
+
"content": {
|
|
35
|
+
"audio/webm": {
|
|
36
|
+
"schema": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"format": "binary"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"audio/mp4": {
|
|
42
|
+
"schema": {
|
|
43
|
+
"type": "string",
|
|
44
|
+
"format": "binary"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"audio/x-m4a": {
|
|
48
|
+
"schema": {
|
|
49
|
+
"type": "string",
|
|
50
|
+
"format": "binary"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"audio/m4a": {
|
|
54
|
+
"schema": {
|
|
55
|
+
"type": "string",
|
|
56
|
+
"format": "binary"
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"audio/aac": {
|
|
60
|
+
"schema": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"format": "binary"
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"audio/ogg": {
|
|
66
|
+
"schema": {
|
|
67
|
+
"type": "string",
|
|
68
|
+
"format": "binary"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"audio/wav": {
|
|
72
|
+
"schema": {
|
|
73
|
+
"type": "string",
|
|
74
|
+
"format": "binary"
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"audio/x-wav": {
|
|
78
|
+
"schema": {
|
|
79
|
+
"type": "string",
|
|
80
|
+
"format": "binary"
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"audio/wave": {
|
|
84
|
+
"schema": {
|
|
85
|
+
"type": "string",
|
|
86
|
+
"format": "binary"
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"audio/mpeg": {
|
|
90
|
+
"schema": {
|
|
91
|
+
"type": "string",
|
|
92
|
+
"format": "binary"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"audio/mp3": {
|
|
96
|
+
"schema": {
|
|
97
|
+
"type": "string",
|
|
98
|
+
"format": "binary"
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"audio/flac": {
|
|
102
|
+
"schema": {
|
|
103
|
+
"type": "string",
|
|
104
|
+
"format": "binary"
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
"responses": {
|
|
110
|
+
"200": {
|
|
111
|
+
"description": "The text heard (empty when nothing was said).",
|
|
112
|
+
"headers": {
|
|
113
|
+
"x-hub-recording-audio": {
|
|
114
|
+
"description": "With x-hub-recording and x-hub-segment: what became of the segment's audio.",
|
|
115
|
+
"schema": {
|
|
116
|
+
"type": "string",
|
|
117
|
+
"x-hub-known": [
|
|
118
|
+
"stored",
|
|
119
|
+
"skipped-cap",
|
|
120
|
+
"failed",
|
|
121
|
+
"off"
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"content": {
|
|
127
|
+
"application/json": {
|
|
128
|
+
"schema": {
|
|
129
|
+
"$ref": "#/components/schemas/Transcript"
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"default": {
|
|
135
|
+
"$ref": "#/components/responses/Error"
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
"/api/v1/speak": {
|
|
141
|
+
"post": {
|
|
142
|
+
"operationId": "speak",
|
|
143
|
+
"tags": [
|
|
144
|
+
"speech"
|
|
145
|
+
],
|
|
146
|
+
"x-hub-access": "user",
|
|
147
|
+
"summary": "Text to speech",
|
|
148
|
+
"description": "Speaks text with the user's text-to-speech settings. The text is made speakable first (Markdown and code blocks dropped, links named) and cut to the hub's limit (800 characters by default, HUB_MAX_SPEECH_CHARS). The audio is streamed as the provider makes it. Fails with 400 invalid when nothing speakable is left, and 502 upstream_failed when the speech provider fails before the audio starts.",
|
|
149
|
+
"parameters": [
|
|
150
|
+
{
|
|
151
|
+
"name": "x-hub-recording",
|
|
152
|
+
"in": "header",
|
|
153
|
+
"required": false,
|
|
154
|
+
"description": "Voice recording (docs/voice-recording.md): the ID of a recording of this user that this request belongs to. Optional; without it nothing is recorded.",
|
|
155
|
+
"schema": {
|
|
156
|
+
"type": "string"
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"name": "x-hub-tts-ref",
|
|
161
|
+
"in": "header",
|
|
162
|
+
"required": false,
|
|
163
|
+
"description": "Voice recording: which reply sentence this is, `<messageID>:<ordinal>:<seq>:<i>`.",
|
|
164
|
+
"schema": {
|
|
165
|
+
"type": "string"
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
],
|
|
169
|
+
"requestBody": {
|
|
170
|
+
"required": true,
|
|
171
|
+
"content": {
|
|
172
|
+
"application/json": {
|
|
173
|
+
"schema": {
|
|
174
|
+
"$ref": "#/components/schemas/SpeakRequest"
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
"responses": {
|
|
180
|
+
"200": {
|
|
181
|
+
"description": "The speech, MP3.",
|
|
182
|
+
"content": {
|
|
183
|
+
"audio/mpeg": {
|
|
184
|
+
"schema": {
|
|
185
|
+
"type": "string",
|
|
186
|
+
"format": "binary"
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
"default": {
|
|
192
|
+
"$ref": "#/components/responses/Error"
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
"/api/v1/settings/speech": {
|
|
198
|
+
"get": {
|
|
199
|
+
"operationId": "getSpeechSettings",
|
|
200
|
+
"tags": [
|
|
201
|
+
"speech"
|
|
202
|
+
],
|
|
203
|
+
"x-hub-access": "user",
|
|
204
|
+
"summary": "The user's speech settings",
|
|
205
|
+
"description": "The speech-to-text and text-to-speech settings that apply to the user, and whether each direction can work. Keys are never shown: only whether one is set, where it comes from and, for the caller's own key (or any key on a pairing-mode hub), its last four characters. On a hub with several users (OIDC), a user who is not the pairing-mode owner also gets `scope: \"user\"`, the server default and their own saved fields.",
|
|
206
|
+
"responses": {
|
|
207
|
+
"200": {
|
|
208
|
+
"description": "The effective settings.",
|
|
209
|
+
"content": {
|
|
210
|
+
"application/json": {
|
|
211
|
+
"schema": {
|
|
212
|
+
"$ref": "#/components/schemas/SpeechSettings"
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
"default": {
|
|
218
|
+
"$ref": "#/components/responses/Error"
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
"components": {
|
|
225
|
+
"schemas": {
|
|
226
|
+
"Transcript": {
|
|
227
|
+
"type": "object",
|
|
228
|
+
"required": [
|
|
229
|
+
"text"
|
|
230
|
+
],
|
|
231
|
+
"properties": {
|
|
232
|
+
"text": {
|
|
233
|
+
"type": "string"
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
"SpeakRequest": {
|
|
238
|
+
"type": "object",
|
|
239
|
+
"required": [
|
|
240
|
+
"text"
|
|
241
|
+
],
|
|
242
|
+
"properties": {
|
|
243
|
+
"text": {
|
|
244
|
+
"type": "string",
|
|
245
|
+
"description": "What to say. Markdown is fine: it is made speakable."
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
"SpeechSettings": {
|
|
250
|
+
"type": "object",
|
|
251
|
+
"required": [
|
|
252
|
+
"stt",
|
|
253
|
+
"tts",
|
|
254
|
+
"voiceHints",
|
|
255
|
+
"ready"
|
|
256
|
+
],
|
|
257
|
+
"properties": {
|
|
258
|
+
"stt": {
|
|
259
|
+
"$ref": "#/components/schemas/SpeechToTextSettings"
|
|
260
|
+
},
|
|
261
|
+
"tts": {
|
|
262
|
+
"$ref": "#/components/schemas/TextToSpeechSettings"
|
|
263
|
+
},
|
|
264
|
+
"voiceHints": {
|
|
265
|
+
"type": "object",
|
|
266
|
+
"description": "Voices known to work, keyed by a model ID prefix (a voice belongs to its model).",
|
|
267
|
+
"additionalProperties": {
|
|
268
|
+
"type": "array",
|
|
269
|
+
"items": {
|
|
270
|
+
"type": "string"
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
"ready": {
|
|
275
|
+
"$ref": "#/components/schemas/SpeechReadiness"
|
|
276
|
+
},
|
|
277
|
+
"scope": {
|
|
278
|
+
"type": "string",
|
|
279
|
+
"description": "\"user\": a user's own view on a hub with several users, with `default` and `user`. Absent for the server default's view (the owner of a pairing-mode hub).",
|
|
280
|
+
"x-hub-known": [
|
|
281
|
+
"user"
|
|
282
|
+
]
|
|
283
|
+
},
|
|
284
|
+
"default": {
|
|
285
|
+
"$ref": "#/components/schemas/SpeechDefaultSettings"
|
|
286
|
+
},
|
|
287
|
+
"user": {
|
|
288
|
+
"$ref": "#/components/schemas/OwnSpeechSettings"
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
},
|
|
292
|
+
"SpeechToTextSettings": {
|
|
293
|
+
"type": "object",
|
|
294
|
+
"required": [
|
|
295
|
+
"provider",
|
|
296
|
+
"model",
|
|
297
|
+
"apiKey"
|
|
298
|
+
],
|
|
299
|
+
"properties": {
|
|
300
|
+
"provider": {
|
|
301
|
+
"type": "string",
|
|
302
|
+
"x-hub-known": [
|
|
303
|
+
"openrouter",
|
|
304
|
+
"openai-compatible"
|
|
305
|
+
]
|
|
306
|
+
},
|
|
307
|
+
"model": {
|
|
308
|
+
"type": "string"
|
|
309
|
+
},
|
|
310
|
+
"baseURL": {
|
|
311
|
+
"type": "string",
|
|
312
|
+
"description": "Present when one is configured."
|
|
313
|
+
},
|
|
314
|
+
"language": {
|
|
315
|
+
"type": "string",
|
|
316
|
+
"description": "The spoken language's code (e.g. en), when one is set."
|
|
317
|
+
},
|
|
318
|
+
"apiKey": {
|
|
319
|
+
"$ref": "#/components/schemas/SpeechKey"
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
"TextToSpeechSettings": {
|
|
324
|
+
"type": "object",
|
|
325
|
+
"required": [
|
|
326
|
+
"provider",
|
|
327
|
+
"model",
|
|
328
|
+
"voice",
|
|
329
|
+
"apiKey"
|
|
330
|
+
],
|
|
331
|
+
"properties": {
|
|
332
|
+
"provider": {
|
|
333
|
+
"type": "string",
|
|
334
|
+
"x-hub-known": [
|
|
335
|
+
"openrouter",
|
|
336
|
+
"openai-compatible"
|
|
337
|
+
]
|
|
338
|
+
},
|
|
339
|
+
"model": {
|
|
340
|
+
"type": "string"
|
|
341
|
+
},
|
|
342
|
+
"voice": {
|
|
343
|
+
"type": "string"
|
|
344
|
+
},
|
|
345
|
+
"baseURL": {
|
|
346
|
+
"type": "string",
|
|
347
|
+
"description": "Present when one is configured."
|
|
348
|
+
},
|
|
349
|
+
"speed": {
|
|
350
|
+
"type": "number",
|
|
351
|
+
"description": "0.5 to 2, when set."
|
|
352
|
+
},
|
|
353
|
+
"apiKey": {
|
|
354
|
+
"$ref": "#/components/schemas/SpeechKey"
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
"SpeechKey": {
|
|
359
|
+
"type": "object",
|
|
360
|
+
"required": [
|
|
361
|
+
"set",
|
|
362
|
+
"source"
|
|
363
|
+
],
|
|
364
|
+
"description": "A speech provider key, masked.",
|
|
365
|
+
"properties": {
|
|
366
|
+
"set": {
|
|
367
|
+
"type": "boolean"
|
|
368
|
+
},
|
|
369
|
+
"last4": {
|
|
370
|
+
"type": "string",
|
|
371
|
+
"description": "Its last four characters: only for a key of 12 characters or more that the caller may see."
|
|
372
|
+
},
|
|
373
|
+
"source": {
|
|
374
|
+
"type": "string",
|
|
375
|
+
"description": "user: the user's own; settings: the saved server default; config: the hub's configuration file; env: the hub's environment; none: no key.",
|
|
376
|
+
"x-hub-known": [
|
|
377
|
+
"user",
|
|
378
|
+
"settings",
|
|
379
|
+
"config",
|
|
380
|
+
"env",
|
|
381
|
+
"none"
|
|
382
|
+
]
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
},
|
|
386
|
+
"SpeechReadiness": {
|
|
387
|
+
"type": "object",
|
|
388
|
+
"required": [
|
|
389
|
+
"stt",
|
|
390
|
+
"tts"
|
|
391
|
+
],
|
|
392
|
+
"properties": {
|
|
393
|
+
"stt": {
|
|
394
|
+
"type": "boolean",
|
|
395
|
+
"description": "Speech-to-text can work (OpenRouter has a key, another provider a base URL)."
|
|
396
|
+
},
|
|
397
|
+
"tts": {
|
|
398
|
+
"type": "boolean",
|
|
399
|
+
"description": "Text-to-speech can work."
|
|
400
|
+
},
|
|
401
|
+
"reason": {
|
|
402
|
+
"type": "string",
|
|
403
|
+
"description": "What is missing, for people; absent when both are ready."
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
},
|
|
407
|
+
"SpeechDefaultSettings": {
|
|
408
|
+
"type": "object",
|
|
409
|
+
"required": [
|
|
410
|
+
"stt",
|
|
411
|
+
"tts"
|
|
412
|
+
],
|
|
413
|
+
"description": "The server default under the user's own settings.",
|
|
414
|
+
"properties": {
|
|
415
|
+
"stt": {
|
|
416
|
+
"$ref": "#/components/schemas/SpeechToTextSettings"
|
|
417
|
+
},
|
|
418
|
+
"tts": {
|
|
419
|
+
"$ref": "#/components/schemas/TextToSpeechSettings"
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
},
|
|
423
|
+
"OwnSpeechSettings": {
|
|
424
|
+
"type": "object",
|
|
425
|
+
"required": [
|
|
426
|
+
"stt",
|
|
427
|
+
"tts"
|
|
428
|
+
],
|
|
429
|
+
"description": "The fields the user saved; absent ones come from the server default.",
|
|
430
|
+
"properties": {
|
|
431
|
+
"stt": {
|
|
432
|
+
"$ref": "#/components/schemas/OwnSpeechToTextSettings"
|
|
433
|
+
},
|
|
434
|
+
"tts": {
|
|
435
|
+
"$ref": "#/components/schemas/OwnTextToSpeechSettings"
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
},
|
|
439
|
+
"OwnSpeechToTextSettings": {
|
|
440
|
+
"type": "object",
|
|
441
|
+
"properties": {
|
|
442
|
+
"provider": {
|
|
443
|
+
"type": "string",
|
|
444
|
+
"x-hub-known": [
|
|
445
|
+
"openrouter",
|
|
446
|
+
"openai-compatible"
|
|
447
|
+
]
|
|
448
|
+
},
|
|
449
|
+
"model": {
|
|
450
|
+
"type": "string"
|
|
451
|
+
},
|
|
452
|
+
"baseURL": {
|
|
453
|
+
"type": "string"
|
|
454
|
+
},
|
|
455
|
+
"language": {
|
|
456
|
+
"type": "string"
|
|
457
|
+
},
|
|
458
|
+
"apiKey": {
|
|
459
|
+
"$ref": "#/components/schemas/SpeechKey"
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
},
|
|
463
|
+
"OwnTextToSpeechSettings": {
|
|
464
|
+
"type": "object",
|
|
465
|
+
"properties": {
|
|
466
|
+
"provider": {
|
|
467
|
+
"type": "string",
|
|
468
|
+
"x-hub-known": [
|
|
469
|
+
"openrouter",
|
|
470
|
+
"openai-compatible"
|
|
471
|
+
]
|
|
472
|
+
},
|
|
473
|
+
"model": {
|
|
474
|
+
"type": "string"
|
|
475
|
+
},
|
|
476
|
+
"voice": {
|
|
477
|
+
"type": "string"
|
|
478
|
+
},
|
|
479
|
+
"baseURL": {
|
|
480
|
+
"type": "string"
|
|
481
|
+
},
|
|
482
|
+
"speed": {
|
|
483
|
+
"type": "number"
|
|
484
|
+
},
|
|
485
|
+
"apiKey": {
|
|
486
|
+
"$ref": "#/components/schemas/SpeechKey"
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
}
|