Comments 5
Может хоть приведете пример что там в бд то хранится и что агенты запрашивают/получают?..
Данные по БД самого проекта code-index
Из get_stats, строка repo: "code-index" (C:\MCP-Servers\code-index):
files 108 (исходники проекта)
functions 992
classes 152
imports 413
calls 6 372 (рёбра графа вызовов)
variables 64
text_files 25 (.md / .toml / .yaml и пр.)
То есть весь проект — это 108 файлов, разобранных tree-sitter'ом в 992 функции / 152 класса / 413 импортов / 6 372 вызова / 64 переменные. Плюс сырой исходник каждого файла лежит в file_contents, сжатый zstd.
Парсер раскладывает каждый файл на эти таблицы — буквально в функции write_code_to_db (crates/code-index-core/src/indexer/mod.rs:460): сначала upsert_file (метаданные: путь, content_hash, ast_hash, mtime, file_size), потом insert_functions / insert_classes / insert_imports / insert_calls / insert_variables, и в конце upsert_file_content (zstd-исходник). Структура строки в таблице functions (FunctionRecord) совпадает один-в-один с тем, что агент потом получает в ответе.
Что агент запрашивает и что получает
Агент даёт два поля — репо и имя символа — и получает точную функцию со строками, а не весь файл (который тут ~2000+ строк). Это и есть экономия токенов из статьи.
Запрос:
get_function(repo="code-index", name="write_code_to_db")
Ответ из БД (поля = колонки таблицы functions, тело сокращено):
{
"_meta": { "dependent_files": ["crates/code-index-core/src/indexer/mod.rs"] },
"result": [
{
"id": 7338,
"file_id": 552,
"name": "write_code_to_db",
"qualified_name": "Indexer<'a>::write_code_to_db",
"line_start": 460,
"line_end": 613,
"args": "(&self, rel_path: &str, content_hash: &str, language: &str, lines_total: usize, ast_hash: &str, parse_result: &ParseResult, skip_delete: bool, mtime: Option<i64>, file_size: Option<i64>, text_for_fts: Option<&str>, raw_content: Option<&str>)",
"return_type": "Result<()>",
"docstring": "/// Записать код-файл в БД: метаданные + символы (функции, классы, импорты и т.д.) ...",
"body": "pub fn write_code_to_db(&self, ...) -> Result<()> { ... }",
"is_async": false,
"node_hash": "bff5478a936fbd87f55a194416252fc816090106a51dcafa9a27b6c2c30a01a6",
"override_type": null,
"override_target": null
}
]
}ast-grep хорошо справляется с поиском по коду и экономией токенов
Проведу более объективное исследование, сорри.
Вот это более объективное сравнение.
https://disk.yandex.ru/i/2yKBqjKnCPLeoA
И дополню, что это в плане только поиска кода( 4 инструмента... ну, и редактирования в случае ast-grep). Все прочие инструменты code-index идут бонусом:)
Экономия токенов на grep: индекс кода для AI-агентов на Rust + tree-sitter + SQLite + MCP