🔌
ローカルのClaudeCodeをOpenAI ChatAPI互換で使う為のアダプター
課題: 気軽にLLMを試したい
- OSS活動やちょっとしたPOC、モックの開発などでOpenAIのChatAPIを使っていると地味に費用が嵩む
- プロジェクト毎に個別にAPIキーを発行するのも面倒い
- Ollamaは重くて辛い(Macが非力)
- 既存のLangChainコードはそのまま使いたい
解決策: claude code 使わせてもらう
ローカルのclaude code を LangChain(OpenAI ChatAPI標準)経由で使う
- 大体のプロジェクトは利用するLLMとしてOpenAI ChatAPIに対応している
- 月に100$分を使い切りたい!(心が貧乏)
- OpenAI ChatAPI標準のエンドポイントを用意して claude code に投げるアダプターがあれば十分そう
- 作ったのがこれ
何ができるのか
ローカルのClaude CodeをOpenAI互換のAPIサーバーとして動かせます
# リポジトリをダウンロード
# 必要あればforkして利用してください
git clone git@github.com:pppp606/cli-agent-openai-adapter.git
# サーバー起動
npm install
npm start
# => デフォルトは http://localhost:8000 で起動
LangChainでの使用例
import { ChatOpenAI } from "@langchain/openai";
// 開発環境:ローカルのClaude Code経由
const llmDev = new ChatOpenAI({
configuration: {
baseURL: "http://localhost:8000/v1"
},
modelName: "claude-code",
apiKey: "dummy" // 不要だけどSDKの仕様上必要
});
// 本番環境:OpenAI API直接
const llmProd = new ChatOpenAI({
openAIApiKey: process.env.OPENAI_API_KEY,
modelName: "gpt-4"
});
// 使い方は全く同じ
const response = await llmDev.invoke("こんにちは!");
OpenAI SDKでの使用例
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "http://localhost:8000/v1",
apiKey: "dummy"
});
const response = await client.chat.completions.create({
model: "claude-code",
messages: [
{ role: "user", content: "TypeScriptでFizzBuzzを書いて" }
]
});
console.log(response.choices[0].message.content);
実装のポイント
ステートレス実行
セッションの維持はしておらず、都度 claude code -p の非対話型で起動している状態です。会話履歴はクライアント側で管理し、OpenAI APIと同じ動作をします。
会話履歴の扱い
// 会話履歴をJSON形式でプロンプトに含める
const prompt = `
Conversation history:
[
{"role": "user", "content": "私の好きな色は青です"},
{"role": "assistant", "content": "素敵ですね!"}
]
Current user message: 私の好きな色は何ですか?
`;
ツールの無効化
安全のため、Claude Codeのツール機能(ファイル操作など)は .claude/settings.json で無効化。
またシステムプロンプトでコーディングエージェントではなく純粋な汎用LLMとして動くように調整しています。(システムプロンプトはオプションで設定可能です)
利用するモデル
デフォルトはレスポンスを重視してHaikuを使っています。これもオプションで変更可能です。
まとめ
「ちょっとLLM使いたい」時の最軽量の選択肢
- セットアップ:Claude Codeがあればnpmインストールだけ
- コスト:Claude Codeの料金のみ
- 互換性:既存のOpenAI APIコードがそのまま動く
注意
本番運用は想定していません。挙動もそうですがclaudeの規約的にもアカウントを自分以外に使わせるのは問題があるはずです。
今後の予定
- ストリーミングレスポンス対応
- こっちの方がレスポンスが早くなりそう
- 他のCLIツール(Codex、Gemini CLI)対応
何かあればフィードバックやコントリビューションお待ちしています!
Discussion