Версия: 1.0.0
Дата: 2025-11-10
Цель: Простыми словами о каждом инструменте
Что это:
Язык программирования, на котором написана вся платформа.
Зачем:
- Все агенты написаны на Python
- Удобно работать с файлами, текстом
- Огромная экосистема библиотек
Как работает:
# Это Python код
def hello():
print("Привет!")
У нас уже есть: ✅ Python 3.11 установлен на сервере
Аналоги:
- JavaScript/Node.js (веб-ориентирован)
- Go (системное программирование)
- Java (тяжеловесный)
Почему Python:
- ✅ Простота
- ✅ AI/ML библиотеки
- ✅ Быстрая разработка
Что это:
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 (экономия)
Что это:
Библиотека для чтения и записи 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)
Что это:
Библиотека для работы с 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
Что это:
Фреймворк для написания и запуска тестов на 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_)
- ✅ Мощные фикстуры
- ✅ Отличные сообщения об ошибках
- ✅ Большая экосистема плагинов
Что это:
Библиотека для создания командной строки (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 использует)
Что это:
Библиотека для управления 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 хватит
Что это:
Мощный шаблонизатор (как в 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 проще и хватит
Что это:
Библиотека для валидации данных через 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 хватит
Что это:
Библиотека для логирования в структурированном формате (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 проще
Что это:
Встроенная в 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: синхронные вызовы проще
- ⚠️ Усложняет код
Что это:
Библиотека для полнотекстового поиска на 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) — линейный поиск хватит
Что это:
Библиотека для создания 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)
- ⚠️ Сложность + размер модели
Что это:
Система для распределённого выполнения задач (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 |
Легенда:
- ✅ Обязательно — нужно сразу
- 🟡 Полезно — добавим когда понадобится
- ⚪ Опционально — для продвинутых случаев
Пример стоимости:
- Создание проекта: ~2000 input + 1000 output = $0.021
- 100 проектов в месяц: ~$2
Очень дешёво
💰 ElevenLabs (Text-to-Speech, Фаза 5):
Итого: ~$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
Статус: Готово к обсуждению