「AIエージェントキャッチアップ #80 - agentOS」を開催しました

ジェネラティブエージェンツの大嶋です。

「AIエージェントキャッチアップ #80 - agentOS」という勉強会を開催しました。

generative-agents.connpass.com

アーカイブ動画はこちらです。

www.youtube.com

agentOS

今回は、AIエージェントのためのポータブルなオペレーティングシステム「agentOS」をキャッチアップしました。

agentOSのGitHubリポジトリはこちらです。

github.com

Webサイトはこちらです。

www.rivet.dev

ドキュメントはこちらです。

rivet.dev

今回のポイント

agentOSとは

agentOSは、AIエージェントを実行するためのサンドボックスのOSSの1つです。

agentOSの環境は、仮想マシンやコンテナを起動することなく、プロセス内で実行されます。 そのため、起動の高速さやリソースのオーバーヘッドの少なさが特徴とされています。

環境の分離の技術としては、WebAssemblyとV8 isolateが採用されています。

分離された環境で、プロセス管理やファイルシステムなどの機能が仮想的に提供されるようになっています。

実際に動かしてみた

公式ドキュメントのQuickstartの内容を動かしてみました。

www.rivet.dev

まず、サーバー側(server.ts)を実装します。

import common from '@rivet-dev/agent-os-common'
import pi from '@rivet-dev/agent-os-pi'
import 'dotenv/config'
import { setup } from 'rivetkit'
import { agentOs } from 'rivetkit/agent-os'

const vm = agentOs({
  options: { software: [common, pi] }
})

export const registry = setup({ use: { vm } })
registry.start()

次に、クライアント側(client.ts)を実装します。

import 'dotenv/config'
import { createClient } from 'rivetkit/client'
import type { registry } from './server'

const client = createClient<typeof registry>('http://localhost:6420')
const agent = client.vm.getOrCreate(['my-agent']).connect()

// Subscribe to streaming events
agent.on('sessionEvent', (data) => {
  console.log(data.event)
})

// Create a session and send a prompt
const session = await agent.createSession('pi', {
  env: { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY! }
})
await agent.sendPrompt(
  session.sessionId,
  'Write a hello world script to /home/user/hello.js'
)

// Read the file the agent created
const content = await agent.readFile('/home/user/hello.js')
console.log(new TextDecoder().decode(content))

サーバーを起動して、クライアントを実行しました。 すると、エージェントの実行ログが表示され、エージェントが作成した/home/user/hello.jsの内容を確認できました。

デフォルトのファイルシステム

上記の例では、エージェントは/home/user/hello.jsというファイルを作成します。 デフォルトの設定では、インメモリのファイルシステムに書き込まれています。

設定次第でホストのディレクトリをマウントすることもできるようです。

rivet.dev

agentOSの仮想ファイルシステム

一般論として、エージェントが行うファイルシステムの操作がWrite・Readのみであれば、仮想的なファイルシステムを提供するのは比較的難しくないでしょう。

問題は、コマンドを実行した場合でも整合性がとれる挙動をすることです。 コマンドの実行にも対応しようとすると、もはやファイルシステムを実装することになります。

agentOSはまさにそのようなアプローチをとっています。 ファイルシステムを実装することで、Write・Read・コマンド実行のすべてに対して、整合性がとれた挙動を提供しているのです。

具体的には、V8 isolateの環境に、agentOSが実装したプロセス管理やファイルシステムの機能を提供することで、ユーザー空間で仮想的にOSを提供しているようです。

coreutilsの追加

コマンドの実行に対してもうまく動くことを確認するため、coreutilsを追加した設定でエージェントを動かしてみました。

npm install @rivet-dev/agent-os-coreutils

server.tsで、coreutilsを使えるよう設定します。

import common, { coreutils } from '@rivet-dev/agent-os-common'
  :
const vm = agentOs({
  options: { software: [common, pi, coreutils] }
})
  :

client.tsで、作成したファイルをcatコマンドで読み込んでみます。

  :
const result = await agent.exec('cat /home/user/hello.js')
console.log('--- hello.js ---')
console.log(result)
  :

残念ながら、今回試した範囲ではcat: /home/user/hello.txt: Permission deniedというエラーでうまく動作しませんでした。

GitHubに同様のIssueがあがっているため、agent-osの問題のようでした。

github.com

ホストツール

coreutilsのコマンドの追加のように、agentOSではTypeScriptで実装したツールを環境にCLIとして提供する機能があるようです。

rivet.dev

エージェントにツールとして設定するのではなく、自動でCLIツールを環境に配置するのは面白い実装だと思います。

次回のご案内

以上、今回は「agentOS」をキャッチアップしました。

次回は「AIエージェントキャッチアップ #81 - DeepEval」ということで、オープンソースのLLM評価フレームワークがテーマです!

generative-agents.connpass.com

ご興味・お時間ある方はぜひご参加ください!

また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!