https://www.perplexity.ai/search/sozdai-requiremmnts-txt-rkA2KeVJR1y0gtlrZpwecA

---

доработай чтобы удовлетворить всем требованиям 

`какие есть открытые агенты, доступные на декстопе вин 10, к которым можно подсоединить как внешние (типа gemini по api) так и внутренние (развернутые в ollama) llm, и чтобы можно было задавать кастомные промпты, типо сделать запрос через curl и получить ссылки на изображения внутри json взять их их и вывести все 4 в чате чтобы визульано было видно что получено, сделать запрос по полученной ссылке на изображения, проанализировать изображение и вывести промпт чтобы сгенерировтаь подобное - а промпт например подать запрос по удаленному эндпоинту. или запросить в некой папке got --diff staged и создать сообщение на основе этого для коммита. или например аналзировать формируемый где-то субтитры видеозвонка и на сонове того брать последние 50000 символов и пропускать через промпт выдавая на выходе предложения по дальнейшему развитию игры в днд`. если нужно задай вначале все необходимые вопросы и не приступай к генерации пока не получишь всю нужную информацию. Если нужно а я не даю, продолжай требовать её

---

1. Ollama не будет использоваться, только внешние модели пока что `MODELS = {
    "gemini-2.0-flash": {
        "name": "gemini-2.0-flash",
        "provider": "openai",
        "baseUrl": "https://render-service-gsu7.onrender.com/g/v1beta",
        "apiKey": "AIzaSyDpueKFWVqknVKlQn6TdasLmJ2lvAUiBik",
        "stream": True,
        "capabilities": ["vision"],
    },
    "gemini-2.5-flash": {
        "name": "gemini-2.5-flash",
        "provider": "openai",
        "baseUrl": "https://render-service-gsu7.onrender.com/g/v1beta",
        "apiKey": "AIzaSyDpueKFWVqknVKlQn6TdasLmJ2lvAUiBik",
        "stream": True,
        "capabilities": ["vision"],
    },
    "gemini-2.5-flash-preview-05-20": {
        "name": "gemini-2.5-flash-preview-05-20",
        "provider": "openai",
        "baseUrl": "https://render-service-gsu7.onrender.com/g/v1beta",
        "apiKey": "AIzaSyDpueKFWVqknVKlQn6TdasLmJ2lvAUiBik",
        "stream": True,
        "capabilities": ["vision"],
    },
    "mistral-small-latest": {
        "name": "mistral-small-latest",
        "provider": "mistralai",
        "baseUrl": "https://render-service-gsu7.onrender.com/m",
        "apiKey": "Q0m29fvxBY0Cfdj4sjHaKqccy1NjonLW",
        "stream": True,
        "capabilities": ["vision"],
    },
}`, заложи заглушку, которую потом можно развить под ollama (типо пустой словарь соединений с моделями).

1. Веб интерфейс не слабее chatgpt или perlexity, с историями диалогов, с о средней панелью (левая история, правая чат, а средняя - граф) с графом как на flowith, сделай его через react flow если нет лучше альтернативы. суть в том, что активный чат - это выбранная ветка на графе, и новое сообщение в чате порождает новый лист в графе, а граф перестраивается с использованием библиотеки dagre. активный нод в графе - ыбранный последнее сообщение в правой панели, например, если выбрать промужточное на графе (щелкнуть лкм по ноду), то сообщения в правой панели выведутся от корня графа вплоть до щелкнутого сообщения. и если спроить, то будет добален ноду новый ребенок и дальше новое ветвления с постоянным обновлением посдвечиваемого синими цветом активного листа согласно последнему сообщению(сообщения пользователя и llm разными цветми контура нода). я пробовал streamlit и он показался оцень примитивным, возможно, я не прав. 
Соответсвтенно хранятся одержимое нодов графа в чем-то и при отправке сообщения нужно использовать память (формировать её?) но не в лоб как в дипсик, чтобы она глупо конкатенировалась, а суммаризацией, возможно либо с отсечкой по кол-ву токенов последних - предложи сначала варианты, какие есть. т.е. для новой ветки формируемый промпт будет разным (отправляемыая история).
1. Нужно бесплатное решение - предложи варианты. и то, что будет работать на gtx 1060 ti .
2. подробное описание и стиль как минимум. предложи, что ещё?
3. сначала предложи вариант платформы для звонка, (варианты), которые позволяю непрерывно извлекать уже сформированные на данный момент звонка субтитры и передавать в систему (промежуточные субтитры).
4. необходимость запустить код в obsidiab ````dataviewjs
const defaultlocations = ["Фаэрун"];
const defaultCurrentDate = "1491/09/29";
const defaultStartDate = "1490/01/01";
const defaultEndDate = "1493/3/30";
const defaultPcsParticipationOnly = false;
const defaultIncludeRegionsParticipants = false;
const fullWidth = true;

const scriptPath = "scripts/timeline-widget";
await dv.view(scriptPath, { arg1: dv, arg2: defaultlocations, arg3: defaultCurrentDate, arg4: defaultStartDate, arg5: defaultEndDate, arg6: defaultPcsParticipationOnly, arg7: defaultIncludeRegionsParticipants, arg8: fullWidth });

```` и считать результат. ВОзможность собирать данные из obsidian.

Также этот эндпоинт на удаленном ресурсе (остаь пока там произвольную константу для url), который имеет этот ресурс для получения изображения по промпту : `def _process_image_generation(prompt: str):
    """
    Вспомогательная функция для обработки логики генерации изображений.
    Возвращает кортеж (image_urls, error_message).
    """
    image_urls = []
    error_message = None

    # При каждой генерации изображений создаем новый объект BingArt
    # с помощью функции load_cookies, чтобы убедиться, что куки актуальны.
    # Это позволяет избежать проблем с устаревшими сессиями.
    # Важно: close_session() вызывается в finally, чтобы гарантировать закрытие сессии.
    local_bing_art = BingArt(
        auth_cookie_U=cookies.get('_U'),
        auth_cookie_KievRPSSecAuth=cookies.get('KievRPSSecAuth'))

    try:
        if prompt:
            results = local_bing_art.generate_images(prompt)
            if results and 'images' in results:
                # Фильтруем и обрезаем до 4 изображений
                image_urls = [
                    img['url'] for i, img in enumerate(results['images'])
                    if i % 2 == 0
                ][:4]
            else:
                error_message = "Не удалось получить изображения."
        else:
            error_message = "Коммандер, введи промпт!"
    except Exception as e:
        error_message = f"Произошла ошибка: {str(e)}"
        app.logger.error(f"Ошибка при генерации изображения: {e}",
                         exc_info=True)
    finally:
        # Важно: закрываем сессию BingArt после использования
        local_bing_art.close_session()

    return image_urls, error_message


@app.route('/generate-images', methods=['GET', 'POST'])
def generate_images():
    """
    Генерация изображений с использованием bingart.
    Поддерживает как POST (form data), так и GET (query parameter) запросы.
    """
    if request.method == 'POST':
        prompt = request.form.get('prompt')
    else:  # GET request
        prompt = request.args.get('prompt')

    session['prompt'] = prompt  # Сохраняем промпт в сессии

    image_urls, error_message = _process_image_generation(prompt)

    if error_message:
        session['error_message'] = error_message
        return jsonify({'error': error_message}), 500

    session['image_urls'] = image_urls
    return jsonify({'image_urls': image_urls})`

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

храниться они будут в отдельной папке в подпапках, а при  начале письма подставляются в виде `<имя папки>/<ввод пользователя><вариант продолжения N>`
 и все варианты должны предлагаться в некотором popup-окне или лучше.
8. Русский.

---

