@@ -259,6 +259,10 @@ <h3>第 4 章</h3>
259259 < ul >
260260 < li > < a href ="#ch04-6-tools-demo-filename "> 4.6 節 ツール動作確認スクリプトのファイル名</ a > </ li >
261261 </ ul >
262+ < h3 > 第 6 章</ h3 >
263+ < ul >
264+ < li > < a href ="#ch06-4-create-model-from-env "> 6.4 節 createModelFromEnv の実装差異</ a > </ li >
265+ </ ul >
262266 < h3 > 第 7 章</ h3 >
263267 < ul >
264268 < li > < a href ="#ch07-2-variables "> 7.2 節 Variables の設定</ a > </ li >
@@ -324,6 +328,68 @@ <h3>ツール動作確認スクリプトのファイル名</h3>
324328 </ article >
325329 </ section >
326330
331+ < section class ="chapter-group ">
332+ < h2 > 第 6 章</ h2 >
333+
334+ < article id ="ch06-4-create-model-from-env ">
335+ < header >
336+ < span class ="chapter-label "> 6.4 節</ span >
337+ < h3 > < code > createModelFromEnv</ code > と配布リポジトリ実装の差異</ h3 >
338+ < a class ="anchor " href ="#ch06-4-create-model-from-env "> #</ a >
339+ </ header >
340+ < dl >
341+ < dt > 本書の記載</ dt >
342+ < dd >
343+ < p > 本書では < code > createModelFromEnv</ code > を次の形で実装しています(抜粋)。</ p >
344+ < pre > < code > export function createModelFromEnv(): LanguageModel {
345+ const provider = process.env.LLM_PROVIDER;
346+ const modelName = process.env.LLM_MODEL;
347+ const apiKey = process.env.LLM_API_KEY;
348+ if (!provider) throw new Error('LLM_PROVIDER 環境変数が設定されていません');
349+ if (!modelName) throw new Error('LLM_MODEL 環境変数が設定されていません');
350+ switch (provider.toLowerCase()) {
351+ case 'openai': {
352+ if (apiKey && !process.env.OPENAI_API_KEY) {
353+ process.env.OPENAI_API_KEY = apiKey;
354+ }
355+ const openai = createOpenAI();
356+ return openai(modelName);
357+ }
358+ // anthropic / google も同様に process.env 経由で apiKey を伝搬
359+ }
360+ }</ code > </ pre >
361+ </ dd >
362+ < dt > 症状</ dt >
363+ < dd >
364+ < p > 本書のコードをそのまま写経して進める範囲では問題なく動作します。ただし、配布リポジトリの < code > src/providers/modelFactory.ts</ code > は付録 B(Responses API 対応)を含む拡張のため、次の 3 点で本書の記載と異なります。</ p >
365+ < ul >
366+ < li > < strong > シグネチャ</ strong > :< code > createModelFromEnv(options?: { useResponses?: boolean })</ code > のように Responses API の切替オプションを受け取ります。</ li >
367+ < li > < strong > < code > LLM_API_KEY</ code > の扱い</ strong > :未設定時に明示的に < code > throw</ code > します(本書版はサイレント通過のため、後段の SDK 呼び出しで < code > 401</ code > として現れます)。</ li >
368+ < li > < strong > API キーの渡し方</ strong > :< code > createOpenAI({ apiKey })</ code > のように直接引数で渡します(本書版は < code > process.env.<PROVIDER>_API_KEY</ code > への代入経由)。</ li >
369+ </ ul >
370+ < p > このため、配布リポジトリの < code > bin/cli.ts --responses</ code > (付録 B)を試そうとすると、本書版の < code > createModelFromEnv</ code > には < code > useResponses</ code > 切替が存在せず、付録 B のサンプルどおりに動作させられません。</ p >
371+ </ dd >
372+ < dt > 対処</ dt >
373+ < dd >
374+ < p > 本書の章を順に進める読者は、本書のコードのままで問題ありません。配布リポジトリのコードを参照する場合や、付録 B(Responses API 対応)を試す場合は、リポジトリの < code > src/providers/modelFactory.ts</ code > の実装を参照してください。</ p >
375+ < p > Responses API 切替を本書版に最小限取り込みたい場合は、OpenAI ケースに次の分岐を加える方法があります。</ p >
376+ < pre > < code > case 'openai': {
377+ if (apiKey && !process.env.OPENAI_API_KEY) {
378+ process.env.OPENAI_API_KEY = apiKey;
379+ }
380+ const useResponses = process.env.USE_RESPONSES_API === 'true';
381+ const openai = useResponses ? createOpenAIResponses() : createOpenAI();
382+ return openai(modelName);
383+ }</ code > </ pre >
384+ </ dd >
385+ < dt > 補足</ dt >
386+ < dd >
387+ < p > 同様の経緯で、本書 6.4 節のコード片では Google ケースの API キーに < code > process.env.GOOGLE_API_KEY</ code > を使っていますが、配布リポジトリの < code > .env.example</ code > および < code > src/providers/google.ts</ code > は < code > GEMINI_API_KEY</ code > を優先します(< code > GOOGLE_API_KEY</ code > もフォールバックとして読みます)。本書のコードは引き続き動作しますが、リポジトリの環境変数名は < code > GEMINI_API_KEY</ code > である点に留意してください。</ p >
388+ </ dd >
389+ </ dl >
390+ </ article >
391+ </ section >
392+
327393 < section class ="chapter-group ">
328394 < h2 > 第 7 章</ h2 >
329395
0 commit comments