人間とエージェントのために作られた Spaces CLI

TL;DR

Mistral AI は Spaces をリリースしました。これは、開発者がわずか3つのコマンドでマルチサービスプロジェクトを作成、実行、デプロイできるコマンドラインインターフェースであり、すべての対話型プロンプトにフラグまたは設定ファイルの同等機能を持たせることで、自律型AIエージェントが手動介入なしでツールを使用できるように設計されています。

優れた開発者体験とは何か

Spaces は、反復的なセットアップ作業を排除することに焦点を当てています。適切なディレクトリレイアウトを選択し、設定ファイルを自動生成し、サービスを相互に接続することで、以下のコマンドを実行した後、新しいプロジェクトがホットリロード、データベース、Dockerfile を備えて実行可能になります:

$ spaces init my-project
$ cd my-project
$ spaces dev

このCLIはコマンドを3つの機能的なカテゴリにグループ化しています:

  • スキャフォールディング – プロジェクト構造を作成し、質問をし、オプションを表示します。
  • 開発 – 単一の spaces dev コマンドで内部開発ループを実行します。
  • 運用 – 明示的な確認を必要とする本番レベルのアクションを実行します。

2番目のユーザー(AIエージェント)のための設計

AIコーディングエージェントが init の対話型TUIピッカーを使用しようとしたとき、生のANSIエスケープコードに遭遇し、UIを操作できませんでした。簡単な修正は --components フラグを公開することでしたが、より深い洞察は、CLIが要求するすべての情報には、非対話型の表現が必要であるということでした。

フラグを普遍的な契約として

各対話型の質問は契約を表します:CLIは続行するために値が必要です。フラグ、設定ファイル、またはデフォルトを提供することで、入力の方法に関係なく同じビジネスロジックが実行されます。実装例:

def init_command(
    components: str | None = Option(None),
    yes: bool = Option(False, "-y"),
):
    if components:
        selected = components.split(",")
    elif yes:
        selected = get_defaults()
    else:
        selected = show_picker()
    create_project(selected)

-y フラグは、呼び出し元がすべての必要なデータをプログラムで提供することを示し、必要な入力が欠落している場合、stdinでハングする代わりにCLIが大声で失敗します。

エンドツーエンドのエージェントワークフロー

エージェントは現在、次のことができます:

  1. spaces --help を実行してコマンドシグネチャを発見します。
  2. config.yamlcontext.json を自動生成します。
  3. 人間の介入なしにDockerfile、レジストリ設定、CIパイプラインを配線します。
  4. リポジトリをKoyeb上の Space として10分以内にデプロイします。

各対話型プロンプトにはフラグの同等機能があるため、エージェントは開始からデプロイまで自律的に動作します。

インターフェースレイヤーとしての構造化データ

Spaces は、各モジュールがハードコードされたロジックではなくデータモデルで記述されるプラグインシステムを使用します:

class ModulePlugin(BaseModel):
    type_id: str
    category: str
    default_port: int
    def get_env_vars(self) -> list[EnvVarDef]: ...
    def get_dev_command(self, port: int) -> str: ...

プラグインはイントロスペクト可能で、JSONにシリアライズ可能で、差分を取ることができます。人間はTUIピッカーを介して対話し、エージェントはレジストリをクエリしてJSONを受け取ります。新しいモジュールを追加するには、新しいプラグインクラスが必要なだけで、ピッカー、Dockerfileジェネレーター、composeテンプレートにわたる重複した更新が不要になります。

エージェントへのコンテキスト提供

Spaces は、init のたびに2つのファイルを生成します:

  • context.json – プロジェクトのモジュール、ポート、コマンド、環境変数のスナップショット。
  • AGENTS.md – LLM向けの明示的な手順書。例:「データベースの変更をテストする前に mycli dev --migrate を実行してください。」

これらの成果物はエージェントに信頼できる情報源を提供し、推測を減らし、間違ったポートの使用や重複した依存関係のインストールなどの間違いを防ぎます。コンテキストファイルはキャッシュバスターとしても機能し、プロジェクト設定が変更されるたびに自動的に更新されます。

暗黙の状態の排除

暗黙の仮定(現在の作業ディレクトリに依存するなど)は、エージェントの自動化を壊します。修正は、適切なフォールバックを使用してすべての状態を明示的にすることです:

# 以前
config = load_config(Path.cwd() / "config.yaml")
# 以後
config = load_config(
    path or find_config_in_parents(Path.cwd())
)

CWD、環境変数、ドットファイルの場所を明示的にすることは、エージェントの信頼性と人間のスクリプト作成の両方を向上させます。

エージェントフレンドリーなプラクティスのチェックリスト

  • すべての対話型入力には対応するフラグがあります。
  • フラグはヘッドレス実行のためのスマートなデフォルトを提供します。
  • すべての状態(パス、環境変数、設定)は明示的に渡されます。
  • プラグインは純粋なデータモデルであり、自動的にイントロスペクト可能です。
  • context.jsonAGENTS.md はエージェントに構造化されたプロジェクトの説明を提供します。

これがすべての人のためのツールを改善する理由

エージェント指向の設計を追加しても、人間の体験は低下しません:TUIピッカー、スピナー、確認ダイアログは変更されません。代わりに、エージェントに必要な制約(明示的な入力、フラグベースの契約、構造化されたメタデータ)は、CLIを開発者にとってより構成可能で、スクリプト可能で、テスト可能にします。

Mistral AI は、開発者ツールの作成者に対し、すべての input() 呼び出し、CWDの仮定、人間専用の出力を監査し、非人間プロセスが同じインターフェースを使用できるかどうかを問うことを推奨しています。これらの質問に対処することで、人間とエージェントの両方にとってより堅牢なツールが得られます。


Spaces CLI は、Mistral AI の Lorenzo Signoretti、Riwa Hoteit、Sam Fenwick によって、Applied AI チームのフィードバックを受けて構築されました。

Sources