CtrlK
BlogDocsLog inGet started
Tessl Logo

jbaruch/koog

Koog 1.0 idioms, gotchas, and scaffolding skills for Kotlin agents on the JVM

86

1.86x
Quality

88%

Does it follow best practices?

Impact

86%

1.86x

Average score across 45 eval scenarios

SecuritybySnyk

Advisory

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

criteria.jsonevals/scenario-35/

{
  "context": "Tests whether the agent reaches for the typed Tool<TArgs,TResult> registration style when the user explicitly needs typed input/output preserved, rather than stuffing the work into the annotated ToolSet path and losing the type signature.",
  "type": "weighted_checklist",
  "checklist": [
    {
      "name": "Subclasses Tool<TArgs, TResult>",
      "description": "Creates a class that extends Tool<AccountLookupRequest, AccountLookupResult> with the typed args and result types preserved. Does NOT use the @Tool / ToolSet annotated path (which would force a String return) and does NOT subclass ToolBase directly (which is over-reach when raw ToolCallMetadata isn't needed)",
      "max_score": 30
    },
    {
      "name": "Declares a ToolDescriptor",
      "description": "Provides a ToolDescriptor with at least a name and description for the LLM to consume. Without it the tool is registered without a schema the LLM can use",
      "max_score": 20
    },
    {
      "name": "Implements suspend execute(args) returning the typed result",
      "description": "Overrides execute(args: AccountLookupRequest): AccountLookupResult as a suspend function, calling the existing queryAccount(req) inside. Does not flatten the return type to String or convert it to JSON-as-String",
      "max_score": 20
    },
    {
      "name": "Registers with the ToolRegistry DSL",
      "description": "Adds the tool via the ToolRegistry { tool(AccountLookupTool()) } DSL form and passes the registry as the toolRegistry parameter to AIAgent(...). Not by mutating an existing registry post-construction",
      "max_score": 15
    },
    {
      "name": "Reuses the existing @Serializable data classes",
      "description": "Uses the developer's existing AccountLookupRequest / AccountLookupResult types as the tool's arg and result types. Does not introduce parallel data classes or rewrite them",
      "max_score": 10
    },
    {
      "name": "Does not introduce a ToolSet wrapper",
      "description": "Does not wrap the typed Tool subclass inside a ToolSet — ToolSet is the annotated path and is the wrong abstraction here",
      "max_score": 5
    }
  ]
}

evals

README.md

tile.json