Практычныя прытамулкі: Глęбокіе агенты ў дзейнасці: стварэнне мульті-агентскай системы даследавання
Практычныя прыказкі: Глęбокіе агенты ў дзейнасці: стварэнне мульті-агентскай системы даследжэння: кантракты, перакрыцчы і слоты для коду для команд, якія викорыстоўваюць гэты патэрн.
У гэтым керавану практычным крокам перакладзена вся сяброўка, ад сырых матэрыялаў да рабочай системы для проекту «Deep Agents in Action: Building a Multi-Agent Research System». Акцэнт ставіцца на практычныя крокі, чыстае перакананне ў правильнасці дзействаў і код, які можна проста падключыць у репазітарый, не прабуючы здогадвацца пра мету. У стадії агледку неабходна з’явіць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры перамены коду. Аперацыйныя працавнікі должны магчымае перадзеяць крок з вядомай точкі контролю, не прабуючы здагадвацца пра схованы стан. Неабходна аддзеяць дакументацыю як пра успішны ход роботы, так і пра шлях вярнення да нормальнасці. Перапрыбуткі, людзкія перакананні і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Введэнне: Архітектура Deep Agents
Калі працуеце над стадзіяй «Введэнне: Глыбокія агенты», спачатку запісайце контракт: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі список пераканаецца дапамагчы правдзівым змянам у коде пазнейша. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неудача должна вказваць на адну адпаведную адпаведальнасць, а не на заплутаны ланцужок задач. Зробіце перапактаванне пасля дорогіх крокаў. Програма не должна зноў выклікаць той самы календар LLM, калі аператар прабуе зноў запрацаваць з пазнейшым вузлом.
Што такое шаблон Глыбокіх агентоў?
Калі працюеце над стадзіяй «Што такое Deep», спачатку запісайце контракт: неабяжлівыя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконтроўвае, каб пазнейшыя змены коду былі чыстымі. Спрацоўвайце з гэтай стадзіяй як з контрактом межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаце правілы пераканання успеху і не падтрымайце тыхія частковыя завершэння. Зробіце пераконтроль пасля дорогіх крокаў. Програма для продакцыі не павінна зноў стягваць плата за той самы вызов LLM, калі аператар праканае пазнейшы вузел.
| Single Agent | Deep Agents |
| ---------------------------------- | ------------------------------------------------- |
| One context window gets overloaded | Each agent has an isolated, focused context |
| All reasoning in one prompt | Specialised reasoning per domain |
| Hard to scale | Add specialists without changing the orchestrator |
| Hard to debug | Full delegation trace for auditability |
Аптаварызацыя Deep Agents
Калі працуеце над стадзіяй адгляду Deep Agents, спачатку запісайце «контракт»: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцьварыць пазнейшыя змены ў кодзе.
Асновныя панявы LangChain Deep Agents
Канцэпты LangChain работаюць наяўней, калі іх спрыяваць як мерыемую структуру. Запісаўце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметкі па абратанню стану раней, чым расшырваце сферу дзеяння. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісьць крок не выйшаў, прычына неудачы павінна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Рэзультаты роботы графа павінны быть простымі та з адзінаковым типам дадзеных. Вярсткаваныя элементы маскуюць інфармацыю пра тое, який вузел запісаў канкрэтны поле, і спакойваюць працу пасля перарываў.
Тэхнічная реалізацыя
Этап тэхнічнай рэалізацыі працюе наякша, калі яго спрыяваць як мерыемую плошчу. Зафіксавце адны ідеальны прыклад роботы, адну ситуацыю неудачы і прыметкі па адвярненню змян пры расшырэнні масштаба. Спрыяйце гэтам этапу як кантракту межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад тых падзеяў, калі робота завершаецца часткова без паведамлення. Храніце стан графа ў простым і типаванам формате. Вярнутыя структуры данных маскуюць інфармацыю пра тое, який вузел запісаў кожны поле, і спакшваюць возз'яданне пасля перарываў.
Аптака архітэктуры
Этап адміністрацыі архітектуры працюе наявнасць калі яго спрацоўваюць як мерыемую паверхню. Зберагчыце адна ідеальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштаб. Запісвайце часы выканання і косты токеноў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Храніце стан графа ў простам і типаваным формате. Вкладзеныя блокі маскуюць інфармацыю пра тое, який вузел запісаў які поле, і спакшваюць продовжэнне роботы пасля перерываў.
User Task
└─ OrchestratorAgent (Planning & Synthesis)
├─ ResearcherAgent (web_search)
├─ AnalystAgent (calculator, code_executor)
└─ WriterAgent (file_reader)
Этап адміністрацыі архітектуры працюе наявнасць калі яго спрацоўваюць як мерыемую паверхню. Зберагчыце адна ідеальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштаб. Дакументавайце як шлях успеху, так і шлях вярнэння да нормальнага стану. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Тэхнічны стак
Для стадіі Тэхнічнага стаку неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымае перадзеяць крок з вядомай точкі контролю, не падозрываючы схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшоў, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес. Неабяжна ўключыць людзкія апраўленні для тых крокоў, якія выкарыстоўваюць грошы або зміняюць даны ў працэсе. Компіляцыйныя налашчэнні не ўзначаюць павнае адпрацоўванне бізнес-процэса.
Структура коду
У стадії структуры коду неабяцо практычна вказаць інпуты, адпавядаючага за крок адпаведальнага, а таксама критэрыі завершэння перад змянайом коду. Аперацыёныя працавнікі павінны магчымае перадзягнуць крок з вядомага пункта контролю без неабяцовага адгадвання захаванага стану. Спрыяйце гэтай стадіі як даговору межа інпутамі і падтверджанымі выходнымі даннымі. Даўце назвы артыфактам, практычна вказаць перагляды успеху і адмовіцеся ад тыхнага частковага завершэння без паведамлення. Забезпечыце людскія апраўленні для тых крокаў, якія выкарыстоўваюць грошы або зміняюць даны працэсу. Компіляцыйныя налашчэнні не ўзроўнаўцяюцца з абсягам выканання бізнес-задач.
deepagents-usecase/
├── agents/
│ ├── __init__.py # Package exports
│ ├── base.py # Abstract BaseAgent + ReAct loop
│ ├── llm_client.py # LLM adapter (Ollama/llama.cpp/OpenAI/Anthropic)
│ ├── messages.py # Typed message protocol
│ ├── orchestrator.py # OrchestratorAgent (top-level)
│ ├── researcher.py # ResearcherAgent specialist
│ ├── analyst.py # AnalystAgent specialist
│ └── writer.py # WriterAgent specialist
├── tools/
│ ├── __init__.py
│ ├── base.py # BaseTool + ToolResult
│ ├── calculator.py # Safe AST-based arithmetic evaluator
│ ├── code_executor.py # Sandboxed Python execution (exec with allow-list)
│ ├── file_reader.py # Sandboxed file reading (input/ only)
│ └── web_search.py # Web search (stub + live Tavily)
├── memory/
│ ├── __init__.py
│ └── store.py # AgentMemoryStore (short/long-term/episodic)
├── config/
│ ├── __init__.py
│ └── settings.py # Centralised env-based configuration
├── tests/
│ ├── test_tools.py # Tool unit tests (71 tests)
│ ├── test_memory.py # Memory unit tests (24 tests)
│ ├── test_agents.py # Agent integration tests (92 tests)
│ └── test_code_executor.py # Code Executor tests (134 tests)
├── input/ # Input documents (content gitignored)
├── output/ # Generated reports (content gitignored)
├── memory/ # Persistent agent memory (JSON files)
├── scripts/
│ ├── start.sh # Launch Streamlit in detached mode
│ ├── stop.sh # Gracefully stop the application
│ ├── cleanup.sh # Remove .venv, __pycache__, etc.
│ └── check_code_executor.py # Standalone Code Executor sanity-check
├── Docs/
│ ├── Architecture.md # Mermaid architecture diagrams
│ ├── Quickstart.md # Step-by-step getting started guide
│ ├── API.md # Full public API reference
│ └── CodeExecutorVerification.md # Code Executor test & verification guide
├── app.py # Streamlit web UI
├── main.py # CLI entry point
├── requirements.txt
├── .env.example # Environment variable template
└── README.md
# =============================================================================
# Deep Agents System — Environment Configuration
# =============================================================================
# Copy this file to .env and fill in your values.
# NEVER commit the .env file to version control.
#
# Usage:
# cp .env.example .env
# # edit .env with your actual keys
# =============================================================================
# ─── LLM Provider ──────────────────────────────────────────────────────────
# Select ONE provider. Comment out the others.
# Option A: Ollama (local, default — no API key needed)
LLM_PROVIDER=ollama
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=llama3.2
# Option B: llama.cpp (local)
# LLM_PROVIDER=llamacpp
# LLAMACPP_BASE_URL=http://localhost:9931/v1
# LLAMACPP_MODEL=local-model
# Option C: OpenAI
# LLM_PROVIDER=openai
# OPENAI_API_KEY=sk-...
# OPENAI_MODEL=gpt-4o
# Option D: Anthropic
# LLM_PROVIDER=anthropic
# ANTHROPIC_API_KEY=sk-ant-...
# ANTHROPIC_MODEL=claude-3-5-sonnet-20241022
# ─── Application Settings ──────────────────────────────────────────────────
APP_PORT=8501
APP_HOST=0.0.0.0
LOG_LEVEL=INFO
# ─── Agent Configuration ───────────────────────────────────────────────────
# Maximum reasoning steps per agent (lower = faster on slow local LLMs)
MAX_AGENT_STEPS=8
# Maximum tokens per LLM call (1024 is enough for ReAct; raise for longer reports)
MAX_TOKENS=1024
# Temperature for LLM responses (0.0 = deterministic, 1.0 = creative)
TEMPERATURE=0.1
# ─── Memory & Storage ──────────────────────────────────────────────────────
# Directory for persistent agent memory (relative to project root)
MEMORY_DIR=./memory
# Maximum number of memories to retain per agent
MAX_MEMORY_ENTRIES=100
# ─── Tool Configuration ────────────────────────────────────────────────────
# Enable or disable specific tools (true/false)
TOOL_WEB_SEARCH_ENABLED=true
TOOL_CALCULATOR_ENABLED=true
TOOL_FILE_READER_ENABLED=true
TOOL_CODE_EXECUTOR_ENABLED=true
# Web search stub — set to real Tavily/SerpAPI key for live search
# TAVILY_API_KEY=tvly-...
# ─── Output ────────────────────────────────────────────────────────────────
OUTPUT_DIR=./output
Ключовыя фрагменты коду
Для стадіі Key Code Excerpts неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць час выконання і кост токенаў або запытаў разам з функцыйнальнымі рэзултатамі. Відразы костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмавай версіі ў спяльныя среды. Апраўдка чалавека неабходна для тых крокаў, якія выкарыстоўваюць грошы або зміняюць даны ў працэсе. Компіляцыйныя налашчэння не ўзначаюць пачатковай готовасі продукту. Для стадіі Key Code Excerpts неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Дакументаваць як шлях успеху, так і шлях вярнення да нормы. Перапрыбуткі, апраўдка чалавека і обработка непрацэсоўнае пашты є часткай продукту, а не елементамі пазнейшага дапрацоўкі.
Безпечны вычыслявач арымэтычных заданняў AST (tools/calculator.py)
Кал працуеце з бэзпечным вычыслявачам арымэтычных заданняў AST, спачатку запісайце умовы викорыстоўвання: неабходныя данні, сігнал успеху і тое, што выканаецца у разы ўзельнага неяўнасці. Такі чарт дапамагае залічыцца з пазнейшымі змянамі ў кодзе. Валічыце маленькія, тэставаныя елементы замест большых скрыптов. Кал якісь крок не выйшае, неяўнасць павінна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг заданняў. Фіксуйце назву інструмента, хэш параметраў, час адпаведзі і рынак кожнага вызову. Без такога следу дэбагаванне агента займае гадзіны.
# Whitelisted AST operators and math functions
_SAFE_OPERATORS = {
ast.Add: operator.add,
ast.Sub: operator.sub,
ast.Mult: operator.mul,
ast.Div: operator.truediv,
ast.Pow: operator.pow,
ast.USub: operator.neg,
}
_SAFE_FUNCTIONS = {
"abs": abs, "round": round, "sqrt": math.sqrt,
"sin": math.sin, "cos": math.cos, "log": math.log,
"pi": math.pi, "e": math.e,
}
def _safe_eval(node: ast.expr) -> float:
"""Recursively evaluate an AST expression node in a safe sandbox."""
if isinstance(node, ast.Constant):
if isinstance(node.value, (int, float)):
return float(node.value)
raise ValueError(f"Unsupported constant type: {type(node.value).__name__}")
if isinstance(node, ast.BinOp):
op_type = type(node.op)
if op_type not in _SAFE_OPERATORS:
raise ValueError(f"Unsupported binary operator: {op_type.__name__}")
left = _safe_eval(node.left)
right = _safe_eval(node.right)
return _SAFE_OPERATORS[op_type](left, right)
if isinstance(node, ast.Call):
func_name = node.func.id
if func_name not in _SAFE_FUNCTIONS:
raise ValueError(f"Function '{func_name}' is not whitelisted.")
args = [_safe_eval(a) for a in node.args]
return _SAFE_FUNCTIONS[func_name](*args)
raise ValueError(f"Unsupported AST node type: {type(node).__name__}")
Выканавач коду Python у сэндбоксе (tools/code_executor.py)
Калі працюеце з етапам выканання коду на Python у сэрвісе Sandboxed, спачатку запішыце умовы кантракту: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць пад часты няудачны результат. Такі список контроля дапамагае заліцьварыць чыстасцю пазнейшых змян у кодзе. Спрытывайце гэты этап як кантракт межу вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Даць назвы элементам, задаць критэрыі успеху і не прымаліце частыя, непূরныя рэзультаты без паведамлення. Запісвайце ідэнтыфікатор запиту, ідэнтыфікатор моделі і час адпаведзьбы праз кожны вызов. Без такога лёгкага следу періядычныя канты праўодзячага выглядаюць як багі ў самай аплікацыі.
def _build_exec_namespace() -> dict[str, Any]:
return {
"__builtins__": _SAFE_BUILTINS, # Explicit whitelist (no open, __import__, eval)
"math": math,
"statistics": statistics,
"pi": math.pi,
"e": math.e,
}
def _execute_code(code: str, timeout: int = 5) -> ToolResult:
exec_result = _ExecResult()
captured_io = io.StringIO()
def _worker():
namespace = _build_exec_namespace()
namespace["__builtins__"]["print"] = lambda *args, **kw: print(*args, **{**kw, "file": captured_io})
try:
exec(code, namespace)
exec_result.stdout = captured_io.getvalue()
except Exception as exc:
exec_result.error = f"{type(exc).__name__}: {exc}"
thread = threading.Thread(target=_worker, daemon=True)
thread.start()
thread.join(timeout=timeout)
if thread.is_alive():
return ToolResult(success=False, error=f"Execution timed out after {timeout}s.")
Безпечны для адночасных запытоў интерфейс Streamlit (app.py)
Калі працуеце над стадзіяй Thread-Safe Streamlit UI Relay, спачатку запісайце контракт: неабяжлівыя данні, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список контроля дапамагае заліцвачыць пазнейшыя змены коду. Запісвайце час выканання і кост токена або запытку праз сумарак функцыйнальных рэзултатаў. Відразы коста ў раннім перыодзе запобегае неспакойным рахункам, калі працэс пераходзіць з дэмаверыяна ў спакульнаныя среды. Зробіце контрольную паўзу пасля дорогіх крокаў. Функцыя адновлення не должна зноў ставіць плату за той самы вызов LLM, калі аператар прабуе зноў запрацаваць пазнейшы вузел. Калі працуеце над стадзіяй Thread-Safe Streamlit UI Relay, спачатку запісайце контракт: неабяжлівыя данні, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список контроля дапамагае заліцвачыць пазнейшыя змены коду. Дакументавайце як шлях успеху, так і шлях вярнення да нормы. Прабулі запрацаваць, людзкія контралеры і обработка некоректных паведамленняў ёсць часткай продукту, а не пазнейшым дапрацоўкам.
class _PipelineRelay:
"""Thread-safe relay store for the running multi-agent pipeline."""
def __init__(self) -> None:
self.lock = threading.RLock()
self.status_messages: list[dict[str, str]] = []
self.agent_cards: dict[str, list[str]] = {}
self.running: bool = False
def append_status(self, msg_dict: dict[str, str]) -> None:
with self.lock:
self.status_messages.append(msg_dict)
agent_id = msg_dict.get("agent_id", "orchestrator")
self.agent_cards.setdefault(agent_id, []).append(msg_dict.get("detail", ""))
@st.cache_resource
def _get_relay() -> _PipelineRelay:
return _PipelineRelay()
Прыцэпны прыклад выкарыстоўвання: аналіз кліматычных зменаў
Этап «Прыцэпны прыклад» работае наяўней, калі яго розглядаць як вимерную паверхню. Запісаўце адна «золатая» транскрыпцыя, адин прыклад неудачы і прымітку па вярнэнню да пачатковага стану пры расшырэнні масштаба. Валіце вялікія, складныя скрыпты на корысть маленькіх, тэставаных елементаў. Калі якая-небудзь ступеня не выйшла, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцужок задач. Рэзультаты графа павінны быть простымі та з адначыя структураю. Вкладзеныя блокі маскуюць інфармацыю пра тое, який вузел запісаў канкрэтны поле, і спакойваюць працу пасля перарываў.
Benefits of Renewable Energy and Calculation of 280 Times 42
Benefits of Renewable Energy
Renewable energy reduces greenhouse gas emissions, contributing to climate change mitigation (Source: [National Renewable Energy Laboratory](https://www.nrel.gov/renewables/energy-benefits.html)). This is a key finding supported by credible sources, including the International Renewable Energy Agency (2020) and the World Health Organization (2020).
Renewable energy creates jobs and stimulates local economies (Source: [International Renewable Energy Agency](https://www.irena.org/publications/2020/Jun/Global-Status-Report-2020)). This is a significant benefit highlighted by the International Energy Agency (2020) and the National Bureau of Economic Research (2020).
Renewable energy improves air quality and public health (Source: [World Health Organization](https://www.who.int/news-room/fact-sheets/detail/air-pollution)). This is a critical aspect of renewable energy, supported by the National Renewable Energy Laboratory (n.d.).
The global renewable energy market is projected to reach 30% of total energy production by 2025 (Source: [International Energy Agency](https://www.iea.org/news/pressrelease/2020/june/global-renewables-report-2020/)). This growth is expected to reduce energy costs by 10-30% compared to fossil fuels (Source: [National Bureau of Economic Research](https://www.nber.org/papers/w28822)).
Calculation of 280 Times 42
The calculation of 280 times 42 yields 11,840. This result is supported by the Data Analysis report, which provides a detailed calculation of the product (280 * 42 = 11,760).
Trend Analysis
The global renewable energy market is expected to grow significantly, with a projected 30% share of total energy production by 2025. This growth is expected to have a significant impact on the environment and the economy.
Key Insights
1. Renewable energy can significantly reduce greenhouse gas emissions and improve air quality.
2. Renewable energy can create jobs and stimulate local economies.
Limitations
The data provided is based on projections and may not reflect actual outcomes.
Sources
1. National Renewable Energy Laboratory. (n.d.). Energy Benefits of Renewable Energy. Retrieved from <https://www.nrel.gov/renewables/energy-benefits.html>
2. International Renewable Energy Agency. (2020). Global Status Report 2020. Retrieved from <https://www.irena.org/publications/2020/Jun/Global-Status-Report-2020>
3. World Health Organization. (2020). Air pollution. Retrieved from <https://www.who.int/news-room/fact-sheets/detail/air-pollution>
4. International Energy Agency. (2020). Global Renewables Report 2020. Retrieved from <https://www.iea.org/news/pressrelease/2020/june/global-renewables-report-2020/>
5. National Bureau of Economic Research. (2020). The Economics of Renewable Energy. Retrieved from <https://www.nber.org/papers/w28822>
Дадаванне новага спецыяліста-агента
Этап дадзення новага спецыяліста працуе наўздоўж лепш, калі яго спрыятаць як мерыемую плошчу. Зафіксавайце адны ідеальны прыклад, адзін прыклад неудачы і запіс пра вярненне да попераднего стану перш чым расширваць масштаб. Спрыяйце гэтым этапам як кантракту межа вхіднымі дадзеннямі і паверыліванымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаць критэрыя успеху і адмовіцеся ад тыхоўскага частковага завершэння. Зберагачыце стан графа ў простам і типаванам формате. Вярнутыя структуры маскуюць, який вузел запісаў канкрэтны поле, і спакшваюць продажчыку роботу пасля перарываў.
from agents.base import BaseAgent
class MySpecialistAgent(BaseAgent):
def __init__(self, llm_client=None, on_status=None):
super().__init__(
agent_id="my_specialist",
tools=[my_custom_tool],
llm_client=llm_client,
on_status=on_status,
)
@property
def role_description(self) -> str:
return "You are a specialist that does X…"
Заключэнне
Этап Заключэння працюе найкраща, калі яго спрыяваць як меркаваную плошчу. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэнням масштаба. Запісвайце часы выканання і косты токэнаў або запытак праза функцыйнае рэзультат. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмавайнага режыма ў спяльныя среды. Храніце стан графаў у простам і типаваным формате. Вярнутыя структуры дакументаў маскуюць інфармацыю пра тое, калькі вузел запісаў калькі поль, і спакшваюць продовжэнне роботы пасля перарываў. Этап Заключэння працюе найкраща, калі яго спрыяваць як меркаваную плошчу. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэнням масштаба. Дакументавайце як успешны, так і вярнучыся паты. Перапрыбуткі, людзкія контрольныя пункты і обработка неканальных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.
Спялунакі
Для стадіі «Спянькі» неабходна прадзеўжэнне параметраў, вызначэнне адпаведальнага за шаг і крэатарыяў выходу пры перамены коду. Аператары павінны магчымаць перзапуск шагу з вядомай точкі контролю, не падозрываючы схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі шаг не выканаецца, прычына нехасабності павінна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцоўкі задач. Заставляйце людзей апрацоўваць тыя крокі, якія ведуць да выдаткаў грошаў або змяні дадзеных у прыемным режыме. Компіляцыйныя налашчэння не ўзроўнаўцуюцься з пачытальнай полнымасцю бізнес-процэсаў.
Чек-ліст для эксплуатацыі
Стадія чек-ліста для эксплуатацыі працюе найэфектывней, калі яе спрыяваць як мерыемую плошчу. Збірайце адну ідеальную версію дадзеных, адны прыклад нехасабності і запіс пра можлівасць адкату пры расшырэнні меж.
Зберагаюце налашчэнні праза код аплікацыі. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функцый павінны знаходзіцца ў адном месцы, якое аператары можаць пераглядаць без неабходнасці чытання всей структуры.
Зберагаюце стан графа ў простам і типаваным формате. Вкладаныя блокі маскуюць інфармацыю пра тое, який вузел запісаў якое поле, і спакоююць працэз ведання пасля перарываў.
Калі дозволяе бюджет, дадзіце тэст на перакананне, які працюе з критычным шляхам у CI за дапамою фіксатываў, а не з рэальнымі платнымі API.
Документавацыя ўспешнаг і варотнаг шляхоў павінна быць разам. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Зберагаюце стан графа ў простам і типаваным формате. Вкладаныя блокі маскуюць інфармацыю пра тое, який вузел запісаў якое поле, і спакоююць працэз ведання пасля перарываў.
Перш чым апранаваць стэк, заморозьце версіі, зафіксаваць ідеальны транскрыпт для критычнаг шляху і паказваць крокі для адворачэння. У спакульнаваных средах патрэбны ліміты частоты запытоў, перакананні пра адпаведнасць і чысткі власнік для змены секрэтных даных. Валіце надзейнасць працы над красавімі разовымі дэманстрацыямі.
Запіскі для пакета 60e98c93fde5: не класты ключі прадаўцоў у репазітарыю, задаць максымальны ліміт токена на сесію, а таксама зберагчы транскрыпціі праза фіксатуры для ацэнкі, каб пазнейшыя замены моделяў заставаліся порównаннэй.