主要ポイント
- OpenCodeに触れる前にcurlでエンドポイントを検証し、失敗が設定の問題かAPIの問題かを確認してください。
- カスタムプロバイダーには3つのものが必要です:ベースURL、APIキー、およびモデルID(ここではuncensored)。
- エージェントが実際のウィンドウに合わせて計画できるように、コンテキスト制限を100,000トークンに設定します。
- ストリーミングと関数呼び出しはサポートされており、これはエージェントループに必要な機能です。
開始前に必要なもの
OpenCodeはターミナルで実行されるオープンソースのコーディングエージェントです。多くのモデルプロバイダーと通信でき、エンドポイントがOpenAIチャット形式に従っている場合、独自のプロバイダーを追加できます。このAPIはそれに従うため、セットアップは数フィールドに入力するだけの問題です。
まずこれら3つの値を収集してください:
- ベースURL:
https://api.kimicode.top/v1 - モデルID:
uncensored - APIキー: APIキーページで作成します。新規アカウントは、ワンクリックで$0.50の無料トライアルクレジットを取得でき、これは以下のテストに十分です。トライアルキーは、最大2つの同時リクエストと1分あたり60リクエストまで許可されます。
キーをファイルに貼り付けるのではなく、環境変数に保持してください:
export KIMICODE_API_KEY="your-key-here"ステップ1:curlでエンドポイントをテスト
ツールを設定する前にこれを行ってください。curlが動作してOpenCodeが動作しない場合、問題が設定にあることがわかります。curlが失敗する場合、キーまたはURLを2か所でなく1か所で修正します。
curl https://api.kimicode.top/v1/chat/completions \
-H "Authorization: Bearer $KIMICODE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [{"role": "user", "content": "Say hello in five words."}],
"max_tokens": 40
}'
choices配列とusageブロックを含むJSONオブジェクトを取得する必要があります。401は、キーが間違っているか、Bearerプレフィックスが不足していることを意味します。404は通常、URLの入力ミスまたはすでに/chat/completionsが含まれていることを意味します。
コーディングエージェントは回答をストリーミングし、ツールを呼び出すため、それら2つも確認してください:
curl -N https://api.kimicode.top/v1/chat/completions \
-H "Authorization: Bearer $KIMICODE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"stream": true,
"messages": [{"role": "user", "content": "Count from one to five."}]
}'
一連のdata:行、各々に小さなJSON差分、使用状況の数値、および最終マーカーが表示されるはずです。-Nフラグはcurlのバッファリングを無効にし、チャンクが到着するたびに現れます。
ステップ2:OpenCodeにカスタムプロバイダーを追加
OpenCodeは、プロジェクトフォルダーまたはグローバル設定ディレクトリからJSON設定ファイルopencode.jsonを読み取ります。カスタムOpenAIスタイルのプロバイダーは、AI SDKのOpenAI互換パッケージ、ベースURL、およびモデルのリストを使用して宣言されます。以下のレイアウトは、執筆時点でのOpenCodeの公開ドキュメントに従っています。フィールド名はリリース間で変更される可能性があるため、拒否された場合は現在のOpenCodeドキュメントのプロバイダーセクションと比較してください。
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"kimicode": {
"npm": "@ai-sdk/openai-compatible",
"name": "Kimicode API",
"options": {
"baseURL": "https://api.kimicode.top/v1",
"apiKey": "{env:KIMICODE_API_KEY}"
},
"models": {
"uncensored": {
"name": "Uncensored",
"limit": {
"context": 100000,
"output": 8192
}
}
}
}
},
"model": "kimicode/uncensored"
}
modelsの下のキーは、サーバーに送信される正確なモデルIDであるため、uncensoredと読み込まなければなりません。最後の行は、プロバイダー名、スラッシュ、モデルIDとして記述されたデフォルトとしてプロバイダーとモデルを選択します。
{env:KIMICODE_API_KEY}形式は、OpenCodeにシェル変数から読み込ませるよう指示します。お使いのバージョンが独自のログインコマンド経由で認証情報を処理する場合は、その方法を使用し、ファイルからキーを除外してください。いずれの場合も、実際のキーをコミットしないでください。
プロジェクト設定またはグローバル設定
プロバイダーブロックを2つの場所に保持できます。プロジェクトルートにあるファイルはそのリポジトリにのみ適用され、1つのセットアップを共有するチームに適しています。ユーザー設定ディレクトリにあるファイルはすべてに適用され、パーソナルなデフォルトに適しています。両方が存在する場合、プロジェクトファイルはグローバルファイルに追加または上書きします。
プロバイダー定義にはグローバルファイル、キーには環境変数を優先してください。そうすれば、すべてのリポジトリがエンドポイントを使用でき、機密情報がソースコードの隣に置かれません。複数の人が1つのプロジェクトで作業する場合、キーなしでプロバイダーブロックのみをコミットし、各人が独自の変数を設定させます。これにより、キーのローテーションも簡単になります:変数を変更し、ターミナルを再起動すると、設定ファイルは変更されません。
ステップ3:モデルを選択してタスクを実行
プロジェクトフォルダーでOpenCodeを起動し、モデルピッカーを開きます。カスタムプロバイダーは、設定した表示名でリストに表示されるはずです。それを選択し、関数の説明や短いファイルのユニットテストの作成など、小さく検証可能なタスクをエージェントに与えます。
2つの理由で小さく始めてください。まず、ツール呼び出しが機能するかどうかを確認できます:OpenCodeがモデルにファイルを読み取ったり編集したりするように依頼すると、ツール呼び出しインターフェースを介して行われます。第二に、コーディングエージェントは1ターンあたりのテキスト量が多く、ファイル内容と履歴を含むため、長いセッションはトークンを急速に消費します。次のセクションでは、その数値を示します。
モデルが表示されない場合は、ファイルが有効なJSONであること、OpenCodeが設定を探す場所に配置されていること、およびプロバイダー名がmodelフィールドに入力したものと一致していることを確認してください。
関数呼び出しとJSONモードを直接テスト
OpenCodeはファイルの読み取り、コマンドの実行、コードの編集にツール呼び出しに依存するため、エージェントの失敗を責める前にエンドポイントがツール定義を処理できることを確認する価値があります。このリクエストは1つのツールを提供し、それが必要な質問をします。
curl https://api.kimicode.top/v1/chat/completions \
-H "Authorization: Bearer $KIMICODE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [{"role": "user", "content": "What is in the file notes.txt?"}],
"tools": [{
"type": "function",
"function": {
"name": "read_file",
"description": "Read a text file by path",
"parameters": {
"type": "object",
"properties": {"path": {"type": "string"}},
"required": ["path"]
}
}
}],
"tool_choice": "auto"
}'
良い応答には、tool_callsエントリが含まれ、JSON引数文字列でread_fileを指定します。エージェントはツールを実行し、roleをtoolに設定したメッセージとして結果を送り返し、モデルはそこから続行します。プレーンテキストしか表示されない場合は、モデルがツールを呼び出すかどうかはその動作の一部であるため、より直接的なプロンプトを試してください。
JSONモードは別のスイッチです。"response_format": {"type": "json_object"}を追加すると、有効なJSON出力が要求され、戻り値を解析する必要があるスクリプトに役立ちます。期待する形状をモデルに知らせるため、プロンプトにJSONも言及してください。
コンテキストサイズとセッションの費用
コンテキストウィンドウは100,000トークンで、プロンプトと補完を合わせてカウントします。limit.contextを100000に設定すると、エージェントは実際の上限を知り、サーバーがリクエストを拒否する前に履歴をトリムまたは要約できます。補完は残りのスペースを使用でき、max_tokensはオプションです。
課金は、1M入力トークンあたり$0.15、1M出力トークンあたり$0.50です。エージェントは入力が重く、これは各ターンで会話が再送信されるためです。適度なセッションの計算例を以下に示します。
- 40ターン、各ターンで約30,000入力トークンを送信:1,200,000入力トークン、つまり1.2 x $0.15 = $0.18。
- 各ターンで約800出力トークンを返す:32,000出力トークン、つまり0.032 x $0.50 = $0.016。
- 合計:$0.196、つまりセッション全体で約20セント。
あなたの数値は異なる可能性があります。レスポンス内のusage値を確認するか、各レスポンスで残高を報告するX-Balance-USDヘッダーを確認してください。クレジットは前払いで期限切れにならず、失敗または拒否されたリクエストには課金されません。詳細は料金ページをご覧ください。
コーディングエージェントに対する正直な期待
これは、法的な成人用途においてコンテンツ拒否なしで回答するように調整された汎用テキストモデルです。これはコード専用で構築されたモデルではなく、このページではベンチマークに関する主張は行っていません。リポジトリを確実に編集できるかどうかは、重要なデータを渡す前に、バージョン管理を有効にして独自のタスクでテストすべきです。
エージェントに必要な配管を処理します:ストリーミングされたtool_calls、role: "tool"メッセージとして送信されるツール結果、およびresponse_formatを通じたJSONモード。テキストのみで画像には対応していないため、スクリーンショットを添付する機能は機能しません。
エージェントにとって2つの制限が重要です。フルキーは最大8つの同時リクエストと1分あたり300リクエストまで許可されます。一度に多くの呼び出しを発生させるサブエージェントや並列ツール実行は、同時実行数の上限に達する可能性があり、ストリーミングされたリクエストはストリームが終了するまでスロットを保持します。その場合、コードconcurrencyでHTTP 429を取得します。コードrate_limitedは、1分あたりのリクエストが多すぎます。一時的な過負荷時には、Retry-After: 5で429も表示されることがあります。並列性を減らすか、待機して再試行してください。
トラブルシューティング
| 症状 | 考えられる原因 | 修正方法 |
|---|---|---|
| 401 Unauthorized | 空または間違ったキー;OpenCodeを起動したシェルで環境変数が設定されていない | 同じターミナルで echo $KIMICODE_API_KEY を実行し、その後 OpenCode を再起動してください |
| 404 Not Found | ベースURLに/chat/completionsが含まれているか、/v1が欠落している | https://api.kimicode.top/v1 を正確に使用してください |
| モデルが見つからない | モデルキーがuncensoredと異なる | modelsのキーを、GET /v1/modelsで返されるIDと一致させてください |
concurrency付きの429 | 一度にリクエストが多すぎる | 並列のツール呼び出しを減らすか、ストリーミングが完了するまで待ってください |
| リクエストが大きすぎます | 本文が8 MBを超えるか、履歴がコンテキストウィンドウの制限に近づいている | 新しいセッションを開始するか、履歴を要約してください |
ここでカバーされていない内容については、ドキュメントページに完全なリクエストリファレンスが記載されており、統合ガイドでは他のOpenAI互換クライアントの観点から同じエンドポイントについて解説しています。
