ГлавнаяБлогНеделя открытой разработки: пишем p2p-сеть и агентов на Python
Карьера

Неделя открытой разработки: пишем p2p-сеть и агентов на Python

Разбор недели открытой разработки: p2p-сеть на Python, агенты, 53 коммита. Узнайте, как улучшить свои проекты и рабочий процесс. Читайте сейчас!

Al
Редакция Algolitalgolit.ru
10 мин чтения31 августа 2026 г.

Зачем читать эту статью

Вы когда-нибудь задумывались, как выглядит неделя разработки, в которой удаётся сделать 53 коммита, открыть 13 pull request'ов и при этом не выгореть? Я покажу на своём примере, как совмещать работу над низкоуровневыми p2p-протоколами, агентными системами и личной базой знаний. Вы узнаете, какие задачи стоят за цифрами, как я подхожу к отладке сложных сетевых багов и почему ведение журнала сессий делает код лучше.

Что я строил: глубокое погружение в p2p-сеть

Основное время я потратил на py-libp2p — библиотеку для децентрализованных сетей. Код сетевого уровня не прощает ошибок, но когда всё начинает работать — это невероятное удовольствие. В модуле libp2p/kad_dht я реализовал настраиваемые ограничения разнообразия подсетей и лимиты на количество IP-адресов в таблице. Если вы сталкивались с Sybil-атаками или хаотичным распределением пиров, вы поймёте, насколько это важно — дело не просто в функциональности, а в устойчивости DHT.

На транспортном уровне я занимался исправлением WebRTC в libp2p/transport. Пришлось защитить запись в приватные слоты и убедиться, что мы используем close_peer_connection во всех местах, где это необходимо, чтобы не оставлять висящие ресурсы. Также я потратил время на хитрый баг в Windows: для прохождения тестов нужно было слушать на конкретном не-loopback интерфейсе.

Пример кода: защита приватных слотов в WebRTC

async def close_peer_connection(conn):
    """Безопасно закрывает соединение, освобождая ресурсы."""
    if conn is None:
        return
    try:
        await conn.close()
    except Exception as e:
        # Логируем ошибку, но не прерываем выполнение
        print(f"Ошибка при закрытии: {e}")
    finally:
        # Гарантируем, что ссылка на соединение будет удалена
        conn = None

# Пример использования в коде транспорта
async def handle_peer(peer_conn):
    # ... обработка соединения ...
    await close_peer_connection(peer_conn)  # Всегда закрываем явно

Улучшение Reachable и Breakscale

Я дорабатывал Reachable, делая функцию "Ask" более похожей на естественный разговор. Пришлось укрепить хранилище, чтобы состояние не дрейфовало при усложнении интерфейса.

В breakscale я столкнулся с забавным багом: Vitest падал на Node 26 из-за реализации localStorage в jsdom. Я открыл issue, отследил проблему и отправил фикс, вернув localStorage на место. Также я добавил функцию улучшения описаний дизайнов — теперь акцент на том, из чего дизайн состоит, а не только на его размерах. Небольшое изменение UX, но оно делает инструмент интуитивнее.

Цифровой мозг: мой Obsidian-хранилище

Я отношусь к своему obsidian-vault как к продакшн-репозиторию: на этой неделе в нём 35 коммитов. В основном синхронизировал состояния UI и обновлял шаблоны. Заметил баг в шаблоне "Concept": родительский указатель рекурсивно ссылался на сам шаблон — классическая мета-ошибка. Также я записал три сессии стриминга, что помогает документировать мыслительный процесс во время кодинга.

Pull Request'ы и оркестрация агентов

Я открыл 13 PR, некоторые ещё в работе. Много усилий ушло на agent-orchestrator. Я добавляю передачу ID запросов в события, генерируемые демоном, чтобы телеметрия была полезной. Нет ничего хуже, чем видеть ошибку в логе без возможности отследить её источник. Также исправил проблему с dev-server прокси, который указывал не на тот демон — один из тех багов "как это вообще работало?", которые приятно исправлять.

В репозитории corsair я стремился повысить надёжность и производительность. Открыл PR, чтобы:

  • Покрыть verifyHmacSignature юнит-тестами (код безопасности без тестов — просто катастрофа).
  • Добавить индексы базы данных для путей запросов corsair_entities и corsair_accounts. С ростом данных последовательные сканирования начали замедлять работу.
  • Улучшить обработку ошибок CLI, чтобы асинхронные сбои не вываливали неперехваченные промисы в терминал.

Пример кода: добавление индексов в SQLAlchemy

from sqlalchemy import Index, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class CorsairEntity(Base):
    __tablename__ = 'corsair_entities'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    # Другие поля...

# Создаём индекс для ускорения поиска по имени
Index('ix_corsair_entities_name', CorsairEntity.name)

Issues и вклад в сообщество

Я открыл 7 issues, в основном чтобы работать в открытую. Когда нахожу баг в agent-orchestrator (например, прокси tailnet Connect Mobile оставляет процессы после некорректного завершения) или узкое место в corsair, я документирую это до исправления. Это помогает держать всё в порядке и предупреждает мейнтейнеров о том, что я исследую.

Один баг, который я всё ещё отслеживаю, — в omarchy: выбор агента по умолчанию вызывает понижение версии из-за cooldown релиза в mise. Это странное взаимодействие между менеджером версий и логикой агента, надеюсь решить на следующей неделе.

Технологический стек и настроение

Неделя была полиглотной, но Python и TypeScript явно лидировали.

  • Python: 84 МБ кода (в основном внутренности libp2p).
  • TypeScript: 58 МБ кода во фронтенд-инструментах и CLI-утилитах.
  • Прочее: немного Lua для конфигурации nvim и Shell/Makefile для CI.

С 12 205 добавлениями против 1 500 удалений это была "растущая" неделя. Я не просто чистил код, а добавлял новые функции и расширял тестовые наборы. Семидневная серия не была натянутой: когда переключаешься между p2p-протоколами и AI-агентами, всегда хочется что-то докрутить перед концом дня.

Что дальше

На следующей неделе планирую закрыть PR по WebRTC v2 в py-libp2p. Спецификации надёжные, но детали реализации фрейминга data-channel как байтового потока всё ещё капризны. Также хочу довести до конца индексы базы данных в corsair и посмотреть на реальное улучшение производительности.

И, конечно, больше стриминга. Я заметил, что запись сессий в Obsidian делает меня осознаннее в коде. Если мне нужно объяснить что-то "будущему мне" в журнале, я реже выбираю ленивый путь.

Практический вывод

Прямо сейчас: начните вести журнал своих сессий программирования. Это может быть просто текстовый файл или заметка в Obsidian. Записывайте, что вы делали, какие проблемы решали и что хотите сделать дальше. Через неделю вы заметите, что стали писать более продуманный код, а ваши рабочие процессы — прозрачнее. Попробуйте хотя бы 3 дня — и увидите разницу.

#p2p-сети#агенты#Python
Al
Редакция Algolit

Пишем про алгоритмы, подготовку к собеседованиям и карьеру в IT — так, чтобы было понятно и полезно.

Хочешь закрепить знания на практике?

Решай задачи на Algolit — интерактивная платформа для обучения

Начать бесплатно →