文档 / 开始 / 第一个 app
第一个 app
从一个空的 crate 开始,写一个 agent 能调的动作。
app 是一包能力加声明。它被调用,不被打开。它返回卡,不自己画屏。
一个 app 是什么
一个目录,里面两样东西:
hello/
app.toml 清单:我是谁、要什么
bin/hello.cwasm wasm 模块,编成了设备的本机码
app 用 Rust 写,编成 wasm32-unknown-unknown。运行时把它装进自己的进程里隔离着跑。app 能用的只有运行时给的函数:联网、存数据、推卡、时间、日志、定时。
建 crate
写 app 的库 qapp 在公开的 qingos-sdk 里。
# Cargo.toml
[package]
name = "hello"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib", "rlib"]
[dependencies]
qapp = { git = "https://github.com/second-state/qingos-sdk" }
写一个能力
一个能力是一个动作。它有名字、一句说明、参数和风险档。
use qapp::prelude::*;
struct Greet;
impl Capability for Greet {
fn spec(&self) -> ToolSpec {
ToolSpec::new("hello.greet", "打个招呼", json!({ "type": "object", "properties": {} }))
.risk(Risk::Local)
.intent("打个招呼")
}
fn call(&self, _args: Value) -> Result<Outcome> {
let card = Card::text("你好,我是 hello。", "你好,我是 hello。");
Ok(Outcome::with_card(json!({}), "打了个招呼", Effect::None, card))
}
}
qapp::main!(|app| {
app.add(Greet);
});
- 名字用 app 的名字开头:
hello.greet。别的开头,运行时登记时丢掉。 Risk::Local是本地可逆的动作,守门人不问。intent是一句本地能认的话。人说「打个招呼」,不用上模型就直接调它。
写清单
# app.toml
[app]
name = "hello"
title = "打招呼"
version = "0.1.0"
command = "bin/hello.cwasm"
network = false
memory_mb = 32
能力不写在清单里。清单只管身份和权限。每个字段见 清单 app.toml。
编译
rustup target add wasm32-unknown-unknown
cargo build --release --target wasm32-unknown-unknown
编出来的 .wasm 到处都能跑:开发机、QEMU、真设备只差编本机码那一步。
把 app 装到真设备上,要用 QingOS 的开发工具。工具现在不公开。想要开发工具,请联系我们。
下一步
你的动作要联网、要花钱、要发消息时,先读 守门人和风险档。