@ai-matrx/meet
企业部,人工智能的电话 和每个Matrx客户的会面: 窃听一个人并打电话进来 2秒,或者运行一个与Zoom相竞争的会议——大厅,主机控制,屏幕共享,录音—— 人工智能那半部分不是附加的 但是我们的理由更好.
一个供应商,一个组成部分,在一小时之内召开包括AI在内的全面生产会议.
pnpm add @ai-matrx/meet
建造在 @ai-matrx/data/realtime 用于信号和
@ai-matrx/messaging 请柬。 有一个 手卷为零
.channel( 此软件包中的代码而且你身上一定没有.
此软件包为何存在
视频通话是每个团队 估计两周和船舶 在三个月内,因为 硬块不是瓷砖 他们是:谁被允许进入这个会议室,如果 信号器在中会到期 摄影机灯为何在离开后继续开 手机为何在 在你用笔记本电脑回答后,其他房间仍然在鸣叫, 为什么你没有插上耳机 仍然"选择", 什么客人谁没有帐户是允许的。 每一个都有一个 名称在本 README 和旁边的回归测试中.
我们是故意的 无弹性. LiveKit Cloud是媒体基础设施,硬码(D1/D2). 没有提供者的抽象,永远不会有。 我们想要的就是这个计划 做,这就是产品.
学说
1. 客户从来不持有LiveKit秘密.
不是在nev var, 不是在建时常数, 不是"只是为了本地的 dev"。 一个 LiveKit API 的秘密 浏览器将薄荷捆绑为 任意 项目中的会议室,包括持有者 从来没有被邀请参加——这是本组织内每次对话的充分妥协.
因此软件包没有能够接受一个代码路径. 它要求的是活塞;活塞;活塞薄荷. 这是 仅限 进入一个房间(R1)的授权路径,客人的全部能力就是他们的象征 仅限一个房间,没有其他房间(R5).
2. 在被咬前重新刷新出一枚标志并铸造出ONCE.
刷新发生在信物生命的80%,而不是当重新连接以100%失败时——经典 两小时会议bug 是一个会话, 它超过它的象征, 不能回来。 每个 同步 Asker 分享一分薄荷:薄荷两次给予一分的反射出严格模式双效 识别两个 LiveKit 会话,而 LiveKit 连接旧会话。 这看起来像"我的" 当我交换分页时,请随意调用".
没有的标志 expires_at 实值 拒绝 而不是用,因为一个符号 包不能
安排一个刷新是无法默接的会议.
3. 阶段从来不是。 没有无限的旋转器.
requesting-token → lobby | connecting → connected ⇄ reconnecting → left,则任何失败都变成
failed 附带说明的补救办法。重新连接是一个可见的状态,因为
没有解释的被冷冻的瓷砖 与坠毁的应用程序是分不开的.
设备故障得到4个不同的句子,而不是一个缩出: 不允许,没有这样的设备,
设备已被另一个应用程序使用, 且上下文不安全( e)getUserMedia 不存在于
页:1 一个单一的"媒体错误"会告诉用户错误的东西在四分之三.
4. 两条腿接到电话,然后响了ONCE.
这个 长腿 是邀请行及其 Postgres 更改事件: 它在重新加载后幸存, a 迟到的标签 和一个被丢弃的套接字, 而这正是错失的调用 是一个事实而不是一个 丢失的包。 这个 即时腿 是在您的用户频道上播放的,没有数据库往返. 两者在被邀请的ID上被去除.
反之亦然 删除可耐用腿并拨打的电话丢失; 删除即时 腿和铃声感觉很慢.
周围: 每枚戒指 结束 (未答复的电话) missed),在一个设备上回答
停止其他活动 在电话中 回答忙着
而不是响起, 国家机器拒绝 复活一个固定的呼叫 当迟到
接受到达.
5. 来宾是一等身份,而不是退化的用户.
一个会议链接对任何人都有用(D6)。 客人输入名字,在大厅等,主持人承认 他们。 经认证的用户跳过提示;主机权限需要认证.
这由TYPES执行,而不是通过纪律: MeetIdentity.userId 实值 UserId | null和每个
操作需要账户的操作 UserId。一个客串供应商 根本没有呼叫中心 —— 说
这样 useCalls().canCall 是不正确的, 没有呼叫控制会比禁用按钮( 没有死端) .
6. 接纳是服务器的决定。 角色来自符号.
admit 是一个经认证检查的 RPC; 仅随后播放 告诉 敲门手,谁没有
数据库自读。 两个主机点击"承认"是普通情况,RPC是什么
使它具有同能性.
每个参与者的作用从 包含在服务器上的代号元数据。可以 确定是宿主可以让任何人变哑 而联合主机无法移除主机——没有这个等级 检查,"host control"是一个相互校验按钮.
7. 一个持久的链接是一个身份,而不是一个事件的URL.
枪声响起 之前、期间和之后 预定时间和一次经常性会议 保持一个链接。 当会议结束时 连结就会断掉 后续行动,也就是人们去寻找它的时候.
胡说八道,故意把那些听错的人 大声读出来:不 0编号 :O,没有
1编号 :l。 。 。 .
8. 同意是一揽子财产,而不是道具.
没有 showRecordingIndicator={false}记录一个人而不告诉他们是违法的
双方同意的管辖范围 和无正当理由 任何地方,所以指标和
加入时间通知船与包裹。 唯一的把手是兽人 recordingPolicy —— 说 disabled
编号 : host-controlled 编号 : always-on ——决定录音是否可能发生,永远不
人们是否被告知.
指标在 服务器 说egress在跑 从来没有在客户的 希望; 被拒绝的开始会重现它, 而不是留下一个红点 在一个没有的录音上 运行中。 以及平台文件系统中的录制土地 文件编号,从不提供 URL ——一个LiveKit URL是一个孤儿,当房间被收集到垃圾时.
9. 大赦国际是与会者之一,看来是与会者之一.
记事员作为真正的LiveKit参与者加入这个房间 is_agent 在它的象征元数据,
所以它会变成一块被贴上标签的瓷砖 一个隐形的听众在会议上 是没有人应该做的事
永远的船.
所有AI通过平台代理系统执行 @ai-matrx/agents。软件包永远不会
和模特儿谈话,永远不要急,也不要带代理定义——它需要代理身份证明
和未配置的能力报告 unavailable 补救措施
而UI则完全隐藏了这个动作.
🚨 用户法. user_input 人类是什么样的类型。 记录、名册和议程
旅费作为 已命名变量。服务器存储和帧 user_input 作为转弯的人
说,所以走私记录稿 通过它破坏每一个谈话。 没错
此软件包中的一个呼叫发送一个 user_input: 一个人实际上问的在会中的问题.
临时的笔录线从不联系到经纪人,截取的笔录在线上也这么说.
10. 舞台是算术的,从不洗牌.
屏幕分享(或者一个明显的指针)拥有舞台;然后是活跃的扬声器,然后是举起手,然后是 摄影机,然后 稳定 与时俱进 在名册上重排的牌子最多 令人不适的事物 见面UI可以做的.
大型会议 页次 并说 +N more people 它没有制作200个视频和死亡,它
不默不作声地放弃它无法适应的人(R5).
11. 没有什么是沉默地失败的,任何控制都不是谎言.
每个错误都是 MeetError 拥有稳定 code (单位:千美元) remedy 句号。 每个站着
自己宣布:一个未插接的耳机说 "你记忆中的麦克风不再连接..
使用系统默认“ 而不是悄悄地切换你的笔记本电脑麦克风.
无法使用的控件是 缺席,从不禁用外观,从不按下服务器 将拒绝.
一小时融合(R7)
4个子路径(CORE-DESIGN 第5.1节): @ai-matrx/meet/core (无框架; @ai-matrx/meet
(再出口), @ai-matrx/meet/react (供应商,钩子, <MeetingSkinRoot>,记录和
和每张相片一张 @ai-matrx/meet/skins/meet 持有相遇皮肤的部分
(单位:千美元)ControlBar, (中文(简体) ), ParticipantTile, (中文(简体) ), Captions,.),用于构成它们的主机布局.
import "@ai-matrx/meet/tokens.css"; // defaults — override these with your brand
import "./brand.css";
import "@ai-matrx/meet/styles.css"; // structural, last
import { MeetProvider, IncomingCallHost, MeetingSkinRoot, useCalls } from "@ai-matrx/meet/react";
export function App({ children }) {
return (
<MeetProvider
client={supabase}
baseUrl={AIDREAM_URL}
displayName={user.name}
organizationId={org.id}
accessToken={async () => (await supabase.auth.getSession()).data.session?.access_token ?? null}
transport={matrxTransport}
agents={{ noteTaker: NOTE_TAKER_AGENT_ID, liveIntelligence: LIVE_AGENT_ID }}
>
{/* Mount ONCE. Calls now ring on whatever surface the user is on. */}
<IncomingCallHost />
{children}
</MeetProvider>
);
}
// Anywhere a person appears: your own control, calling through the hook.
const calls = useCalls();
calls.canCall && <button onClick={() => calls.call([userId], "video")}>Call</button>
// Your meeting route — the skin root chooses the viewer's skin (Meet until S9):
<MeetingSkinRoot roomName={roomName} meetingId={meetingId} />
舞台会填充取景口(100dvh) (中文(简体) ). 在一个盒子里开个会——一个板砖,一个分块
窗格——给祖先一个确定的高度和设定 --mx-meet-height: 100% 上; 每个屏幕
然后装满那个盒子.
🚨 你不告诉“见见谁是用户”,也没有道具. 代理用户读取
从 client自己的会话——在每次请求中都给JWT做薄荷的同一个客户端——因此,id in a
p_user_id 参数和符号中的标识不能不同意。 通过0.5.x,这是一个道具,每
主机从自己状态的复制件中填充,一个旋转的认证饼干留下了该复制件命名
账户标签已无法证明它的存在; meet_pending_call_invites 拒绝读取
403 与 "代理用户... 不是认证用户"。通过 displayName 财务报告和审定财务报表 avatarUrl —— 说
他们都是染色体 而不是身份 A 类 userId 道具被忽略了 并说.
A 类 来宾 加入时是同一提供者 guestName这是宣布客人身份的唯一方法
车道。 客人没有帐号,所以他不读任何会话:
<MeetProvider client={supabase} baseUrl={AIDREAM_URL} organizationId={orgId}
guestName={typedName} accessToken={async () => null}>
<MeetingSkinRoot roomName={meeting.roomName} slug={slug} />
</MeetProvider>
请在邮件连接上登入处理器:
<MessagingProvider
actions={[
createCallInviteHandler({ calls, repository, onJoin: (invite) => router.push(`/meet/${invite.roomName}`) }),
createMeetingInviteHandler({ onOpen: (payload) => router.push(`/meet/${payload.slug}`) }),
]}
>
东道主拥有的,以及它绝对不能做的
输入 : supabase客户端, Aidream 的基础 URL, 用户是谁( 或宾名), org, a access-token source, matrx transport, agent ids, 品牌标志值和路由器.
永远: 抓取软件包错误以重新解释, 重试软件包调用, 验证软件包 输入,或软件包上的分支。 这个逻辑属于这里(C22) 包,放出后删除按摩.
服务器先决条件
这是客户的一半。 需要两个服务器侧的部件,并且是 尚未建设数字 :
- 助脑会遇到路由器 - 硬币(身份、赠款、TTL、来宾和游说者),
Egress start/ stop, LiveKit webhooks 保存数据库 TRUE- current, 以及 LiveKit 代理
记事机 这个软件包的准确路线
MEET_ROUTES内src/core/tokens.ts。 。 。 . - 这个
communication.meet_*matrx Main的图案 - 表格和RPCsrc/core/repository.ts,在平台的犬形DB公约下.
在两者都存在之前,包会响亮地失败,有一条补救措施来命名缺失的棋子. 从来没有
伪造一个房间,一个标志,或者一个会议记录. 见 FEATURE.md。 。 。 .
盖茨
pnpm --filter @ai-matrx/meet typecheck
pnpm --filter @ai-matrx/meet test
pnpm --filter @ai-matrx/meet check:package # build + publint + packed-tarball canary
麻省理工学院有执照 资料来源: aidream/apps/shared/meet。 。 。 .