architect/_archive/2025-11-cleanup/platform-v2-cifra/archive/2025-11-10-redundant/SOFTWARE_EXPLAINED.md

Объяснение всех инструментов платформы

Версия: 1.0.0
Дата: 2025-11-10
Цель: Простыми словами о каждом инструменте


🎯 ОБЯЗАТЕЛЬНЫЕ ИНСТРУМЕНТЫ (уже есть / нужны сразу)


Python 3.11+

Что это:
Язык программирования, на котором написана вся платформа.

Зачем:
- Все агенты написаны на Python
- Удобно работать с файлами, текстом
- Огромная экосистема библиотек

Как работает:

# Это Python код
def hello():
    print("Привет!")

У нас уже есть: ✅ Python 3.11 установлен на сервере

Аналоги:
- JavaScript/Node.js (веб-ориентирован)
- Go (системное программирование)
- Java (тяжеловесный)

Почему Python:
- ✅ Простота
- ✅ AI/ML библиотеки
- ✅ Быстрая разработка


anthropic (библиотека для Claude API)

Что это:
Python библиотека для общения с Claude API.

Зачем:
Агенты вызывают Claude для генерации кода, документации, анализа.

Как работает:

from anthropic import Anthropic

client = Anthropic(api_key="sk-ant-...")

response = client.messages.create(
    model="claude-sonnet-4-5-20250929",
    max_tokens=1024,
    messages=[{
        "role": "user",
        "content": "Напиши функцию для форматирования цены"
    }]
)

print(response.content[0].text)
# Вывод: def format_price(amount): ...

Установка:

pip install anthropic

Стоимость:
- Input: $3 / 1M tokens
- Output: $15 / 1M tokens

Аналоги:
- openai (для GPT)
- google-generativeai (для Gemini)

Почему anthropic:
- ✅ Официальная библиотека Anthropic
- ✅ Claude — лучший для кода
- ✅ Prompt caching (экономия)


PyYAML (работа с YAML файлами)

Что это:
Библиотека для чтения и записи YAML файлов.

Зачем:
Конфигурация, метаданные, каталоги — всё храним в YAML (удобный формат).

Как работает:

import yaml

# Чтение
with open('config.yaml') as f:
    config = yaml.safe_load(f)

print(config['version'])  # "1.0.0"

# Запись
data = {
    'name': 'DocumentAgent',
    'enabled': True,
    'timeout': 300
}

with open('agents.yaml', 'w') as f:
    yaml.dump(data, f)

Формат YAML:

# Комментарий
name: DocumentAgent
enabled: true
timeout: 300
tags:
  - documentation
  - agent

Установка:

pip install pyyaml

Аналоги:
- json (встроен в Python, но менее читаемый)
- toml (используется в Rust проектах)

Почему YAML:
- ✅ Очень читаемый (для человека)
- ✅ Поддержка комментариев
- ✅ Git friendly (хорошо работает с diff)


python-frontmatter (метаданные в Markdown)

Что это:
Библиотека для работы с YAML frontmatter в Markdown файлах.

Зачем:
В PROJECT.md нужно хранить метаданные (версия, дата, статус) + сам текст.

Как работает:

Файл PROJECT.md:

---
version: 1.0.0
created_at: 2025-11-10
status: active
---

# Проект Marketplace

Описание проекта...

Python код:

import frontmatter

# Чтение
with open('PROJECT.md') as f:
    post = frontmatter.load(f)

print(post['version'])      # "1.0.0"
print(post['status'])       # "active"
print(post.content)         # "# Проект Marketplace\n\nОписание..."

# Изменение
post['version'] = '1.1.0'
post['status'] = 'archived'

# Сохранение
with open('PROJECT.md', 'w') as f:
    frontmatter.dump(post, f)

Установка:

pip install python-frontmatter

Аналоги:
- Отдельный project.yaml файл (но тогда 2 файла вместо 1)
- JSON в начале файла (менее читаемо)

Почему frontmatter:
- ✅ Всё в одном файле (метаданные + содержание)
- ✅ Популярный стандарт (Jekyll, Hugo используют)
- ✅ Git friendly


pytest (тестирование)

Что это:
Фреймворк для написания и запуска тестов на Python.

Зачем:
Проверять что агенты работают правильно.

Как работает:

# tests/test_document_agent.py

from platform.agents.document_agent import DocumentAgent

def test_create_project_md():
    """Тест создания PROJECT.md"""
    agent = DocumentAgent("/opt/claude-workspace")

    result = agent.execute({
        "type": "create_project_md",
        "project_name": "test",
        "description": "Test project"
    })

    assert result['status'] == 'success'
    assert 'file' in result

    # Проверяем что файл создан
    import os
    assert os.path.exists(result['file'])

def test_create_project_md_with_invalid_name():
    """Тест с невалидным именем"""
    agent = DocumentAgent("/opt/claude-workspace")

    result = agent.execute({
        "type": "create_project_md",
        "project_name": "",  # Пустое имя
        "description": "Test"
    })

    assert result['status'] == 'error'

Запуск:

# Запустить все тесты
pytest

# Запустить конкретный файл
pytest tests/test_document_agent.py

# С подробностями
pytest -v

# С покрытием
pytest --cov=platform

Установка:

pip install pytest
pip install pytest-cov  # Для покрытия кода

Аналоги:
- unittest (встроен в Python, но многословнее)
- nose (устарел)

Почему pytest:
- ✅ Простой синтаксис (просто функции с test_)
- ✅ Мощные фикстуры
- ✅ Отличные сообщения об ошибках
- ✅ Большая экосистема плагинов


Click (CLI интерфейс)

Что это:
Библиотека для создания командной строки (CLI).

Зачем:
Чтобы можно было вызывать платформу из терминала:

cifra create-project --name myapp --template streamlit-mvp-v1

Как работает:

# platform/cli.py

import click

@click.group()
def cli():
    """Платформа ЦИФРА"""
    pass

@cli.command()
@click.option('--name', required=True, help='Имя проекта')
@click.option('--template', required=True, help='Шаблон')
def create_project(name, template):
    """Создать новый проект"""

    click.echo(f"Создаю проект {name} из шаблона {template}...")

    # Вызываем агентов
    from platform.api.agent_api import AgentAPI
    api = AgentAPI("/opt/claude-workspace")

    result = api.call_agent("ProjectAgent", {
        "type": "create_project",
        "name": name,
        "template": template
    })

    if result['status'] == 'success':
        click.secho("✅ Проект создан!", fg='green')
    else:
        click.secho(f"❌ Ошибка: {result['error']}", fg='red')

if __name__ == '__main__':
    cli()

Использование:

# Запуск
python platform/cli.py create-project --name myapp --template streamlit-mvp-v1

# Помощь
python platform/cli.py --help
python platform/cli.py create-project --help

Установка:

pip install click

Аналоги:
- argparse (встроен, но многословнее)
- typer (новее, основан на type hints)

Почему Click:
- ✅ Простой и понятный
- ✅ Декораторы (@click.command)
- ✅ Автоматическая генерация help
- ✅ Цветной вывод
- ✅ Популярный (Flask использует)


🔧 ОПЦИОНАЛЬНЫЕ (полезные, но не обязательные)


GitPython (работа с Git из Python)

Что это:
Библиотека для управления Git репозиторием из Python кода.

Зачем:
- Анализировать историю коммитов
- Автоматически делать коммиты (GitAgent)
- Искать изменения в коде

Как работает:

from git import Repo

# Открыть репозиторий
repo = Repo('/opt/claude-workspace')

# История коммитов
commits = list(repo.iter_commits('master', max_count=10))
for commit in commits:
    print(f"{commit.hexsha[:7]} - {commit.message}")
    print(f"Автор: {commit.author.name}")
    print(f"Дата: {commit.committed_datetime}")
    print()

# Поиск коммитов
agent_commits = [
    c for c in commits
    if 'DocumentAgent' in c.message
]

# Diff между версиями
diff = repo.git.diff('HEAD~1', 'HEAD')
print(diff)

# Создание коммита
repo.index.add(['platform/agents/document_agent.py'])
repo.index.commit("feat: DocumentAgent реализован")

# Статус
print(repo.git.status())

Установка:

pip install gitpython

Альтернатива:

# Через subprocess (встроенный)
import subprocess

result = subprocess.run(
    ['git', 'log', '--oneline', '-10'],
    capture_output=True,
    text=True
)
print(result.stdout)

Почему GitPython:
- ✅ Удобнее чем subprocess
- ✅ Объектная модель (Commit, Tree, Blob)
- ✅ Не нужно парсить текст

Когда НЕ нужен:
- ⚠️ Если команды простые (git add, git commit) — subprocess хватит


Jinja2 (продвинутые шаблоны)

Что это:
Мощный шаблонизатор (как в Django/Flask).

Зачем:
Генерировать сложные документы с циклами, условиями.

Как работает:

Шаблон (template.md.j2):

# {{ project_name }} — Спецификация

**Версия:** {{ version }}
**Дата:** {{ date }}

## Компоненты

{% for component in components %}
### {{ component.name }}
- Путь: `{{ component.path }}`
- Описание: {{ component.description }}
{% endfor %}

{% if is_production %}
**⚠️ Это production проект!**
{% else %}
Это dev проект.
{% endif %}

Python код:

from jinja2 import Template

with open('template.md.j2') as f:
    template = Template(f.read())

result = template.render(
    project_name="Marketplace",
    version="1.0.0",
    date="2025-11-10",
    components=[
        {"name": "DocumentAgent", "path": "agents/document_agent.py", "description": "Генерация документов"},
        {"name": "CodeAgent", "path": "agents/code_agent.py", "description": "Генерация кода"}
    ],
    is_production=True
)

print(result)

Результат:

# Marketplace — Спецификация

**Версия:** 1.0.0
**Дата:** 2025-11-10

## Компоненты

### DocumentAgent
- Путь: `agents/document_agent.py`
- Описание: Генерация документов

### CodeAgent
- Путь: `agents/code_agent.py`
- Описание: Генерация кода

**⚠️ Это production проект!**

Установка:

pip install jinja2

Альтернативы:

# f-strings (для простых случаев)
doc = f"""
# {project_name}
Версия: {version}
"""

Почему Jinja2:
- ✅ Циклы, условия, фильтры
- ✅ Наследование шаблонов
- ✅ Популярный (Flask, Ansible используют)

Когда НЕ нужен:
- ⚠️ Фаза 0-1: f-strings проще и хватит


Pydantic (валидация данных)

Что это:
Библиотека для валидации данных через Python классы.

Зачем:
Проверять что данные (конфигурация, метаданные) корректны.

Как работает:

from pydantic import BaseModel, Field, validator
from datetime import datetime
from typing import List

# Определяем модель
class ProjectMetadata(BaseModel):
    name: str = Field(..., min_length=1, max_length=50)
    version: str = Field(..., regex=r'^\d+\.\d+\.\d+$')
    created_at: datetime
    status: str = Field(..., regex='^(active|archived|deprecated)$')
    tags: List[str] = []

    @validator('name')
    def name_must_be_lowercase(cls, v):
        if not v.islower():
            raise ValueError('Имя проекта должно быть в нижнем регистре')
        return v

# Использование
try:
    project = ProjectMetadata(
        name="marketplace",
        version="1.0.0",
        created_at="2025-11-10",
        status="active",
        tags=["ecommerce", "mvp"]
    )
    print("✅ Валидация прошла")
    print(project.dict())
except Exception as e:
    print(f"❌ Ошибка: {e}")

# Ошибка
try:
    bad_project = ProjectMetadata(
        name="",  # Пустое имя
        version="1.0",  # Неправильный формат
        created_at="2025-11-10",
        status="unknown"  # Неизвестный статус
    )
except Exception as e:
    print(f"❌ {e}")
    # name: field required
    # version: string does not match regex
    # status: string does not match regex

Установка:

pip install pydantic

Альтернативы:

# Ручная валидация
def validate_project(data):
    if not data.get('name'):
        raise ValueError("Name is required")
    if not re.match(r'^\d+\.\d+\.\d+$', data.get('version', '')):
        raise ValueError("Invalid version format")
    # ...

Почему Pydantic:
- ✅ Type safety
- ✅ Автоматическая конвертация типов
- ✅ Отличные сообщения об ошибках
- ✅ Валидаторы (custom logic)

Когда НЕ нужен:
- ⚠️ Фаза 0-1: простые проверки if/raise хватит


structlog (структурированное логирование)

Что это:
Библиотека для логирования в структурированном формате (JSON).

Зачем:
Логи в JSON проще парсить, анализировать, отправлять в системы мониторинга.

Как работает:

Обычное логирование (Python logging):

import logging

logging.info("DocumentAgent created PROJECT.md for marketplace in 1.5s")
# 2025-11-10 14:30:15 INFO DocumentAgent created PROJECT.md for marketplace in 1.5s

Структурированное (structlog):

import structlog

log = structlog.get_logger()

log.info(
    "document_created",
    agent="DocumentAgent",
    project="marketplace",
    file="PROJECT.md",
    duration=1.5,
    tokens_used=1234
)

# Вывод (JSON):
# {"event": "document_created", "agent": "DocumentAgent", "project": "marketplace", "file": "PROJECT.md", "duration": 1.5, "tokens_used": 1234, "timestamp": "2025-11-10T14:30:15.123456Z"}

Преимущества JSON логов:

# Легко парсить и анализировать
import json

with open('agents.log') as f:
    for line in f:
        log_entry = json.loads(line)
        if log_entry['agent'] == 'DocumentAgent':
            print(f"Токенов использовано: {log_entry['tokens_used']}")

Установка:

pip install structlog

Альтернативы:
- Python logging (встроен, но текстовый)

Почему structlog:
- ✅ JSON логи (легко парсить)
- ✅ Контекст (можно привязывать данные к логгеру)
- ✅ Процессоры (преобразование логов)

Когда НЕ нужен:
- ⚠️ Фаза 0-1: Python logging проще


asyncio (асинхронное программирование)

Что это:
Встроенная в Python библиотека для асинхронного выполнения.

Зачем:
Запускать несколько агентов параллельно (не последовательно).

Как работает:

Синхронно (медленно):

# CentralAgent
def create_project_workflow(name):
    # Последовательно (ждём каждого)
    result1 = call_agent("DocumentAgent", task1)  # 5 секунд
    result2 = call_agent("CodeAgent", task2)      # 10 секунд
    result3 = call_agent("TestAgent", task3)      # 3 секунды

    # Итого: 18 секунд

Асинхронно (быстро):

import asyncio

async def create_project_workflow(name):
    # Параллельно (все одновременно)
    task1 = call_agent_async("DocumentAgent", task1)
    task2 = call_agent_async("CodeAgent", task2)
    task3 = call_agent_async("TestAgent", task3)

    results = await asyncio.gather(task1, task2, task3)

    # Итого: 10 секунд (самый долгий)

Когда полезно:
- I/O bound операции (HTTP запросы, файлы)
- Claude API вызовы (ожидание ответа)
- Несколько независимых задач

Встроено в Python 3.7+

Альтернативы:
- threading (потоки, сложнее)
- multiprocessing (процессы, для CPU bound)

Почему asyncio:
- ✅ Встроено
- ✅ Идеально для I/O bound (HTTP, API)
- ✅ Современный подход

Когда НЕ нужен:
- ⚠️ Фаза 0-2: синхронные вызовы проще
- ⚠️ Усложняет код


Whoosh (полнотекстовый поиск)

Что это:
Библиотека для полнотекстового поиска на Python.

Зачем:
Быстро искать компоненты по описанию, тегам.

Как работает:

Без Whoosh (медленно):

# Линейный поиск
catalog = yaml.safe_load(open('catalog.yaml'))
results = []
for component in catalog['formatters']:
    if 'price' in component['description'].lower():
        results.append(component)
# Для 1000 компонентов — медленно

С Whoosh (быстро):

from whoosh.index import create_in
from whoosh.fields import Schema, TEXT, ID

# 1. Создать схему
schema = Schema(
    name=ID(stored=True),
    path=TEXT(stored=True),
    description=TEXT,
    tags=TEXT
)

# 2. Создать индекс
ix = create_in("indexdir", schema)

# 3. Индексация
writer = ix.writer()
writer.add_document(
    name="format_price",
    path="components/formatters.py",
    description="Форматирование цены в рубли",
    tags="formatting price currency"
)
writer.add_document(
    name="format_date",
    path="components/formatters.py",
    description="Форматирование даты",
    tags="formatting date time"
)
writer.commit()

# 4. Поиск
from whoosh.qparser import QueryParser

with ix.searcher() as searcher:
    query = QueryParser("description", ix.schema).parse("price")
    results = searcher.search(query)

    for result in results:
        print(f"{result['name']} - {result['path']}")
    # format_price - components/formatters.py

Установка:

pip install whoosh

Альтернативы:
- Линейный поиск (YAML)
- SQLite FTS (Full-Text Search)
- Elasticsearch (overkill для нас)

Почему Whoosh:
- ✅ Python native
- ✅ Быстрый
- ✅ Полнотекстовый поиск
- ✅ Ranking результатов

Когда НЕ нужен:
- ⚠️ Мало компонентов (<100) — линейный поиск хватит


Sentence Transformers (семантический поиск)

Что это:
Библиотека для создания embeddings (векторных представлений) текста.

Зачем:
Находить семантически похожие компоненты (не только по ключевым словам).

Проблема:

Запрос: "нужно форматировать деньги"
Компонент: "format_price" с описанием "Форматирование цены"

Обычный поиск: НЕ НАЙДЁТ (нет слова "деньги")
Семантический: НАЙДЁТ (понимает что "деньги" ≈ "цена")

Как работает:

from sentence_transformers import SentenceTransformer
import numpy as np

# 1. Загрузить модель (один раз)
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')

# 2. Создать embeddings для всех компонентов
components = [
    "Форматирование цены в рубли",
    "Валидация ИНН",
    "Отправка email"
]

embeddings = model.encode(components)
# embeddings.shape = (3, 384)  # 3 компонента, 384-мерный вектор каждый

# 3. Поиск
query = "нужно форматировать деньги"
query_embedding = model.encode([query])

# 4. Вычислить сходство
from sklearn.metrics.pairwise import cosine_similarity
similarities = cosine_similarity(query_embedding, embeddings)[0]

# 5. Топ-3 результата
top_indices = similarities.argsort()[-3:][::-1]

for idx in top_indices:
    print(f"{components[idx]} - сходство: {similarities[idx]:.2f}")

# Форматирование цены в рубли - сходство: 0.78  ← НАШЛО!
# Валидация ИНН - сходство: 0.12
# Отправка email - сходство: 0.05

Установка:

pip install sentence-transformers
pip install scikit-learn  # Для cosine_similarity

# Модель загрузится при первом запуске (~500MB)

Альтернативы:
- OpenAI Embeddings (платно, но точнее)
- Обычный поиск (бесплатно, но примитивно)

Почему Sentence Transformers:
- ✅ Локально (бесплатно)
- ✅ Семантический поиск
- ✅ Поддержка русского языка

Когда НЕ нужен:
- ⚠️ Мало компонентов (<500)
- ⚠️ Сложность + размер модели


Celery (распределённые задачи)

Что это:
Система для распределённого выполнения задач (task queue).

Зачем:
- Запускать агентов на разных серверах
- Retry при ошибках
- Мониторинг выполнения

Как работает:

Архитектура:

CentralAgent
    ↓
Celery (добавляет задачу в очередь)
    ↓
Redis/RabbitMQ (брокер сообщений)
    ↓
Worker 1 (выполняет DocumentAgent)
Worker 2 (выполняет CodeAgent)
Worker 3 (выполняет TestAgent)

Код:

# platform/celery_app.py
from celery import Celery

app = Celery(
    'cifra',
    broker='redis://localhost:6379',
    backend='redis://localhost:6379'
)

@app.task
def run_agent(agent_name, task):
    """Задача для выполнения агента"""
    from platform.api.agent_api import AgentAPI
    api = AgentAPI("/opt/claude-workspace")
    return api.call_agent(agent_name, task)

# Использование
result = run_agent.delay("DocumentAgent", {
    "type": "create_project_md",
    "project_name": "test"
})

# Ждём результата
print(result.get())  # Блокирующий вызов

# Или проверяем статус
if result.ready():
    print("Готово!")
else:
    print("Ещё выполняется...")

Запуск worker:

# Установка
pip install celery redis

# Запуск Redis (брокер)
redis-server

# Запуск Celery worker
celery -A platform.celery_app worker --loglevel=info

Установка:

pip install celery
pip install redis  # Или RabbitMQ

Альтернативы:
- RQ (Python-специфичный, проще)
- asyncio (встроено, но не распределённое)
- AWS Lambda (serverless, но дорого)

Почему Celery:
- ✅ Распределённое выполнение
- ✅ Retry механизм
- ✅ Мониторинг (Flower)
- ✅ Популярный

Когда НЕ нужен:
- ⚠️ Фаза 0-3: усложнение
- ⚠️ Нужен Redis/RabbitMQ
- ⚠️ Если 1 сервер — asyncio хватит


📊 СРАВНИТЕЛЬНАЯ ТАБЛИЦА

Инструмент Зачем Обязательно? Фаза
Python Язык программирования ✅ Да 0
anthropic Claude API ✅ Да 0
pyyaml Конфигурация ✅ Да 0
python-frontmatter Метаданные в Markdown ✅ Да 0
pytest Тестирование ✅ Да 0
click CLI интерфейс ✅ Да 0
GitPython Работа с Git 🟡 Полезно 1
Jinja2 Продвинутые шаблоны 🟡 Полезно 2
Pydantic Валидация данных 🟡 Полезно 2
structlog Структурированные логи 🟡 Полезно 2
asyncio Параллелизм 🟡 Полезно 3
Whoosh Полнотекстовый поиск ⚪ Опционально 3
Sentence Transformers Семантический поиск ⚪ Опционально 4
Celery Распределение задач ⚪ Опционально 4

Легенда:
- ✅ Обязательно — нужно сразу
- 🟡 Полезно — добавим когда понадобится
- ⚪ Опционально — для продвинутых случаев


💰 СТОИМОСТЬ

Бесплатные (open-source):

Платные (API):

Пример стоимости:
- Создание проекта: ~2000 input + 1000 output = $0.021
- 100 проектов в месяц: ~$2

Инфраструктура:

Итого: ~$2-5 / месяц при активной разработке


🚀 ЧТО УСТАНОВИТЬ ПРЯМО СЕЙЧАС

# Минимальный набор для Фазы 0
pip install anthropic           # Claude API
pip install pyyaml              # Конфигурация
pip install python-frontmatter # Метаданные
pip install pytest              # Тесты
pip install click               # CLI

# Опционально (полезно)
pip install gitpython           # Git анализ

Всё остальное — потом, когда понадобится!


❓ ВОПРОСЫ?

Q1: Какой инструмент непонятен?
- Объяснить подробнее?

Q2: Какие ещё инструменты нужны?
- Что я упустил?

Q3: Что-то слишком сложное?
- Можем убрать / упростить?

Q4: Готовы устанавливать и начинать?
- Или ещё вопросы?


Версия: 1.0.0
Дата: 2025-11-10
Статус: Готово к обсуждению