Source code for kodeagent.code_reviewer
"""Review code for security vulnerabilities."""
import uuid
from . import kutils as ku
from .models import CodeReview
from .usage_tracker import UsageTracker
CODE_SECURITY_SYSTEM_PROMPT = ku.read_prompt('code_guardrail.txt')
[docs]
class CodeSecurityReviewer:
"""Review code for security vulnerabilities."""
[docs]
def __init__(
self,
model_name: str,
litellm_params: dict | None = None,
usage_tracker: UsageTracker | None = None,
tool_names: set[str] | None = None,
):
"""Initialize the CodeSecurityReviewer.
Args:
model_name: The name of the LLM model to use.
litellm_params: Optional parameters for the LLM.
usage_tracker: Optional UsageTracker instance.
tool_names: Optional set of whitelisted tool names provided by the user.
"""
self.model_name = model_name
self.litellm_params = litellm_params or {}
self.usage_tracker = usage_tracker
self.tool_names = tool_names or set()
[docs]
async def review(self, code: str) -> CodeReview:
"""Review the code for security vulnerabilities.
Args:
code: The code to review.
Returns:
A CodeReview object containing the review results.
"""
# Format the system prompt with whitelisted tools
if self.tool_names:
tools_list = '\n'.join(f'- {tool}' for tool in sorted(self.tool_names))
else:
tools_list = '- [None provided]'
system_prompt = CODE_SECURITY_SYSTEM_PROMPT.format(whitelisted_tools=tools_list)
messages = [
{
'role': 'system',
'content': system_prompt,
},
{
'role': 'user',
'content': f'Review this code:\n{code}',
},
]
review_response = await ku.call_llm(
model_name=self.model_name,
litellm_params=self.litellm_params,
messages=messages,
response_format=CodeReview,
trace_id=uuid.uuid4().hex,
usage_tracker=self.usage_tracker,
component_name='CodeSecurityReviewer',
)
return CodeReview.model_validate_json(review_response)