Files
2026-04-23 23:58:59 -05:00

2.1 KiB

Genkit Middleware (genkit_middleware)

A collection of useful middleware for Genkit Dart to enhance your agent's capabilities. Register plugins when initializing Genkit:

import 'package:genkit/genkit.dart';
import 'package:genkit_middleware/genkit_middleware.dart';

void main() {
  final ai = Genkit(
    plugins: [
      FilesystemPlugin(),
      SkillsPlugin(),
      ToolApprovalPlugin(),
    ],
  );
}

Filesystem Middleware

Allows the agent to list, read, write, and search/replace files within a restricted root directory.

final response = await ai.generate(
  prompt: 'Check the logs in the current directory.',
  use: [
    filesystem(rootDirectory: '/path/to/secure/workspace'),
  ],
);

Tools Provided:

  • list_files, read_file, write_file, search_and_replace

Skills Middleware

Injects specialized instructions (skills) into the system prompt from SKILL.md files located in specified directories.

final response = await ai.generate(
  prompt: 'Help me debug this issue.',
  use: [
    skills(skillPaths: ['/path/to/skills']),
  ],
);

Tools Provided:

  • use_skill: Retrieve the full content of a skill by name.

Tool Approval Middleware

Intercepts tool execution for specified tools and requires explicit approval. Returns FinishReason.interrupted.

final response = await ai.generate(
  prompt: 'Delete the database.',
  use: [
    // Require approval for all tools EXCEPT those below
    toolApproval(approved: ['read_file', 'list_files']),
  ],
);

if (response.finishReason == FinishReason.interrupted) {
  final interrupt = response.interrupts.first;
  
  // Ask user for approval
  final isApproved = await askUser();

  if (isApproved) {
    final resumeResponse = await ai.generate(
      messages: response.messages, // Pass history
      toolChoice: ToolChoice.none, // Prevent immediate re-call
      interruptRestart: [
        ToolRequestPart(
          toolRequest: interrupt.toolRequest,
          metadata: {
            ...?interrupt.metadata, 
            'tool-approved': true 
          }, 
        ),
      ],
    );
  }
}