Галоўная / Артыкулы / Практычныя прытамкі: агенты, інструменты та навыки для працюючага міні-падрадчыка AI

Практычныя прытамкі: агенты, інструменты та навыки для працюючага міні-падрадчыка AI

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

3544 слоў

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

Што такое інструменты, навыкі і агенты?

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

get_current_conditions
get_forecast
get_alerts
get_historical_weather
get_air_quality
get_marine_conditions
get_river_conditions
get_wildfire_info
search_location
check_service_status
Temperature = Celsius, Fahrenheit, Kelvin

Length / Distance = Inches, Feet, Yards, Miles, Millimeters, Centimeters, Meters, Kilometers

Mass / Weight = Ounces, Pounds, Stone, Grams, Kilograms, Metric Tons

Volume / Capacity = Fluid Ounces, Cups, Pints, Quarts, Gallons, Milliliters, Liters, Cubic Meters

Area =  Square Feet, Square Meters, Acres, Hectares

Speed =  Miles per Hour (mph), Kilometers per Hour (km/h), Knots, Meters per Second (m/s)

Time Zones =  UTC/GMT offsets, Daylight Saving Time (DST) transitions, Unix timestamps to human-readable dates

Storage =  Bytes, Kilobytes (KB), Megabytes (MB), Gigabytes (GB), Terabytes (TB)

Эксперыментавація з прыкладным кодам.

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

Шаг 1 — Імпортуйце неабяжлівыя бібліятэкі

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

import re
import os
import getpass
import requests

Шаг 2 — Створыць інструмент калькулятора

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

def calculator_tool(prompt: str) -> str:
    print("    [Tool 1: Calculator] scanning prompt for dollar amounts...")
    dollar_amounts = re.findall(r'\$\s?(\d+(?:\.\d{1,2})?)', prompt)

    if not dollar_amounts:
        result = "no dollar amounts found"
        print(f"    [Tool 1: Calculator] {result}")
        return result

    values = [float(a) for a in dollar_amounts]
    total = sum(values)
    breakdown = " + ".join(f"${v:g}" for v in values)
    result = f"{breakdown} = ${total:.2f}"
    print(f"    [Tool 1: Calculator] found {len(values)} amount(s) {values} -> {result}")
    return result

Шаг 3 — Створыць інструмент перакладчыка единайц

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

UNIT_ALIASES = {
    "kilometers": "km", "kilometer": "km", "km": "km",
    "mile": "miles", "miles": "miles",
    "m": "meters", "meter": "meters", "meters": "meters",
    "ft": "feet", "foot": "feet", "feet": "feet",
}

DISTANCE_TO_MILES = {"km": 0.621371, "miles": 1.0, "meters": 0.000621371, "feet": 0.000189394}

def unit_converter_tool(prompt: str) -> str:
    print("    [Tool 2: Unit Converter] scanning prompt for distance legs...")
    legs = re.findall(r'(\d+(?:\.\d+)?)\s*(kilometers?|km|miles?|meters?|feet|ft)\b',
                       prompt, re.IGNORECASE)

    if not legs:
        result = "no distances found"
        print(f"    [Tool 2: Unit Converter] {result}")
        return result

    total_miles = 0.0
    breakdown = []
    for value, unit in legs:
        value = float(value)
        unit_norm = UNIT_ALIASES.get(unit.lower(), unit.lower())
        total_miles += value * DISTANCE_TO_MILES.get(unit_norm, 1.0)
        breakdown.append(f"{value:g} {unit_norm}")
    result = f"{' + '.join(breakdown)} = {round(total_miles, 2)} miles total"
    print(f"    [Tool 2: Unit Converter] found {len(legs)} leg(s) -> {result}")
    return result

Шаг 4 — Стварыць навык падсумоўвання

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

def summarizer_skill(text: str, max_sentences: int = 2) -> str:
    print("    [Skill: Summarizer] scanning message for key sentence(s)...")
    sentences = [s for s in re.split(r'(?<=[.!?])\s+', text.strip()) if s]

    if len(sentences) <= max_sentences:
        print(f"    [Skill: Summarizer] only {len(sentences)} sentence(s) -- returning as-is")
        return text.strip()

    stopwords = {"the","a","an","is","are","was","were","in","on","at","to","of","and",
                 "or","for","it","this","that","i","you","he","she","they","we","really"}
    words = re.findall(r'\b\w+\b', text.lower())
    freq = {}
    for w in words:
        if w not in stopwords:
            freq[w] = freq.get(w, 0) + 1

    scored = []
    for idx, sentence in enumerate(sentences):
        s_words = re.findall(r'\b\w+\b', sentence.lower())
        score = sum(freq.get(w, 0) for w in s_words)
        scored.append((score, idx, sentence))

    top = sorted(scored, key=lambda x: x[0], reverse=True)[:max_sentences]
    top_in_order = sorted(top, key=lambda x: x[1])
    summary = " ".join(s for _, _, s in top_in_order)
    print(f"    [Skill: Summarizer] kept {len(top_in_order)} of {len(sentences)} sentence(s) -> {summary}")
    return summary

Крок 5 — З’яўіцца ў звязку з вашым LLM

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

GROQ_API_KEY = os.environ.get("GROQ_API_KEY") or getpass.getpass(
    "Enter your free Groq API key (from https://console.groq.com/keys), "
    "or press Enter to skip: "
)

GROQ_MODEL = "openai/gpt-oss-20b"
GROQ_ENDPOINT = "https://api.groq.com/openai/v1/chat/completions"

def call_llm(augmented_prompt: str,
             system_prompt: str = "You are a helpful, concise assistant.") -> str:
    if not GROQ_API_KEY:
        return ("[No LLM reply -- no Groq API key was provided. Get a free one at "
                 "https://console.groq.com/keys, then re-run the setup cell above.]\n"
                 f"Here is the augmented prompt that would have been sent:\n\"\"\"\n{augmented_prompt}\n\"\"\"")
    try:
        response = requests.post(
            GROQ_ENDPOINT,
            headers={
                "Content-Type": "application/json",
                "Authorization": f"Bearer {GROQ_API_KEY}",
            },
            json={
                "model": GROQ_MODEL,
                "messages": [
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": augmented_prompt},
                ],
                "temperature": 0.7,
                "max_tokens": 400,
            },
            timeout=30,
        )
        response.raise_for_status()
        data = response.json()
        return data["choices"][0]["message"]["content"].strip()
    except requests.exceptions.RequestException as e:
        return f"[LLM request failed -- {e}]"
    except (KeyError, IndexError, ValueError):
        return "[LLM returned an unexpected response format.]"

print("LLM configured." if GROQ_API_KEY else "No key entered -- running in fallback mode.")

Крок 6 — Стварыце сваіх агентоў

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

def show_step(step_num: int, label: str, content: str) -> None:
    """Small helper so every agent prints its pipeline the same, readable way."""
    print(f"\n  STEP {step_num} - {label}:")
    for line in str(content).splitlines() or [""]:
        print(f"    {line}")


def trip_planner_agent(prompt: str) -> str:
    """Agent 1. Condition: 2+ dollar costs AND 2+ distances -- a multi-stop itinerary."""
    print("[Router] -> Agent 1: Trip Planner Agent activated (detected an itinerary: multiple costs + multiple distances)")
    show_step(1, "Original prompt", prompt)

    cost_result = calculator_tool(prompt)
    show_step(2, "Tool result (Calculator -- total cost)", cost_result)

    distance_result = unit_converter_tool(prompt)
    show_step(3, "Tool result (Unit Converter -- total distance)", distance_result)

    augmented_prompt = (
        f"The user asked: \"{prompt}\"\n\n"
        f"A calculator tool already computed the total cost: {cost_result}\n"
        f"A distance tool already computed the total distance traveled: {distance_result}\n\n"
        "Using those two verified totals (don't redo either calculation yourself), give the "
        "user a short, friendly trip summary that reports both totals clearly."
    )
    show_step(4, "Prompt has changed -- now the augmented prompt sent to the LLM", augmented_prompt)

    reply = call_llm(augmented_prompt)
    show_step(5, "Final response from Groq", reply)

    return f"🧳 Agent 1: Trip Planner Agent:\n{reply}"


def text_agent(prompt: str) -> str:
    """Agent 2. Condition: default for any prompt, OR chained after Agent 1
    when the itinerary prompt also has an extra narrative sentence."""
    print("[Router] -> Agent 2: Text Analysis Agent activated")
    show_step(1, "Original prompt", prompt)

    summary = summarizer_skill(prompt)
    show_step(2, "Skill result (Summarizer)", summary)

    augmented_prompt = (
        f"The user wrote: \"{prompt}\"\n\n"
        f"Automatic summary of their message: {summary}\n\n"
        "Write a short, thoughtful, natural-sounding reply to the user that responds "
        "to what they actually said, informed by (but not just repeating) this summary."
    )
    show_step(3, "Prompt has changed -- now the augmented prompt sent to the LLM", augmented_prompt)

    reply = call_llm(augmented_prompt)
    show_step(4, "Final response from Groq", reply)

    return f"📝 Agent 2: Text Analysis Agent:\n{reply}"

7-й крок — Направленне да правильнага агента

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

def looks_like_itinerary(prompt: str) -> bool:
    dollar_amounts = re.findall(r'\$\s?\d+(?:\.\d{1,2})?', prompt)
    distance_legs = re.findall(r'\d+(?:\.\d+)?\s*(?:kilometers?|km|miles?|meters?|feet|ft)\b',
                                prompt, re.IGNORECASE)
    return len(dollar_amounts) >= 2 and len(distance_legs) >= 2

def has_extra_narrative(prompt: str) -> bool:
    sentences = [s for s in re.split(r'(?<=[.!?])\s+', prompt.strip()) if s]
    extra = [
        s for s in sentences
        if "quot; not in s
        and not re.search(r'\b(?:miles?|km|kilometers?|feet|ft)\b', s, re.IGNORECASE)
        and not s.strip().endswith("?")
    ]
    return len(extra) >= 1

def route_prompt(prompt: str) -> str:
    if looks_like_itinerary(prompt):
        reply = trip_planner_agent(prompt)
        if has_extra_narrative(prompt):
            print("[Router] -> also routing to Agent 2: Text Analysis Agent (extra narrative sentence detected)")
            reply += "\n\n" + text_agent(prompt)
        return reply
    else:
        return text_agent(prompt)

Шаг 8 — Апробава вашых рэзультатаў

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

prompt = input("Ask me anything: ")

print("=" * 60)
print(f"PROMPT: {prompt}")
print("=" * 60)
final_answer = route_prompt(prompt)
print(f"\n  >>> RETURNED: {final_answer}")
print("-" * 60 + "\n")

Розумеўце логіку.

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

Шаг 1 — Направленне да агента

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

Крок 2 — Агент планавальніка паўтарыць вызовы своих інструментаў

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

3-й крок — Выклікайце інструмент калькулятора

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

Этап 4 — Выклік інструмента перакладчыка единайц

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

Этап 5 — Стварыць апошню версію запросу

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

Крок 6 — Адправіць рэзультаты ў GROQ

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

Этап 7 — Выкарыстоўванне text_agent

Для этапу «Шаг 7: Использаць textagent» неабяжна прадзефінавацыя вхідных дадзеных, адпраўніка шагу і крэтарыявання для завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчымае перзапускаць шаг з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы заместо велікіх скрыптав. Калі шаг не выйшоў, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцоўкі задач. Автентыфікуйцеся на входзе і паўторна автарызуйцеся на роўні дадзеных. Толькі токэн-носіцель не є межай адпаведальнасці. Для этапу «Шаг 7: Использаць textagent» неабяжна прадзефінавацыя вхідных дадзеных, адпраўніка шагу і крэтарыявання для завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчымае перзапускаць шаг з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісвайце час выконання і кост токэна або запыту разам з функцыйнымі рэзультатамі. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмовай среды ў спакульнаныя сераўы.

Крок 8 — Адаптаваць навык падсумоввання

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

Крок 9 — Зноў адправіць рэзультаты ў GROQ

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

Аргументы за викорыстоўванне агентаў, навыкаў і інструментаў.

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

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

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

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

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

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

Напісайце кароткі посібнік: як роцыяваць канты, як спрабаваць апустошыць чергу, як вярнуцца да пачатковага стану пасля апошней інтеграцыі.

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

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

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