From d5d0a84e573c833843279c520ce2d5765425ba93 Mon Sep 17 00:00:00 2001 From: tanaka takashi Date: Tue, 11 Aug 2026 00:15:54 +0900 Subject: feat: implement LLM skill selection with Ollama structured output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P5残件3項目を実装: 1. Ollama structured output (format param): - OllamaChatRequestへFormat プロパティ追加 (JsonElement?) - IOllamaClientへChatStructuredAsync メソッド追加 - OllamaClient.ChatCoreAsync へformat パラメータ追加 - ChatStructuredAsync はtoolsなし、format指定でJSON構造化出力を要求 2. AgentRuntime skill selection step: - SelectSkillsAsync メソッド追加: メインループ前にOllamaへskill catalogを送信 - structured output で {"selected_skills": ["name"]} を取得 - ParseSelectedSkills: JSON解析、unknown skill名排除、重複排除、最大10件 - structured output非対応モデルはfallback空リスト - 選択されたskillのInstructionsのみPromptContext.SelectedSkillsへ設定 - Progressive Disclosure Stage 2→3 が完了 3. Skill security/path validation: - SelectSkillsAsync でsettings.Skillsからのみ選択(unknown name排除) - SkillLoader でreparse point skip済み(既存実装) - 選択数上限10件でDoS防止 - Skill load != permission grant 維持: allowed-toolsはSandbox permissionに影響しない 変更対象: - OllamaModels.cs: OllamaChatRequest.Format プロパティ追加 - IOllamaClient.cs: ChatStructuredAsync メソッド追加 - OllamaClient.cs: ChatCoreAsync へformat パラメータ追加、ChatStructuredAsync 実装 - AgentRuntime.cs: SelectSkillsAsync + ParseSelectedSkills、メインループ前の選択ステップ 検証結果: - Release build: 警告0、エラー0 - Core tests: 61/61 PASS、skip 0 - Planner tests: 10/10 PASS、skip 0 --- src/Agent.Core/Ollama/IOllamaClient.cs | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/Agent.Core/Ollama/IOllamaClient.cs') diff --git a/src/Agent.Core/Ollama/IOllamaClient.cs b/src/Agent.Core/Ollama/IOllamaClient.cs index a03a353..d1cb99f 100644 --- a/src/Agent.Core/Ollama/IOllamaClient.cs +++ b/src/Agent.Core/Ollama/IOllamaClient.cs @@ -1,5 +1,6 @@ namespace Agent.Core.Ollama; +using System.Text.Json; using Agent.Core.Tools; public interface IOllamaClient @@ -7,5 +8,7 @@ public interface IOllamaClient Task ChatAsync(IReadOnlyList messages, double? temperatureOverride, CancellationToken cancellationToken); Task ChatWithToolsAsync(IReadOnlyList messages, double? temperatureOverride, IReadOnlyList tools, CancellationToken cancellationToken) => ChatAsync(messages, temperatureOverride, cancellationToken); + Task ChatStructuredAsync(IReadOnlyList messages, double? temperatureOverride, JsonElement format, CancellationToken cancellationToken) => + ChatAsync(messages, temperatureOverride, cancellationToken); Task SupportsVisionAsync(CancellationToken cancellationToken) => Task.FromResult(null); } -- cgit v1.2.3