Вы же молчите. А как понять, что у вас на уме. Расскажите, что именно вы делаете?
Ну я же его писал.
Вначале я перепробовал, то, что показал в таблицах, потом перешел на Python, директорию я увидел, но это было долго, потом загнал в память содержимое директории, чтоб быстрее было.
Значит AI меня обманул, буду дальше копать.
Да, допилил, для экономии токенов.
Опять незнакомое слово.
Вы об этом? Это самый бюджетный вариант?
import osimport sys# --- ПОДАВЛЕНИЕ WARNING от gRPC/Google (делаем ДО импорта genai!) ---os.environ["GRPC_VERBOSITY"] = "ERROR"os.environ["GLOG_minloglevel"] = "3" # 3 = только FATAL, 2 = ERROR и выше# Теперь можно импортировать Google AIimport google.generativeai as genaiimport threadingimport timeimport itertoolsimport re# --- НАСТРОЙКА ---GOOGLE_API_KEY = 'ВАШ_API_КЛЮЧ_GEMINI'PROJECT_PATH = "D:/путь/путь/путь/путь/путь/путь/путь"TARGET_EXTENSIONS = ['.tx1', '.tx2', '.tx3', '.tx4', '.scc']# --- ФУНКЦИЯ: получение списка файлов (и запоминание путей) ---def get_file_paths(project_path): file_paths = [] for root, _, files in os.walk(project_path): for file in files: if any(file.endswith(ext) for ext in TARGET_EXTENSIONS): full_path = os.path.join(root, file) rel_path = os.path.relpath(full_path, project_path) file_paths.append((full_path, rel_path)) return sorted(file_paths, key=lambda x: x[1])# --- ФУНКЦИЯ: загрузка контекста из уже известных путей ---def load_full_context_from_paths(file_paths): print("... Загружаю полный код проекта в контекст ...") full_context = "" for full_path, rel_path in file_paths: full_context += f"--- ФАЙЛ: {rel_path} ---\n\n" try: with open(full_path, 'r', encoding='cp1251', errors='ignore') as f: full_context += f.read() except Exception as e: full_context += f"*** ОШИБКА ЧТЕНИЯ: {e} ***" full_context += "\n\n" print(f"--- Контекст загружен ({len(full_context)} символов) ---") return full_context# --- АНИМАЦИЯ ---def animate(stop_event): for c in itertools.cycle(['|', '/', '-', '\\']): if stop_event.is_set(): break sys.stdout.write(f'\rAI: ...думаю... {c}') sys.stdout.flush() time.sleep(0.1) sys.stdout.write('\r' + ' ' * 40 + '\r') sys.stdout.flush()# --- ПРОВЕРКА ЗАПРОСА О ФАЙЛАХ ---def is_file_list_request(query: str) -> bool: patterns = [ r"список файлов", r"какие файлы", r"покажи файлы", r"структура проекта", r"что видишь", r"файлы.*mcp", r"mcp.*файлы", r"перечисли файлы", r"есть ли файлы" ] return any(re.search(p, query.lower()) for p in patterns)# --- ОСНОВНАЯ ПРОГРАММА ---def main(): global full_context full_context = None # Инициализация модели try: genai.configure(api_key=GOOGLE_API_KEY) model = genai.GenerativeModel('models/gemini-2.0-flash') except Exception as e: print(f"[ОШИБКА] Ошибка инициализации модели: {e}") return # Сканируем директорию ОДИН РАЗ print("... Анализирую структуру проекта ...") file_paths = get_file_paths(PROJECT_PATH) file_list = [rel for _, rel in file_paths] files_summary = "\n".join(f"* `{f}`" for f in file_list) print(f"--- Найдено файлов: {len(file_list)} ---") print("\n--- Готов к работе! Введите 'выход', чтобы завершить. ---") print("[ПОДСКАЗКА] Спросите «Какие файлы в проекте?» — ответ без токенов!\n") while True: user_input = input("Вы: ").strip() if not user_input: continue if user_input.lower() == 'выход': print("Программа завершена.") break # Быстрый ответ — без AI if is_file_list_request(user_input): print(f"AI: Я вижу следующие файлы в проекте:\n\n{files_summary}\n") print("[ЭКОНОМИЯ] Этот ответ сгенерирован локально — без расхода токенов.") continue # Загружаем контекст ОДИН РАЗ, используя уже известные пути if full_context is None: full_context = load_full_context_from_paths(file_paths) system_prompt = ( "Ты — опытный программист, специализирующийся на ... " "Тебе предоставлен полный код проекта. Отвечай точно, ссылаясь на имена файлов при необходимости.\n\n" "Код проекта:\n\n" + full_context ) chat_session = model.start_chat(history=[ {'role': 'user', 'parts': [system_prompt]}, {'role': 'model', 'parts': ["Контекст загружен. Готов отвечать на вопросы по коду."]} ]) # Вызов модели response_container = {} stop_animation = threading.Event() def get_response(): try: response = chat_session.send_message(user_input) response_container['text'] = response.text except Exception as e: response_container['error'] = str(e) api_thread = threading.Thread(target=get_response) animation_thread = threading.Thread(target=animate, args=(stop_animation,)) api_thread.start() animation_thread.start() api_thread.join() stop_animation.set() animation_thread.join() # Вывод if 'text' in response_container: print(f"AI: {response_container['text']}") elif 'error' in response_container: print(f"[ОШИБКА] Ошибка API: {response_container['error']}") else: print("[ОШИБКА] Неизвестная ошибка при получении ответа.")if __name__ == "__main__": main()
И что ж такого сложного в MCP? Устанавливается проще некуда. И он не панацея. Все равно остается ограничение от AI: 200,000 токенов ≈ 150,000 слов ≈ 600-800 КБ текста. Вы можете без загадок говорить?
npx --versionnode --versionnpm install -g @modelcontextprotocol/server-filesystem
{ "mcpServers": { "filesystem": { "command": "mcp-server-filesystem", "args": [ "D:\\путь\\путь\\путь\\путь\\путь\\путь\\путь" ] } }}
Еще раз, это не я хочу, и делаю я это для того, кто портит мне жизнь и косит под хорошего. Поэтому уж извините, но рвение, инициатива и т.п. давно утихли.
Тот, кто хочет, ничего платить не будет.
Да, не переживайте вы так, я завтра сам прекрасно разберусь.
Я так и собирался делать. В понедельник буду копать. А в свободное от работы время напрягаться не планирую, это же не мне надо.
Сколько платите?