Галоўная / Артыкулы / Практычныя нарады: Апгрэйдавайце ваш Deep Agent за дапамою локальнага сандбокса на адкрытым кодам.

Практычныя нарады: Апгрэйдавайце ваш Deep Agent за дапамою локальнага сандбокса на адкрытым кодам.

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

3190 слоў

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

Што такое песочніца і чаму агентам яна неабходная

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

Адзінакавасць

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

Увайдзіце в OpenSandbox

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

Тачка расшырэння для сандбокса Deep Agents

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

class BaseSandbox(ABC):
    def execute(self, command: str, *, timeout: int | None = None) -> ExecuteResponse: ...
    @property
    def id(self) -> str: ...
    def upload_files(self, files: list[tuple[str, bytes]]) -> list[FileUploadResponse]: ...
    def download_files(self, paths: list[str]) -> list[FileDownloadResponse]: ...

Стварэнне інтеграцыі

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

Як працюе OpenSandbox?

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

# Generate a starter config
uvx opensandbox-server init-config ~/.sandbox.toml --example docker

# Start the server
uvx opensandbox-server

Спроставаны код інтеграціі

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

.create()

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

class MinimalOpenSandboxBackend(BaseSandbox):
    def __init__(self, sandbox: Sandbox, runner: AsyncRunner):
        self._sandbox = sandbox
        self._runner = runner
from opensandbox import Sandbox
from opensandbox.config import ConnectionConfig

IMAGE = "opensandbox/code-interpreter:v1.1.0"
ENTRYPOINT = ["/opt/code-interpreter/code-interpreter.sh"]

@classmethod
def create(cls, api_key: str | None = None) -> "MinimalOpenSandboxBackend":
    runner = AsyncRunner()
    config = ConnectionConfig(domain="localhost:8080", api_key=api_key)
    sandbox = runner.run(
        Sandbox.create(IMAGE, entrypoint=ENTRYPOINT, connection_config=config, timeout=timedelta(minutes=30))
    )
    return cls(sandbox, runner)

.id()

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

@property
def id(self) -> str:
    return self._sandbox.id

.execute()

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

from deepagents.backends.protocol import ExecuteResponse

def execute(self, command: str, *, timeout: int | None = None) -> ExecuteResponse:
    execution = self._runner.run(self._sandbox.commands.run(command))
    stdout = "\n".join(c.text for c in execution.logs.stdout)
    stderr = "\n".join(c.text for c in execution.logs.stderr)
    output = "\n".join(p for p in (stdout, stderr) if p)
    return ExecuteResponse(output=output, exit_code=execution.exit_code or 0)

.upload_files()

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

from opensandbox.models import WriteEntry
from deepagents.backends.protocol import FileUploadResponse

def upload_files(self, files: list[tuple[str, bytes]]) -> list[FileUploadResponse]:
    entries = [WriteEntry(path=path, data=data, mode=644) for path, data in files]
    try:
        self._runner.run(self._sandbox.files.write_files(entries))
        return [FileUploadResponse(path=p) for p, _ in files]
    except Exception as exc:
        return [FileUploadResponse(path=p, error=str(exc)) for p, _ in files]

.download_files()

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

from deepagents.backends.protocol import FileDownloadResponse

def download_files(self, paths: list[str]) -> list[FileDownloadResponse]:
    results = []
    for path in paths:
        try:
            content = self._runner.run(self._sandbox.files.read_bytes(path))
            results.append(FileDownloadResponse(path=path, content=content))
        except Exception as exc:
            results.append(FileDownloadResponse(path=path, error=str(exc)))
    return results

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

.kill()

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

def kill(self) -> None:
    self._runner.run(self._sandbox.kill())
    self._runner.shutdown()

Мост сінхронна/асынхронная робота

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

Агент для аналізу дадзэнняў у сандбоксе

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

import asyncio
import nest_asyncio
import threading
from datetime import timedelta
from pathlib import Path

from deepagents import create_deep_agent
from deepagents.backends.protocol import ExecuteResponse, FileDownloadResponse, FileUploadResponse
from deepagents.backends.sandbox import BaseSandbox
from langchain.chat_models import init_chat_model

from opensandbox import Sandbox
from opensandbox.config import ConnectionConfig
from opensandbox.models import WriteEntry

# nest_asyncio for running async functions in Jupyter.
nest_asyncio.apply()

IMAGE = "opensandbox/code-interpreter:v1.1.0"
ENTRYPOINT = ["/opt/code-interpreter/code-interpreter.sh"]

backend = MinimalOpenSandboxBackend.create(api_key="SANDBOX_API_KEY")
print("Sandbox ready:", backend.id)
llm = init_chat_model(
    model="gemini-3.5-flash",
    model_provider="google_genai",
    api_key=os.environ["GOOGLE_API_KEY"],
    max_tokens=14750,
    max_retries=5,
)
agent = create_deep_agent(
    model=llm,
    system_prompt=(
        "You are a Python coding assistant with sandbox access. "
        "You specialize in performing data analysis and data visualization with python,"
        "you generate clear reports with good looking charts using seaborn."
    ),
    backend=backend,
)
csv_bytes = Path("customers-1000.csv").read_bytes()
results = backend.upload_files([("/workspace/customers-1000.csv", csv_bytes)])
for r in results:
    if r.error:
        print(f"Upload failed for {r.path}: {r.error}")
    else:
        print(f"Uploaded {r.path}")
result = agent.invoke({
    "messages": "Perform a deep exploratory data analysis on the customers-1000.csv file "
                "and summarize the findings in a markdown report with clear charts."
})
# Deep Exploratory Data Analysis: Customer Acquisition and Profiling
**Dataset:** `customers-1000.csv`
**Analysis Period:** Jan 2020 – May 2022

---

## 1. Executive Summary

This report presents a comprehensive exploratory data analysis (EDA) of a customer database containing 1,000 unique records. The analysis delves into geographical distributions, sign-up temporal trends, domain & technical alignments, and name demographics to uncover actionable insights for strategic growth.

### Key Takeaways
1. **Unprecedented Global Reach:** The customer base is extraordinarily decentralized, spanning **240 countries** across all **7 continents** (including Antarctica). No single country represents more than 1.2% of the customer base. Africa (24.7%) and Asia (22.6%) are the leading regions, followed by Europe (18.5%) and North America (16.1%).
2. **Stable Acquisition Trends:** Customer subscriptions are remarkably stable, averaging roughly **34-35 new customers per month** across 2020 and 2021. This consistency is maintained across all continents year-over-year, indicating a highly standardized, globally distributed customer acquisition channel.
3. **Mid-Week and Weekend Consistency:** Subscriptions are evenly spread across the days of the week, with a minor peak on Friday and Saturday, and a minor trough on Thursday.
4. **B2B / Synthetic Profile Characteristics:** The dataset shows zero domain overlap between customer email domains and company websites (0.0% exact match across 923 unique domains). Combined with the near 1-to-1 ratio of customers to companies, this suggests a highly B2B-centric profile (one representative per enterprise) or synthetically generated profiles with randomized fields.
5. **Standardized TLD Footprint:** The `.com` top-level domain (TLD) dominates both emails (61.2%) and corporate websites (58.8%). The remaining distribution is evenly split among `.org`, `.net`, `.biz`, and `.info`.

---

## 2. Dataset Structure & Data Integrity

The initial dataset contains **1,000 rows** and **12 columns**. An inspection of data integrity reveals excellent completeness:
- **Zero Missing Values:** Every column is 100% populated.
- **Zero Duplicates:** There are no duplicate rows, and the `Customer Id` column contains 1,000 unique identifiers.
- **Data Types:** All columns are stored as object/string types except for `Index` (integer).

### Data Preprocessing & Feature Engineering
To enable deep exploratory analysis, several features were engineered:
1. **Temporal Features:** `Subscription Date` was parsed as a datetime object, allowing the extraction of `Sub_Year`, `Sub_Month`, `Sub_Month_Name`, `Sub_Day_of_Week`, and `Sub_Year_Month` (period).
2. **Geographical Mapping:** Using the `pycountry` and `pycountry-convert` libraries, coupled with a manual fallback dictionary for territories, each of the 240 countries was successfully mapped to its respective **Continent**.
3. **Domain & Technical Profiles:** Email domains (`Email_Domain`), email TLDs (`Email_TLD`), and website TLDs (`Website_TLD`) were extracted to analyze the technical profiling of users.

---

## 3. Geographical Analysis

### Continent-Level Distribution
The geographic reach of this customer base is truly global. Rather than being concentrated in a single dominant market like North America or Europe, customers are spread across all continents:

| Continent | Customer Count | Percentage |
| :--- | :---: | :---: |
| **Africa** | 247 | 24.7% |
| **Asia** | 226 | 22.6% |
| **Europe** | 185 | 18.5% |
| **North America** | 161 | 16.1% |
| **Oceania** | 107 | 10.7% |
| **South America** | 54 | 5.4% |
| **Antarctica** | 20 | 2.0% |

#### Chart 1: Customer Distribution by Continent
![Customer Distribution by Continent](downloads/customer_by_continent.png)

### Country-Level Distribution (Top 15 Countries)
The country-level distribution exhibits a heavy tail, with the 1,000 customers distributed across **240 distinct nations**. This indicates that the average number of customers per country is only **4.17**.

The top countries by customer density are:
- **Liechtenstein:** 12 customers (1.2%)
- **Gabon:** 10 customers (1.0%)
- **China, Bangladesh, Reunion, Nigeria, Luxembourg:** 9 customers each (0.9%)

This extreme dispersion suggests a borderless, digital-first product that appeals universally across jurisdictions without localized geographic bias.

#### Chart 2: Top 15 Countries by Customer Count
![Top 15 Countries by Customer Count](downloads/top_15_countries.png)

---

## 4. Temporal Analysis (Subscription Trends)

... (Trimmed to keep blog (estimated read time short))

З ноутбука да пакета PyPi

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

!pip install deepagents-opensandbox-backend

Пагляньце

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

Чэк-ліст для практычнай перাচালনы

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

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

Пауза пасля дорогіх крокаў. Функцыя аднова не павинна занова нарахоўваць плата за той самы вызыв LLM, калі аператар праказвае спробу на пазнейшый вузел.

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

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

Пауза пасля дорогіх крокаў. Функцыя аднова не павинна занова нарахоўваць плата за той самы вызыв LLM, калі аператар праказвае спробу на пазнейшый вузел.

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

Запіска параграфу для 43662eb4f13d: не кластыць ключы прадаўцаў у репазітары, задаць максымальную кантэнцыю токена на сесію і зберагчы транскрыпціі праза фіксатуры адлічэння, ўпынку калі будзе трэба зменіць модель, ўсё застаецца порównаным.

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

Дзеянне пра зміцнэнне 0/814: вымерыце час выканання, класію памылак і витрату токенаў для гэтай запіскі, а потым выявіце, чы хацеце застаўці змену на адной пазначанай сэткі пытанняў, а не на адной лягендзе.