goLLM is designed to be extensible. You can create custom rules, formatters, and commands to tailor it to your needs.
Create a new rule by extending BaseRule
:
from gollm.rules.base import BaseRule
class MyCustomRule(BaseRule):
"""Check for custom patterns in code."""
id = "my-custom-rule"
description = "Custom rule description"
severity = "warning"
def check_node(self, node, filename):
# Your validation logic here
if self._has_forbidden_pattern(node):
self.report_violation(
node.lineno,
"Found forbidden pattern",
node=node
)
Register your rule in gollm.json
:
{
"custom_rules": [
"my_package.rules.MyCustomRule"
]
}
Create a new command using the @command
decorator:
from gollm.cli import command
@command("my-command")
def my_command(args):
"""Description of my command."""
print("Running my custom command!")
Place your command in a Python package and add it to gollm.json
:
{
"plugins": [
"my_package.commands"
]
}
Create a formatter by extending BaseFormatter
:
from gollm.formatters.base import BaseFormatter
class MyFormatter(BaseFormatter):
"""Custom output formatter."""
def format(self, results):
"""Format validation results."""
output = []
for result in results:
output.append(f"{result.filename}:{result.line} - {result.message}")
return "\n".join(output)
Register your formatter in gollm.json
:
{
"formatters": {
"my-formatter": "my_package.formatters.MyFormatter"
}
}
A plugin is a Python package that can contain rules, commands, and formatters:
my_plugin/
βββ __init__.py
βββ commands.py
βββ formatters.py
βββ rules.py
Add your plugin to gollm.json
:
{
"plugins": [
"my_plugin"
]
}
goLLM provides hooks to extend functionality at specific points:
pre_validation
: Before validation startspost_validation
: After validation completespre_generation
: Before code generationpost_generation
: After code generationfrom gollm.hooks import register_hook
@register_hook("pre_validation")
async def my_pre_validation_hook(context):
"""Run before validation."""
print("Running pre-validation hook")
return context
goLLM emits events that you can listen to:
validation_started
: When validation startsvalidation_completed
: When validation completesgeneration_started
: When code generation startsgeneration_completed
: When code generation completesfrom gollm.events import event_bus
def on_validation_completed(event):
print(f"Validation completed with {len(event.results)} results")
event_bus.subscribe("validation_completed", on_validation_completed)
Create a custom LLM provider:
from gollm.llm.base import BaseLLMProvider
class MyLLMProvider(BaseLLMProvider):
"""Custom LLM provider."""
def __init__(self, config):
super().__init__(config)
self.name = "my-llm"
async def generate(self, prompt, **kwargs):
"""Generate text from prompt."""
# Your generation logic here
return {
"text": "Generated text",
"metadata": {}
}
Register your provider in gollm.json
:
{
"llm_integration": {
"providers": {
"my-llm": {
"class": "my_package.providers.MyLLMProvider"
}
}
}
}
Create tests for your extensions:
import unittest
from my_package.rules import MyCustomRule
class TestMyCustomRule(unittest.TestCase):
def test_rule(self):
rule = MyCustomRule()
# Test your rule
self.assertTrue(True) # Your test assertions
Test your extension with goLLM:
import unittest
from gollm import GollmCore
class TestMyExtension(unittest.TestCase):
def test_extension(self):
gollm = GollmCore()
# Test your extension with goLLM
self.assertTrue(True) # Your test assertions
my_extension/
βββ setup.py
βββ README.md
βββ my_extension/
β βββ __init__.py
β βββ commands.py
β βββ rules.py
β βββ formatters.py
βββ tests/
βββ test_extension.py
from setuptools import setup, find_packages
setup(
name="gollm-my-extension",
version="0.1.0",
packages=find_packages(),
install_requires=["gollm"],
entry_points={
"gollm.plugins": [
"my_extension = my_extension"
]
}
)
See the goLLM Extensions Repository for example extensions.