CtrlK
BlogDocsLog inGet started
Tessl Logo

gamussa/langchain4j-agentic

Build and demo Java AI agent systems with langchain4j-agentic: workflow patterns, supervisor, custom Planner strategies (incl. the flagship typed-verdict / CriticResult-style critic pattern), plus MCP tools, A2A remote agents, build setup, and conference-demo storylines. Pinned to 1.15.0 / 1.15.0-beta25.

84

4.76x
Quality

89%

Does it follow best practices?

Impact

100%

4.76x

Average score across 2 eval scenarios

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

criteria.jsonevals/scenario-2/

{
  "context": "Tests whether the agent implements the typed-verdict verify/revise loop using langchain4j-agentic on a novel domain (travel itinerary) so the pattern must be transferred, not copied. The key idea is that the object passed between agents (the verifier's output) is a TYPED domain object the router branches on — not a string or a score. 'CriticResult' is an illustration, not a required framework type, and need NOT be generic. Weights favor the tile-specific, non-leaked framework criteria (Planner API, beta pinning, call/done, -parameters).",
  "type": "weighted_checklist",
  "checklist": [
    {
      "name": "Typed inter-agent verdict object",
      "description": "The verifier/reviewer agent returns a single typed domain object (Java record or class) carrying a boolean pass/fail verdict (e.g. 'successful'/'approved'), a feedback/notes String (nullable or Optional), and the judged artifact. It may be generic OR concrete per-domain — both are acceptable; what matters is it is one typed object, not loose values.",
      "max_score": 12
    },
    {
      "name": "No bare score/double",
      "description": "The verifier does NOT return a bare double, float, int score, or raw String as its verdict — the routing logic branches on a structured typed value",
      "max_score": 8
    },
    {
      "name": "Typed solution record",
      "description": "The itinerary being produced and verified is a typed Java record or class (e.g. fields like destination, days, totalCost, activities), not a plain String",
      "max_score": 10
    },
    {
      "name": "Planner method signatures",
      "description": "The custom Planner/strategy class implements the three methods: init(InitPlanningContext), firstAction(PlanningContext), and nextAction(PlanningContext)",
      "max_score": 12
    },
    {
      "name": "call() and done() helpers",
      "description": "The Planner implementation uses the call(...) and done() helper methods to return Actions — does NOT instantiate Action subclasses directly (e.g. no 'new Action.DoneAction()')",
      "max_score": 10
    },
    {
      "name": "outputKey not outputName",
      "description": "All agent builders and @Agent annotations use 'outputKey' (not the deprecated 'outputName') to name the scope variable where the result is stored",
      "max_score": 8
    },
    {
      "name": "HtmlReportGenerator at end",
      "description": "The main/demo class registers an AgentMonitor and calls HtmlReportGenerator.generateReport(monitor, path) after running the pipeline to produce an HTML execution report",
      "max_score": 8
    },
    {
      "name": "-parameters compiler flag",
      "description": "The build.gradle.kts includes options.compilerArgs.add(\"-parameters\") (or equivalent Maven/Kotlin DSL) in the Java compile task configuration",
      "max_score": 10
    },
    {
      "name": "Beta artifacts pinned explicitly",
      "description": "langchain4j-agentic (and/or langchain4j-agentic-a2a / langchain4j-mcp if present) are pinned to an explicit beta version (e.g. 1.15.0-beta25) and NOT left to be resolved by the BOM",
      "max_score": 12
    },
    {
      "name": "Core BOM or explicit 1.15.0",
      "description": "The build uses either langchain4j-bom for core module alignment or pins core langchain4j modules (langchain4j, langchain4j-anthropic) to 1.15.0",
      "max_score": 10
    }
  ]
}

README.md

tile.json