介绍
本文档介绍一个 Agent 尝试项目 StarryClaw,目前开发的版本还是一个尝试版本。 目标是为了以后在辰龙机器人上运行一个智能体 Agent。
GitHub 地址
项目地址
https://github.com/chenlongos/StarryClaw开始实验
环境搭建
- PC Ubuntu 24.04
- qemu
- 目标体系 RISC-V (辰龙机器人 SG2002)
- 主机 IP: 192.168.1.8
安装 rustup
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shrust 支持 RISC-V 编译
# 以 riscv64 为例rustup target add riscv64gc-unknown-linux-musl安装交叉编译器
# 在合适的目录下载wget https://musl.cc/riscv64-linux-musl-cross.tgz# 解压tar zxf riscv64-linux-musl-cross.tgz配置编译器环境
export PATH=`pwd`/riscv64-linux-musl-cross/bin:$PATH下载运行 StarryOS
git clone --recursive https://github.com/Starry-OS/StarryOS.gitcd StarryOS编译 RISCV64 版本
make build # 默认 riscv64# 或make ARCH=riscv64 build # 显式指定 riscv64下载建立磁盘
make img ARCH=riscv64我的磁盘在 make/disk.img 位置
运行 StarryOS
make run ARCH=riscv64编译 StarryClaw 并添加到 StarryOS
git clone https://github.com/chenlongos/StarryClawcd StarryClawcargo build --release --target riscv64gc-unknown-linux-musl我使用的是免费的云 Ollama。
所以在 main.rs 里关于免费 Ollama 的配置:
const DEFAULT_OLLAMA_BASE: &str = "http://192.168.1.8:11434/v1";const DEFAULT_OLLAMA_MODEL: &str = "kimi-k2.5:cloud";这两行需要根据你的 Ollama 配置进行修改。ollama 免费配置方法
关于 Ollama 的免费云环境,请参考上面的文档。
注意修改共享IP
这样 qemu里的 StarryOS就可以访问 ollama 的主机ip了。
OLLAMA_HOST=0.0.0.0:11434 ollama serve获取 StarryClaw 二进制文件
StarryClaw/target/riscv64gc-unknown-linux-musl/release/starryclaw制作 disk.img
cd StarryOSmkdir -p mnt sudo mount -o loop make/disk.img mntsudo cp ../StarryClaw/target/riscv64gc-unknown-linux-musl/release/starryclaw mnt/sudo umount mnt运行
make run


为了让 StarryOS 支持 StarryClaw 的中文输入,需要修改代码
+++ b/kernel/src/pseudofs/dev/tty/terminal/ldisc.rs@@ -145,7 +145,8 @@ impl<R: TtyRead, W: TtyWrite> InputReader<R, W> { continue; } - if ch.is_ascii_graphic() {+ // 空格、制表、可打印 ASCII、UTF-8 多字节(>=0x80)均应进入行缓冲(原仅 is_ascii_graphic 会丢掉中文与空格)+ if ch == b' ' || ch == b'\t' || ch.is_ascii_graphic() || ch >= 0x80 { self.line_buf.push(ch); continue; }@@ -173,7 +174,9 @@ impl<R: TtyRead, W: TtyWrite> InputReader<R, W> { b'\n' => self.writer.write(b"\n"), b'\r' => self.writer.write(b"\r\n"), ch if ch == term.special_char(VERASE) => self.writer.write(b"\x08 \x08"),- ch if ch == b' ' || ch.is_ascii_graphic() => self.writer.write(&[ch]),+ ch if ch == b' ' || ch == b'\t' || ch.is_ascii_graphic() || ch >= 0x80 => {+ self.writer.write(&[ch]);+ } ch if ch.is_ascii_control() && term.has_lflag(ECHOCTL) => { self.writer.write(&[b'^', (ch + 0x40)]); }