Галоўная / Артыкулы / Практычныя прытамулкі: Створыце свой сабе Claude Code за дапамою Langchin: Дэтальны аналіз

Практычныя прытамулкі: Створыце свой сабе Claude Code за дапамою Langchin: Дэтальны аналіз

Практычныя прыказкі: Как створыць савой Claude Code за дапамою Langchin: Дзеянне ў глыбі — кантракты, перакрыцчы і слоты для коду для команд, якія викорыстоўваюць гэты патэрн.

3402 слоў

У гэтым карыце парадоксу перадстаўляецца шлях ад сыр'ёчных матэрыялаў да рабочай системы для: Стварэнне савага Claude Code за дапамогою Langchin: Дзеярлівы аналіз Deep Agents у LangChain. Акцэнт ставяецца на практычныя крокі, чыстае перакананне і код, які можна проста дадаць у репазітарый без неабясненых спадчыных параметраў. У стадзіі агульнага відгледу неабходна з'явіць вхідныя даны, адпаведальнага за крок і критэрыя завершэння прычымоўкі перад зменай коду. Аператары должны магчымае перадзначыць крок з вядомай точкі контролю без неабясненняя скрытых станоў. Конфігурацыю трэба залічыць праза код аплікацыі. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функцияў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць без неабяснення цэлай структуры.

Архітектура агента для програмавання

Калі працуеце над «Архітектурой стэджа», спачатку запісайце умовы працы: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцьварыць пазнейшыя змены ў кодзе. Документавайце як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных паведамленняў є частью самага продукту, а не пазнейшыми допанавамі. Стварайце контрольныя пункты пасля дорогіх крокаў. Програма не должна занова ставіць плату за той самы вызыв LLM, калі аператар перапрыбуе пазнейшы вузел.

Частка 0: Цікл з нуля — без фрэймворкаў, без чараў

Калі працуеце над часткаю 0 «Этап ціклу», спачатку запісайце умовы працы: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список контроля дапамагае заліцвачваць змяны коду пазнейша. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына невыпання павінна вказываць на адзін конкрэтны элемент, а не на заплутаны ланцюг задач. Зробіце пераконтроль пасля дорогіх крокаў. Програма не павінна зноў стягваць плата за той самы вызов LLM, калі аператар прабуе зноў выконаць пазнейшы элемент.

def run_agent_loop(client, user_message, tools, tool_functions, max_turns=20):
    messages = [{"role": "user", "content": user_message}]
    for _ in range(max_turns):
        # 1. Ask the model what to do next.
        response = client.messages.create(
            model="claude-sonnet-4-6", max_tokens=1024, tools=tools, messages=messages
        )
        messages = [*messages, {"role": "assistant", "content": response.content}]

        # 2. Plain text and no tool request? The job is done.
        tool_uses = [b for b in response.content if b.type == "tool_use"]
        if not tool_uses:
            return "".join(b.text for b in response.content if b.type == "text")
        # 3. Run each requested tool and hand the results back. 4. Repeat.
        results = [
            {"type": "tool_result", "tool_use_id": call.id,
             "content": tool_functions[call.name](**call.input)}
            for call in tool_uses
        ]
        messages = [*messages, {"role": "user", "content": results}]
    raise RuntimeError(f"agent loop did not finish within {max_turns} turns")

Частка 1: Цікл — двайнер, який керуе всім

Калі працуеце над часткаю 1, стадзіяй «Цикл», спачатку запісайце контракт: неабяжлівыя вхідныя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Спрэчвайце гэтую стадзію як контракт межа вхіднымі данымі і перакананымі выходнымі данымі. Дайце назвы элементам, задаце правіла пераканання успеху і не падзволяйце частковаму завершэнню без паведамлення. Зробіце перапытку пасля дорогіх крокаў. Програма не должна зноў ставіць плату за той самы вызов LLM, калі аператар праказвае пазнейшы вузел. Калі працуеце над часткаю 1, стадзіяй «Цикл», спачатку запісайце контракт: неабяжлівыя вхідныя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Зберагачыце настройкі параду ўнутры коду прыемлівай программы. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функций должны знаходзіцца ў аднам месцы, куда аператары можуць аудытаваць іх, не чытаючы весь граф.

pip install deepagents langchain-anthropic
from deepagents import create_deep_agent

def get_weather(city: str) -> str:
    """Get the weather for a given city."""
    return f"It's always sunny in {city}!"
agent = create_deep_agent(
    model="anthropic:claude-sonnet-4-6",
    tools=[get_weather],
    system_prompt="You are a helpful assistant.",
)
result = agent.invoke(
    {"messages": [{"role": "user", "content": "What's the weather in San Francisco?"}]}
)

Частка 2: Адыянты — які даюць агенту можлівасці

Этап «Адыянты» працюе найэфективней, калі яго розглядаць як меравальную плошчу. Перш чым расширваць масштаб, зафіксавайце адны ідеальны прымер работы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану. Дакументавайце як шлях успеху, так і шлях вярнэння. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць частью продукту, а не пасляднім дапрацоўкам. Адкрыйце адыянты з вузкімі схемамі і чысткімі пазначэннямі парадоксальных наследкав. Хостам неабходна знаты, якія вызовы меняюць стан, перш чым яны автаматычна схваляюць іх.

Чаму проста не дазволіць модэлю выканаць будзь-які каманд?

Усё будзе лепша, якшто розглядаць стадію як вимерную паверхню. Зафіксавайце адны ідеальны прыклад, адну справу з неудачай і прыметку пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Задаўце ліміт токенав на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.

Стварэнне з адпаведнымі агентамі

Этап «Building it with Deep» працюе найкраща, калі яго розглядаць як вимерную паверхню. Зафіксавце адны ідеальны прыклад, адну справу з бягамі та прыметку па вярнэнню да пачатковага стану пры расшырэнні масштаба. Разглядзайце гэты этап як кантракт межа вхіднымі даннымі та пераканаленымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху та адмовіцеся ад мовчанкавага частковага завершэння. Храніце стан графа ў простаму та типаванаму формате. Вкладзеныя блокі маскуюць інфармацыю пра тое, який вузел запісаў які поле, і спакшуюць возз'яданне пасля перарываў. Этап «Building it with Deep» працюе найкраща, калі яго розглядаць як вимерную паверхню. Зафіксавце адны ідеальны прыклад, адну справу з бягамі та прыметку па вярнэнню да пачатковага стану пры расшырэнні масштаба. Храніце настройкі паза кодам прыемліка. Файлы сяродавішча, хранальнікі секрэтных данных та флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць без неабяжнага чытання всего графа.

import subprocess
from langchain_core.tools import tool

MAX_OUTPUT_CHARS = 20_000  # roughly 5k tokens
@tool
def run_tests(path: str = ".") -> str:
    """Run the project's pytest suite and return its output.
    Output is truncated to the last 20k characters (failures appear at the
    end). The run is killed after 5 minutes.
    """
    try:
        result = subprocess.run(["pytest", path], capture_output=True,
                                text=True, check=False, timeout=300)
    except subprocess.TimeoutExpired:
        return "pytest timed out after 300s"
    output = result.stdout + result.stderr
    if len(output) > MAX_OUTPUT_CHARS:
        return ("[... output truncated to the last 20,000 characters ...]\n"
                + output[-MAX_OUTPUT_CHARS:])
    return output
agent = create_deep_agent(
    model="anthropic:claude-sonnet-4-6",
    tools=[run_tests],            # merged in alongside the built-ins
    system_prompt="You are a coding assistant. Always run tests after editing.",
)

Частка 3: Планаванне — размышленні пры перад тым, як дзеяць

У стадії планавання часткі 3 неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры зміне коду. Аперацыйныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкіе перакрыцця і обробка некоректных паведамленняў є частью продукту, а не яго пазнейшай дапрацоўкі. Неабяжна атрымаць людзкую згоду для тых крокоў, якія выкарыстоўваюць грошы або зміняюць даны праўдзівай роботы. Працэс кампілявання не є эквівалентным повнай бізнес-готовасці.

Частка 4: Кантэкстнае адарожненне — праявленне меры памяці

У стадії керування контекстам часткі 4 неабяцо практычна вказаць інпуты, адміністратара крока і крэтыяры выходу пры зміне коду. Аператары павінны магчымаць перзапуск крока з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшаў, прычына нехаспекі павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес. Неабяцо працаваць з апраўданнем чалавека ў тых моментах, калі выконваюцца витраты або зміняюцыся даныя для працы. Компіляцыйны падключэння не ўзначае повнасці бізнес-процэсу.

Стварэнне з адпаведнымі агентамі

Для стадії «Стварэнне з Deep» неабяжнае падзець апрацаваць параметры вхідных дадзеных, адпраўніка крока і крэтарыя выходу пры перадзеі коду. Аператары должны магчыма было перзапускаць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра заштынены стан. Спрыяйце цій стадіі як даговору межаў вхідных дадзеных і перакананых выходных рэзультатаў. Даць назвы артыфактам, апрацаваць перакананні пра успех і не падтрымваць тыхя частковых завершэнняў. Заставіць людзкую апрацоўку для тых крокаў, якія выкарыстоўваюць грошы чы зміняюць даны для працы. Компіляцыйны падключэння не ўзроўнаўваецца з пачатковай цэласнасцю бізнес-процэсаў. Для стадіі «Стварэнне з Deep» неабяжнае падзець апрацаваць параметры вхідных дадзеных, адпраўніка крока і крэтарыя выходу пры перадзеі коду. Аператары должны магчыма было перзапускаць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра заштынены стан. Зберагчы канфігурацыю параду ад коду прыкладнення. Файлы сераўіса, хранальнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаючы весь ланцуг задач.

Частка 5: Падзелчыкі — дзеліце і павярнуце

Калі працюеце над этапам дзелення на падзелчыкіў у Частцы 5, спачатку запісайце контракт: неабходныя даны, сігнал успеху і тое, што выканаецца у разе частковай нявыполненасці. Такі список контроля дапамагае залічваць змяны ў кодзе чыста. Документавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є частью продукту, а не наступным этапам дорабкі. Стварайце контрольныя пункты пасля дорогіх крокаў. Програма не должна занова выклікаць той самы календар LLM, калі аператар перапрыбуе пазнейшы вузел.

code_searcher = {
    "name": "code-searcher",
    "description": "Searches the codebase to find where specific logic lives. "
                   "Use this for any open-ended 'where is X?' question.",
    # ⚠️ NOTE: the key is `system_prompt`, NOT `prompt` (see correction below).
    "system_prompt": "You are an expert at navigating codebases. Use the grep "
                     "and glob tools to locate relevant files, then report a "
                     "concise summary of what you found and where. Do not make "
                     "any edits.",
}

agent = create_deep_agent(
    model="anthropic:claude-sonnet-4-6",
    tools=[run_tests],
    system_prompt="You are a coding assistant.",
    subagents=[code_searcher],
)

Частка 6: Безпека і участка чалавека — гальмы

Калі працуеце над часткай 6 «Безпека» і ўсіма етапамі, спачатку запішыце умовы контракту: неабяжныя даны, сігнал успеху і тое, што выходзіць пад частковым абяканнем. Такі список пераконтроўкаў дапамагае заліцвачыць змяны ў кодзе. Валічыце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок абякае, прычына абякання павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцужок задач. Робіце пераконтроўку пасля дорогіх крокаў. Програма не павінна зноў стягваць плата за той самы вызов LLM, калі аператар праканае выконанне наступнага вузла.

Стварэнне з Deep Agents

Калі працуеце на стадыі «Стварэнне з Deep», спачатку запісайце контракт: неабяжлівыя даннэ, сигнал успеху і тое, што выканаецца у разы ўзельнага неякшэння. Такі чарткі спамагаець залічыць пазнейшыя змены ў кодзе чыстымі. Спрыймайце гэтую стадыю як контракт межа даннэмі і перакананымі выходамі. Дайце назву рэзультатам, задаць тэсты на успех і не прабывайце прыймаць часткова завершаныя рэзультаты без паведамлення. Зробіце перапаконтрацыю пасля дорогіх крокаў. Програма не должна зноў выклікаць той самы календар LLM, калі аператар прабуе зноў запрацаваць пазнейшы ўзел. Калі працуеце на стадыі «Стварэнне з Deep», спачатку запісайце контракт: неабяжлівыя даннэ, сигнал успеху і тое, што выканаецца у разы ўзельнага неякшэння. Такі чарткі спамагаець залічыць пазнейшыя змены ў кодзе чыстымі. Зберагаце канфігурацыю паза кодам прыемленае. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функций должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць без неабяжлівага чытання всей структуры.

from deepagents import create_deep_agent
# Import path for backends can vary by version - check the current
# "Backends" page in the Deep Agents docs.
from deepagents.backends import LocalShellBackend

agent = create_deep_agent(
    model="anthropic:claude-sonnet-4-6",
    system_prompt="You are a coding assistant working inside this project.",
    backend=LocalShellBackend(),   # enables the `execute` shell tool
)
from langgraph.types import Command

result = agent.invoke({"messages": [...]}, config)
result["__interrupt__"]   # the pending action + allowed decisions — show your user

# You decide; the loop picks up exactly where it paused:
agent.invoke(Command(resume={"decisions": [{"type": "approve"}]}), config)
# ... or {"type": "reject"} — the tool is never run, and the model is told so.

Частка 7: Памяць і стабільна працэса — запам’ятовыванне межы сесіямі

Частка 7 «Памяць і стабільна працэса» работае найкраща, калі яе розглядаць як меркаваную структуру. Запісаце адна ідеальная версія, адзін прыклад неудачы і прыметкі па поверненню да попярэдньяго стану пры розширэнні масштаба. Дакументавайце як успешны, так і варыянты відновлення працэсу разам. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є частью продукту, а не наступным етапам дорабатка. Зберагаюце стан графа ў простам і типаваным формате. Вкладзеныя блокі маскуюць інфармацыю пра тое, який вузел запісаў канкрэтны поле, і спакоююць працэс пасля перарываў.

Створэнне з агентамі Deep Agents

Конструкцыя, створаная з апрантам Deep stage, працюе найкраща, калі яе розглядаць як вимерную паверхню. Запісаўце адна «золатая» транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да поперадньага стану пры расшырэнні масштаба. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Рэзультаты роботы графа павінны быць простымі та з адначыя типамі дадзеных. Вкладаныя структуры дадзеных маскуюць інфармацыю пра тое, який вузел запісаў кожны поле, і спакоююць працу пасля перерываў.

from deepagents import create_deep_agent
from langgraph.checkpoint.memory import InMemorySaver

agent = create_deep_agent(
    model="anthropic:claude-sonnet-4-6",
    tools=[run_tests],
    system_prompt="You are a coding assistant.",
    checkpointer=InMemorySaver(),   # remembers state within a session
)
# A "thread_id" ties messages together into one ongoing conversation.
config = {"configurable": {"thread_id": "project-alpha"}}
agent.invoke(
    {"messages": [{"role": "user", "content": "Start refactoring the auth module."}]},
    config=config,
)
# Later, same thread_id - the agent remembers the earlier turn:
agent.invoke(
    {"messages": [{"role": "user", "content": "Now update the tests too."}]},
    config=config,
)

Аб’еднанне всього

Этап «Адгулярэння всего разам» працюе найкраща, калі яго спрыяваць як меравальную паверхню. Зберагчыце адны ідеальны прыклад, адну справу з бягам і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштаб. Спрыявайце гэты этап як кантракт межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад тыхоўскага частковага завершэння. Храніце стан графа ў простам і типаваным формате. Вярнутыя структуры маскуюць, який вузел запісаў канкрэтны поле, і спакшваюць продажчыку роботу пасля перарываў. Этап «Адгулярэння всего разам» працюе найкраща, калі яго спрыяваць як меравальную паверхню. Зберагчыце адны ідеальны прыклад, адну справу з бягам і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштаб. Храніце настройкі за межамі коду прыемлівача. Файлы сяродавішча, хранальнікі секрэтных данных і флагі функций павінны знаходзіцца ў адном месцы, якое аператары можаць пераглядаць без неабяжнага чытання всего графа.

from deepagents import create_deep_agent
from deepagents.backends import LocalShellBackend
from langchain_core.tools import tool
from langgraph.checkpoint.memory import InMemorySaver

# --- A custom tool (Part 2) — token-budgeted, see Part 2 for the full body ---
@tool
def run_tests(path: str = ".") -> str:
    """Run the project's pytest suite and return its (truncated) output."""
    import subprocess
    try:
        result = subprocess.run(["pytest", path], capture_output=True,
                                text=True, check=False, timeout=300)
    except subprocess.TimeoutExpired:
        return "pytest timed out after 300s"
    output = result.stdout + result.stderr
    return output if len(output) <= 20_000 else "[... truncated ...]\n" + output[-20_000:]

# --- A specialized subagent (Part 5) — note the `system_prompt` key ---
code_searcher = {
    "name": "code-searcher",
    "description": "Finds where specific logic lives in the codebase. "
                   "Use for open-ended 'where is X?' questions.",
    "system_prompt": "You navigate codebases using grep and glob, then report a "
                     "concise summary of what you found. You never make edits.",
}

# --- A system prompt that teaches good behavior (Parts 2 & 3) ---
SYSTEM_PROMPT = """You are a careful coding assistant.
Workflow:
1. Plan the task as a to-do list before doing anything.
2. Use your built-in read, grep, and glob tools to explore - never the raw shell
   equivalents like cat or grep.
3. Make focused edits.
4. ALWAYS run the tests after editing, and fix anything that breaks.
5. Delegate broad codebase searches to the code-searcher subagent.
"""

# --- Assemble the agent (Parts 1, 4, 6, 7 handled by the harness) ---
agent = create_deep_agent(
    model="anthropic:claude-sonnet-4-6",                  # Part 1: the loop, model-agnostic
    tools=[run_tests],                                     # Part 2: custom hands
    system_prompt=SYSTEM_PROMPT,                           # Parts 2 & 3: behavior + planning
    subagents=[code_searcher],                             # Part 5: delegation
    backend=LocalShellBackend(root_dir=".", virtual_mode=False),  # Part 6: shell access
    interrupt_on={"execute": True,                         # Part 6: the brakes —
                  "write_file": True, "edit_file": True},  #   approval before anything destructive
    checkpointer=InMemorySaver(),                          # Part 7: memory across turns
)
# Part 4 (context management) and built-in planning come on automatically.

config = {"configurable": {"thread_id": "my-project"}}
result = agent.invoke(
    {"messages": [{"role": "user", "content": "The login tests are failing. Fix them."}]},
    config=config,
)
print(result["messages"][-1].content)

Чыстая частка: што лёгкае, а шта складнае

Ёсць чыста правда: перш чым зменіць код, неабяжна визначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыямі неабяжна маты можласць парадзейсці крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкія перакрыцці і обробка некоректных паведамленняў є частью продукту, а не чымсь, што дадаецца пазней. Неабяжна прыняць рашэнне чалавека ў тых випадках, калі гэта выклікае витраты грошаў або змянюе даны ў працэсе виробніцтва. Працэс складання коду не є гарантіяй полнай адпаведнасці продукту бізнес-трэбованням.

Заключныя заўважэнні

У фазе завершэння неабяжна практычна вызначыць параметры вводу, адпавядающага за крок і критэрыі завершэння пры перадзеяванні коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выконваецца, прычына нехарактернага рэзультата должна вказываць на адну конкрэтную адпавядачнасць, а не на заплутаны ланцоўкі задач. Заставляйце людзей апрацоўваць тыя крокі, якія ведуць да выдаткаў грошаў або змін у продакцыйных данных. Компіляцыйнае падключэнне не ўзроўнавалася з повнасцю бізнес-процэсаў.

Чек-ліст для эксплуатацыі

Фаза чек-ліста для эксплуатацыі працюе наякша, калі яе спрыямаць як мерыемую плошчу. Збірайце адну ідеальную версію рэзультата, адны прыклад нехарактернага рэзультата і прыметкі па адвярнэнню змян пры расшырэнні масштаба. Запісвайце часы виконання і косты токеноў або запытавань разам з функцыйнымі рэзультатамі. Відразлівасць костаў з самага пачатку запобегае неспадзяваным выкладкам, калі процес пераходзіць з дэмовай среды ў спяльныя сераўеры.

Зберагаюце стан графа ў простам і типаваным формате. Вкладаныя блобы маскуюць інфармацію пра тое, який вузел запісаў якое поле, і спакошуюць продовжэнне роботы пасля перерываў.

Калі дозволяе бюджет, дадзіце тэст на перакананне, які працюе над критычным шляхам у CI з викорыстаннем фіксатываў, а не рэальных платных API.

Конфігурацыю трэба зберагаць паза кодам прыкладнай програмы. Файлы сераўнавання, хранільнікі секрэтных данных і флагі функцыяй должны знаходзіцца ў аднам месцы, куда аператары можуць аудытуваць іх без неабяжнага чытання всего графа.

Зберагаюце стан графа ў простам і типаваным формате. Вкладаныя блобы маскуюць інфармацію пра тое, який вузел запісаў якое поле, і спакошуюць продовжэнне роботы пасля перерываў.

Перш чым апранаваць стак, заморозьце версіі, зафіксуйце ідеальны транскрыпт для критычнага шляху і паказваце крокі для атрыбутавання. У спакульнаваных сераўнаваннях неабходны ліміты швайнасці, перакананні ў прыналежнасці і чыстае вялоўнік для змены секрэтных данных. Валіце надзвычайную надзяйнасць працоўнікаў працоўнікам, а не крэатыўныя разовыя дэманстраціі.

Запіска параграфу 9ef98d98a69a: не трэба кантрацеўваць ключы прадаўцаў у репазітарыі, задаць максімальную кантроль на токены за сесыю, а таксама зберагчы транскрыпціі праза фіксатуры адлічэння, каб пазнейшыя замены моделей заставалі пораўнанневымі.

Для запіскі параграфу 0 пра зміцнэнне: перад зменай коду неабходна адзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыёныя працавнікі должны магчымае перадзваначыць крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест аб’емных скрыптов. Калі крок не выйшоў, прычына неудачы должна адносіцца да адной конкрэтнай адпаведальнасці, а не да заплутанага ланца задач.

Дзялянка зміцнэння 0/891: памерыце час выканання, класію адзінакоў і выкарыстаныя токены для гэтай запіскі, а пасля вырашыце, чы робіць змяну на адной фіксаванай сэтцы пытанняў, а не на адной лічбе прыкладаў.

Калі працуеце над першым этапам зміцнення, спачатку запісайте умовы кантракту: неабяцковыя даны, сігнал успеху і тое, што выходзіць пад частковыя неудачы. Такі список дапамагае заліцварваць будучыя змены коду. Празначайце час выканання задачі, а таксама вартасць токена чыў запиту празрачна ўжо на стадіі функцыональных рэзультатаў. Відразліва візуалізацыя вартасцей запобегае неспакойным рахункам, калі процес пераходзіць з дэмовай среды ў спакульнаныя сераўы.

Дзеянне зміцнення 1/891: вымерайце час выканання, класыя ошибакі і вартасць викорыстоўвання токена для гэтага пункту, а потым выберыце, чы хацеце застаўіць змену на адной фіксаванай сэтке пытанняў, а не на адной лічбе прыкладаў.

Этап зміцнення 2 працюе лепш, калі яго спрыямаць як мерымабельную паверхню. Запісайце адны ідеальны прыклад роботы, адзін кейс неудачы і прыказку па аброце перад расшырэнням масштаба. Дакументавайце як успішны, так і вярнучыся парадоксы. Перапрыбуткі, людзкія контралі і обработка неканальных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.

Дзеянні паўжасткі 2/891: звярніце увагу на час выканання, клас памылак і колькасць викорыстоўваных токенав для гэтага зьязку, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы хацяце застаўіць гэтыя змены.