ephia-protocol
Contrat universel EphiaAudioEvent - le cœur du systemme。
Rôle et consommateurs autoris郁闷
ephia-protocol 美国东部时间勒 签约有线互联网 d'Ephia:类型、模式、fixture等
更新日志protocolaire。看到 docs/wire-contract.md 等 docs/protocol-versioning.md 倒勒
实际不变量(协议v3): segment.canonical, commandSeq,
ephiaWireServerEventSchema).
我将测试消费指导标准。
@ephia/sdk(packages/ephia-sdk) -汉城运行时的客户端自动访问的转换器的电线;- Les测试与包的收缩有关;
- le后端Python通过les fixture JSON de
src/fixtures/。
我不会通过一个API客户端。 应用程序不需要通过导入器的模式连接
(ephiaWireServerEventSchema(等)倒解析器,你的贴花拉西拉西方向- elles
consomment大 @ephia/sdk例如,qui / qui / qui / qui / qui / qui / qui / qui / qui / qui / qui
注:le restest de ce README(章节“信封公社”,“Événements par catsamgorie”, 为例
transcript.segment.committed(3)联合国第3号通讯议定书(联合国第3号通讯议定书 事实上,我们已经通过了一项调查,确定了我们的目标是通过一项调查,确定我们的目标是通过一项调查。
普林西比fondamental
Protocol > Framework
Ce封装测试 独立. 我将创建新的SDK,新的React,新的LiveKit,新的后端。
非洲大陆:
- types TypeScript des samvacimement public
- schsammas zold浇注验证运行时
- 消息客户端
- 会议期间的薪金
- 编码误差
- 版本du协议(
3线/"3.0"其他功能)
À quoi sert ce档案?
packages/protocol 对产品音频进行合同协议。Il避开缆车后端等用des SDK evoluent定义d 'evenements发散。
Concretement:
- 我们的后端doit sametree des payloads JSON符合我们的sametree包
- 让SDK导入所有类型、类型、reducer、处理程序和回调函数
- 让SDK生效的chaque samvacimement reactu avec
ephiaAudioEventSchema.safeParse() - 以下测试分别用于测试vsamrifier与兼容后端/SDK <s:1>组件的兼容性,并用于测试vsamriri<e:1>的源
让后端Python导入TypeScript代码。合同的约束条件是:所有的标准和所有的标准、所有的标准和所有的标准、所有的标准和所有的标准、所有的标准、所有的标准和所有的标准。
包膜公社(指其他的薪金)
{
"protocolVersion": 3,
"eventId": "550e8400-e29b-41d4-a716-446655440000",
"sessionId": "sess_abc",
"type": "transcript.segment.committed",
"seq": 42,
"timestampMs": 1716200000000,
"payload": { "..." },
"meta": { "provider": "voxtral-small", "latencyMs": 340 }
}
seq:严格的牛角面包eventId: UUID唯一timestampMs:时间戳服务器sessionId:对某些事件负有义务meta: optionnel -诊断,延迟,模式
r<e:1>协议
- 没有问题
preview/stable它是联合国的一部分committed committed法语版法语版法语版法语版reviewing信号一审查SMART无更改文本corrected替换精确的le段committed代理行review.rejected终止一次审查,不更改文本- 命令为
seq
r<s:1> d' atomicite_des聚变
transcript.segment.committed Est l' s samvsamement atomique d'application documentation。
Lorsqu'un段吸收,d'autres段,载荷 mergedWith 大陆的IDs吸收了大量的化学物质。让客户做贴花,并提交最后的et la抑制吸收的数据 一个seule事务可视化原子 - jamais en deux薪金,薪金和薪金。
segment.absorbed 测试UN的生命周期/调试。我将测试一下。 然后 transcript.segment.committed 代理行。我要做的是,在我们承诺承诺之前,我们要做的是,在我们承诺承诺之前,我们要做得更好。
Événements par catsamgoorie
会话
| 类型 | 有效载荷cl | 描述 |
|---|---|---|
session.started | clientType, mode, language | 会话initiee |
session.ready | roomName | Room LiveKit prête,可能的话 |
session.stt_ready | bufferedFramesFlushed | 惰性初始化终止符(initialis<e:1>) |
session.paused | - - - - - - | 会话中断 |
session.closed | reason | 会议结束(user_stop|disconnect|error|timeout) |
session.error | code, message, recoverable | 误差会话 |
session.pong | - - - - - - | 你要保持活力 |
session.context.reset | contextOnly, reason | 上下文后端rmizinitialis<e:1> |
session.catchup.started | trackName, durationMs | 赶上音频传输 |
session.catchup.completed | segmentCount, durationMs | 酱termine |
session.catchup.failed | reason | 酱echoue |
音频/ VAD
| 类型 | 有效载荷cl | 描述 |
|---|---|---|
audio.vad.start | timestampMs | Voix detectee |
audio.vad.end | timestampMs, durationMs | 最后的声音 |
管段(双)
| 类型 | 有效载荷cl | 描述 |
|---|---|---|
segment.opened | segmentId, segmentSeq, startMs | 分段音频输出 |
segment.audio.closed | segmentId, endMs, reason | 方音频du段终止 |
segment.dropped | segmentId, reason | 沉默/粗野,无知 |
segment.absorbed | segmentId, absorbedInto | 片段融合了舞蹈和舞蹈 |
转录-温度升高
| 类型 | 有效载荷cl | 描述 |
|---|---|---|
transcript.preview | segmentId, segmentSeq, text, revision | 在课程中发送文本(peut se rsamuxsamuter) |
transcript.preview.stable | segmentId, segmentSeq, text, revision | 派对稳定预览 |
转录-生命周期片段
| 类型 | 有效载荷cl | 描述 |
|---|---|---|
transcript.segment.opened | segmentId, segmentSeq, startedAtMs | dsm段(管道遗留) |
transcript.segment.processing | segmentId, durationMs | 终稿正在进行中 |
transcript.segment.completed | segmentId, provider | 定稿terminee |
transcript.segment.ready | segmentId, text, tags | 文本finalis<e:1> (bridge visual avant commit) |
transcript.segment.committed | segmentId, text, tags, mergedWith? | 对于definitif -贴花喷剂 |
transcript.segment.reviewing | segmentId, tags | 在课程中复习SMART |
transcript.segment.corrected | segmentId, text | 纠正复查贴花 |
transcript.segment.revised | segmentId, newText, oldText | 修订post-commit |
transcript.segment.review.queued | segmentId | 专心复习 |
transcript.segment.review.rejected | segmentId, reason, text | 检查终端,不需要更正 |
transcript.segment.review.failed | segmentId, error | 错误评论 |
transcript.segment.error | segmentId, code, message, recoverable | 误差定稿 |
文档
| 类型 | 有效载荷cl | 描述 |
|---|---|---|
document.patch | ops[] | opsamos的结构和文件是一致的 |
通量法向d'un段
segment.opened
→ transcript.preview (texte interim, 1..N fois)
→ transcript.preview.stable (texte stable, 0..N fois)
→ segment.audio.closed (audio terminé, traitement en cours)
→ transcript.segment.committed ← appliquer atomiquement
→ [transcript.segment.reviewing
→ transcript.segment.corrected | transcript.segment.review.rejected]
负载示例 committed
{
"protocolVersion": 3,
"eventId": "550e8400-e29b-41d4-a716-446655440000",
"sessionId": "sess_abc",
"type": "transcript.segment.committed",
"seq": 42,
"timestampMs": 1716200000000,
"payload": {
"segmentId": "seg_12",
"segmentSeq": 12,
"text": "Le foie est de taille normale.",
"source": "voxtral-small",
"tags": [{ "tag": "anatomy", "word": "foie" }]
},
"meta": {
"provider": "voxtral-small",
"latencyMs": 820,
"audioDurationMs": 2300
}
}
消息客户机→后端
| 消息 | Envoye通过 | 描述 |
|---|---|---|
{ type: "session.pause" } | data_channel | 米暂停 |
{ type: "session.resume" } | data_channel | 重复一下 |
{ type: "session.reset", payload: { contextOnly: true } } | data_channel | 重置contexte |
{ type: "catchup.start", payload: { catchupId, source, sampleRate, channels, bytesTotal, durationMs, clientStartedAtMs?, clientEndedAtMs?, catchupSeq?, operationId?, startSample?, endSample? } } | data_channel | dsammarer的突发PCM16单声道16khz追赶; startSample/endSample 客户端le前缀:com audio.live.anchor |
{ type: "catchup.chunk", payload: { catchupId, chunkIndex, offsetBytes, dataBase64 } } | data_channel | 特使在大块赶上可以让人心烦意乱 |
{ type: "catchup.end", payload: { catchupId, chunkCount, bytesTotal } } | data_channel | 最后,我突然赶上来了 |
{ type: "catchup.abort", payload: { catchupId, reason } } | data_channel | 环宇乐爆棚追赶 |
ephia.session.pause | RPC | 相同的暂停模式 useRpcCommands) |
ephia.session.resume | RPC | 相同的简历模式 useRpcCommands) |
ephia.session.reset | RPC | 标识复位模式 useRpcCommands) |
用法
import {
ephiaAudioEventSchema,
type EphiaAudioEvent,
type TranscriptSegmentCommittedEvent,
PROTOCOL_VERSION, // 4
} from "ephia-protocol";
// Validation runtime
const parsed = ephiaAudioEventSchema.safeParse(raw);
if (!parsed.success) {
console.warn("Invalid event:", parsed.error.issues);
return;
}
// Discrimination par type
const event: EphiaAudioEvent = parsed.data;
if (event.type === "transcript.segment.committed") {
const { segmentId, text, tags, mergedWith } = event.payload;
applyToEditor(segmentId, text, { absorbed: mergedWith ?? [] });
}