跳到正文
Hacker News· vahmohh2·· 6 天前AI 评分62

Veda 发布智能体原生操作系统,语音智能体内置为系统服务

Veda: First AI Agentic Hobby OS

AI 导读

Veda 发布一个从零用 Rust 编写的智能体原生操作系统,语音智能体作为系统服务在启动时运行,通过与应用相同的代码路径执行操作,而非截屏或模拟点击。应用以 JSON 声明动作、参数和风险等级,内置应用提供 70 多个动作;每个动作分为常规、敏感和破坏性三档,后两档由系统服务而非语言模型持有,需用户在三分钟内确认。

正文 · AI 翻译

Veda:智能体原生操作系统

Veda 是一个内置语音智能体的操作系统。说一句“Hey Veda,把我的壁纸换成沙丘”,它就会在任何应用程序中完成这项工作,走的是和你的键盘、鼠标相同的代码路径。对于任何难以撤销的操作,它都会先征求你的同意。

一切都用 Rust 从零编写,并放在这个仓库里:UEFI 引导加载程序、基于能力的微内核、系统服务、窗口系统、工具包和应用程序。少数成熟的 crate 提供 TCP/IP、TLS 和密码学功能(smoltcp、rustls、RustCrypto)。Veda 可在 x86-64 PC 和 QEMU 上运行。

The Veda desktop, with the agent's window open and listening

为什么是智能体原生

操作系统的设计初衷是让人坐在键盘前使用。后来添加的助手必须读取屏幕、模仿点击,或者使用少数提供 API 的应用程序,而系统无法对它施加任何约束。在 Veda 中,智能体是系统的一等用户:

  • 系统的一部分。智能体是一个系统服务,在启动时启动,失败时会重启。它会休眠,直到你叫它的名字、点击任务栏上的圆环,或按下 Super+Space。
  • 在每个应用程序中都是原生的。应用程序声明自己的操作(带类型的参数和风险等级),并以 JSON 报告自己显示的内容。智能体调用这些操作,它们运行的是与键盘和鼠标相同的代码:没有屏幕抓取,没有模拟点击。内置应用程序提供了 70 多个操作。
  • 由系统强制执行的同意机制。每个操作都是常规、敏感或破坏性的。智能体服务——而不是语言模型——会扣住后两类,直到你允许为止。只有桌面 shell 才能作答(init 会告诉每个服务是哪个程序在调用),因此智能体在文档中读到的任何内容都无法批准任何操作。
  • 真实的上下文。每次对话开始时都会带上时间、打开的窗口、每个应用程序的操作、智能体对你的了解,以及你上次对话是如何结束的。在行动之前,它会读取应用程序的当前状态。
  • 由你控制的记忆。它只记住你明确告诉它的内容(你的名字、你生活中的人、你喜欢的做事方式),从不记住它自己的猜测。记忆保存在你的电脑上,设置中会显示并遗忘其中的任何部分。
  • 语音优先。你可以随时打断它。回声消除和回声门控让它听不到自己,对话期间其他声音会降低 20 dB。休眠时,它用一个本地运行的语音检测器来监听,因此没人说话时不会有音频离开电脑。
  • 智能是一项设置。语音识别、语言模型和声音来自 Deepgram 的 Voice Agent API,音频已选择退出 Deepgram 的模型改进。模型(默认是 OpenAI 的 gpt-4.1-mini)、声音,甚至智能体的名字都可以在设置中选择。

智能体如何工作

  1. 监听。休眠时,智能体在电脑上运行语音检测器。它听到的语音会发送到 Deepgram 的识别器,并以智能体的名字作为关键术语。以名字开头或结尾的句子(“Hey Veda,……”“……,Veda?”)会唤醒智能体,句子的其余部分就是它的第一个请求。
  2. 对话。唤醒会打开一个 Deepgram Voice Agent 会话,其中包含智能体的指令、上下文和函数。Deepgram 负责轮流发言、语言模型和声音;Veda 的音频服务双向传输声音。
  3. 操作。模型调用代理的 17 个函数(窗口、文件、音量、Wi-Fi、壁纸、通知、计时器和提醒、记忆、系统及其程序),并通过 use_app 和 read_app 调用每个应用的操作和状态。每次调用都返回一个结构化结果。
  4. 同意。需要你确认的调用会等待在代理窗口中或通知里,明确说明将要发生什么以及针对什么。只有你在三分钟内允许,它才会执行。敏感操作可以永久允许;破坏性操作每次都会询问。

代理完整涵盖了设计:协议、语音管线、同意、记忆和测试。

操作系统

  • 微内核。vkernel 只处理隔离、调度、内存和 IPC:带权限的能力句柄、传递消息和句柄的通道、VMO、事件、futex 和中断对象。它支持带 x2APIC 的 SMP、无滴答定时器和 XSAVE。
  • 受监督的服务。驱动程序、文件系统、窗口系统、音频、网络和代理都是用户空间进程。init 会在窗口系统、shell、音频、网络和代理崩溃时重启它们,因此桌面会自行恢复。
  • 虚拟机中的 Linux 驱动。Veda 只驱动自己的磁盘(virtio-blk、AHCI、NVMe)。Linux 在 驱动虚拟机 中驱动其他一切,运行在 Veda 自己的虚拟机监控程序上(VMX 带 EPT,无模拟硬件)。设备整体交给它,其 DMA 被限制,中断由 Veda 的 IOMMU 驱动重新映射。崩溃的驱动只会拖垮该虚拟机,Veda 会重置并重启它。参见 驱动虚拟机。
  • 桌面。一个合成窗口管理器,具有服务端装饰、阴影、动画、吸附和带实时缩略图的 Alt+Tab 切换器。它在 Intel 显卡上通过 GPU 合成,在其他地方通过处理器合成;一旦 Linux 驱动显示,每一帧都在垂直消隐时整体翻转。shell 有任务栏、可搜索的开始菜单、桌面图标、日历和通知。
  • 工具包。vui 是一个即时模式工具包:控件、菜单、对话框、矢量图标以及 Inter 和 JetBrains Mono 中的抗锯齿文本。每个 vui 应用都与代理兼容。
  • 3D 图形。OpenGL ES 3.0 配合 GLSL ES 1.00 和 3.00,用 Rust 实现(vgl、vglsl),每次调用都按规范要求检查。它通过驱动虚拟机中的 Mesa 在 GPU 上渲染(Intel 的 iris;在 QEMU 下使用宿主 GPU 上的 virgl),或在多线程软件渲染器上渲染。Interceptor 全屏展示它:一座海湾城市及其交通、基于物理的光照、阴影、泛光和 4 倍多重采样。
  • 网络。一个网络服务,支持 IPv4 和 IPv6、DHCP、DNS、TCP、UDP 和 ICMP,以及一个 Wi-Fi 服务,可加入 WPA2、WPA3 和开放网络并支持管理帧保护,记住它们、重新连接并漫游。Linux 的驱动只移动帧,永远看不到密码。应用程序从 vtls 获得 TLS 1.3 和 1.2,证书对照 Mozilla 的根证书进行检查。参见 网络。
  • 音频。一个混音服务,具有回声消除录音和闪避功能,既为代理的对话也为音乐而构建。
  • 存储。 主目录有自己的磁盘。在更改停止半秒后保存,在两个带校验和的槽位之间交替,因此中断的保存永远不会损坏前一个。代理的内存和密钥位于只有代理才能打开的私有目录中。
  • C 和 GCC。 镜像包含 GCC 16、binutils 和 musl:在终端中编写 C 程序,编译并运行它,在 QEMU 或 PC 上。C 程序是静态可执行文件,其系统调用转到 vposix,一个用 Rust 编写的 POSIX 层。交叉编译器还在开发机器上为 Veda 构建 C 和 C++ 程序。参见 Veda 上的 C。

应用程序

每个应用程序都与代理兼容:你能用鼠标和键盘做的事情,代理也能做。

应用程序 它做什么 代理能做什么
文本编辑器 标签页、语法高亮(Rust、C、TOML、Markdown)、查找和替换、自动换行、缩放、无限撤销。 创建、打开、读取和写入文档;查找和替换、撤销、保存;另存为或放弃更改(经你同意)。
照片 ~/Pictures 的缩略图库和具有缩放、旋转、全屏和幻灯片放映的查看器;PNG、JPEG、BMP 和 QOI。 显示、缩放和旋转图片,全屏,运行幻灯片放映,将图片设置为壁纸。
音乐 ~/Music 的库(QOA 和 WAV)、封面艺术、实时频谱可视化器、跳转、随机播放和重复。 按名称播放歌曲、暂停、停止、跳过、跳转、随机播放、重复、设置音量。
文件 位置、面包屑、带缩略图的列表和图标视图、搜索、复制和粘贴、属性,以及一个将项目恢复到原位置的回收站。 打开、搜索、创建文件夹;复制、移动、重命名和删除到回收站(经你同意);恢复;清空回收站(每次都询问)。
终端 一个带有约五十个内置命令(文件、进程、wifi、ping、curl、...)、历史记录和制表符补全的 shell;运行 C 程序和 GCC,支持管道、重定向和 Ctrl+C。 运行命令(经你同意),读取其输出,中断它。
任务管理器 具有 CPU 和内存使用情况的进程、“结束任务”和实时性能图表。 列出进程、读取图表、结束程序(每次都询问)。
设置 壁纸、代理(密钥、名称、语音、模型、监听、内存、权限)、网络和 Wi-Fi、显示和系统。 打开页面,更改代理的语音和语速;重命名它或更改其模型(经你同意)。永远不能更改密钥。
拦截者 在 OpenGL ES 3.0 中穿越海湾城市的警察追捕:八个任务、快速追逐和巡逻,白天、日落、夜晚和雨中,带有合成的引擎声、警笛声和音乐。 开始任务、追逐或巡逻;暂停、恢复、重新开始或退出;更改声音、单位、相机和显示。

截图

The Text Editor showing a Rust program with syntax highlighting Photos showing a library of eight pictures
文本编辑器,高亮 Rust 照片,图片库
Music playing a song, with cover art and a spectrum visualiser Files showing pictures as thumbnails, with the Trash in its sidebar
音乐,带有可视化器 文件,带有缩略图
The Terminal, where GCC names an undeclared variable in a C program Interceptor: a chase at sunset on a road through the trees of the hills
终端中的 GCC 16 拦截者,在 OpenGL ES 3.0 中

每张截图都是 1280x800。它们是在 QEMU 中由 cargo xtask script docs/screenshots.vts 拍摄的,代理与 Deepgram 的替身对话。拦截者的截图由 cargo xtask script docs/interceptor.vts --resolution 1920x1200 以 1920x1200 拍摄并缩小。

快速开始

要求

Veda 构建在带有 Linux 的 x86-64 PC 上。

  • Rust,稳定版。rust-toolchain.toml 使 rustup 在首次使用时安装额外的目标,Rust 自己的链接器(rust-lld)链接所有内容。
  • QEMU 和 OVMF UEFI 固件(在 Debian 和 Ubuntu 上:qemu-system-x86、qemu-system-gui、qemu-system-modules-opengl 和 ovmf),可以访问 /dev/kvm。
  • 对于驱动 VM:Linux 的构建工具、交叉编译器和 Mesa (在 Debian 和 Ubuntu 上:build-essential、bc、curl、rsync、m4、 flex、bison、meson、ninja-build、libgmp-dev、libmpfr-dev、 libmpc-dev、python3-mako 和 python3-packaging),以及 KVM 的嵌套 虚拟化(kvm_intel nested=1)。参见 驱动 VM。
  • 可选:为 agent 提供 Deepgram API 密钥,以及 你的发行版中用于 C 工具链的构建工具,cargo xtask toolchain 会 构建一次(参见 Veda 上的 C)。

检查环境:

cargo xtask doctor

构建并运行

首先,构建驱动 VM 的 Linux(其内核、交叉编译器和 Mesa),这需要一段时间。没有它,Veda 启动时就没有键盘、 鼠标、声音或网络。

cargo xtask linux

然后构建并运行 Veda:

cargo xtask run

这会构建每个组件,写入 target/veda/veda.img 并在 1920x1080 的 QEMU 窗口中 启动它。首次构建还会渲染示例 图片和音乐。之后的构建是增量的。

cargo xtask run --resolution 1280x800 --smp 4 --memory 2048
cargo xtask run --cmdline "run=editor"
cargo xtask run --net wifi

run=NAME 在启动后启动 /system/bin/NAME.exe。默认情况下, 机器通过 QEMU NAT 上的有线网卡接入互联网。 --net wifi 改为给它一个 Wi-Fi 无线电,并启动 airsim,一个 模拟的 Wi-Fi 环境,其网络("Veda Home"、"Veda WPA3"、 ……)以密码 veda-wifi 通向互联网;--net both 则两者都提供。cargo xtask help 列出所有命令和选项。

真实 PC,从 USB 启动盘启动

cargo xtask iso

这会写入 target/veda/veda.iso,一个 live 系统。要启动它:

  1. 用 Rufus 将其写入 USB 启动盘(分区 方案 GPT,目标系统 UEFI,ISO 模式),或使用任何镜像写入工具。
  2. 在 PC 的固件设置中,打开 VT-x 和 VT-d,并关闭 Secure Boot(Veda 的加载器未签名)。
  3. 以 UEFI 模式从启动盘启动 PC,通常从启动菜单 (开机时按 F12、F11 或 Esc)。

Veda 从内存运行,不启动任何磁盘驱动,因此它从不读取或 写入 PC 的磁盘。其主目录会一直保留到 PC 关机 为止。要先在 QEMU 中试用启动盘,请运行 cargo xtask run --live。

启动盘会在 VEDA/LOGS 中保留每次启动的日志,每次启动一个 编号文件夹(最新的编号最大):来自 Veda 的 VEDA.TXT 和 来自驱动 VM 的 LINUX.TXT。它们每秒同步一次,因此即使一次 启动什么都没显示,也能在另一台电脑上诊断。

驱动 VM 中 Linux 的驱动支持:

设备 支持
显示 固件报告的接近 1920x1080 的屏幕模式,在固件报告的情况下采用面板自身的形状;每一帧都在垂直消隐期整体翻转
GPU Intel 的集成显卡(i915,配合 Mesa 的 iris)
输入 USB 3(xHCI)控制器上的 USB 键盘、鼠标和集线器;PS/2 键盘、鼠标和触摸板
网络 Intel 和 Realtek 的以太网、Intel 的 Wi-Fi、USB 网络适配器
声音 HD Audio(扬声器、耳机、线路输出、编解码器的麦克风)、笔记本放大器(Cirrus Logic CS35L41)、HDMI 和 DisplayPort 音频
音频 DSP 上的内置麦克风 Intel 的 Tiger Lake 到 Raptor Lake(第 11 到第 13 代 Core),通过 Sound Open Firmware;更晚的目前还没有声音

没有 VT-x 和 VT-d 时,Veda 只驱动磁盘(仅 VT-x 时,还有 PS/2 键盘和鼠标)。USB 磁盘,包括启动盘,则不予处理。 状态 显示每个设备类别 进展如何。要在 QEMU 中试用 USB 输入或 HD Audio:

cargo xtask run --input usb
cargo xtask run --sound hda

与 Veda 对话

  1. 打开 Settings → Agent 并添加你的 Deepgram API 密钥。agent 的 名称、语音、语言模型、聆听和记忆都在同一页上。
  2. 说 "Hey Veda",点击任务栏右侧的圆环,或按 Super+Space。
  3. 自然地说话,随时可以打断。说完后说再见, 它就会回到睡眠状态。

Veda 使用 PC 的麦克风和扬声器,在 QEMU 下也是如此。目前它只说英语。Deepgram 按每分钟对话计费;在休眠状态下,只有检查其名称的短暂识别会计费,每小时最多十分钟。

可以问的事情:

  • "把我的壁纸换成沙丘。"
  • "播放 Neon Horizon。"
  • "写一个购物清单,包含鸡蛋、牛奶和咖啡。"
  • "给我看灯塔照片,全屏。"
  • "二十分钟后提醒我伸展一下。"
  • "什么占用的内存最多?"
  • "在 Interceptor 中开始一场日落时分的快速追逐。"
  • "删除 City Lights 照片。"(它会先问你。)
  • "你对我了解多少?"

使用桌面

  • 点击任务栏中间的圆环,或轻触 Super,打开开始菜单,然后输入以搜索。
  • 点击任务栏按钮可打开、聚焦或最小化应用程序;中键点击会打开另一个窗口。点击时钟查看日历。
  • 双击桌面图标即可打开。右键点击桌面可更改壁纸。
  • 将窗口拖到屏幕顶部可最大化,或拖到一侧以填满那一半(或按 Super+Left/Right/Up/Down)。Super+D 显示桌面,Alt+Tab 切换窗口,Alt+F4 关闭一个窗口。
  • 删除的项目会进入 Trash,即第一个桌面图标:将桌面项目拖到它上面,或在 Files 中按 Delete(Ctrl+Z 可将其恢复,Shift+Delete 则永久删除)。打开它以将项目恢复到原处,或清空它。
  • 任务栏上的扬声器图标可设置音量(在其上滚动);旁边的网络图标列出可加入的 Wi-Fi 网络。

你的文件位于 /home/user,在重启和重建后保留在 target/veda/home.img 上(--fresh-home 会重新开始)。

构建兼容代理的应用程序

代理支持是 vui 应用程序平台的一部分。应用程序描述其操作、报告其状态并执行操作;vui::run 将其注册到代理服务,并在帧之间应答代理:

use vui::agent::{self, Action, AppAgentInfo, Risk, Value, arg_path, arg_str, object, show_path};

impl vui::App for Notes {
    fn update(&mut self, ui: &mut vui::Ui) { /* ... */ }

    fn agent_info(&self) -> Option<AppAgentInfo> {
        Some(agent::info(
            "A notes app: one note per file in ~/Notes.",
            vec![
                Action::new("add_line", "Adds a line at the end of the note shown")
                    .param("text", "string", "The line", true)
                    .build(),
                Action::new("delete_note", "Deletes a note for good")
                    .param("path", "string", "The note's file, such as ~/Notes/Ideas.txt", true)
                    .risk(Risk::Destructive)
                    .build(),
            ],
        ))
    }

    fn agent_state(&self) -> Value {
        object! { "note" => self.title.as_str(), "lines" => self.lines.len() }
    }

    fn agent_invoke(&mut self, action: &str, args: &Value) -> Result<Value, String> {
        match action {
            "add_line" => { self.append(arg_str(args, "text")?); Ok(object! { "lines" => self.lines.len() }) }
            "delete_note" => {
                let path = arg_path(args, "path")?;
                self.delete(&path).map_err(|e| format!("{} could not be deleted: {e}", show_path(&path)))?;
                Ok(object! { "deleted" => show_path(&path) })
            }
            other => Err(format!("Notes has no action called {other}")),
        }
    }
}

为语言模型编写操作描述:简短、命令式,并明确说明单位和默认值。声明每个操作的风险,明确命名其目标(已批准的操作可能会在几分钟后运行),并让它通过与键盘和鼠标相同的代码运行。同意、记忆和对话是系统的职责,而不是应用程序的职责。参见 使应用程序兼容代理。

测试

cargo xtask test

这会在主机上运行库的单元测试,然后以无头模式启动 Veda,并运行 systest 集成测试(IPC、内存、线程、文件系统、窗口系统的崩溃恢复、C 和 C++ 程序)。任何 panic 都会导致运行失败。

cargo xtask test --ui

这会添加 tests/ui/ 中的 GUI 脚本和 tests/agent/ 中的代理脚本。它们点击浏览桌面和应用程序,检查日志和截图,并以多种方式破坏模拟的 Wi-Fi 网络,以检查 Veda 能否自行恢复。需要 GCC 的脚本在没有 C 工具链时会被跳过。

代理的脚本在主机上针对 Deepgram 的替身运行,因此它们是确定性的、离线的且免费的。它们涵盖对话、函数调用、中断、回声、同意、在音乐中通过名字唤醒以及每个应用程序的操作。tests/real/ 与真实的 Deepgram 通信(密钥在 DEEPGRAM_API_KEY 中),在虚拟麦克风中使用合成语音。

网络有其自己的主机测试:802.11 及其密码学针对已发布的测试向量,TCP/IP 通过模拟电缆,以及 TLS 针对 rustls 服务器和真实证书链。在 Veda 内部,nettest 检查 DNS、TCP、HTTP、HTTPS 和 ping。

运行一个脚本,或者无头启动并保存 target/veda/screen.png:

cargo xtask script tests/agent/wake-name.vts
cargo xtask shot --wait 20

每次运行都会将串口控制台(内核日志和每个程序的输出)保存到 target/veda/serial.log。

仓库布局

路径 内容
services/agent/、lib/agent/ 该 agent:对话、名称监听器、函数、同意与记忆;其逻辑(Deepgram 的协议、指令、唤醒词、回声门控)位于 lib/agent
boot/ vboot,UEFI 引导加载程序
kernel/ vkernel,微内核,包含 hypervisor 和 IOMMU 驱动
services/ init(服务注册表、启动器、进程身份)、vfs、devmgr(PCI)、compositor、audio、agent、netd(网络)、wlan(Wi-Fi)、drivervm(驱动 VM 的监视器)
drivers/ Veda 自有的驱动:virtio-blk、ahci 和 nvme
lib/ 共享库:系统调用 ABI 与运行时、IPC 与服务协议、POSIX 层、2D 图形、字体与图像、vui 工具包、OpenGL ES 与 GLSL、网络与 TLS、音频、agent 的逻辑等等
apps/ 桌面 shell 和应用程序;Interceptor 的游戏可在宿主机上测试,位于 interceptor/game
guest/ 驱动 VM 的程序:其 init、Veda 为 Linux 提供的驱动(input、alsa、net、wifi、kms)、OpenGL ES renderer,以及 logkeeper(U 盘的日志)
ports/ 带有 Veda 补丁的上游发布版:用于 C 工具链的 GCC、binutils、GMP、MPFR、MPC 和 musl,以及用于驱动 VM 的 Linux
tests/ systest 和 nettest(系统内测试)、C 和 C++ 测试程序、GUI 和 agent 脚本
tools/ 在构建时生成壁纸、图片和音乐的宿主机程序,以及 airsim(模拟 Wi-Fi)
xtask/ 构建系统:交叉编译、磁盘镜像、QEMU、自动化、Deepgram 的替身
third_party/ 带有 Veda 补丁的 vendored crate(smoltcp)
assets/ 字体和应用程序清单
docs/ 文档、README 的截图,以及图标和社交预览图(docs/icon/)
website/ www.vedaos.org,一个静态页面

文档

  • 该 agent:语音 agent、其函数、同意与记忆,以及应用程序如何变得兼容 agent。
  • 架构:系统如何组合在一起。
  • 网络:网络与 Wi-Fi 服务、模拟 Wi-Fi 环境、安全与测试。
  • Veda 上的 C:编写、编译和运行 C 程序、POSIX 层,以及工具链如何构建。
  • 驱动 VM:hypervisor、平台、桥接、IOMMU 和设备。
  • 开发:构建命令、系统镜像、编写应用程序、性能说明。
  • 编码约定。

许可证

版权所有 © 2026 Vahid Mohammadi。

Veda 是自由软件:你可以根据自由软件基金会发布的 GNU 通用公共许可证第 3 版条款重新分发和/或修改它(见 LICENSE)。分发它是希望它有用,但不提供任何保证;甚至没有适销性或特定用途适用性的默示保证。

其他部分保留各自的许可证:

  • 字体(Inter、Lato、JetBrains Mono):SIL 开放字体许可证 1.1;见 assets/fonts/。
  • 驱动 VM 的 Linux 加载到设备中的设备固件(ports/linux/firmware.txt)运行在设备上,而非 Veda 中。它未经修改地来自 Linux 固件集合,遵循其 WHENCE 为每个文件制作者给出的条款(他们允许再分发),并来自 Sound Open Firmware 的发布版(sof-bin:Intel 签名的音频 DSP 固件构建,遵循 BSD 许可证及其 LICENCE.Intel 中的 Intel 专利许可)。
  • Vendored 代码保留自己的许可证;见 third_party/。
  • C 工具链 镜像可能包含:GCC 和 binutils,采用 GPL 第 3 版或更高版本(GCC 运行时库附带其运行时库例外条款,因此 GCC 构建的程序保留自己的许可证),GMP、MPFR 和 MPC 采用 LGPL 第 3 版或更高版本,musl 采用 MIT 许可证。其源代码是 ports/*/port.toml 所指的上游发布版本,补丁就在旁边。

来源:Hacker News · github.com