- ストリーミング応答時のパニック:
--streamオプション使用時に発生していた「panic: close of closed channel」エラーを修正しました。sync.Onceを使用してresponseChanが一度だけクローズされるようにしました。
- 設定ファイルパスオプション: デフォルトの場所を上書きする、設定ファイルへのパスを指定するためのグローバルな
--config(-c) フラグを導入しました。 - 設定検証を伴うプロファイルチェックコマンドの強化:
llm-cli profile checkコマンドが、プロバイダー固有の設定検証を実行するようになりました。- 新しい
llm.ConfigValidatorインターフェースを導入し、各LLMプロバイダーが実装しています。 - 各プロバイダーの
ValidateConfig()メソッドは、必須設定(例:model、api-key、aws-region、project-id、credentials-file)とその有効性をチェックします。 checkコマンドは詳細な検証エラーを報告するようになり、ユーザーが設定ミスを早期に特定し修正するのに役立ちます。
- 新しい
- クレデンシャルファイルパスの解決:
config.jsonファイルの場所に対する相対パスでcredentials-fileパスを解決し、~(チルダ)をユーザーのホームディレクトリに展開するロジックを実装しました。これにより、現在の作業ディレクトリに関係なく正しいパス解決が保証されます。 - プロバイダー設定検証インターフェース:
llm.ConfigValidatorインターフェースを定義し、すべてのLLMプロバイダー(ollama、openai、openai2、bedrock、vertexai、vertexai2、mock)でValidateConfig()メソッドを実装し、設定検証ロジックを一元化および標準化しました。
- 高度なOpenAI互換プロバイダー (
openai2): OpenAI互換API(特にLM Studio)向けに、動的で柔軟なモデル解決機能を持つ新しいopenai2プロバイダーを導入しました。model設定に、優先順位を指定するカンマ区切りのリスト(例:"my-model,auto")を使用できます。- プロバイダーはサーバーの
/v1/modelsエンドポイントをクエリし、優先順位リストに一致する最初の利用可能なモデルを使用します。これにより、プロファイルを頻繁に編集する必要がなくなり、ワークフローが簡素化されます。
- プロバイダーのパッケージ分離:
internal/llmパッケージを、各プロバイダーが自己完結したサブパッケージ(例:internal/llm/openai)に配置されるように再構築しました。この大規模なリファクタリングにより、厳格なモジュールの独立性が確保され、保守性が大幅に向上し、堅牢なユニットテストへの道が開かれました。
- Vertex AI プロバイダーの強化 (
vertexai2): Vertex AI SDKがネイティブでシステムプロンプトをサポートしていない問題に対する、より堅牢なワークアラウンドを提供する新しいvertexai2プロバイダーを追加しました。このプロバイダーは、チャット履歴の最初のターンとしてシステムプロンプトを注入することで会話のコンテキストを事前設定し、より一貫したモデルの振る舞いを実現します。
- パフォーマンスとセキュリティを向上させるため、様々なGoモジュールを最新バージョンに更新しました。
- Zsh補完スクリプトのインストール: 環境固有の問題により、
make install時のZsh補完スクリプトの自動インストールを削除しました。ユーザーはllm-cli completion zshを使用して手動でスクリプトを生成できます。
- OpenAI APIキーファイル対応:
credentials-fileで指定されたJSONファイルからOpenAI APIキーを読み込む機能を追加しました。- JSONファイルには
openai_api_keyフィールドにAPIキーが含まれている必要があります。 credentials-fileはプロファイルに直接設定されたapi_keyよりも優先されます。
- JSONファイルには
- プロファイルチェックコマンドの強化:
llm-cli profile checkコマンドが、プロファイルで指定されたクレデンシャルファイルの存在を検証するようになりました。- 指定されたクレデンシャルファイルが存在しない、または解決できない場合に警告を表示します。
- プロファイルチェックロジックの修正:
llm-cli profile checkコマンドが、標準のデフォルト値と既に一致している場合でも「limits」設定の更新を不必要に促す問題を修正しました。- コマンドは、「limits」がゼロ値であるか、標準のデフォルト値と意味的に異なる場合にのみ更新を促すようになりました。
- ビルド修正:
cmd/root.goの未使用インポートを解決し、ビルド時のgovulncheckエラーを修正しました。
- READMEの更新:
~(チルダ) パス表記を明確にし、OpenAI APIキーファイル対応の使用例をREADME.mdおよびREADME.ja.mdに追加しました。
- エラーハンドリング:
main.goおよびcmd/root.goでエラーハンドリングを一元化し、一貫したエラー処理と終了コードを実現しました。
- プロファイルチェックコマンド: 設定プロファイルの検証と移行を行う
llm-cli profile checkコマンドを追加しました。- 特に「limits」のような新しく導入された設定について、すべてのプロファイルの一貫性をチェックします。
- デフォルトまたは未設定の「limits」設定を持つプロファイルを、標準のデフォルト値に更新するかどうかをユーザーに確認します。
- 非対話型操作のための
--confirmまたは-yフラグを含みます。 - 変更を保存する前に、
config.jsonファイルのタイムスタンプ付きバックアップを~/.config/llm-cli/backups/ディレクトリに作成し、データの安全性を確保します。 profile showコマンドを拡張し、「limits」情報を表示するようにしました。
- DoS防御機能の強化: DoS防御とUTF-8の安全性に関する残りの問題を修正しました。
readAndProcessStreamを修正し、「warn」モードであってもMaxPromptSizeBytesの制限に達した時点で入力の読み込みを停止するようにしました。これにより、大きなファイルが完全にメモリにロードされるのを防ぎます。truncateStringByBytesをUTF-8対応に更新し、サイズ制限のための文字列切り詰めがマルチバイト文字を破損させないようにしました。
- 設定読み込みの一貫性: 設定ファイルをロードする際に、
Limits構造体が明示的に設定ファイルに存在しない場合でも、常にデフォルト値で初期化されるようにしました。これにより、すべてのプロファイルで一貫した動作が保証されます。
- サイズ制限によるDoS防御: 偶発的なリソース枯渇を防ぐため、設定可能な入力および出力サイズ制限を実装しました。
config.jsonのプロファイルに新しいlimitsオブジェクトを追加しました。promptコマンドは、これらの制限をチェックし、超過時の動作 (stopまたはwarn) を設定できるようになりました。addコマンドは、新しいプロファイルに対してフラグ (--limits-max-prompt-size-bytesなど) を介して制限を設定できるようになりました。setコマンドは、ドット表記 (limits.on_input_exceededなど) を使用して制限を設定できるようになりました。listコマンドは、各プロファイルの設定された制限を表示するようになりました。
- スピナーによるUX改善:
--streamモードを使用しない場合に、長時間実行される操作中に視覚的なフィードバックを提供するため、promptコマンドにスピナーを追加しました。スピナーは対話型ターミナルでのみ表示されます。
- CLIの動作: ランタイムエラー(APIエラーなど)発生時に自動的に使用方法の表示を抑制し、よりクリーンなエラー出力を提供するようにしました。
- プロファイルコマンドのテスト容易性向上:
profileサブコマンド (add,set,use,remove) をリファクタリングし、os.Exitを呼び出す代わりにエラーを返すようにしました。これにより、テストが可能になり、テストの信頼性が向上しました。
- 脆弱性チェックの統合:
Makefileにgovulncheckを追加し、ビルドプロセスに統合することで、既知の脆弱性を自動的にスキャンするようにしました。 - macOS アドホック署名: ビルドマシン以外のマシンでも実行できるように、
Makefileで macOS ユニバーサルバイナリにアドホック署名を実装しました。
- ビルド修正:
cmd/list.goのosパッケージのインポート文で引用符が欠落していた構文エラーを修正し、継続的な「missing import path」ビルドエラーを解決しました。
- 設定ファイルのパーミッション強化:
~/.config/llm-cli/config.jsonのファイルパーミッションをより厳格なもの (0644から0600へ) に、その親ディレクトリのパーミッションも同様に強化 (0755から0700へ) し、APIキーなどの機密情報のセキュリティを向上させました。
- Google Cloud Vertex AI プロバイダーのサポート: Vertex AI との対話に対応しました。
profile addコマンドの機能拡張:profile addコマンドで、プロバイダー、モデル、エンドポイント、APIキー、AWS認証情報、GCPプロジェクトID、ロケーション、クレデンシャルファイルパスなどのパラメータを一括して指定できるようになりました。
- Vertex AI SDK の移行:
google.golang.org/genaiSDK の最新バージョンに移行しました。サービスアカウント認証の修正、Clientオブジェクトの正しい利用、ストリーミングイテレータの適切な処理を含みます。 - クレデンシャルファイルパスの実行時展開:
credentials_fileのパス展開を、設定時ではなく実行時に行うように変更しました。これにより、動的なホームディレクトリ環境でも柔軟に対応できるようになりました。
- 開発経緯の更新:
docs/development_logs/dev_log-2025-08-02.mdにVertex AI SDK移行の詳細な経緯とSDKの現状に関する記述を追加しました。 - 関連ドキュメントの更新:
README.ja.mdおよびREADME.en.mdを、Vertex AI プロバイダーの追加とprofile addコマンドの機能拡張、システムプロンプトの扱いについて更新しました。 - プロバイダー開発ガイドの修正:
DEVELOPING_PROVIDERS.ja.mdおよびDEVELOPING_PROVIDERS.en.mdから、特定のプロバイダー実装に関する記述を削除しました。 - 変更履歴の更新:
CHANGELOG.ja.mdおよびCHANGELOG.en.mdを更新しました。
- コード監査と品質改善: コード全体の監査を実施し、潜在的な不具合や脆弱性を修正しました。
profile editのコマンドインジェクション対策、設定パス管理の一元化、エラーメッセージの改善など、堅牢性と保守性を向上させました。
- APIエラーハンドリングの修正: ストリーミングモードでAPIエラーが発生した際に、エラーを検知できずに正常終了してしまう問題を修正しました。非同期処理の競合状態を解消し、エラーハンドリングをより堅牢にしました。
- コマンド名とフラグの変更:
askコマンドがpromptに変更されました。また、--promptフラグは--user-promptにリネームされ、--prompt-fileは--user-prompt-fileにリネームされました。既存のスクリプトやワークフローを更新する必要があります。
- コマンド名とフラグのリファクタリング:
askコマンドをpromptに変更し、--promptフラグを--user-promptにリネームしました。また、--user-prompt(-p),--system-prompt(-P),--user-prompt-file(-f),--system-prompt-file(-F) の省略形を追加しました。
- 開発ログと開発計画の追加: プロジェクトの経緯と今後の計画を記録するため、
docs/development_logs/を作成しました。 - 開発ルールの更新:
GEMINI.mdに開発ルール(絶対パスの使用、根本原因の修正、ドキュメント更新、コミット前のコミット、コード品質とセキュリティ、コメントの原則)を追加しました。
- Amazon Bedrock Novaモデルのサポート:
amazon.nova-lite-v1:0などのNovaモデルとの対話に対応しました。
- Bedrockプロバイダーのリファクタリング: Bedrockプロバイダーの内部実装を、NovaモデルのMessages API仕様に厳密に合わせて再設計しました。
- リクエスト/レスポンス構造体 (
novaMessageContent,novaMessage,novaSystemPrompt,novaMessagesAPIRequest,novaCombinedAPIResponse,novaMessagesAPIStreamChunk) を更新。 - プロンプトおよび推論パラメータのハンドリングをNova APIに合わせて調整。
- ストリーミング応答のパースロジックを修正。
- リクエスト/レスポンス構造体 (
- プロバイダー選択ロジックの改善:
cmd/ask.goで、bedrockプロバイダーが選択された際に、モデルIDのプレフィックス (amazon.nova) に基づいてNovaBedrockProviderを動的に選択するように変更しました。
- プロンプトバリデーションの修正:
cmd/ask.goでプロンプトのバリデーションを一元的に行うように修正し、internal/llm/bedrock_nova.goから冗長なバリデーションを削除しました。これにより、--promptまたは--prompt-file、あるいは標準入力からのプロンプトが必須となりました。
- ドキュメントの更新:
README.mdおよびBUILD.mdを、新しいBedrockのセットアップ手順とビルドプロセスの変更に合わせて更新しました。 - Makefileの改善:
make allコマンドがクロスコンパイルも実行するように修正し、ビルド出力ディレクトリの整理を行いました。
- LLMとの対話機能:
- OllamaおよびLM Studio (OpenAI互換API) との対話に対応。
- コマンドライン引数、ファイル、標準入力からのプロンプト入力に対応。
- ストリーミング応答表示 (
--streamフラグ) に対応。
- プロファイル管理機能:
- 複数のLLM設定をプロファイルとして管理 (
profile list,profile use,profile add,profile set,profile remove,profile edit)。
- 複数のLLM設定をプロファイルとして管理 (
- ビルドシステム:
- Goモジュールの初期化とCobra CLIフレームワークの導入。
Makefileによるビルド、テスト、クロスコンパイル (macOS Universal, Linux, Windows) に対応。- ビルド成果物をプラットフォーム別ディレクトリに整理。
README.mdの作成と機能説明の追加。BUILD.mdの作成とビルド手順の詳細化。README.mdにGeminiによる開発支援とMITライセンスの明記。BUILD.mdおよびREADME.mdにコードレビューで指摘された改善点を反映。