🗂

OpenAI Agent SDKのSwiftクローンを30分で書いた

2025/03/13に公開

https://github.com/fumito-ito/AgentSDK-Swift

書いた。30分で。何を言っているのか分からないと思うが、筆者も何をされたのか分からない。
完璧なテストはしていないが、おおむねの機能は動くようである。

Agent SDK

事の発端はOpenAIからAgent SDKが発表された事である。
https://github.com/openai/openai-agents-python

これはOpenAIが発表した複数エージェントを協働させることにフォーカスしたSDKだ。
役割を定義したAgentを必要な数だけ用意してRunnerに放り込むと、タスクを実行する際にそれぞれの役割を果たしながら出力の精度を上げてくれる。

要はMAGIシステムである。

AnthropicによるModel Context Protocolの制定や、それに伴うMCPサーバーの流行によって話題がさらわれていたところにカウンター気味に出してきた。
MCPもAgent SDKも目指すべきゴールはほぼ同じだが、OpenAIはMCPとは別のアプローチを見せてきたわけである。

PythonにムカついてClaude Codeに丸投げした

しかし、Agent SDKはPythonで書かれている。筆者はiOS畑の人間だ。Swiftが好きである。
OpenAIやAnthropicがPythonやTypeScriptで書かれた公式SDKをリリースするたびに、やりきれない思いを抱えていた。

Swiftで書かせてくれ!

その思いをClaude Codeにぶつけたら、15分くらいで出てきたのが前述のSDKである。
実際には微妙にビルドが通らない成果物が出てきたので、いくつかの修正指示と人間の手による修正が入っている。

だから、書いた時間は30分なのだ。

もともとはVS Code Dev Containersの検証をしていた

Claude Codeは素晴らしいプロダクトだと思うが、自分の環境にダイレクトにインストールするのは怖いというのが筆者の印象であった。

いい感じに仮想化されたサンドボックス内でClaude Codeを暴れさせたいと調べたところ、VS Code Dev Containersに行き着いた。

https://code.visualstudio.com/docs/devcontainers/containers

めちゃくちゃ良かった。今までDockerfileをちまちま手で書いていたのがバカらしくなるようなお手軽さで、左下の >< みたいなボタンをポチッと押せばとりあえず使えるのが体験として最高だった。

筆者はとりあえず次のような雛形をちまちま育てている途中である。

{
    "name": "Swift",
    "image": "swift:6.0",
    "features": {
        "ghcr.io/devcontainers/features/common-utils:2": {
            "installZsh": "false",
            "username": "vscode",
            "upgradePackages": "false"
        },
        "ghcr.io/devcontainers/features/git:1": {
            "version": "os-provided",
            "ppa": "false"
		},
		"ghcr.io/devcontainers/features/github-cli:1": {
			"installDirectlyFromGitHubRelease": true,
			"version": "latest"
		},
        "ghcr.io/devcontainers/features/node:1": {
            "version": "20"
        }
    },
    "mounts": [
        "type=bind,source=${localEnv:HOME}/.ssh,target=/home/vscode/.ssh,consistency=delegated",
        "source=${localEnv:SSH_AUTH_SOCK},target=/ssh-agent,type=bind"
    ],
    "remoteEnv": {
        "SSH_AUTH_SOCK": "/run/host-services/ssh-auth.sock"
    },
    "forwardPorts": [22],
    "runArgs": [
        "--cap-add=SYS_PTRACE",
        "--security-opt",
        "seccomp=unconfined"
    ],
    "postCreateCommand": "chmod 700 ~/.ssh && chmod 600 ~/.ssh/* && npm install -g @anthropic-ai/claude-code",
    // Configure tool-specific properties.
    "customizations": {
        // Configure properties specific to VS Code.
        "vscode": {
            // Set *default* container specific settings.json values on container create.
            "settings": {
                "lldb.library": "/usr/lib/liblldb.so"
            },
            // Add the IDs of extensions you want installed when the container is created.
            "extensions": [
                "swiftlang.swift-vscode",
                "RooVeterinaryInc.roo-cline"
            ]
        }
    },
    // Use 'forwardPorts' to make a list of ports inside the container available locally.
    // "forwardPorts": [],

    // Set `remoteUser` to `root` to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
    "remoteUser": "vscode"
}

Claude Codeは認証する際にブラウザを開こうとするのだが、開くブラウザが存在しない場合などはコンソール上にURLが表示され、別の端末やホストなどでURLを踏むことで認証が成立する仕組みになっていた。

おそらく、Dockerのようなサンドボックス内で利用されることを最初から想定して組み込んでいたのだろう。

Discussion