SimpleHosting

SimpleHosting
Рейтинг
46
Регистрация
22.08.2017
Sly32 #:
Ты же писал, что разобрался!

Вы же молчите. А как понять, что у вас на уме. Расскажите, что именно вы делаете?

Sly32 #:
Ты хоть понимаешь что он делает?

Ну я же его писал.

Sly32 #:
Как этот код решает проблему ограничения по токенам?

Вначале я перепробовал, то, что показал в таблицах, потом перешел на Python, директорию я увидел, но это было долго, потом загнал в память содержимое директории, чтоб быстрее было.

Sly32 #:
В данном случае MCP и не пахнет.

Значит AI меня обманул, буду дальше копать.

Sly32 #:
Тут просто весь контекст грузится в промпт.

Да, допилил, для экономии токенов.

Sly32 #:
Даже чанков нет.

Опять незнакомое слово.

Sly32 #:
но все это может работать и на бесплатных ЛЛМ

Вы об этом? Это самый бюджетный вариант?

AI Описание
grok.com Для него, это много файлов
chatgpt.com Для него, это много файлов
gemini.google.com Вы можете добавлять одновременно не более 10 файлов
chat.qwen.ai В одном раунде диалога разрешено загружать не более 5 документов.
claude.ai Для него, это много файлов
perplexity.ai Вы достигли ежедневного лимита загрузок для вашего плана.


НазваниеОписание
viaSocketСлетают фильтры
Claude DesktopMCP работает, но лимиты быстро заканчиваются. 200,000 токенов ≈ 150,000 слов ≈ 600-800 КБ текста.
vs Code + ContinueНе получилось увидеть файлы.


import os
import sys

# --- ПОДАВЛЕНИЕ WARNING от gRPC/Google (делаем ДО импорта genai!) ---
os.environ["GRPC_VERBOSITY"] = "ERROR"
os.environ["GLOG_minloglevel"] = "3"  # 3 = только FATAL, 2 = ERROR и выше

# Теперь можно импортировать Google AI
import google.generativeai as genai
import threading
import time
import itertools
import 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()
EdwardEdit #:
если
Опять нюанс.
Sly32 #:
Угу...  Claude тебе не помог, а  Claude Desktop поможет? а в чем разница, не расскажешь?

И что ж такого сложного в MCP? Устанавливается проще некуда. И он не панацея. Все равно остается ограничение от AI: 200,000 токенов ≈ 150,000 слов ≈ 600-800 КБ текста. Вы можете без загадок говорить?

npx --version
node --version
npm install -g @modelcontextprotocol/server-filesystem
{
  "mcpServers": {
    "filesystem": {
      "command": "mcp-server-filesystem",
      "args": [
        "D:\\путь\\путь\\путь\\путь\\путь\\путь\\путь"
      ]
    }
  }
}
Sly32 #:
Серьезно??? И как тебе поможет в работе с большими данными  Claude Desktop? 
Да - серьезно. Пара мегабайт не так уж и много. Я с ИИ поговорил, ролики посмотрел - поможет. На практике еще не пробовал, сегодня уже не успею.
Sly32 #:
Спорим, что нет?
Разобрался, ИИ предложил установить или "LibreChat" или "Claude Desktop", с вас - бутылка.
Sly32 #:
Спорим, что нет?
Вызов принят.
Sly32 #:
Ты хочешь халявы

Еще раз, это не я хочу, и делаю я это для того, кто портит мне жизнь и косит под хорошего. Поэтому уж извините, но рвение, инициатива и т.п. давно утихли.

Sly32 #:
расширять за счет оплаты

Тот, кто хочет, ничего платить не будет.

Sly32 #:
не разбираются в теме

Да, не переживайте вы так, я завтра сам прекрасно разберусь.

Sly32 #:
Предлагаю тебе не тратить усилия на это

Я так и собирался делать. В понедельник буду копать. А в свободное от работы время напрягаться не планирую, это же не мне надо.

Sly32 #:
Модели я предпочитаю платные

Сколько платите?

leoseo #:
неразвитые просто не долетят
Лететь и не обязательно, есть и другие пути. Да и развитость понятие относительное.
Всего: 1300