Code StorageはPierre Computer Companyによって構築された、AIエージェント向けの管理されたGitインフラです。SDK、HTTP API、またはGit over HTTPSを通じてリポジトリの作成、コミットの書き込み、ブランチのマージ、GitリモートURLの取得を可能にします。
問題#
AI poweredシステム、特にAIエージェントを構築する際、従来のストレージソリューションは重大な制限に直面します:
- S3/R2の独自ソリューション: 遅くて脆弱で、コラボレーティブなワークロード向けに設計されていない
- 従来のストレージAPI: コラボレーティブな作業のために構築されていない
- Gitプリミティブの複雑さ: チームはPostgresや他のデータストアでGitプリミティブを重複させながら、S3で分岐するスナップショットを管理しようとしている
- パフォーマンスの低下: 現在のソリューションは1日数百万の新しいリポジトリを処理できない
- レート制限と複雑な認証: パブリックAPIにはレート制限と複雑な認証フローがある
AIエージェントにとって、Gitは決定論的で再現可能な状態を提供し、プロンプト、評価、ロールバックでピン留めできるコンテンツアドレス可能なスナップショット、および人間-エージェントコラボレーションのための馴染みのあるマルチプレイヤー戦略(ブランチなど)を提供します。
ソリューション#
Code Storageは、リポジトリの保存とコラボレーションのためにGit上に構築された高スケールの分散ストレージシステムで、マシン向けに最適化されたAPIエルゴノミクスを備えています。
コアアーキテクチャ#
Code StorageはGitの3フェーズコミットプロトコルと「spoke-like」クォーラムベースのアーキテクチャを活用して、大規模なすべての読み取りと書き込みの耐久性と一貫性を保証します。
graph TD
A[AIエージェント/アプリケーション] --> B[Code Storage SDK]
B --> C[HTTP API]
C --> D[クォーラムベースストレージレイヤー]
D --> E[Gitリポジトリストレージ]
D --> F[Git LFSストレージ]
D --> G[メタデータストレージ]
H[JWT認証] --> C
I[Refポリシー] --> C
J[コミット署名] --> C
K[Webhooks] --> L[ビルドシステム]
K --> M[Bots]
K --> N[AIエージェント]
C --> K
主要な機能#
Git操作#
- JWT認証されたリモートでHTTPS経由のclone、fetch、push、pull
- レート制限、複雑な認証フロー、その他の制限なし
Git LFS#
- 別のLFSサーバーなしで同じリモートで大きなファイルを追跡
Git Notes#
- コミットにメタデータを添付し、refによってノートストリームを分離
Refポリシー#
- JWTが更新できるrefを制限し、forceプッシュを拒否
コミット署名#
- キーを登録し、選択したrefで署名されたコミットを要求
インポート名前空間#
- 大きなリポジトリの一括プッシュ、Code Storageはコールドストレージに移動
エフェメラル名前空間#
- プレビューと実験のために分離されたrefを作成し、その後プロモート
リポジトリフォーク#
- テンプレート、スナップショット、または分離された作業のためにリポジトリをコピー
GitHub同期#
- GitHubリポジトリをCode Storageとの間でミラーリング
汎用同期#
- GitLab、Bitbucket、または他のHTTPS Gitリポジトリをミラーリング
Webhooks#
- HMAC署名で検証されたプッシュおよび同期イベントを受信
AIエージェントワークフロー#
Code Storageはエージェント向けの専門的なワークフローを提供します:
サンドボックスに接続#
認証されたURLでModal、E2B、Daytona、および他のサンドボックスにクローンします。
sequenceDiagram
participant Agent as AIエージェント
participant CodeStorage as Code Storage
participant Sandbox as Modal/E2B/Daytona
Agent->>CodeStorage: 認証されたURLをリクエスト
CodeStorage-->>Agent: JWT認証されたGit URL
Agent->>Sandbox: 認証されたURLでクローン
Sandbox->>CodeStorage: HTTPS経由でGitクローン
CodeStorage-->>Sandbox: リポジトリデータ
Sandbox-->>Agent: クローン完了
セッション状態の保存#
エージェントセッション状態をエフェメラルコミットとして保存し、通常のブランチは変更しません。
サンドボックス作業の再開#
新しいサンドボックスで最後のセッション状態を復元します。
並列試行の実行#
1つのコミットから複数の試行を開始し、最良の結果をプロモートします。
graph TD
A[ベースコミット] --> B[試行1]
A --> C[試行2]
A --> D[試行3]
B --> E{結果の品質?}
C --> F{結果の品質?}
D --> G{結果の品質?}
E -->|最良| H[メインにプロモート]
F -->|最良| H
G -->|最良| H
H --> I[最終結果]
ライブdiffの表示#
新しい状態ごとに更新されるライブdiffとしてエージェントブランチをレンダリングします。
クイックスタート#
インストール#
# TypeScript
pnpm i @pierre/storage
# Python (uvを使用 - 推奨)
uv add pierre-storage
# またはpipを使用
pip install pierre-storage
# Go
go get github.com/pierrecomputer/sdk/packages/code-storage-go@latestbashクライアントの初期化#
TypeScript#
import { GitStorage } from '@pierre/storage';
const storage = new GitStorage({
name: 'your-org',
key: process.env.PIERRE_PRIVATE_KEY!,
});typescriptPython#
from pierre_storage import GitStorage
storage = GitStorage({
"name": "your-org",
"key": os.environ["PIERRE_PRIVATE_KEY"],
})pythonGo#
client, err := storage.NewClient(storage.Options{
Name: "your-org",
Key: os.Getenv("PIERRE_PRIVATE_KEY"),
})goリポジトリの作成と最初のコミット#
TypeScript#
const repo = await storage.createRepo({ id: 'new-workspace' });
const result = await repo
.createCommit({
targetBranch: 'main',
commitMessage: 'Get started with Code Storage',
author: { name: 'Pierre', email: 'pierre@pierre.co' },
})
.addFileFromString('README.md', '# Getting started\n')
.addFileFromString('main.ts', 'console.log("Hello from Code Storage");')
.send();
console.log(result.commitSha);typescriptPython#
repo = await storage.create_repo(id="new-workspace")
result = await (
repo.create_commit(
target_branch="main",
commit_message="Get started with Code Storage",
author={"name": "Pierre", "email": "pierre@pierre.co"},
)
.add_file_from_string("README.md", "# Getting started\n")
.add_file_from_string("main.py", "print('Hello from Code Storage')")
.send()
)
print(result["commit_sha"])pythonGo#
ctx := context.Background()
repo, err := client.CreateRepo(ctx, storage.CreateRepoOptions{ID: "new-workspace"})
builder, err := repo.CreateCommit(storage.CommitOptions{
TargetBranch: "main",
CommitMessage: "Get started with Code Storage",
Author: storage.CommitSignature{Name: "Pierre", Email: "pierre@pierre.co"},
})
result, err := builder.
AddFileFromString("README.md", "# Getting started\n", nil).
AddFileFromString("main.go", "package main\n\nfunc main() {}\n", nil).
Send(ctx)
fmt.Println(result.CommitSHA)go認証とセキュリティ#
Code Storageは認証にJSON Web Tokens (JWT)を使用します。各Code Storageリクエストは組織が署名したJWTを使用します。各JWTでリポジトリアクセス、スコープ、有効期限、refポリシーを制御できるため、すべてのクライアント、エージェント、またはタスクが正確に必要なアクセスを取得します。
flowchart TD
A[組織] --> B[JWTに署名]
B --> C[スコープ付きJWT]
C --> D[Refポリシー]
C --> E[有効期限]
C --> F[リポジトリアクセス]
D --> G[Ref更新の制限]
E --> H[トークン有効期限]
F --> I[リポジトリ権限]
G --> J[エージェントリクエスト]
H --> J
I --> J
J --> K[Code Storage API]
K --> L[JWTを検証]
L --> M[ポリシーを適用]
M --> N[操作を実行]
パフォーマンスとスケール#
Code Storageは大規模なワークロードを処理するように設計されています:
- 1日数百万のリポジトリ: 1日数百万の新しいリポジトリを処理可能
- 60倍高速: 読み取り/書き込み操作は同様のS3/R2ベースのソリューションより約60倍高速
- 99.99%稼働時間: 重要なリポジトリインフラの高可用性
- ピーク時90,000以上の操作: ピーク時に90,000以上の操作を維持可能
事例:Lovable#
AI poweredソフトウェア開発プラットフォームであるLovableは、前例のない速度、スケール、信頼性要件で週に800万以上の新しいリポジトリを処理するためにCode Storageを選択しました。
達成された結果#
- 99.99%稼働時間 重要なリポジトリインフラ向け
- ピーク時90,000以上の操作
- p50 fetchレイテンシで230%改善
- pushレイテンシで160%改善
「Pierreは、スケールでのAIネイティブソフトウェア生成の運営方法にとって基礎的なインフラとなりました。彼らのチームは、エージェント駆動開発ワークロードの運用現実を深く理解しています。」
— Will Rudenmalm、Lovableの技術スタッフメンバー
ベストプラクティス#
- エフェメラルブランチを使用 実験とプレビューのため
- Refポリシーを実装 forceプッシュを制限し、重要なブランチを保護するため
- Webhooksを活用 ビルドシステムやボットと統合するため
- セッション状態ワークフローを使用 エージェント状態管理のため
- 並列試行を実装 探索と最適化のため
重要な注意事項#
[!NOTE] Code Storageはプルリクエスト、課題、コードレビューを提供しません。Gitインフラとストレージに焦点を当てており、GitHubのコラボレーション機能ではありません。