AIエージェントプラットフォーム「AgentSea」を試す
AgentSea
ビルダーのための高度なエージェントツールキット
私たちのツールは、それぞれ一つのことを非常にうまく行うように設計されている。Unixマシンでsed、awk、grep、ps、topを使うように、混ぜて使ったり、一緒に使ったり、個別に使ったりできる。Githubでは、どのような使用例にも対応するMITライセンスが無料で提供されている。
SurfKit
エージェントをローカル、コンテナ、クラウドで構築、実行し、デバイスに接続することができる。ToolFuse
エージェントが環境を観察し対話するために使用できるエージェントツールを構築するための堅牢なライブラリ。AgentD
AIエージェントがデスクトップOSにアクセスできるようにする強力なデーモン。HTTP API経由でデスクトップを公開し、デスクトップとAI駆動型アプリとのシームレスなインタラクションを可能にする。AgentDesk
AgentDを搭載したVMをクラウドまたはローカルで起動し、Toolインスタンスとして実行するライブラリ。DeviceBay
ファイルシステム Playwright ブラウザやデスクトップのように、エージェントが使用できるデバイスのプラグイン可能なインスタンスをセットアップできる。ToolFuseを介して動作する。ThreadMem
マルチロール永続スレッドを構築するためのライブラリ。エージェントはこのライブラリを使って LLM や MLLM と通信する。MLLM
マルチロール持続スレッドを介してマルチモーダル大規模言語モデルと通信するためのライブラリ。Taskra
AIエージェント用のタスク管理システム。
AgentSeaプラットフォームにディープダイブ
AgentSeaは、エージェントのためのオープンソースプラットフォームである。どこでもエージェントを実行、構築、展開するために使用するUNIXライクなツールのコレクションである。
パズルの最高かつ最も重要なピースはSurfkitだ。 エージェントのためのKubernetesだと思ってほしい。ローカルプロセス、Dockerコンテナ、またはGCP/Amazonのクラウドでエージェントを立ち上げることができる。
エージェントをパッケージ化し、起動させれば、「Airbnbにアクセスして、7月15日から20日の間だけ、ロンドンで300ドル以下の場所とアパートメントを全部探してきてくれ」といったタスクをこなしてくれる。
エージェントは、デバイスやトラッカーに接続する。 デバイスとは、ファイルシステム、プレイライト・ブラウザ、デスクトップなど、エージェントが扱えるものであれば何でもいい。
私たちがリリースする最初のデバイスは大きなもので、マウスクリックやキーコマンドなどを送信することでエージェントがコントロールできる完全な仮想デスクトップだ。
我々の最初のプロトタイプのアルファエージェントは、GUIサーフィンの達人、SurfpizzaとSurfSlicerだ。 これらは、GUIをナビゲートするために純粋なマルチモーダル・アプローチを使っている。 つまり、Playwrightとは異なり、デスクトップやインストールされたアプリなどと対話することができる。彼らは画面を見て、次に取るべきアクションを見つけ出す。
なるほど、複数のコンポーネントを組み合わせるところはUNIXライクでK8Sライクかもしれない。
いくつかのコンポーネントはより詳細な説明がある。
SurfKit
SurfKit は、エージェントのための完全な Kubernetes スタイルのオーケストレータを提供する。ローカル、コンテナ、クラウドでエージェントをビルドして実行し、デバイスに接続してタスクを実行させることができる。
- GCPまたはAmazonでモデルを起動する
- 複数のエージェントを同時に起動し、すべてのエージェントを追跡する。
- Playwrightブラウザ、フル仮想デスクトップ、ファイルシステムなど、リモートまたはローカルのツールにエージェントをアタッチする。
ToolFuse
ToolFuseは、LLMベースのエージェントツールを構築するための堅牢なライブラリを提供する。ツールやそのアクションや観察を定義するためのシンプルなインターフェイスを提供する。
ツールは、データの取得、デスクトップの操作、計算、ファイルへの書き込みなどに使用できる。
ToolFuseは、次のことに重点を置いている:
- モデルに対して、どのツールが使用可能か、またそのツールの能力は何かを示す。
- モデルの応答に基づいて、許可されたアクションを実行する方法
- エージェントのアクションに関するルールを強制する
AgentDesk
AgentDeskは、AIエージェントによってプログラム制御可能なフル機能のデスクトップ環境を提供する。
AgentDeskは、ローカルとクラウドでVMを実行し、Python SDKとCLIを使って制御することができる。これにより、AgentDeskはGUIベースのエージェントのための強固な基盤となる。
DeviceBay
Devicebayは、ファイルシステム、Playwrightブラウザ、デスクトップなどのデバイスをエージェントにアタッチすることができる。
私たちの最初の主要なデバイスは、エージェントがTeamviewerをコントロールするようにコントロールする完全な仮想Linuxデスクトップだが、マウスクリックやキーコマンドの送信はエージェントが担当する。
QEMU、GCP、AWS経由でデスクトップをアタッチすることができる。
AgentSeaは何が他と違うのか?
- ほとんどのチームは、LLMとの対話、データロード、RAGに集中している。 我々はそれ以外の全てに取り組んでいる。
- 我々はUNIXの哲学である、一つのことをうまくやるということを支持している。 それぞれのツールは一つのことをする。 別々に使ってもいいし、一緒に使ってもいい。 sed、awk、grep、top、psを考えてほしい。
- 相互運用性。 LlamaIndexやLangChainが好きなら、それらも使おう。
最後に、LLMはインテリジェントなアプリにとって最も重要な部分であると同時に最も重要でない部分でもあると我々は感じている。- 我々は、LLMをホットスワップ可能な頭脳やLinuxカーネルのようなものだと考えている。 LLMがより良く、より速く、より賢くなったときでも、LLMの周りでコーディングしたものはすべて役に立つはずだ。 入れ替えれば、少しの調整ですぐにアップグレードできる。
- 人々が好きなようにソフトウェアを使うことができる、最もシンプルで優れたOSSライセンスであるMITライセンスで全て提供されている。商用アプリを作るか、上流に貢献するか。それはあなたの選択だ。
コンポーネントが多いのでどこから手を付けたらいいのかちょっとわかりにくいけど、SurfKitがどうやらコアなコンポーネントの様子。
QuickStartに従って進めてみる。今回はローカルのMacで。仮想環境を作っておくこと。
SurfKitをインストール
$ pip install surfkit
エージェントをインストールする。AgentSeaではHubにあらかじめエージェントが用意されている様子。Hubにあるエージェントはsurfkit find
で確認できる。
$ surfkit find
Name Kind Description Supports Tags Source
------------------------- --------- ------------------------------------------------- ---------- ------ ---------------------------
pbarker/SurfPizza TaskAgent A GUI surfer which slices up the screen desktop gui https://api.hub.agentsea.ai
mariyadavydova/SurfSlicer TaskAgent A GUI surfer which zooms and slices up the screen desktop gui https://api.hub.agentsea.ai
現時点ではSurfPizzaとSurfSlicerというエージェントがある様子。ちなみにドキュメントのトップに、Hubにあるエージェントの説明がある。
- SurfPizza: 画面をスライスして探索するエージェントで、マルチモーダルモデルに合成結果を返すことで、次に進むべき場所を選ぶことができる。
- SurfSlicer: スクリーンを領域を示すドットに分割し、マルチモーダルモデルは探しているものに最も近いドットを選び、ズームインしてターゲットをゼロにする。
- SurfNinja(近日公開): 精密ベースの第2世代AIエージェント。
- SurfMonsta(近日公開): 最高のパフォーマンスを誇るエージェント。SurfSlicerリージョン、GUIのバウンディングとセグメンテーションのためのSAMモデル、テキストの位置決めのためのOCR、マルチモーダルモデルに最適な解像度を与えるために画像の小さなスライスをアップスケールするためのGANなど、多くの我々の技術を組み合わせている。
一般的なエージェントフレームワークの「エージェント」といえば、何かしらのペルソナ的な役割をもたせるもの、というイメージがあるが、AgentSeaにおいてはどちらかというとケイパビリティをもたせたもの、現時点ではデスクトップやブラウザの自動操作を行うものという印象。もう少し見ていくとまた違うかもしれない。
今回はSurfSlicerをエージェントとしてインストールする
$ surfkit create agent -t mariyadavydova/SurfSlicer -n agent01
OpenAIのAPIキーを求められるので入力。なお、出力を見る限り、gpt-4oを使う様子。
This agent requires one of the following LLM API keys:
- OPENAI_API_KEY
Would you like to enter an API key for 'gpt-4o' [y/N]: y
OPENAI_API_KEY: sk-XXXXXXXXXXXXX
エージェントはDockerコンテナになっている様子。
Running agent 'mariyadavydova/SurfSlicer' with runtime 'docker' and name 'agent01'...
Pulling Docker image 'us-central1-docker.pkg.dev/agentsea-dev/guisurfer/surfslicer:latest'...
Status update for latest: Pulling from agentsea-dev/guisurfer/surfslicer
Layer fb784af4aeda: 100%|██████████████████████████| 12376835/12376835 [00:10<00:00, 1207529.55it/s]
Layer 1103112ebfc4: 100%|█████████████████████████████| 3507699/3507699 [00:09<00:00, 352668.03it/s]
Layer 8a1e25ce7c4f: 100%|██████████████████████████| 29124181/29124181 [00:09<00:00, 2966172.87it/s]
Layer 043e7f3dd05a: 100%|█████████████████████████████████████████| 245/245 [00:07<00:00, 34.29it/s]
Layer 538a89c93346: 100%|█████████████████████████████| 3364108/3364108 [00:05<00:00, 655255.89it/s]
(snip)
しばらく待っていると、、、失敗した。
waiting for agent to be ready...
waiting for agent to be ready...
waiting for agent to be ready...
Failed to run agent: Container 'agent01' did not pass health check
Container 'agent01' does not exist.
waiting for agent to be ready...
中にdocker ps
で見た感じだと、9090番ポートで待ち受けていたみたいだけども、ヘルスチェックが通らなかったっぽい。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
18e5ef3a99d4 us-central1-docker.pkg.dev/agentsea-dev/guisurfer/surfslicer:latest "poetry run python -…" About a minute ago Up About a minute 0.0.0.0:9090->9090/tcp agent01
もう一度やってみたけど同じだった。ポートがバッティングしているというようなこともない。
ドキュメントを再度確認してみると、こういう記載がある。
If you are using Docker Desktop on MacOS, please update the settings: go to
Settings | Advanced
and make sure that the checkboxAllow the default Docker socket to be used (requires password)
is checked. Save the settings, apply and restart.
Docker Desktopの設定を確認してみる。
問題なし。
んー、ちょっとわからない。Docker Desktopのバージョンが最新でなかった(4.23.0。最新は4.31.0)ので一旦バージョンアップして再トライしてみるか。それでもダメならUbuntuサーバの方でやり直してみるかなー。
Docker Desktopのバージョンが最新でなかった(4.23.0。最新は4.31.0)ので一旦バージョンアップして再トライしてみるか。
バージョンアップしたら、ヘルスチェックは通るようになった。ただバージョンアップでそれが改善したのかどうかはわからない。あとなんとなくエラーっぽい出力が見える。
waiting for agent to be ready...
waiting for agent to be ready...
waiting for agent to be ready...
Health check passed for 'agent01'
Failed to run agent: (sqlite3.IntegrityError) UNIQUE constraint failed: agent_instances.name
[SQL: INSERT INTO agent_instances (id, name, full_name, type, runtime_name, runtime_config, version, status, tags, labels, port, icon, owner_id, created, updated) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]
[parameters: ('2b81da2d-a1bb-48a3-8225-fc2de18dd568', 'agent01', None, '{"version":null,"kind":"TaskAgent","id":"a8a56888-65db-4f9e-b919-990a3a23eb49","name":"SurfSlicer","description":"A GUI surfer which zooms and slices ... (584 characters truncated) ... "cpu":"2","memory":"4Gi"},"llm_providers":{"preference":["gpt-4o"]},"devices":[],"meters":[],"tags":["gui"],"labels":{},"namespace":"mariyadavydova"}', 'docker', '{"timeout":null}', 'latest', 'running', '[]', '{}', 9090, None, None, 1718943202.543777, 1718943202.543778)]
(Background on this error at: https://sqlalche.me/e/20/gkpj)
INFO:mllm.router:loading models with preference: ['gpt-4o']
INFO:mllm.router:Found LLM provider 'gpt-4o' API key in environment variables.
INFO:uvicorn.error:Will watch for changes in these directories: ['/app']
INFO:uvicorn.error:Uvicorn running on http://0.0.0.0:9090 (Press CTRL+C to quit)
INFO:uvicorn.error:Started reloader process [1] using WatchFiles
Intialized router with Routing strategy: simple-shuffle
Routing fallbacks: None
Routing context window fallbacks: None
Router Redis Caching=None
INFO:mllm.router:loading models with preference: ['gpt-4o']
INFO:mllm.router:Found LLM provider 'gpt-4o' API key in environment variables.
INFO:watchfiles.main:147 changes detected
INFO:uvicorn.error:Started server process [18]
INFO:uvicorn.error:Waiting for application startup.
INFO:uvicorn.error:Application startup complete.
INFO:uvicorn.access:192.168.65.1:16451 - "GET /health HTTP/1.1" 200
んー、どうもエージェントは内部のDBで管理されるぽいのだけど、ここまででエージェントのインストールに失敗した際に、どうもエージェント名が既に登録されている、ってことでエラーになってるような気がするな。エージェント自体は起動しているように思える。
surfkit list agents
でインストールされているエージェントの一覧を見るとたしかに存在している。
$ surfkit list agents
Name Kind Type Runtime Status Port
------- --------- ------------------------- --------- -------- ------
agent01 TaskAgent mariyadavydova/SurfSlicer docker running 9090
ちょっと気持ち悪いのでエージェントを一旦削除してみる。Usageを見るとdelete
がある。
$ surfkit --help
Usage: surfkit [OPTIONS] COMMAND [ARGS]...
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --debug -d Enable debug mode │
│ --install-completion [bash|zsh|fish|powershell|pwsh] Install completion for the specified shell. [default: None] │
│ --show-completion [bash|zsh|fish|powershell|pwsh] Show completion for the specified shell, to copy it or customize the installation. │
│ [default: None] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ build Build an agent container │
│ config Retrieve tracker logs │
│ create Create resources │
│ delete Delete resources │
│ find Find an agent │
│ get Get resources │
│ list List resources │
│ login Login to the hub │
│ logs Resource logs │
│ new Create a new agent repo │
│ publish Publish an agent │
│ solve Use an agent to solve a task │
│ version Show the version of the CLI │
│ view View resources │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
$ surfkit delete agent agent01
Successfully deleted container: agent01
Agent 'agent01' deleted
ということで再度エージェントインストール。
$ surfkit create agent -t mariyadavydova/SurfSlicer -n agent01
うまく行けた模様。
waiting for agent to be ready...
waiting for agent to be ready...
waiting for agent to be ready...
Health check passed for 'agent01'
Successfully created agent 'agent01'
$ surfkit list agents
Name Kind Type Runtime Status Port
------- --------- ------------------------- --------- -------- ------
agent01 TaskAgent mariyadavydova/SurfSlicer docker running 9090
次にエージェントが操作するデバイスの作成。デバイスは以下の3つから選択できる。
- QEMU
- AWS EC2
- GCP GCE
それぞれ事前にセットアップが必要になる。EC2やGCEのほうが有料にはなるが環境汚さなくて簡単に捨てれそうで良さそうな印象だし、QEMUあんまりしらないのだけどなんとなく環境に影響されそうな気もしているが、一旦QEMUで。QEMUのインストール手順はここにある。
うちはHomebrewが入っているので以下でOKだった。
$ brew install qemu
$ qemu-system-x86_64 --version
QEMU emulator version 9.0.1
Copyright (c) 2003-2024 Fabrice Bellard and the QEMU Project developers
ではデバイスを作成する。
$ surfkit create device --provider qemu -n desktop01
ディスクイメージがダウンロードされる。
Creating desktop 'desktop01' using 'qemu' provider
Downloading image 'https://storage.googleapis.com/agentsea-vms/jammy/latest/agentd-jammy.qcow2'...
起動するまで待つ。
No encryption key found. Generating a new one. This key will be stored in ~/.agentsea/keys/agentdesk_encryption_key
waiting for desktop to be ready...
waiting for desktop to be ready...
waiting for desktop to be ready...
うーん、待てど暮らせど終わらない。。。。一旦止めてやり直してみたけども変わらず。Apple Siliconだから、とかあるのかなぁ、色々見てるとサポートしているようには思えるのだけど。QEMUあんまり知らないんだよなぁ・・・・
ということで諦めてEC2にする。EC2を使う場合の設定手順は以下。
自分の場合は既にAWS CLIが使える環境ができているので基本的に作業不要だった。
では改めて。
$ surfkit create device --provider ec2 -n desktop01
Creating desktop 'desktop01' using 'ec2' provider
Key pair 'desktop01' successfully imported.
(snip)
Exception: No default VPC found in this region.
んー、デフォルトVPCがない?デフォルトのリージョンはap-northeast-1でデフォルトVPCはあるのだけども。。。。
$ aws ec2 describe-vpcs
{
"Vpcs": [
{
"CidrBlock": "172.31.0.0/16",
"DhcpOptionsId": "dopt-XXXXXXXX",
"State": "available",
"VpcId": "vpc-XXXXXXXXXXXXXXXX",
"OwnerId": "XXXXXXXX",
"InstanceTenancy": "default",
"CidrBlockAssociationSet": [
{
"AssociationId": "vpc-cidr-assoc-XXXXXXXX",
"CidrBlock": "172.31.0.0/16",
"CidrBlockState": {
"State": "associated"
}
}
],
"IsDefault": true,
"Tags": [
{
"Key": "Name",
"Value": "default"
}
]
},
Tracebackを見ているとどうもus-east-1に作ろうとしているぽく見える。
│ ╭───────────────────────────────── locals ──────────────────────────────────╮ │
│ │ _provider = <agentdesk.vm.ec2.EC2Provider object at 0x10e091250> │ │
│ │ cpu = 2 │ │
│ │ data = V1ProviderData(type='ec2', args={'region': 'us-east-1'}) │ │
│ │ disk = '30gb' │ │
│ │ image = None │ │
│ │ load_provider = <function load_provider at 0x10e7176a0> │ │
│ │ memory = 4 │ │
│ │ name = 'desktop01' │ │
│ │ provider = 'ec2' │ │
│ │ reserve_ip = False │ │
│ │ type = 'desktop' │ │
│ │ V1ProviderData = <class 'agentdesk.server.models.V1ProviderData'> │ │
│ ╰───────────────────────────────────────────────────────────────────────────╯
そういえばus-east-1にデフォルトVPCはなかった。
CLIのUsage見る限りはここを手動で変更する方法は見当たらない。
$ surfkit create device --help
Usage: surfkit create device [OPTIONS]
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --name -n TEXT The name of the desktop to create. Defaults to a generated name. [default: None] │
│ --type -t TEXT The type of device to create. Options are 'desktop' [default: desktop] │
│ --provider -p TEXT The provider type for the desktop. Options are 'ec2', 'gce', and 'qemu' [default: qemu] │
│ --image TEXT The image to use for the desktop. Defaults to Ubuntu Jammy. [default: None] │
│ --memory INTEGER The amount of memory (in GB) for the desktop. [default: 4] │
│ --cpu INTEGER The number of CPU cores for the desktop. [default: 2] │
│ --disk TEXT The disk size for the desktop. Format as '<size>gb'. [default: 30gb] │
│ --reserve-ip --no-reserve-ip Whether to reserve an IP address for the desktop. [default: no-reserve-ip] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
ということでus-east-1にデフォルトVPCを作成。
$ aws ec2 --region us-east-1 create-default-vpc
再度デバイス作成。
$ surfkit create device --provider ec2 -n desktop01
ClientError: An error occurred (AuthFailure) when calling the RunInstances operation: Not authorized for images:
[ami-XXXXXXXXXXXX]
今度は違うエラーが。。。。うーん、イメージが公開されていないのか????
しょうがないのでGCPにする。手順は以下。GCPのアカウントはあったけど、Google-Cloud-SDKは設定してなかったので設定する。
- GCPコンソールから新規プロジェクト作成。今回は
agentsea-test
とした - 作成したプロジェクトでCompute Engine APIを有効化
- HomebrewでGoogle−Cloud−SDKをインストール
$ brew install --cask google-cloud-sdk
- Google−Cloud−SDKの設定(
gcloud init
)- ブラウザ経由でログイン(
You must log in to continue. Would you like to log in (Y/n)? Y
) - 作成したプロジェクトを選択(
Pick cloud project to use:
) - デフォルトのComputeリージョンを設定(
Do you want to configure a default Compute Region and Zone? (Y/n)?
)- 今回は
asia-northeast1-a
を選択
- 今回は
- ブラウザ経由でログイン(
- 設定確認
$ gcloud config configurations list
NAME IS_ACTIVE ACCOUNT PROJECT COMPUTE_DEFAULT_ZONE COMPUTE_DEFAULT_REGION
default True XXXX@XXXXX agentsea-test asia-northeast1-a asia-northeast1
- CLIのデフォルトのクレデンシャルの作成
$ gcloud auth application-default login
- プロジェクトの設定
$ gcloud config set core/project agentsea-test
$ export GOOGLE_CLOUD_PROJECT=agentsea-test
- 確認
# アカウントが表示されてACTIVE(*)になっていること
$ gcloud auth list
# 該当のプロジェクトでCompute Engine APIが有効になっていること
$ gcloud services list --enabled | grep compute.googleapis.com
# 作成したプロジェクトが設定されてデフォルトになっていること
$ gcloud config list
では再度デバイスを作成。
$ surfkit create device --provider gce -n desktop01
成功したーーーー
waiting for desktop to be ready...
waiting for desktop to be ready...
waiting for desktop to be ready...
successfully created desktop 'desktop01'
us-central-1aに作成されているらしい。デフォルトリージョンの設定はあんまり関係ないのかもね。
トラッカーの作成。トラッカーは、Dockerコンテナ内でタスクを追跡するタスクサーバーらしい。
$ surfkit create tracker -n tracker01 -r docker
イメージがダウンロードされる
Pulling Docker image 'us-central1-docker.pkg.dev/agentsea-dev/taskara/api:latest'...
Layer 14aea17807c4: 40%|██████████▋ | 1048576/2647113 [00:00<00:00, 12376243.13it/s]
完了
Tracker 'tracker01' created using 'docker' runtime
ではいよいよタスクを投げてみる。エージェント、デバイス・トラッカーを指定してsurfkit solve
でクエリを投げる。ドキュメントの例の"French Duck"ってのがピンとこないので変えて、日本語にしてみた。
$ surfkit solve "最も一般的なお米の品種を検索して。" \
--agent agent01 \
--device desktop01 \
--tracker tracker01
何やらエージェントがデバイスに接続しているのと、UI用の別のコンテナが起動しているのがわかる。
Found agent instance 'agent01'
finding device 'desktop01'...
starting proxy to vm...
proxy from local port 8000 to remote port 8000 started...
connected to desktop via agentd
found device 'desktop01'...
viewing device...
creating UI container...
Pulling Docker image 'us-central1-docker.pkg.dev/agentsea-dev/guisurfer/surfkit-ui:latest'...
Status update for latest: Pulling from agentsea-dev/guisurfer/surfkit-ui
Layer 1e60a453843e: 66%|█████████████████ | 32505856/49613402 [00:10<00:05, 3041443.44it/s]
Layer 51cd5f8f608f: 16%|████▎ | 10485760/63994737 [00:09<00:49, 1080501.66it/s]
UIコンテナが起動した
waiting for UI container to start...
ブラウザが立ち上がってこんな画面が表示される。
のだけど、裏でコケてた。。。。
raise SystemError(f"could not connect to desktop, is agentd running? {e}")
SystemError: could not connect to desktop, is agentd running? HTTPConnectionPool(host='localhost', port=8000): Max retries exceeded with url: /health (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x2aaabb4522c0>: Failed to establish a new connection: [Errno 111] Connection refused'))
んー、ログを見る限り、VMへポートフォワードしてるのだけど、ここの接続がうまくできていないっぽいように思える。
一応ポートは応答するようなのだけども。
$ curl localhost:8000/health
{"status":"ok"}
一旦止めて、リトライしてみたけども変わらずだった。
全然関係ないけど、この画面内でデスクトップの操作はできた。おそらくここで自動で操作されている様を見るのだろうと思う。
現時点でのまとめ
まあ開発中ということを置いといても、ちょっと環境への依存度が高いような印象を個人的に持った。DockerやKubernetesあたりのコンポーネントごとに役割・責任をもたせるみたいな思想はいいと思うんだけど、ここの連携でうまくいかないとなると意味がないように思える。
インフラ部分で躓いているので、AIエージェントプラットフォームとしてはそもそも評価できる状況ではない。自分の環境依存なのかもしれないけど、まだ時期尚早と感じた。
後片付け。特にEC2やGCE使う場合はデバイス削除を忘れないように。
$ surfkit list agents
$ surfkit list devices
$ surfkit list trackers
$ surfkit delete agent XXXX
$ surfkit delete device XXXX
$ surfkit delete tracker XXXX
あと途中コケたりしてるのでDockerコンテナが残ってたりもするのでその辺りも消しておく。
$ docker ps
EC2回りのところはissue上げたら修正された様子。