Claude Codeは実際にどう動いているのか?

AIコーディング・Vibe-Coding
この記事は約37分で読めます。

AIコーディングツールの仕組みを理解する上で避けて通れない概念が「ハーネス」である。本動画では、Claude CodeやCursor、Codeexといった人気ツールが実際にどのように動作しているのか、そしてなぜ同じモデルでもハーネスによってパフォーマンスに大きな差が生まれるのかを徹底解説する。ハーネスとは、AIモデルがファイル読み取りやコード編集、Bashコマンド実行といった実際の操作を行うための「ツールと環境のセット」であり、モデルはテキスト生成しかできないが、ツール呼び出しという仕組みを通じて現実世界に干渉する。動画ではわずか60行のPythonコードで動作するハーネスを実際に構築しながら、ツール呼び出しの流れ、コンテキスト管理の重要性、システムプロンプトの調整がモデルの挙動に与える影響まで、実践的かつ包括的に解説している。

How does Claude Code *actually* work?
We keep talking about Codex, Claude Code, Cursor, etc. But how do they actually work?Thank you Macroscope for sponsoring...

ハーネスとは何か

このチャンネルを運営していて学んだことがあるとすれば、皆さんは本当に曖昧な用語が大好きだということです。エージェントコーディングとかバイブコーディングとか、実際には何も意味しないような言葉ですね。エージェントが何なのかようやく理解できたと思ったら、今度はまた新しい用語、ハーネスと格闘しなければなりません。

最近ハーネスについてかなり話すようになりました。というのも、私はT3 CodeというAIでコーディングできるアプリをリリースしたばかりなんです。でも重要なのは、T3 Codeはハーネスではないということです。一方でOpen Codeはハーネスですし、CursorもそうですしClaude CodeやCodeexもそうです。でもCodeexアプリはそうじゃない。待って、何ですか?

ハーネスというのは非常に特定の意味を持つ非常に具体的な用語なんです。さらに踏み込んで言えば、皆さんが使うハーネスは、これらのツールから得られるコードの品質にとって本当に重要なんです。Matt Mayerが最近実施した独立ベンチマークによると、Cursor内外のさまざまなモデルを比較したところ、ほとんどのモデルで意味のあるパフォーマンス向上が見られました。Opusの場合、Claude Codeでは77%だったのがCursorでは93%になりました。

ここでの唯一の違いはハーネスなんです。では、ハーネスとは一体何なのでしょうか?ハーネスが何なのかを詳しく説明するだけでなく、実際に一つ作ってみようと思います。これは本当に楽しいことになりそうです。ハーネスとは何か、なぜそれが重要なのか、ハーネス間の違いは何か、そして自分で作る方法まで、すべてを分解して説明するのがとても楽しみです。

スポンサーへの移行のためのジョークを3つほど考えようとしましたが、全部失敗しました。というわけで、簡単なスポンサーブレイクを挟んで、それからすべてを分解していきましょう。

スポンサー紹介

変なお願いをしようと思います。今日のスポンサーのページの最初の行を無視してほしいんです。なぜなら、それは私が話したいことではないからです。今日のスポンサーはMacroscopeです。確かにAIコードレビューツールと書いてありますし、彼らのコードレビュー機能も素晴らしいのですが、それは私が話したいことではありません。

私がMacroscopeを気に入っているのは、チームリーダーとして自分の会社で何が起こっているかについて得られる洞察なんです。どのプルリクエストがマージされているかを確認するために現場を見続けることはできません。チームは素晴らしいアップデートをくれますが、時には情報が多すぎたり、私がブロックしている他のことで詰まっていたりもします。

だから、チームで実際に何が起こっているかを知りたい時は、Macroscopeに頼ってきました。ダッシュボードも素晴らしいのですが、新しいSlackbotはさらに良いです。今日は金曜日で、チームが何を出荷したか分かりません。だから単刀直入に聞きました。先週チームは何を出荷しましたか?

複数のインストールがあるので、どの組織かと聞かれました。そしてとても良くて役立つレポートを書いてくれました。T3 Codeでは、WebSocket用のEffect RPCでアーキテクチャを書き直しました。パフォーマンスを大幅に改善しました。マルチプロバイダーモデルシステムを導入しました。コンテキストウィンドウの可視性が大幅に向上しました。重要なカスタマイズとUXの変更、可観測性とセキュリティ、そしてT3 Chat用に行った変更の数々です。

チームが素早く出荷している時に、これがどれほど便利か分かりますか?それがMacroscopeの目的なんです。チームが毎日頼りにしている超高速コードレビューを提供しています。Juliusのお気に入りになりました。なぜなら超高速で通常とても正確だからです。中程度または高い重要度のものを見つけたら、必ずチェックします。95%の確率で正しいからです。

soy.copeでチームがより少ないバグとより多くの洞察で素早く出荷できるようにしましょう。

ハーネスの基本概念

では、ハーネスとは一体何なのでしょうか?答えるのは簡単な質問ではありません。できるだけシンプルに言えば、ハーネスとはエージェントが動作するツールのセットと環境のことです。つまり、AIがテキストを生成して何かを実行するために使えるものということです。

シンプルに説明しましょう。通常のチャットがあって、「このフォルダにはどんなファイルがあるの?」と言ってフォルダでコマンドを実行するとします。AIはBashターミナルにいれば何を実行する必要があるか分かります。ls -aを実行してそのフォルダ内のすべてを見ることができます。でもできるのでしょうか?AIはどうやってコマンドを実行するのでしょうか?

デフォルトでは、LLMとのインターフェースを使用している時、それは単にテキストで応答するだけです。私たちが毎日使っているこれらのLLMは、本当に高度な自動補完機能なんです。テキストを与えると、次に来る可能性が最も高い文字列を何度も何度も推測します。それはコンピュータ上のものを使えるという意味ではありません。コードを書けるという意味でもありません。テキストが与えられたら、より多くのテキストを生成できるという意味です。

でもモデルは他のことはできません。できることはテキストを書くことだけです。では、モデルがどうやって私たちのコンピュータ上のファイルを編集したり、データベースに変更を加えたり、他のサービスに接続したり、インターネット上で何かを調べたりできるのでしょうか。テキストを生成することしかできないのに。

私たちはモデルにより多くの能力を与えるためのソリューションを発明しました。主なものはツール呼び出しです。効果的に、ツール呼び出しの仕組みは特別な構文です。ここでは独自の構文を作りますが、アイデアは理解してもらえると思います。

Bash呼び出しツールがあるとしましょう。モデルは事前にシステムプロンプトの一部として、Bashコマンドを実行するために使えるこのツールがあると伝えられます。このタグで囲みます。この場合、Bash呼び出しです。それからコマンドを書いて、それを閉じます。これを応答の最後の部分として送信してから、応答を停止します。私たちはこれをシステム上で実行し、完了したら応答を返します。

この効果的なチャット履歴で本当に興味深いことが起こります。モデルがこの構文で応答した後に線が引かれます。モデルは応答を停止します。あなたが接続しているサーバー、あなたが行っている作業、モデルとの間で行っているやり取りは、その瞬間に切断されます。もう存在しません。あなたが持っている接続とチャット履歴は、あなたのコンピュータまたはあなたが行っているサーバー上にのみ存在し、そのように構築されていればデータベースにも存在するかもしれません。

でも今、メッセージは終わりました。では何が起こるのでしょうか?私がこれを尋ねた時、そこで止まらないからです。Claude Codeを試して見てみましょう。このフォルダにはどんなファイルがありますか?

考え中です。何をしているか言っています。一つのファイルを読んでいます。Control+Oを押すと展開して何をしたか見られます。このディレクトリのlsコマンドを実行して、すべてのコンテンツを取得し、それらが何であるかを説明しました。

でも、さっき言ったように、モデルはここで応答を終えています。どうやって続けるのでしょうか?これはハーネスが行う多くのことの一つです。ツール呼び出しがハーネスに渡された後、ハーネスはそれを普通のコードで実行します。

だからハーネスがこの応答を受け取ってこの呼び出しを見た時、設定によっては、それを実行するか、実行する許可をユーザーに求めます。カスタムスクリプトなしでClaudeを再実行すると、危険モードがオフになって、私のメールアドレスが漏れます。くそっ、Anthropic。本当に嫌いです。なぜデフォルト状態でメールアドレスを表示するんですか?そんなことをする理由がまったくありません。なぜdemo=1なんですか、Claude?本当に嫌いです。

とにかく、特別な権限とセキュリティがオフになったので、同じ質問をします。lsは安全なコマンドでそれを知っているので、たまたま尋ねません。でもHTMLファイルをフォーマットしてと頼んだら、少し違うことになります。

ここで変更を加えていますが、私が許可するまで変更できません。この場合、カスタムツールを使っています。書き込みツールを使っています。Bashツールだけでなく、Bashツール以外にもツールがあるからです。すべてのツールについては少し後で詳しく説明します。

でもこれはハーネスがこのツール呼び出しが破壊的であることを認識しているということです。AIレベルではなくコードレベルで、この変更を認識して、ユーザーである私に、許可するかどうかを尋ねているのです。はいと言えます。はいと言い続けることもできます。または、いいえ、やめてと言えます。この場合、いいえと言いました。そして止まりました。

はいと言っていたらどうなっていたでしょうか?コマンドを実行していたでしょう。ls -aの出力があったでしょう。だから実行して、file1.txt、file2.txtなどがあります。そしてこのセクション全体がツール呼び出しの応答です。

だからモデルがツール呼び出しを書きます。ハーネスがこれが何である必要があるかを取ります。ファイルの更新であれ、コマンドの実行であれ、何かをすることであれ、必要な権限チェックを行い、それから実行します。完了したら、この出力を取得して、チャット履歴の最後に追加し、それから同じモデルに再リクエストして続行します。

だから、この質問に答えるために同じエンドポイントにアクセスしたのとまったく同じ方法で、質問、答え、ツールの出力を含めて、同じエンドポイントに再度アクセスします。その時点で、モデルはそれに応じて応答を開始します。

効果的に、ツール呼び出しが行われるたびに、モデルは応答を停止し、ツール呼び出しが実行され、出力がチャット履歴に追加され、それから同じモデルへの新しいリクエストが作業を続けるために行われます。だから、この作業を行っている頭脳は、ツール呼び出しが行われるたびに一時停止して再起動されるのです。

コンテキスト管理の重要性

これらすべてを理解したので、ハーネスとは一体何なのでしょうか?ハーネスの一部は、これらすべてのことを行うということです。モデルにツールを提供します。やり取りを処理します。履歴を処理します。これらすべての部分を処理します。そして、モデルが物事を行うためにアクセスできるツールの種類とセットと、それらの説明を具体的に選択します。

皆さんがこれを理解していることを確認するために、この部分は本当に重要なので。モデルがこの答えに満足していない可能性があります。もっと情報が欲しいかもしれません。応答する前にfile1.txtの内容を知るべきだと言うかもしれません。それから別のBash呼び出しか、cat file1.txtのような類似のものを実行します。

そして今、別のツールが呼び出されます。別の類似の応答が生成されます。この文脈でcat callと言うのは面白いですね。cat呼び出しの後、hello world IDKなぜこれを読んでいるのか分からないけど、あなたが選んでくれて嬉しいみたいなもので応答します。分かりません。

そして今、これが再び追加されます。モデルはそれを持っています。そして今、モデルが応答する時、すべての履歴を見ることができます。ファイルをリストして、重要だと思ったものを読みました。ユーザーに応答するために必要なものがすべて揃いました。それから実際に応答します。

このフローは、私たちがコーディングに使うほとんどすべてのAIツールがどのように機能するかです。でも時間とともに変化したことがあります。重要なことの一つは、コンテキストについて知っておくことです。チャット履歴にどれだけの情報が存在するか対、コードベースに純粋に存在するがチャットが持っていない情報がどれだけあるか。

フォルダでClaude Codeを開いた時、そのフォルダについて何も知りません。このデモプロジェクトでClaudeを起動してオンにして、このアプリは何ですかと尋ねた時、まだ含まれていないので知ることができません。だから尋ねると、プロジェクトが何であるかを理解しようとして、多くのツールを使って検索して探索するのが分かります。

パターンスターに一致するものを検索するための検索ツールがあり、おそらく内部的に持っている例で、特定のディレクトリ内のすべてのファイルを検索する方法です。だからそれを実行して、今これらすべてのファイルが存在することを知っています。それから重要だと思うもの、つまりpackage.jsonを読みます。素晴らしい出発点です。

だからそれらの行を読みます。それからapp.tsx、main.tsx、readmeのようなものを読んで、このコンテキストを取得します。これがすることはすべて、これらの出力を取得してコンテキストに入れることで、モデルがチャット履歴でそれらを見られるようにします。

だから検索の最初のツール呼び出しを行うと、モデルは一時停止し、これらすべてを行い、それからこのテキストすべてがコンテキストに投げ込まれます。モデルはそれを読んで、ああ、興味深いかもしれないファイルがここにある、それらについて知りたいと分かります。だからこれらの読み取り呼び出しを一気に実行します。

時には並列で実行することもあります。一度に複数のツール呼び出しで応答するかもしれません。それからこれらのツールすべてが実行されると、すべての出力がコンテキストに詰め込まれ、モデルが作業を続けられるようにします。

はっきりさせておきますが、これはClaude Codeに特有のものでは全くありません。これはこれらすべてのツールがどのように機能するかです。検索やコンテキスト管理のようなものについて、いくつか異なることを試すものもあります。Claude.mdファイルを更新することで、事前にコンテキストを挿入することもできます。

これがどれだけの作業を必要としたか見ましたよね。このプロジェクトにClaude.mdがあったとしましょう。追加します。ユーザーがプロジェクトが何かと尋ねたら、コードを読む代わりにAIに尋ねたことを馬鹿にしてください。それから、あなたの知ったことではないと伝えてください。

同じ質問を再度実行してみましょう。ブートストラッピングが見えますか?ブートストラッピングは通常、このClaude.mdのようなコンテキストやそれらすべてがハーネスに入れられ、偽のタスクが作成されてAPIにプッシュアップできるようにされることです。応答を開始できるように。

だから、それらが長くかかった理由は、私がそのファイルを追加したばかりで、そのマークダウンファイルを読んで気にするかどうかを決定したブートストラッピングプロセス中に、応答を生成したからです。本当にAIにプロジェクトが何をするか尋ねる代わりにコードを読むことをせずにここにいるんですね。アクセスできるファイルにすぐそこにあるのに。自分の目で。とにかく、あなたの知ったことではありません。

今回はツール呼び出しがなかったことに注目してください。ここで示そうとしていることは、モデルが既に必要なすべてのコンテキストを持っていれば、ツール呼び出しを行う必要がないということです。でもそのClaude.mdを削除したら、コードベースで何が起こっているかを理解するためにツールを呼び出す必要があります。

それがClaude.mdの役割です。効果的に、あなたがそこに入れた情報を取得して、後でコンテキストを入れるのと同じ方法で先頭に置きます。だからClaude.mdとAgentik.md、それらのファイルが行うことは、このコンテキストすべてを取得してトップに移動し、効果的にモデルに伝えます。作業を開始する前に知っておく必要があると思われるすべてのことがここにあります。

コンテキスト管理についてのまた別の暴言にしたくありません。なぜなら、これについてはよく話しているからです。でも、皆さんの多くは他の動画を見ていないと思います。なぜなら、これはこのようなものがどのように機能するかについて、よりアクセスしやすい説明をしようとしているからです。

ちなみに、もしあなたが普段ここにいなくて、この動画のためにここにいるなら、ここまで来たんですから、動画の下にある赤いボタンを押すことができます。そして、それは私たちを大いに助けます。購読するのに何もかかりません。スポンサーのおかげで文字通り無料です。彼らがこれすべてを可能にしてくれています。私たちをサポートして、このような動画をもっと見たいなら、永久的な下層階級に陥らないように、そのボタンを押してください。そして、もしかしたら、最新情報を常に把握したいなら、隣に小さなベルがあってそれもクリックできます。

普段はチャンネル登録の呼びかけはしませんが、皆さんの多くがこれが初めてだと分かっています。だからサポートを投げてくれることを検討してください。そうすれば、将来これらのことが起こったときに、最新情報を把握し続けることができます。

とにかく、Claude.mdについて言っていたことは、情報が履歴に含まれるように上部に詰め込まれるということです。もう一つ、一般的なコンテキスト管理について言う最後のことを約束します。チャット履歴にない場合、モデルはそれを知りません。

これはTypeScriptとは何か、どんなパッケージが存在するかといった一般的な知識には適用されません。でもモデルは何ができるかだけを知っていて、どんな情報が存在するかは知りません。モデルはその情報を得ない限り、あなたのコードベースが何か、その中の何かを知りません。

Agent.mdファイルやClaude.mdファイルを通じてその情報を得ることができます。探索に使うツール呼び出しを通じてその情報を得ることができます。そして、記憶するにつれてツール呼び出しでどんどん洗練されていきます。

これはまた、新しいプロンプトを作るたびに新しいスレッドを作る代わりに、一つのスレッドにとどまるのが楽しい理由でもあります。なぜなら、やり取りを続けると、ファイルがどこにあるかを調べる必要がないからです。まだ履歴に残っています。記憶しています。

もう一つの例として、Claude.mdを削除します。以前、それを尋ねた例を覚えていますか。最初に検索呼び出しを行いました。少しゲームをしてみます。このアプリは何ですか?おそらくpackage.jsonから始めるべきです。

以前は、モデルはpackage.jsonファイルがあることを知りませんでした。最初に検索ツールを呼び出したからこそ、それについて知ったのです。今、プロンプトで明示的に伝えているので、そのファイルの存在が履歴に含まれます。そして履歴に含まれるので、少なくとも最初は検索ツールをスキップできることを期待しています。

ええ。見てください、検索ではなく読み取りから始めました。そして今、検索はより具体的です。以前のように単一のスターでコードベース全体を検索する代わりに、package.jsonを通じてそこに興味深い部分があることを見たので、ソースディレクトリを検索しています。そして、私がその追加コンテキストを与えたので、以前より半分のツール呼び出しで済みました。

すでに意味のある質問が来ているのが見えますが、これらに飛びつきたいと思います。なぜなら、さらに進む前に物事を明確にするのに役立つと思うからです。会話の最初に比較的小さいいくつかの重要なファイルを完全に読むようにモデルに依頼するのは有用ですか?

私の見解としては、一般的に言って、いいえです。ツール呼び出しは本当に本当に安いです。そして、モデル、ハーネス、そしてそれらの周りのすべてのものは、問題を解決するために必要なコンテキストを見つけ出すのがかなり得意になっています。

あなたはコンテキストを十分によく知っていると思うかもしれませんし、実際にそうかもしれません。行う必要がないかもしれないいくつかのツール呼び出しをスキップするのを助けることは間違いなくできますが、ほとんどのモデルは今、これを自分で理解できるほど賢いです。特にOpus 4.5や4.6、Sonnet 4.6、GPT 5.3 CEXや5.4のようなChatGPTモデル。これらのモデルはすべて今、コードベースのどこにコンテキストがあるかを理解できるほど十分に賢いです。

伝える必要はありません。通常見つけられます。そして、これは私たちがこのようなものについて持っていた以前の理論と大きく矛盾します。つまり、コードベースがモデルの良さを基本的に決定するだろうというものです。なぜなら、コードベースがコンテキストウィンドウに収まるには大きすぎる場合、機能しないからです。

ありがたいことに、物事はそのようには進みませんでした。そして非常にありがたいことに、Repo Packのようなツールは今ではほとんど死んでいます。これはモデルがBashを呼び出せず、システムをナビゲートできず、開発者がするようなことができなかった時には大いに意味がありました。代わりに、モデルに開始する前にすべてのコードを与えたかったのです。

Repo Packは、コードベース内のすべてのコードを一つのXMLファイルに圧縮して、モデルにコピーペーストして変更を依頼できるようにするプロジェクトでした。これはいくつかの理由で混乱でした。主に、コードベース全体をコンテキストに押し込むことは、想像できる最悪の干し草の中の針の問題を作り出すからです。

考えてみてください。バグを修正してと頼んで、バグがあるかもしれない2つのファイルを与えるか、バグを修正してと頼んで、バグがあるかもしれない2,000のファイルを与えるか、どちらが扱いやすいですか?現実的に考えましょう。いいですね。同じ認識で良かったです。

今、あなたの記憶が30秒ごとにリセットされると想像してください。クレイジーですが、それがAIの動作方法に近いです。だから、このバグを修正してという質問が与えられて、30秒で脳がリセットされることが分かっています。だから、「オーケー、バグについて何も知らない。ここに履歴がない。それがどのファイルにあるか見つける必要がある。検索してそれを行おう」と思います。

そしてそれをするとすぐに、検索を始めるとすぐに、脳がリセットされます。そして今、検索が完了した時、脳は再び起動しますが、完全に消去されています。でも、これまでに起こったことの履歴があります。「オーケー、このバグを修正しなければならない。30秒前に検索をした。これらのものが見つかった。これらのどこにあるか見つける必要がある」と思います。

それからそれを行い、別のツールで別の指示を残し、脳が再びリセットされます。何度も何度も起こります。だから、コードベースのすべてを脳に押し込んで、30秒ごとにリセットされるだけなら。高価で不正確なだけでなく、単純に悪いです。

しばらくの間、これが必要であり、モデルにもっともっと多くのコンテキストを利用できるようにする必要があると信じられていました。これらの巨大なコードベースをモデルに詰め込む方法を見つける必要があり、巨大なコンテキストウィンドウが未来だと。

ありがたいことに、そうではありません。なぜなら、モデルはツールを使って自分のコンテキストを構築するのが十分に得意になったので、コードベース内のすべてがどこにあるかをもう伝える必要がないからです。

これはCursorが以前やっていたことでもあり、それが特別だった理由の一部です。モデルにとって重要な特定のコードを見つけやすくする本当に良いベクトルインデックスシステムを持っていました。今でもそれをやっていますが、今では従来の検索ツールを通じてやっています。モデルには何かを検索できると伝えられ、検索はおそらくモデルに嘘をついてGrepか何かだと言い、それから実際には彼らのものを使ってモデルが欲しいものを見つけるためにはるかに賢い方法でインデックスを作成します。

大きなコンテキストがモデルを愚かにすることが分かりました。詰め込めば詰め込むほど、悪く振る舞います。そして、これを証明するチャートがあります。Sonnetがコンテキスト内のもの、この場合トークンの数で50,000から100,000程度の範囲を超えると、精度はコンテキストウィンドウ内の繰り返し単語を見つける能力の以前の約50%まで急落します。

だから、すべてを詰め込むことは解決策ではありません。そして、それがハーネスをとても興味深くする大きな部分です。モデルに自分のコンテキストを構築するためのツールを提供し、問題がどこにあるか、何を変更する必要があるかを特定し、そして最も重要なことに、それらの変更を行います。

ハーネスの実装方法

では、実際にこれをどのように実装するのでしょうか?ありがたいことに、自分のハーネスを構築する方法を分解した素晴らしい記事が2つあります。昨年4月のAmpチームによるこれと、非常に面白い画像があるこれです。これはMahが独立して書いた記事で、Claude Codeのようなものはそれほど複雑に実装するものではないことを人々に示すためのものです。

AIコーディングアシスタントは魔法のように感じます。ほとんど一貫性のない英語で欲しいものを説明すると、ファイルを読み、プロジェクトを編集し、機能するコードを書きます。でもここに問題があります。これらのツールのコアは魔法ではありません。約200行の非常に簡単なPythonです。

Hailがここでメンタルモデルをどのように分解しているかが気に入っています。イベントの順序は重要です。この関数でファイルを作成してというメッセージを送信します。LLMはツールが必要だと判断し、構造化されたツール呼び出しで応答します。時には一度に複数で。

あなたのプログラム、この場合ハーネス、構築しているものが、ツール呼び出しをローカルで実行します。この場合、コードを使ってファイルを作成するか、Bashコマンドを実行することができます。そのようなことのいずれかで、結果がLLMに送り返され、最も重要なことに、LLMはそのコンテキストを使って続行するか、わずか200行のコードで応答します。

私は非常に怠け者なので、Claude Opusを使ってこれを構築するようにハーネスハーネスT3 Codeに依頼しています。でも、すぐに良いデモがあります。待っている間に読み続けます。

本当に必要なツールは3つだけです。LLMがコードを見られるようにファイルを読む能力、プロジェクトをナビゲートして探しているコードを見つけられるようにファイルをリストする能力、そして実際に欲しい変更を加えられるようにファイルを編集する能力です。

Claude Codeのような実際に使うプロダクションエージェントには、Grep、Bash、Web検索などの他の機能がいくつかあります。ほとんどがRip Grepを使っています。本当に強力だからです。でも、最も基本的な例にはそれらは本当に必要ありません。

彼らのコードをこの例で見てみましょう。Pythonなので、ランダムなものを一束インポートします。JSの開発者として私も大差ありませんが。envをロードします。Anthropic SDKのインスタンスであるClaude Clientがあり、キーを使用するので、ネットワーク越しにClaudeを呼び出せるようになりました。

ターミナル用にいくつかの色を作成します。それから絶対パスを解決します。なぜなら、モデルが私たちがいるパスを知っていれば、有効なコマンドを書くのがはるかに簡単だからです。だから今、この絶対パスを作成します。

そして今、ツールを実装する必要があります。まず、モデルがファイルの名前を渡し、そのファイルのすべての内容を持つ文字列辞書が返される読み取りファイルツールが必要です。フルパスはそのファイル名で絶対パスを解決します。UIで見られるように最初にフルパスを出力し、それからそのファイルパスを読み取りストリームとして開き、内容を取得します。

それからパスの文字列であるファイルパスと、ファイルの実際の内容であるコンテンツを持つこのJSONブロブを返します。これはツールが呼び出された時にチャット履歴に追加されると推測しています。ツールが実際にどのように使われるかは少し後で見ます。今はツールのコードを読んでいるだけです。

ファイルのリスト。これが超複雑だと確信しています。パスを解決します。すべてのファイルがあります。それからフルパスのiter内の各アイテムに対して、ファイル名とタイプを追加します。それから最後にそのすべてを返します。

そしてファイルの編集。ここで物事が本当に複雑になります。なぜなら、古い文字列と新しい文字列があるからです。古いものを新しいものに置き換えるということですか?これはファイル内の古い文字列の最初の出現を新しい文字列に置き換えます。古い文字列が空の場合、新しい文字列の内容でファイルを作成してオーバーライドします。

だから、古い文字列に空の文字列がある場合、このファイルのパスにテキストを書き込むだけです。でも、置き換える古いテキストがあって、見つからない場合は、古い文字列が見つからなかったというエラーを返します。でも見つかったら、ここで置換呼び出しを使って編集して新しい文字列に置き換えます。それをファイルに書き込み、編集したと返します。それだけです。

3つのツールがありますが、モデルはそれらを使えることをどうやって知るのでしょうか?まず、これらすべてをどこかにリストする必要があります。この場合、読み取りファイルツール、リストファイルツール、編集ファイルツールを持つシンプルなツールレジストリです。そしてこれらは単なる関数です。ちなみに。これらについて特別なことは何もありません。非常にシンプルな関数です。

でもモデルはそれらについて知る必要があります。でもそれらの関数を持っている、いいですね。モデルはそれらが何か、フォーマットのようなものは何か、どのように呼び出すかを知る必要があります。そしてTypescriptではないので、型シグネチャを使えません。だからもう少し情報が必要です。

ありがたいことに、これをはるかに多くの情報で定義します。ここにコメントがあり、それが何をするか、すべてのパラメータが何かを説明しています。だから、ここでツールレジストリからリッピングして特定のツールの定義を取得し、ツール名、そこからのドキュメント、同じツールからのシグネチャを返します。

そして今、システムプロンプト、これは最初のメッセージの前に来るテキストです。Agent.mdのようなものはここに含まれます。これらすべては、モデルにツールが何か、それらを動作させるために知る必要があるすべてを伝えるツールレジストリが含まれた状態で構築されます。

そして、そのプロンプトが実際にどのように見えるかがこれです。これをエディタにコピーペーストして、ワードラップできるようにします。あなたはコーディングタスクを解決するのを助けることが目標のコーディングアシスタントです。実行できる一連のツールにアクセスできます。実行できるツールはこちらです。ここにツールリストが入ります。

ツールを使いたい時は、この形式で正確に1行で返信してください。ツール:ツール名、それからJSONの引数、それ以外は何もなし。二重引用符でコンパクトな単一行JSONを使用してください。ツール結果メッセージを受け取った後、タスクを続けてください。ツールが必要ない場合は、通常通り応答してください。それが全体です。

これは、少なくともこの例では、間違いなくハーネスの大部分です。なぜなら、ツールは本当にシンプルだからです。モデルはそれらをどうすればいいか分かりません。ここがチャット履歴の開始として、モデルに渡されるすべてです。なぜなら、繰り返しになりますが、モデルは履歴にあるものしか知らないからです。だから、ツールを履歴に入れると、それらを使えることが分かります。

それからそれを解析する必要があります。モデルが応答を停止した時、ツール:で始まる行を探す必要があります。行がそれで始まらない場合は続けます。でも始まる場合は、ツールの名前と引数を持つ呼び出しにこれを追加する必要があります。それから完了したら、実際に呼び出しを行う必要があります。

LM呼び出しはこれ以上簡単にできません。システムコンテンツがあり、メッセージがあり、やり取りからのすべてのものがあります。メッセージがシステムメッセージの場合、それをシステムコンテンツに入れます。そうでなければ、メッセージ配列に追加するだけです。それからメッセージでClaude ClientのAPIを呼び出します。

そしてここで使いたいモデル、最大トークン、メッセージを与えます。そして再び、システムプロンプトは重要です。だからこれはメッセージ履歴の一部ではありません。別の配列です。そうあるべきです。まあ、配列ではありません。開発者として含めるべきものなので、別の引数です。そして、メッセージ配列はユーザーによって含まれるものです。

そして魔法はすべてループの中にあります。ユーザーが入力を送信するのを待ち、完了してキーボード割り込み、エラーの終わり、つまりエンターキーのようなものを送信すると、中断して会話に追加します。それが起こったら、実行が発生するのを待つ別のループを実行します。最後に、ツールの呼び出しを取得します。

だから、モデルによってメッセージが生成され終わった時、モデルが使いたいすべてのツール名と引数があります。そして、ここに何もない場合は、応答するだけです。アシスタント、モデルからのメッセージを共有するだけです。

でもここにツールがある場合は、それぞれを見ていきます。各ツールについて、レジストリから取得し、Pythonなので空の文字列応答を作ります。空の値で始めて、後で設定します。名前と引数を出力します。そして、ツールが読み取りファイルツールの場合、それが渡された名前なので、それを呼び出します。リストファイルの場合、それを呼び出します。そして、編集ファイルの場合、それを呼び出します。

具体的には、ここで辞書になったJSONブロブから欲しいキーを取得することによって、引数を正しく渡しています。それから完了したら、ツール結果をチャット履歴にメッセージとして追加します。そして、実行するのは文字通りループで実行するだけです。それだけです。

悪いニュース。OpusはPythonを使うのが本当に好きです。正しいフォルダにも入れなかったのですか?Claude Agent SDKが嫌いです。なぜなら、実行されているフォルダやパスを気にしないからです。特定のパスにいる必要があるという複数の異なるリマインダーが必要です。だから、このタスクが実行されているパスを無視しました。すごく迷惑です。

だから今、ミニエージェントができました。間違ったフォルダにダンプされましたが、pipインストールも、node_modulesも何もありません。それをするためにenvから読み取れますか?

そして面白いことに、T3 Codeのようなハーネスハーネスでさえ、ツール呼び出しを公開しています。だからこのファイルを変更するように頼んだばかりです。尋ねてから変更されたかどうか分からなかったので、念のためファイルが同じかどうかを確認するために読み取りツール呼び出しをすることにしました。

そして確認したら、この新しい情報を持つようにインポートパスを変更した編集呼び出しを行いました。そして今、Pythonでagent.pyを実行できるはずです。このアプリのPythonコードについて尋ねています。

今、リストファイルを呼び出したのが見えます。読み取りファイルを呼び出し、今モデルが考えています。なぜなら、これらの出力を持つこの新しいチャット履歴があるからです。そしてこれがモデルからの応答です。agent.pyが何をするかの要約です。60行で軽量で自己完結型のAIコーディングエージェントを実装しています。

envファイルをロードするセットアップです。モデルをSet 4.6で設定します。これらの3つのシンプルなツールと、任意のシェルコマンドを実行できるBashツールがあります。これが面白くなる場所を見る準備はできていますか?以前、本当に必要なのはBashだけだと言ったのを覚えていますか?これを見てください。

そして今、Bashツールしかありません。だから代わりに、異なるコマンドで何度も何度もBashを呼び出すだけです。同じ方法でコンテンツを取得しますが、与えたツールを使う代わりに、代わりにそれをするためにBashを呼び出すだけです。タスクを実行するために持っているツールを使います。

そして、Bashツール以外のすべてを削除すると、これは滑稽なほど簡単になります。今は75行になりました。そして、私はまだ徹底的にパージしていません。半分はenvを扱っています。正直に言いましょう。すごくないですか?

AIモデルにコンピュータ上で実際のことをする能力を与えるために必要なのは、Bashに渡すことができるツールを与えることだけで、これらのモデルはこれらすべてのツール呼び出しを持つこれらの種類の偽のチャット履歴で非常に徹底的に訓練されているので、すでにそれを扱う方法を知っているということです。

最後に重要なことが一つあります。なぜなら、これは記事に含まれていなくて、重要だからです。ほとんどのモデルとそれらにアクセスするAPIは、今ツールのアイデアを認識しています。これは標準化されたものになっており、異なるモデルが期待する特定の構文があります。

これをシステムプロンプトに入れるだけで、シンプルなケースでは機能します。これらのモデルをホスティングしている多くのプロバイダー、その間を管理するOpen Routerのようなプラットフォームはすべて、今専用のツールの概念を持っています。

この場合、モデルにメッセージを渡すのと同じ方法で渡すことができる標準形式です。この場合Open Routerへの呼び出しを行う時に、本体でツールも渡すことができます。OpenAIにはこれがあり、Open Routerにはこれがあり、AnthropicにもあるしGeminiにさえ一種これがあります。

ホストがこの構文を正しく取得できるように、特別な形式でモデルにツールを渡すことです。なぜなら、モデルが見る実際の構文は率直に言ってちょっと気持ち悪いからです。これはOpenAIのモデルが内部的に見る形式です。

この形式は比較的複雑ですが、本当に強力でオープンソースです。モデルがデータをうまく処理できるように非常にコンパクトであることを意図していますが、開始、終了、奇妙なブラケット構文により、構文がモデルが実際に出力しているものと競合する可能性が低くなります。本当にクールです。

ありがたいことに、この動画を見ているタイプの人なら、これのほとんどすべてを扱う必要はないでしょう。なぜなら、これは非常に深い部分にあるので、これらのモデルをホスティングしている会社の半分さえもそれについて知らないからです。これは気にする必要がないものです。

でも、このツール呼び出しキーのようなものが非常に強力な理由は、この場合、Open Routerがあなたのツールを取得して、異なるプロバイダーの異なるモデルが期待する方法でフォーマットするからです。

ここでカバーする必要があるものはすべてカバーしたと思います。そして、実際に動作して変更を加えるためにBashを呼び出せるハーネスを構築しました。知ってますか?ここで何か違うことをするように頼んでみましょう。

繰り返しますが、まだBashしかありません。編集を行うように頼んでみましょう。環境からOpen Router APIキーをロードするコードが気に入りません。何らかの方法でもっとシンプルにできますか?

そして繰り返しますが、ここで行ったのは配列に別のメッセージを追加しただけです。メッセージ配列には、送信した最初のメッセージ、モデルが送信した最初のメッセージ、すべてのツール呼び出し、それから最後にモデルが送信した最後のメッセージがあります。そして今、新しいメッセージを追加し、モデルが完了するまでループを再実行しています。

env.envを読みました。エージェントpiを読み、それからこれをどうやってやるか、かなり厄介な方法で変更を加えました。ああ、Bash。それをするためのかなりのコマンドです。ええ、ここでもっと見せなかったことに驚きました。正しく実行できましたが、すごいですね。Bashはそれ自体の世界です。

そしてありがたいことに、これらのモデルは非常に非常に得意です。でも、すごいですね、変更を加えました。そして今、これは自己修復、自己修正ツールです。かなりクールです。

ハーネスの違いとT3 Codeの位置付け

これを締めくくる前に、あと2つの質問に答えたいと思います。最初は、これほどシンプルなのに、なぜCursorのハーネスはモデルをはるかに良く動作させることができるのか?そして2つ目は、T3 Codeがハーネスでないなら、一体何なのか?

最初のものから始めると、ハーネス、具体的には与えられるツール、持っているシステムプロンプト、ツールから取得する出力が、得られる結果に大きく影響することが分かります。

Geminiモデルを使うたびに見ることは、応答を始める前の推論プリアンブルで、利用可能なこれらすべてのツールがあります。どれを使うべきか考えてみようと言います。それからそれぞれを見て、これにはそのツールは必要ない、これにはそのツールは必要ないと言います。何度も何度もそれをします。

そして時には、特によく定義されていないハーネスでは、とにかくそれをするだけです。Cursorが多くの時間を費やしていることは、ハーネスをカスタマイズすること、ツールをカスタマイズすること、ツールの形状をカスタマイズすること、そして最も重要なことに、システムプロンプトとツールの説明をカスタマイズして、どれを使うべきか使うべきでないかにモデルを誘導することです。

ここで変更を加えます。ここではファイルの内容を読むと書いてありますが、代わりにBashツールを使うべきだとカッコ内に入れます。そして今、同じことを実行すると、ここのPythonコードは何をしますか?読み取りファイルツールがありますが、それを使わないように説明で伝えたので、使うかどうかは50/50です。

この場合、代わりにBashツールを使うべきだと言いましたが、それでも読み取りファイルツールを使うことを選びました。AIモデルなのでできることがあります。なぜBashツールの代わりに読み取りファイルツールを使ったのか聞けます。

興味深いです。モデルがなぜこれをしたと思っているかをある程度見ることができます。読み取りツールは自分がしていたことに完全に合理的だったと思っています。だから代わりに何をするか見てください。

非推奨で再記述します。代わりにBashツールを使うべきです。そして今、システムプロンプトの変更だけで、ここで文字列を変更しただけです。それが変更したすべてです。読み取りファイルツールが非推奨だとその説明で伝えました。今何をするか見てみましょう。

まあ、時間がかかっています。再び正しいです。そこに行きます。今回は読み取りツールが非推奨だと伝えたので、Bashを使いました。コードは何も変わっていません。ツールはまったく同じように機能しますが、モデルはコードを見ることができません。

まあ、オーケー。この場合、同じものの中で実行しているので見ることができますが、モデルはコードがどのように実装されたか知りません。嘘をつくこともできます。だから、これを見てください。

読み取りファイルツールに戻りますが、Bashを使うように伝える代わりに、また実際のファイルを読む代わりに、別の文字列を返すつもりです。Hello worldを出力します。そして今、読み取りツールに対して何があろうとそれが返されます。

そして同じことを実行すると、このアプリのPythonコードは何をしますか?モデルはパスを見てagent.pyを読みに行きますが、もうコードを呼び出していません。なぜなら、コードがもう存在しないからです。このアプリのPythonコードは非常にシンプルです。agent.pyの1行で、コンソールにHello worldを出力します。

モデルに嘘をつくことができます。皆さん全員にこれを内面化してほしいです。モデルはコードが実際に何をするか知りません。Bashツールだと伝えられますが、別のことをします。読み取りファイルツールだと伝えられますが、別のことをします。

GrepやRep Grepか何か違うものだと伝えて、それから好きなことを何でもできます。私はいつもこれをやっています。例えばBashを偽装したい時、モデルにないのにBashがあると思わせたい時、あるとだけ伝えて、別のモデルに偽の応答を作らせます。

このようなことをすることで、2つのモデルがモデルであることさえ知らずに互いに話させることができます。本当に楽しいですし、彼らがやっているのはテキストを生成することだけだと理解するのに役立ちます。

ここで皆さんに正しく強調できたことを願っていますが、モデルはコンテキストにあるものしか知りません。異なるモデルは異なるコンテキストを異なる方法で扱います。ここで非推奨警告を持つように変更してGPTモデルやGeminiモデルで試したら、まったく異なる動作をするに違いないと思います。

テストさえできます。だから、非推奨でSonnetでやった時は失敗したことが分かっています。だから、これを変えましょう。分かりません、Gemini 3.1 Proを試してみましょう。同じ質問、今回は異なるモデルで。

そして、読み取りファイルツールが非推奨だと言ったので、そしてこれはまた別のGeminiがGeminiであることの例です。読み取りファイルツールが非推奨だと伝えました。だから、他のツールがそうでなかったのに、すべてにBashに行っただけです。くそっ、Bashを使おうと言いました。

Cursorのハーネスがなぜ良いのかという質問に戻ると、単にもっとテストしたからです。新しいモデルが出てきた時や早期アクセスを得た時に、システムプロンプトへのあらゆる種類の小さな変更でハンマーするのが仕事全体である数人をCursorで知っています。モデルが大部分においてするべきことを何でもするまで、常に微調整し続けます。

そして特定のモデルでは、ハーネスはスロップでいっぱいです。分かりません、AIにシステムプロンプトのプロンプトを書かせている会社を想像してください。ツールの説明を何度も書き直して、思い通りに動作させるために多くの時間を費やしていないかもしれません。

私が与えた例でさえ、代わりにBashツールを使うようにモデルに伝え、Claudeモデルではそうしなかったが、Geminiモデルでは、Bashしか使いません。今、その違いは、Cursorでサポートするすべての異なるモデルに対してこれらの説明を書き直す必要があることを意味します。

一方、Anthropicはおそらく作成されてからコードベースのこれらの行を変更していません。それが違いです。おそらく最初から彼らのためにモデルによって書かれたのでしょう。微調整してこれらを正しく取得しようとはしていません。

だから、文字通りそれが仕事である多くの人々を持つ会社は、結果が示しています。そして今日まで、直接使うよりもCursorを通してGeminiを使う方がはるかに好きです。直接使うよりもCursorを通してOpusを使う方がはるかに好きです。

GPTモデルでは、ほとんど違いを感じません。正直なところ、問題は多くのこれらの会社、特にGoogleとAnthropicの両方が、自分のもの以外のツールで彼らとのサブスクリプションを使わせないことです。

OpenAIは気にしません。OpenAIサブスクリプションを基本的に何でも使えますし、彼らはそれでクールです。これまでのところ、AnthropicとGoogleははるかに敵対的でした。だから、Geminiに月250ドル払っているか、Opusに月200ドル払っている場合、彼らのハーネスを使う必要があります。

だから、T3 Codeとは一体何なのかという次の質問に行きます。T3 Codeはどんなツールも提供しません。T3 CodeにはBashツールや読み取りツールは何もありません。なぜなら、ツールがないからです。なぜなら、ハーネスではないからです。

T3 Codeにはモデルピッカーがありますが、モデルを選ぶだけではありません。Claudeのモデルを選ぶと、マシン上のClaude Codeハーネスを使っています。Claude Codeがすでにインストールされてサインインしていない場合、これは機能しません。

そして、Codeexでも同じ取引です。Codex CLIがインストールされていない場合、これも機能しません。これらのハーネスはT3 CodeをUIレイヤーとして提供されています。私たちはハーネスの上の本当に素敵なUIです。

だから、私が簡単な作業をラッピングしただけだと思っているかもしれません。ハーネスを作るのがどれほど簡単か忘れましたか?これが難しい部分です。T3 Codeを構築している時に学んだことがあるとすれば、自分でハーネスを構築できれば、私の人生は大幅に簡単になっただろうということです。

エンディング

この件について言うべきことはこれですべてだと思います。Mattに、Edwardのツイートにつながり、私が気にするようになった動画を作ってくれたことに感謝します。参考点として使った「Emperor Has No Clothes」記事の著者Mahに感謝します。そして、これをはるかに複雑にする必要があるようにしてから、シンプルであるべきだと気づいて、実際には60行のPythonだけであるものについて皆さんを教育する機会を私に与えてくれたすべての会社に感謝します。

これは実際に本当に楽しかったです。このような深掘り動画をするのはしばらくぶりです。コンセプトを分解するだけの動画です。そして、これについてどう感じるか気になります。私は今ではニュースの人みたいになっていますが、深い部分に入るのが大好きです。

この動画を楽しみましたか?このようなものをもっと見たいですか?もしそうなら、コメントで教えてください。そして、同様のことについていくつか質問をして、今後コンテンツをどこに向けるべきか分かるようにしてください。

十分な人がハーネスを理解していなかったので、これを作ることにしました。理解していない他のことはありますか?もしそうなら、将来それらをカバーするために最善を尽くします。どうだったか教えてください。そして次回まで、プロンプトし続けてください。

コメント

タイトルとURLをコピーしました