書籍『作って学ぶ AIエージェント』の書影
Support Site

作って学ぶ AIエージェント サポートサイト

書籍「作って学ぶ AIエージェント ── TypeScriptとLLMで切り拓くAI時代のエンジニアリング」(laiso 著、技術評論社刊)のサポートサイトです。

技術評論社の書籍ページを見る

第 2 章

2.7 節

Google 系 API キーの環境変数名

#
本書の記載

本書 2.7 節「API キーの設定」の .env 記載例では、Google の API キーを次のように記載しています。

OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
GOOGLE_API_KEY=AI...

同様に第 6 章の createModelFromEnv のコード例でも process.env.GOOGLE_API_KEY が使われています。一方、第 3 章のプロバイダー実装と表では GEMINI_API_KEY が登場しており、本書内で表記が混在しています。

症状

配布リポジトリの .env.exampleGEMINI_API_KEY を採用しています。このため、配布リポジトリ実体に合わせて .env を作成する場合と、本書 2.7 節の例どおりに作成した場合で、環境変数名が異なる状態になります。

対処

配布リポジトリの src/providers/google.tsGEMINI_API_KEY を優先しつつ GOOGLE_API_KEY もフォールバックとして参照する実装になっているため、どちらの環境変数名を設定しても動作します。配布リポジトリと一致させたい場合は GEMINI_API_KEY を使用してください。

const apiKey =
    config.apiKey ?? process.env.GEMINI_API_KEY ?? process.env.GOOGLE_API_KEY;

第 3 章

3.3 節

LLMApiError のコンストラクタ引数

#
本書の記載

OpenAI プロバイダーの例で次の呼び出しが記載されています。

throw new LLMApiError('APIからの応答がありません');
症状

LLMApiError クラスの定義では第 1 引数が status: number、第 2 引数が provider: string で、文字列 1 つだけを渡す呼び出しは型エラーになります。

対処

多引数形式で呼び出します。

throw new LLMApiError(500, 'openai', undefined, 'APIからの応答がありません');

第 4 章

4.6 節

ツール動作確認スクリプトのファイル名

#
本書の記載

コード例のコメントに // chapters/04-tools-demo.ts とあり、実行コマンドの例は bun run chapters/04-demo-tools.ts と記載されています。

症状

実行コマンドのファイル名がコード例と一致していないため、記載どおりに実行するとファイルが見つからずエラーになります。

対処

正しいファイル名は 04-tools-demo.ts です。次のコマンドで実行してください。

bun run chapters/04-tools-demo.ts

第 6 章

6.4 節

createModelFromEnv と配布リポジトリ実装の差異

#
本書の記載

本書では 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.tsGEMINI_API_KEY を優先します(GOOGLE_API_KEY もフォールバックとして読みます)。本書のコードは引き続き動作しますが、リポジトリの環境変数名は GEMINI_API_KEY である点に留意してください。

第 7 章

7.2 節

Variables の設定

#
本書の記載

gh variable set による LLM_PROVIDERLLM_MODEL の登録手順が記載されています。

症状

Variables が未登録の場合、ワークフロー実行時にこれらの環境変数が空となり、bin/cli.ts 起動時に「LLM設定が不足しています」のエラーで終了します。Secrets の LLM_API_KEY とは別に Variables として登録する必要があります。

対処

次のコマンドで Variables を登録します。登録状況は gh variable list で確認できます。

gh variable set LLM_PROVIDER --body "openai"
gh variable set LLM_MODEL --body "gpt-5-mini"
補足

gpt-5-nano は安価ですが、本書で紹介している Issue 駆動ワークフロー(コード修正→ブランチ作成→コミット→プッシュ→PR 作成→Issue へのコメント)を maxSteps=20 の上限内で完走できないことを GitHub Actions での実行で確認しています。そのため、少なくとも gpt-5-mini 以上のモデルを推奨します。

7.4 節

PR 作成に必要なリポジトリ設定

#
本書の記載

第 7 章 7.4 節に「プルリクエストの作成には、7.2 節で設定したワークフロー権限(pull-requests: write)とリポジトリ設定(プルリクエスト作成の許可)の両方が必要です」と記載されています。具体的なリポジトリ設定の手順は本文に含まれていません。

症状

ワークフロー権限のみを設定した状態では、プルリクエストを作成できず、実行時に次のエラーで失敗します。

GitHub Actions is not permitted to create or approve pull requests
対処

リポジトリの Settings → Actions → General → Workflow permissions を開き、「Allow GitHub Actions to create and approve pull requests」にチェックを入れて Save してください。7.2 節で設定したワークフロー権限と併用することで、プルリクエストの作成が許可されます。

7.7 節

ISSUE_TEXT の埋め込み

#
本書の記載

ワークフロー YAML で ISSUE_TEXT 環境変数に Issue 本文を渡す設定が記載されています。

症状

bin/cli.tsissueDrivenInstructions テンプレートが ISSUE_TEXT を参照しない構成の場合、エージェントは Issue タイトルしか認識できず、本文の詳細な指示に従えません。

対処

issueDrivenInstructions のテンプレートリテラル内で process.env.ISSUE_TEXT を取り込み、「## Issue本文(参照用)」の形で本文を埋め込みます。

const issueText = process.env.ISSUE_TEXT || '';
const issueDrivenInstructions = `${baseInstructions}

## Issue本文(参照用)
${issueText}
`;

第 8 章

8.5 節

サンドボックス動作確認コマンドのファイルパス

#
本書の記載

サンドボックス動作確認の手順で、コンテナ内で nano-code-cli を起動するコマンド例として次のように記載されています。

$ bun run src/index.ts --sandbox "README.mdの内容を要約してください"
症状

配布リポジトリに src/index.ts は存在しません。CLI のエントリポイントは bin/cli.ts です。本書のコマンドをそのまま実行すると、Bun がモジュールを解決できず次のエラーで即終了します。

error: Module not found "src/index.ts"
対処

エントリポイントを bin/cli.ts に置き換えてください。

$ bun run bin/cli.ts --sandbox "README.mdの内容を要約してください"

本書の同章内の他箇所(コマンド実行ツールの実装手前)では bun run bin/cli.ts ... と正しく記載されているため、表記を合わせる形になります。