Skip to content

Instantly share code, notes, and snippets.

@scovl
Created February 26, 2025 19:45
Show Gist options
  • Select an option

  • Save scovl/285ca0442ca241c0401d88563198cfff to your computer and use it in GitHub Desktop.

Select an option

Save scovl/285ca0442ca241c0401d88563198cfff to your computer and use it in GitHub Desktop.

Análise de Código e Integração LLM no Aider

O Aider implementa um sistema sofisticado de análise de código que combina análise estática com modelos de linguagem. Ele utiliza a biblioteca tree-sitter através do módulo grep_ast para realizar análise sintática do código. Em aider/repomap.py, podemos ver a implementação:

from grep_ast import TreeContext, filename_to_lang
from grep_ast.tsl import USING_TSL_PACK, get_language, get_parser

class RepoMap:
    def get_tree_context(self, fname, code=None):
        if not code:
            code = self.io.read_text(fname)
            if not code:
                return

        try:
            context = TreeContext(
                fname,
                code,
                color=False,
                line_number=True,
                child_context=False,
                last_line=False,
                margin=0,
                mark_lois=True,
                loi_pad=3,
                show_top_of_file_parent_scope=False,
            )
            return context
        except ValueError:
            return

A análise sintática permite ao Aider:

  1. Extrair estruturas do código
  2. Identificar funções e classes
  3. Mapear dependências
  4. Localizar pontos de edição precisamente

Integração com LLM

O Aider usa o LiteLLM como abstração para interagir com diferentes modelos de linguagem. Em aider/llm.py:

class LazyLiteLLM:
    def _load_litellm(self):
        self._lazy_module = importlib.import_module("litellm")
        self._lazy_module.suppress_debug_info = True
        self._lazy_module.set_verbose = False
        self._lazy_module.drop_params = True

Fluxo de Análise e Edição

  1. Análise Inicial:

    • O código é parseado usando tree-sitter
    • Uma AST (Abstract Syntax Tree) é gerada
    • Estruturas importantes são identificadas
  2. Contextualização para o LLM:

    • A AST é convertida em um formato que o LLM pode entender
    • Informações relevantes são extraídas do mapa do repositório
    • O contexto é formatado apropriadamente
  3. Processamento pelo LLM:

    • O modelo recebe o contexto estruturado
    • Analisa as mudanças necessárias
    • Propõe edições precisas

Linting e Validação

O Aider implementa um sistema de linting em aider/linter.py que trabalha em conjunto com a análise estática:

class Linter:
    def __init__(self, encoding="utf-8", root=None):
        self.languages = dict(
            python=self.py_lint,
        )
        
    def find_syntax_errors(self, fname, code):
        try:
            lang = filename_to_lang(fname)
            if not lang:
                return
            parser = get_parser(lang)
            if not parser:
                return
        except Exception:
            return

        tree = parser.parse(code.encode())
        errors = traverse_tree(tree.root_node)
        return errors

Mapeamento do Repositório

O Aider mantém um mapa detalhado do repositório que ajuda na análise de código. Em aider/repomap.py:

def get_ranked_tags_map(self, chat_fnames, other_fnames=None):
    if not chat_fnames:
        return ""

    tags = self.get_tags(chat_fnames, other_fnames)
    if not tags:
        return ""

    return self.format_tags_map(tags)

Este mapa inclui:

  • Estrutura de arquivos
  • Definições de funções e classes
  • Dependências entre arquivos
  • Metadados do repositório

Processamento de Edições

Quando o LLM sugere mudanças, o Aider usa diferentes formatos de edição:

  1. Unified Diff: Em aider/coders/udiff_coder.py
class UnifiedDiffCoder(Coder):
    def get_edits(self):
        content = self.partial_response_content
        raw_edits = list(find_diffs(content))
  1. Search and Replace: Em aider/coders/search_replace.py
def search_and_replace(content, original, updated):
    dmp = diff_match_patch()
    patches = dmp.patch_make(original, updated)
    new_content, results = dmp.patch_apply(patches, content)

Validação de Mudanças

O Aider implementa várias camadas de validação:

  1. Sintática: Verifica se as mudanças mantêm o código sintaticamente válido
  2. Contextual: Assegura que as edições fazem sentido no contexto
  3. Git: Integra com git para tracking de mudanças

É simplesmente incrível!!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment