⚙️ Process System
Процессы — это шаблоны для выполнения LLM-задач. Хранятся в БД, управляются через контракты, запускаются через process_runner.
Что такое Процесс
Процесс — это DB-сущность, которая описывает:
Шаблон для рендеринга user prompt
Default model + min_rank
RAG, personal data, chat history
Timeout, memory errors, model fallback
🔄 Execution Flow
От input_text до ответа
💻 Код: execute_process_for_runtime
async def execute_process_for_runtime(
runtime, *,
process_code: str,
input_text: str,
user_db_id: Optional[int],
chat_db_id: Optional[int],
rag_context: Optional[str] = None,
run_id: Optional[str] = None,
model_tier: Optional[str] = None, # "free" | "paid"
) -> ProcessExecutionResult:
# 1. Определяем лимиты по tier
if model_tier == "paid":
max_tokens = 4096 # paid tier
else:
max_tokens = 512 # free tier
# 2. Загружаем процесс из DB
process = await runtime.db.get_process_by_code(process_code)
# 3. Строим контекст (RAG, personal data, history)
if not rag_context:
if process.metadata.get("rag"):
rag_context = await build_rag_context(query=input_text)
if process.metadata.get("personal_data"):
docs = await db.list_table_documents(user_id=user_db_id)
rag_context += format_personal_docs(docs)
# 4. Выбираем агента (если есть)
agent_sel = await select_agent(db, process_code=process_code)
if agent_sel:
system_prompt = agent_sel["assembled_system_prompt"]
# 5. Рендерим prompt
rendered_prompt = render_process_prompt(
process_code=process_code,
prompt_template=process["prompt_template"],
input_text=input_text,
rag_context=rag_context,
)
# 6. Выбираем модель
process_model = process.get("default_model") or "phi4-mini"
best_available = runtime._pick_best_chat_model(
models, preferred=process_model, min_rank=min_rank
)
# 7. LLM call с timeout
response = await asyncio.wait_for(
runtime.chat_llm(
model=best_available,
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": rendered_prompt},
],
options={"num_predict": max_tokens, "temperature": 0.2},
),
timeout=90.0,
)
# 8. Логируем LLM call
await db.log_llm_call(
scope=f"process:{process_code}",
model=best_available,
latency_ms=...,
)
return ProcessExecutionResult(
text=response["message"]["content"],
model=best_available,
raw=response,
degraded=False,
)📚 Context Sources
Semantic search по embeddings из document_chunks.
metadata.rag = true включаетmax_distance = 0.45 фильтрsnippet_max_chars = 700Данные из table_document пользователя.
metadata.personal_data = true[type] key: value (date)Последние сообщения из чата (default fallback).
context_messages = 10message_max_chars = 200🔄 Fallback Chain
Что происходит при ошибках:
Пробует lighter модели с меньшим num_predict
Если все fail — возвращает degraded ответ из template
Memory error — переключается на модели с меньшим VRAM
Уменьшает num_predict, decay factor = 0.85
Модель не найдена — выбирает лучшую доступную
Может понизить min_rank если нужно
🎯 Model Selection
Model Rank
Short Input Fast-track
Если len(input_text) < 80:
fast_model_for_short_inputs = "phi4-mini"Экономит ресурсы для простых запросов
🗄️ DB Schema
processes
process_runs
📊 Status Flow
💡 Примеры процессов
Обычный диалог с ботом. Без RAG, без special context.
Поиск информации о поездках. RAG-enabled, ищет в document_chunks.
Персональный помощник с доступом к user data из table_document.
🔧 Troubleshooting
"Process not found"
Проверьте processes.code в DB и status = 'active'.
Degraded response
Смотрите llm_calls table, проверьте timeout и memory errors.
Медленный RAG
Проверьте document_chunks size и embeddings. Уменьшите limit или max_distance.