Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ゆるーく理解するKoogのAIAgent開発

Avatar for kk__777 kk__777
October 23, 2025
6

 ゆるーく理解するKoogのAIAgent開発

Avatar for kk__777

kk__777

October 23, 2025
Tweet

Transcript

  1. 実行 agent.run( AgentRequest( // 開発者で定義したdata class screen = Screen.Login.name, instruction

    = "ユーザー名「$username」でログインしてください", parameters = mapOf("username" to username) ) ) agent.run( AgentRequest( screen = Screen.Home.name, instruction = "ホーム画面のデータを取得してください" ) ) agent.run( AgentRequest( screen = Screen.Monthly.name, instruction = "${year}年${month}月のデータを取得してください", parameters = mapOf("year" to year.toString(), "month" to month.toString()) ) )
  2. ツール エージェントが外部の世界(API ・DB ・OS など)とやり取りするための実行インターフェース @LLMDescription("家計簿アプリのツールセット。ログイン、ユーザー情報取得、取引データ管理の機能を提供します。") class BudgetTools : ToolSet

    { @Tool @LLMDescription("指定されたユーザー名でログインします。成功時はユーザー情報を含む成功メッセージを、失敗時はエラーメッセージを返します。 fun loginUser( @LLMDescription("ログインするユーザー名。有効なユーザー名: demo_user, test_user, sample_user") username: String ): String { . } @Tool @LLMDescription("取引データを取得します。yearとmonthを指定すると、その月の取引のみを返します。省略すると全ての取引を返します。") fun getTransactions( @LLMDescription("年(例: 2024)。省略可能 - 省略すると全ての取引を取得します。") year: Int?, @LLMDescription("月(1-12)。省略可能 - yearと一緒に指定する必要があります。") month: Int? ): String { . } .
  3. Strategy エージェントが“ どう考え、どう行動するか” を定義する設計図 val strategy = strategy<AgentRequest, LoginResponse>("login") {

    // 事前準備として clientからのリクエストにコンテキスト(画面名とか今のユーザ名とか)を加えてる val prepareRequest by node<AgentRequest, String> { request -> "画面: ${request.screen}\nユーザー名: ${request.parameters["username"]}\n指示: ${request.instruction}" } // 構造化レスポンスの作成を誘発する val responseNode by nodeLLMRequestStructured<LoginResponse>( fixingParser = StructureFixingParser( fixingModel = OpenAIModels.CostOptimized.GPT4oMini, retries = 2 ) ) // 組み合わせ nodeStart then prepareRequest then responseNode edge(responseNode forwardTo nodeFinish transformed { it.getOrThrow().structure }) }
  4. Agent Config の設定 agentConfig = AIAgentConfig( prompt = prompt("budget_app") {

    system( """ あなたは家計簿アプリのアシスタントです。 ユーザーの画面情報と指示を受け取り、適切なツールを使ってデータを取得・処理してください。 """.trimIndent() ) }, maxAgentIterations = 20 val agent = AIAgent( promptExecutor = simpleOpenAIExecutor(apiKey), // LLM model = OpenAIModels.Chat.GPT4o, // モデル strategy = strategy, // Strategy toolRegistry = ToolRegistry { tools(BudgetTools().asTools()) // Toolの設定 }, ), )
  5. おもしろポイント③ 🟢 Input ( ユーザID ・月など) 🔧 Tool (MCP /

    API / Dummy Data) 📊 Output ( 整形済みデータ) Tool による拡張 今回はダミーデータを返しているだけだが、MCP を使っても API を使っても OK 。 要は「Input → Output 」の関係を伝えておけば中身を意識せずに Agent が適切に使っ てくれる。