Initial commit
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
# Genkit Middleware (`genkit_middleware`)
|
||||
|
||||
A collection of useful middleware for Genkit Dart to enhance your agent's capabilities. Register plugins when initializing Genkit:
|
||||
|
||||
```dart
|
||||
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.
|
||||
|
||||
```dart
|
||||
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.
|
||||
|
||||
```dart
|
||||
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`.
|
||||
|
||||
```dart
|
||||
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
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user