目录

文档 / 开始 / 第一个 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.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 的开发工具。工具现在不公开。想要开发工具,请联系我们。

下一步

你的动作要联网、要花钱、要发消息时,先读 守门人和风险档。