Галоўная / Артыкулы

Семнаццаць маленькіх інструментаў MCP заместо адного велікаг агента: сістэма напісання на базе ШЫ.

Як сістэма досліджэння і напісання дзеў’ядзе вхід відэа, пошук, падготовку праекту, крытыку і перакананне коду на наявнасць правіл у межах інструментаў MCP, з вікорыстанням артэфактов і трэйсінгу.

Выдавец: REACTAPP.TOP13 хв чытання2957 слоў

Крыніцы: Why I Built MaxyAI as 17 Small MCP Tools Instead of One Giant Agent

Складна частка агента для напісання тэкста на базе ШЫ — гэта не тое, каб мовны мадэль пісала. Гэта выбір таго, за шта мадэль не павінна несці адпаведная адпаведнасць. Першыя спробы стварэння такіх агентоў зазвычай вылічваюцца ў адну архітэктуру: даецца адна мадэль тэме, прыўязуецца інструмент для пошуку, і ад яе трэба, каб я ў аднай довгай процэсе раследавала, рассуждала, пісала, пераканалася ў правільнасці тэксту і вярнулася да працы пасля памылак. Запіты становяцца все дыявольскімі, стэпіны выканання працы стаюць важкімі для дыбаггінгу, а дэтэрміністычныя памылкі плутаюцца з сэмантычнымі рашэннямі. MaxyAI, сістэма для доследжэння і напісання тэкста на базе ШЫ, выйшла з іншай ідэі: кожная можнасць, якая мае адзінаковыя вхідныя даны, способы памылак, правілы павторнай спробы чы ўзаемна вікорыстоўваны выхід, стае самастоятэльным інструментам за аднім серверам MCP.

Даныя, які прыходзяць, рэдкасцю бываюць апранутыя. Гэта можа быць лекцыя з YouTube, рэпазітарый на GitHub, сторанка дакументацыі і калькі лінкаў-скарынакоў. MaxyAI прыймае ўсё гэта, расшырвае дакледжэнні за дапамогою пошуку ў інтэрнэце, зберагае растучы корпус на дыску і прыдумвае для яго структуру. Потым ён складае матэрыял разам по разам, перадае чэрнавік цыфроваму крытыку, выдэляе кожны блакіт Python, перакананае і запускае код, вылечвае сінтаксічныя памылкі і экспортуе адзін самастоятэльны HTML-стацыянак.

За гэтым няма якога-то велікага прыказу. Сістэма — гэта сервер FastMCP з 17 зарэгістраванымі інструментамі, з якіх 12 прызначаныя для дакледжэння. Інструменты спецыяльна зроблены маленькімі. Одны перапісвае відэа, другі разумее рэпазітарыя, трэці шукае ў інтэрнэце, чатверты стварае структуру, пяты крытыкуе стацыянак, а шосты перакананае код. Модэль выбірае, які інструмент выкорыстаць, а Python, які знаходзіцца ў кожным інструменце, выкананае дэтэрміністычную працу.

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

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

Чаму не адзін большы інструмент? Таму што сістэма рашыяе кальколька разных інжынерных задач, а не адну задачу логічнага выважвання. Кожна з эых задач (прыем відэа, аналіз рэпазітарыяў, пошук у інтэрнэтэ, керуванне станам, стварэнне праектаў, крытыка, запуск коду, карэкцыя, публікацыя) мае свае вхідныя даны, затраты, можлівасці збою і патрэбы ў павторных спробах. Адзін мега-інструмент скорачыў бы запрашэнне, але ускладніў бы адзірванне і пашырэнне сістэмы.

Нічога з гэтага не значыць, што кожны агент патрэбуе 17 інструментоў. Цэта ўзорка дэкомпазіцыі: дзе семантычныя выважвання належаць модэлю, дзе звычны код павінен застацца керуючым, як артыфакты можаць заменіць перадмольны стан дыялогу, і чаму створаны код павінен працэсаваць дэтэрміністычныя перакананні прытым, калі яго бачыць чытальнік.

Выпаняванне ад пачатку да канца

Розглянем тэму вызывання функцыяў LLM і структураваных выходных даных, пачынаючы з набору кераваючых прынцыпаў: адна прымова з YouTube, адна база дадзеных на GitHub і калькі URL-адрэсаў дакументацыі.

Фаза 1 не стварае прозы. Яе задача — збіраць доказы. Сервер MCP выбірае URL-адрэсы, перадае відэа у мультымадальны API Gemini, ператварае базы дадзеных у фармат, зручны для мадэлі, за дапамогою gitingest, скануе сторанкі за дапамогою Firecrawl, запоўняе прасоці шляхом пошуку ў Tavily і ведае ведамасці пра джэрэла ў файлах стану ў каталозе .nova/. Рэзультатам яе работы ёст research.md — вялікі дакумент даследжэння, які кожны можа ачыніць і прачытаць, замест таямнай памяці дыялогу.

Фаза 2 берае той артыкул і плануе яго публікацыю. Функцыя generate_article_outline выдае раздэлы, цілі па колькасці слоў і коду, а draft_article_section пасля таго пішае адзін часткова завершаны разлак на кожны вызов. Далей функцыя critic_evaluate_article оцэнюе цэлы чэрнавік па тэхнічной глыбіне, якасці коду, структуры і точнасці цітатаў, а refine_and_save_article застаўляе неабходныя правкі пры пісьме файлу article.md.

3-я фаза рассматрывае Markdown як тэкст, які павінен выжыць пасля выканання, а не проста выглядаць пераканаюча. Блакіты Python выдэляюцца і аналізуюцца за дапамою ast.parse(). Верныя фрагменты коду зберагаюцца пад падметкам .nova/sandbox/ і запускаюцца з таймаутам у пяць секунд. У разе памылкі сінтаксісу памылка і фрагмент коду адправляюцца у функцыю fix_code_snippets, а рэзультат зноў пераходзіць на праверкі. Калі код праходзіць праверкі, функцыя export_publication_bundle стварае самастоятэльны HTML-документ.

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

Сервер MCP як основа

Першы выбар пры праектаванні быў на рэвэлі протакола: адкрываць можлівасці праз Model Context Protocol і не прыўязываць кожную функцыю безпосерэдна да адной аплікацыйнай петлі.

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

У праекце mcp_server/src/routers/tools.py ёсць входны пункт да шару інструментаў. Спроставаная рэгістрацыя выглядае так:

import opik
from fastmcp import FastMCP

from ..tools import run_web_research_tool

def register_mcp_tools(mcp: FastMCP) -> None:
    @mcp.tool(name="run_web_research")
    @opik.track(type="tool", tags=["research", "tavily"])
    async def run_web_research(
        queries: list[str],
        research_directory: str,
    ) -> dict:
        return await run_web_research_tool(
            queries=queries,
            research_directory=research_directory,
        )

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

Спецыяльна было ухіленае ад вікорыстоўвання аднаго інструмента do_everything(topic), адтолькі ён зноў бы ввёў зв’язок, які праект стаў за мету адмяніць. Меньшыя інструменты дазволяюць модэлю складаць поведэнне: выкарыстоўваць джэрэла, пераканацца, што чагосці не хапя, зноў шукаты, складаць практычны план, прадрафтаваць, аналізаваць, выправляць. Яны таксама робяць лог-даны набагато лёгкімі для чытання, адтолькі кожны перыод часу адпавядае адной значамай дзеянню.

Такім чынам, сервер з 17 інструментамі — гэта не 17 окрэмых запытоў. Гэта сукупнасць абмежаных можлівасцей. На доследжэння прыпадае самая большая частка — 12 інструментоў, адтолькі саме практычнае збіранне джэрэлаў выклікае найбольшую разнаўрознасць у рабочым працэсе.

Доследжэння: разныя джэрэла, разныя інструменты

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

Gemini для YouTube

Апрацоўка довгіх відэа на месца ёсць дорогай: патрэбна загрузка аудыя, пераклад аудыя на тэкст, кантроль памяці GPU, а пасля — стварэнне апісу. Модуль youtube_handler.py выбірае простэйшы падход: ён перадае публічны URL YouTube безпосерэдна да Gemini як мультымадальны вхід і просіць структураваны Markdown з пазначэнням часу.

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

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

@retry(
    retry=retry_if_exception_type(errors.ServerError),
    wait=wait_exponential(multiplier=1, min=5, max=60),
    stop=stop_after_attempt(3),
)
async def transcribe_youtube(url: str, output_path: Path, timestamp: int = 30):
    client = track_genai_client(
        genai.Client(api_key=settings.google_api_key.get_secret_value())
    )

    parts = [
        types.Part(file_data=types.FileData(file_uri=url)),
        types.Part(text=PROMPT_YOUTUBE_TRANSCRIPTION.format(timestamp=timestamp)),
    ]

    response = await client.aio.models.generate_content(
        model=settings.youtube_transcription_model,
        contents=parts,
    )

    output_path.write_text(response.text, encoding="utf-8")

У адзінам засвечаным тэставанні 39-хвілінны лекцыя была ператворана ў структураваныя нотаткі за 17,8 секунды без выкарыстоўвання памяці GPU на стороне кліента. гэта быў спостарожаны тэст, а не універсальны показнік, адколі навантажэння на сервера і стан сеткі можа яго змяніць. Запісаныя даны паказалі ідэнтыфікатор мадэлі gemini-3.7-flash і захаваны файл .nova/guidelines_filenames.json як артыфакт стану.

gitingest для рэпазітарыяў

Рэпазітарый — гэта не веб-сторанка. Мадэлі трэба структура файлаў і самы ісходны код, а не навігацыйныя элементы GitHub, таму працоўнік GitHub выкарыстоўвае gitingest для стварэння структураванага апісу рэпазітарыя, прыемлемага для LLM.

Парадыграматычная верыфікацыя AST — гэта адзінэцкая прыблытка. Гіт-інструменты толькі запоўнююць сістэму, супляючы модэлю доследжэння карточку каталога і змест кантэкстаў файлаў, тады калі парсер AST у Python працюе значна пазней, калі працэс публікацыі перагляда генераваны код. Спалучэнне гэтых двух падходаў ускладніла б архітэктуру.

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

Tavily і Firecrawl разам

Гэтыя два інструмента рашаюць разныя аспекты веб-доследжэння. Tavily дапамагае у пошуку, ператвараючы запытанне „Што я ўсё ўтрачыў?“ у набор цярпячых запытанняў. Firecrawl дапамагае пасля таго, як сервер выбраў конкрэтную стораніцу і хоча паветлі выкарыстаць ўсё ўсё зместа з яе.

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

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

Файлы ў .nova/ замест адной вялікай розмовы

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

У замену сістэма запісвае маленькія файлы кантролю пад .nova/, такія як guidelines_filenames.json і next_queries.json, а большыя даныя зберагаецца ў файлах у фармаце artifacts, напрыклад research.md. Модэль отрымае толькі тыя даныя, якія неабходны для тэкушчай операцыі.

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

Автар — гэта канвейер

Калі ужо існуе research.md, выступае явным спакусам падаць цэй весь файл у велікія модэлі і запрашваць статыю дыяў 2 000 слоў. Праект ужо з самага пачатку ухіляўся ад гэтага, таму што ліміты выходу і адзінакавасць да дзялёгог кантэксту ускладнююць адночасна кантролюваць структуру, паверхню коду і цітаты.

У замяну фаза напісання дзеліць задачу між чатырма інструментамі:

  • generate_article_outline ператварае корпус даследжэнняў у спіс раздэлаў з планамі колькасці слоў і цілямі паверхні коду.
  • draft_article_section пішчыць часткавыя раздэлы замест адной вялікай статыі.
  • critic_evaluate_article ацэнюе саставленыя чэрнавікі па структураванай шкале з 0 да 100.
  • refine_and_save_article выконвае неабяжлівыя правкі, стварае спіс зместу, пераканальвае структуру цітатаў і зберагае article.md.

Важна тое, каб крытык не проста сказаў "выглядае добра". Яго рэзультат — структураваныя адзывы, на якія можа адразу працаваць іншы інструмент:

{
 "overall_score": 85,
 "status": "APPROVED",
 "category_scores": {
 "technical_depth": 27,
 "code_quality": 26,
 "structure_clarity": 17,
 "citation_fidelity": 15
 },
 "specific_critiques": [
 "Section 3.2 mentions timeout handling but omits the asyncio.wait_for example.",
 "Citation [14] is cited twice with conflicting author names."
 ],
 "required_revisions": [
 "Add the timeout example.",
 "Deduplicate bibliography reference [14]."
 ]
}

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

Рэйтынг 85 з 100 — гэта не научны паказнік якосці. Гэта сігнал кантролю рабочага процэсу, а цэнным ёсць крытык і спіс парадактыкак, чытальныя для машыны.

Следы рэальнага літаратурнага ланцоўка паказваюць структураваны запіт, вызов чат-модэлю і парсер Pydantic — такія запісы дапамагаюць зрозумець автонамны процэс напісання пасля таго, як ён завершыўся.

Код як выконвальны артыфакт

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

Распрацоўшчык ачыяе article.md, выявляе тамтэчны Python-код, пераканальвае кожны блакат пры помцы ast.parse(), зберагае пераканальваны фрагменты ў .nova/sandbox/, запускае іх як дзеціны працэс, адбіраючы выходны і памятны стандартныя потокі, і дазваляе пры неудачах прабавіцца знову за дапамой інструмента для рэмонту з ШЫ.

Статычная пераканальванне і выкананне выявляюць разныя проблемы. ast.parse() ўжоць дэшавы і адразу адхоўляе некарэктны Python-код. Дзеціны працэс выявляе бяговыя бяды, якія немагчыма пазначыць толькі за сінтаксам.

def validate_python_syntax(code: str):
 try:
 ast.parse(code)
 return True, None
 except SyntaxError as exc:
 return False, f"SyntaxError at line {exc.lineno}: {exc.msg}"
result = subprocess.run(
 [sys.executable, str(file_path)],
 capture_output=True,
 text=True,
 timeout=5,
 env={"PYTHONUNBUFFERED": "1"},
)

Неякісны фрагменты коду вылечваюцца і зноў падаюцца на перакананне пра правільнасць прытымкі статты. У аднам з случаў створаная артыкул мела pip install google-genai унутры блока Python. У фармаце Markdown гэта выглядала правдападобна, але Python адразу ж адхіліў гэты код. Функцыя fix_code_snippets прымела апіс падзеі і неякісны блок, перапісала фрагмент коду і падалаяла яго знову на перакананне пра правільнасць.

# Broken
pip install google-genai
from google import genai

# Repaired
# Requires: pip install google-genai
import os
from google import genai

client = genai.Client(
    api_key=os.environ.get("GEMINI_API_KEY", "mock-key")
)

Цыкл рэмантавання намеравана застаецца локальным. Модэлю не разрашаецца перапісваць весь артыкул толькі таму, што адзін фрагмент не выканаў сваю задачу. Ёй даецца самая малая корыстная елемента — код і яго адказ, а дэтэрміністычныя перакананні застаюцца бар’ерам.

Проста кажучы: article.md скануецца на наявнасць Python-кода, кожны фрагмент парсуецца, ствараецца пад .nova/sandbox/ і выкананы ў обмежаным дзецячым процэсе. У разе адказу код і трэйсбек пакуецца для fix_code_snippets, а запропанае рэмантаванне зноў праходзіць па той жа пацеку пераканання. Модэль ніколі не затварае сваее сопраўдзенне. LLM пропануе, а ast.parse() плюс выкананне вынікаюць рашэнне. Толькі калі цыкл завершыцца, export_publication_bundle ператварае апрацаваны артыкул у самастоятэльны HTML-выход.

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

Два спільныя слоі: маршрутызацыя модэляў і трэйсінг

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

Маршрутызацыя модэляў з урахоўваннем квот

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

Праект развіваўся на аднойчынцы з мадэлямі Gemini Flash, Gemini Flash Lite і Llama, якія розмішчуюцься на серверах Groq. Шэрыя з гэтых модэляў не ёсць постаційнымі, але гэта не мае значэння. Кожны інструмент вяршыць вясноўленні з абстракцыяй модэля, пры чым у кодзе для даследжэнняў і напісання не ёсць включаныя дэталі прафесараў.

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

def get_chat_model(model_id: str, schema=None):
    selected = settings.llm_configs[model_id]
    identifier = selected["identifier"]
    params = selected.get("params", {}).copy()

    # resolve provider-specific API key
    ...

    model = init_chat_model(identifier, **params)
    return track_langchain_model(model)

Opik дапамагае пераглядаць дзейнасці працы

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

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

Што праект научыць пра праектаванне агентаў

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

Тачкі расшырэння лёгкая адзначыць. Прыёмнік PDF дае першай фазе іншы тып джэрэла. Замена Tavily не вплывае на рэчыпісцаўца. У трэцюю фазу можна дадаць паўнерчэнне на JavaScript, а механізм доследжэння застаецца незмянным. Змена прадаўцоў модэляў не паўтарае структуру MCP.

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

Тры інжынерныя урокі можна застосаваць і ў іншых сістэмах агентаў:

  1. Межы інструментаў важлівей, чым ўжо існуючая колькасць інструментаў. Надаюце кожнай можлівасці сваю сабственную межу, калі яна прабівае да іншай сістэмы, выкананне яе можа збыцца нявялікім або яе трэба перапрыцягнуць, або якшо яна стварае рэзультат, які хтось будзе вярнуць у практыку.
  2. Мадэлі прымушчаюць працаваць, а дэтэрміністычныя перапыткі вырашаюць, калі гэта можліва. LLM можа выправіць частаку коду, але фінальны выбор здзейсніваецца пасля парсінгу і выканання.
  • Інформацыя пра тое, што можна пераглядаць, лепшая, чым нечыярые адзначэнні пра „памяць“. Зберажаныя рэзультаты даследжэння, кантрольныя файлы і следы дапамагаюць эфектывна дэбагаваць длігія запускі і дазволяюць перазапускаць адзінныя фазы без неабяжнага стварэння вялікага історыя чату.