- 本書の記載
-
本書では createModelFromEnv を次の形で実装しています(抜粋)。
export function createModelFromEnv(): LanguageModel {
const provider = process.env.LLM_PROVIDER;
const modelName = process.env.LLM_MODEL;
const apiKey = process.env.LLM_API_KEY;
if (!provider) throw new Error('LLM_PROVIDER 環境変数が設定されていません');
if (!modelName) throw new Error('LLM_MODEL 環境変数が設定されていません');
switch (provider.toLowerCase()) {
case 'openai': {
if (apiKey && !process.env.OPENAI_API_KEY) {
process.env.OPENAI_API_KEY = apiKey;
}
const openai = createOpenAI();
return openai(modelName);
}
// anthropic / google も同様に process.env 経由で apiKey を伝搬
}
}
- 症状
-
本書のコードをそのまま写経して進める範囲では問題なく動作します。ただし、配布リポジトリの src/providers/modelFactory.ts は付録 B(Responses API 対応)を含む拡張のため、次の 3 点で本書の記載と異なります。
- シグネチャ:
createModelFromEnv(options?: { useResponses?: boolean }) のように Responses API の切替オプションを受け取ります。
LLM_API_KEY の扱い:未設定時に明示的に throw します(本書版はサイレント通過のため、後段の SDK 呼び出しで 401 として現れます)。
- API キーの渡し方:
createOpenAI({ apiKey }) のように直接引数で渡します(本書版は process.env.<PROVIDER>_API_KEY への代入経由)。
このため、配布リポジトリの bin/cli.ts --responses(付録 B)を試そうとすると、本書版の createModelFromEnv には useResponses 切替が存在せず、付録 B のサンプルどおりに動作させられません。
- 対処
-
本書の章を順に進める読者は、本書のコードのままで問題ありません。配布リポジトリのコードを参照する場合や、付録 B(Responses API 対応)を試す場合は、リポジトリの src/providers/modelFactory.ts の実装を参照してください。
Responses API 切替を本書版に最小限取り込みたい場合は、OpenAI ケースに次の分岐を加える方法があります。
case 'openai': {
if (apiKey && !process.env.OPENAI_API_KEY) {
process.env.OPENAI_API_KEY = apiKey;
}
const useResponses = process.env.USE_RESPONSES_API === 'true';
const openai = useResponses ? createOpenAIResponses() : createOpenAI();
return openai(modelName);
}
- 補足
-
同様の経緯で、本書 6.4 節のコード片では Google ケースの API キーに process.env.GOOGLE_API_KEY を使っていますが、配布リポジトリの .env.example および src/providers/google.ts は GEMINI_API_KEY を優先します(GOOGLE_API_KEY もフォールバックとして読みます)。本書のコードは引き続き動作しますが、リポジトリの環境変数名は GEMINI_API_KEY である点に留意してください。