Koog 1.0 idioms, gotchas, and scaffolding skills for Kotlin agents on the JVM
86
88%
Does it follow best practices?
Impact
86%
1.86xAverage score across 45 eval scenarios
Advisory
Suggest reviewing before use
{
"context": "Tests whether the agent recognizes that the developer's stated need — a separately-configured agent exposed as a single callable surface — maps to the sub-agent-as-tool pattern, rather than merging the find agent's tools into the main agent (which would defeat the cost separation) or building a new strategy graph.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Uses AIAgentService.fromAgent to wrap the find agent",
"description": "Calls AIAgentService.fromAgent(findAgent) to bridge from the AIAgent instance to a tool-capable wrapper. Does not try to read out the find agent's tools and copy them into the main agent's registry",
"max_score": 30
},
{
"name": "Calls createAgentTool with typed input/output",
"description": "Calls createAgentTool<String, String>(...) (or the appropriate typed shape) on the service wrapper, producing a tool that the main agent can register",
"max_score": 20
},
{
"name": "Provides agentDescription and inputDescription for the LLM",
"description": "Supplies an agentDescription (what the wrapped agent does) and inputDescription (what input to pass) — these are what the main agent's LLM reads when deciding whether to call the tool. Generic or empty descriptions don't qualify",
"max_score": 15
},
{
"name": "Preserves the find agent's separate configuration",
"description": "Does not modify the find agent's construction — its model, system prompt, and tool registry stay as-is. The wrapping happens after the find agent is built, not by reconstructing it",
"max_score": 15
},
{
"name": "Registers the wrapped tool in the main agent's ToolRegistry",
"description": "Adds the wrapped tool into the main agent's ToolRegistry via tool(...) (not tools(...) — the wrapped result is a single Tool, not a ToolSet). Passes the resulting registry to AIAgent(...) at construction",
"max_score": 15
},
{
"name": "Does not introduce a strategy graph or subgraph",
"description": "Does not author a strategy { ... } block or a subgraphWithTask — the user wants the find agent visible as a tool to the main agent, not as a graph node",
"max_score": 5
}
]
}evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10
scenario-11
scenario-12
scenario-13
scenario-14
scenario-15
scenario-16
scenario-17
scenario-18
scenario-19
scenario-20
scenario-21
scenario-22
scenario-23
scenario-24
scenario-25
scenario-26
scenario-27
scenario-28
scenario-29
scenario-30
scenario-31
scenario-32
scenario-33
scenario-34
scenario-35
scenario-36
scenario-37
scenario-38
scenario-39
scenario-40
scenario-41
scenario-42
scenario-43
scenario-44
scenario-45
skills
add-observability
add-persistence
add-rag
add-structured-output
add-token-budgeting
add-tool
cache-llm-calls
define-prompt
domain-model-subtask-pipeline
references
enable-prompt-caching
handle-agent-events
manage-state
migrate-from-0-x
model-planner-subtasks
persist-chat-history
query-sql-from-agent
scaffold-agent
snapshot-and-restore
test-koog-agents
trace-agent-internals
use-attachments
use-functional-agent
use-llm-node-variants
use-planner
wire-a2a
wire-acp-server
wire-ktor-server
wire-mcp-server
wire-spring-boot