Class-based Development¶
Suitable for complex plugins that require fine-grained control over lifecycle and extension behavior.
1. Create Plugin Project¶
Create a new directory under erii-plugins/:
erii-plugins/my-plugin/
├── build.gradle.kts
└── src/main/kotlin/
└── myplugin/
├── MyPlugin.kt
└── MyExtension.kt
2. Register Module¶
Add to erii-plugins/settings.gradle.kts:
include("my-plugin")
3. Configure Build¶
// erii-plugins/my-plugin/build.gradle.kts
plugins {
id("uesugi.erii-plugin")
}
version = "0.0.1"
4. Define Plugin¶
@PluginDefinition(
pluginId = "my-plugin",
version = "0.0.1",
description = "My plugin",
provider = "your-name"
)
class MyPlugin : AgentPlugin()
5. Implement Extensions¶
class MyAgentExt : AgentExtension<MyPlugin> {
override fun onLoad(context: PluginContext) {
// Initialize: register scheduled tasks, tools, routes, etc.
context.scheduler.scheduleRecurrently("my-task", "0 */1 * * *") {
// Runs every hour
}
}
override fun onUnload() {
// Clean up resources
}
}
class MyRouteExt : RouteExtension<MyPlugin> {
// LLM matches this extension based on matcher key and value
override val matcher: Pair<String, String>
get() = "image" to "Generate or search images"
}
class MyCmdExt : SlashCmdExtension<MyPlugin> {
override val cmd: String = "hello"
override val alias: List<String> = listOf("hi", "hey")
override fun onLoad(context: PluginContext) {
context.chain { meta ->
// Handle command logic
}
}
}
class MyPassiveExt : PassiveExtension<MyPlugin> {
override fun onLoad(context: PluginContext) {
context.scheduler.scheduleRecurrently("bg-task", "*/30 * * * *") {
// Background periodic task
}
}
}