Codex үйлестіруіне арналған ашық бастапқы кодты сипаттама: Symphony
Авторлары: Алекс Котлярский, Виктор Чжу және Зак Брок
Алты ай бұрын өнімділікті арттыруға арналған ішкі құралмен жұмыс істеп жатқанда, командамыз сол уақытта даулы болып көрінген шешім қабылдады: репозиторийімізді адам жазған кодсыз құрастырамыз. Біздің жоба репозиторийіміздегі әрбір жол Codex арқылы жасалуы керек болды.
Мұны іске асыру үшін біз инженерлік жұмыс процесімізді түбегейлі қайта құрдық. Біз агенттерге ыңғайлы репозиторий құрдық, автоматтандырылған тесттер мен қауіпсіздік шектеулеріне қомақты инвестиция салдық және Codex-ті толыққанды команда мүшесі ретінде қарастырдық. Біз бұл жолды алдыңғы инженерлік жұмыстар туралы блог жазбамызда құжаттадық.
Бұл жұмыс істеді, бірақ кейін біз келесі кедергіге тап болдық контекст ауыстыру.
Осы жаңа мәселені шешу үшін біз Symphony деп аталатын жүйе құрдық. Symphony(жаңа терезеде ашылады) Linear сияқты жобаларды басқару тақтасын кодтау агенттері үшін басқару жазықтығына айналдыратын агент оркестраторы. Әрбір ашық тапсырмаға агент тағайындалады, агенттер үздіксіз жұмыс істейді, ал адамдар нәтижелерді қарап шығады.
Бұл жазба Symphony қалай жасалғанын—кейбір командаларда pull request саны 500 пайызға артқанының себебін—және оны өзіңіздің мәселелерді бақылау жүйеңізді үнемі жұмыс істейтін агенттерді басқаратын құралға айналдыру үшін қалай пайдалануға болатынын түсіндіреді.
Интерактивті кодтау агенттерінің шегі
Қолдану оңайырақ болып келе жатса да, бағдарламалау агенттері—оларға веб-қолданбалар немесе командалық жол интерфейсі (CLI) арқылы қол жеткізілетініне қарамастан—әлі де интерактивті құралдар болып табылады.
OpenAI-да агенттік жұмыстың ауқымы артқан сайын, біз жаңа жүктемені байқадық. Әр инженер бірнеше Codex сессиясын ашып, тапсырмалар тағайындап, нәтижені қарап шығып, агентті бағыттап, осы әрекеттерді қайталайтын. Іс жүзінде, адамдардың көпшілігі контекст ауыстыру қиындық тудыра бастағанға дейін бір уақытта үштен беске дейінгі сессияны қиналмай басқара алатын. Одан кейін өнімділік төмендеді. Біз қай сессияның не істеп жатқанын ұмытып қалып, агенттерді қайта дұрыс бағытқа салу үшін терминалдар арасында ауысып, орта жолда тұрып қалған ұзақ орындалатын тапсырмалардың қателерін түзететінбіз.
Агенттер жылдам жұмыс істеді, бірақ бізде жүйелік кедергі болды: адамның назары. Біз іс жүзінде өте қабілетті бастапқы деңгейдегі инженерлер командасын құрып, содан кейін адам инженерлерімізді оларды ұсақ-түйегіне дейін қадағалап басқаруға тағайындаған едік. Бұл масштабталуға келмейтін еді.
Көзқарастың өзгеруі
Біз дұрыс емес нәрсені оңтайландырып жүргенімізді түсіндік. Біз жүйемізді код жазу сеанстары мен біріктірілген PR-лардың айналасында бағдарлап келдік, бірақ PR-лар мен сеанстар шын мәнінде түпкі мақсатқа жетудің құралы ғана. Бағдарламалық жасақтама жұмыс процестері көбіне нәтижелердің айналасында ұйымдастырылады: мәселелер, тапсырмалар, тикеттер, кезеңдер.
Сондықтан біз агенттерді тікелей қадағалауды тоқтатып, оның орнына олар жұмысты тапсырмалар тізімінен өздері алатын болса, не болар еді деп ойладық.
Бұл идея Symphony-ге айналды агенттік жұмысты оркестрациялау үшін қадағалаушы ретінде қызмет ететін жазбаша спецификация.
Мәселелерді бақылау құралын агент оркестраторына айналдыру
Symphony қарапайым тұжырымдамадан басталды: кез келген ашық тапсырманы агент қолға алып, аяқтауы керек. Codex сеанстарын бірнеше қойындыда басқарудың орнына, біз мәселе трекерімізді басқару жазықтығына айналдырдық.
Бұл конфигурацияда әрбір ашық Linear мәселесі агенттің арнайы жұмыс кеңістігіне сәйкестендіріледі. Symphony тапсырмалар тақтасын үздіксіз бақылап, әрбір белсенді тапсырма аяқталғанға дейін оның орындау циклінде жұмыс істейтін агенті болуын қамтамасыз етеді. Егер агент істен шықса немесе тұрып қалса, Symphony оны қайта іске қосады. Жаңа жұмыс пайда болса, Symphony оны қолға алып, жұмысты ұйымдастыруды бастайды.
Біз жұмыс процесімізді тикет мәртебелеріне сүйене отырып, Linear тапсырмалар менеджерін күй машинасы ретінде пайдаланып құрдық.
Іс жүзінде Symphony жұмысты сессиялардан және pull request-терден ажыратады. Кейбір мәселелер бірнеше репозиторий бойынша бірнеше PR-ға әкеледі; ал басқалары код базасына мүлде өзгеріс енгізбейтін таза зерттеу немесе талдау болып табылады.
Жұмыс осылай абстракцияланғаннан кейін, тикеттер әлдеқайда ауқымды жұмыс бірліктерін білдіре алады.
Біз Symphony-ді күрделі мүмкіндіктер мен инфрақұрылымдық миграцияларды үйлестіру үшін тұрақты түрде пайдаланамыз. Мысалы, агенттен кодтық базаны, Slack-ті немесе Notion-ды талдап, іске асыру жоспарын дайындауды сұрайтын тапсырма тіркеуіміз мүмкін. Жоспарға көңіліміз толғаннан кейін, агент жұмысты кезеңдерге бөліп, тапсырмалар арасындағы тәуелділіктерді анықтай отырып, тапсырмалар ағашын жасайды.
Агенттер тек бұғатталмаған тапсырмалармен жұмыс істеуді бастайды, сондықтан осы DAG үшін орындау табиғи әрі оңтайлы түрде параллель өрбиді (орындау қадамдарының тізбегі). Мысалы, біз React жаңартуын Vite-ке көшуге байланысты бұғатталған деп белгіледік. Күтілгендей, агенттер React-ті жаңартуды Vite-ке көшіру аяқталғаннан кейін ғана бастады.
Агенттер жұмысты өздері де жасай алады. Енгізу немесе тексеру барысында олар ағымдағы тапсырманың аясына кірмейтін жақсартуларды жиі байқайды: өнімділік мәселесі, рефакторинг жасау мүмкіндігі немесе жақсырақ архитектура. Мұндай жағдай болғанда, олар біз кейінірек бағалап, жоспарға енгізе алатын жаңа мәселені жай ғана тіркейді—осы кейінгі тапсырмалардың көбін агенттер де қолға алады. Біз бұл процесті қадағалап отырғанда, агенттер жүйелі жұмыс істеп, жұмысты алға жылжыта береді.
Бұл жұмыс істеу тәсілі анық емес жұмысты бастаудың когнитивтік жүктемесін айтарлықтай азайтады. Егер агент бірдеңені қате жасаса, бұл бәрібір пайдалы ақпарат, ал біз үшін шығыны нөлге жуық. Біз агент Go прототип жасап, зерттеу жүргізуі үшін тикеттерді өте аз шығынмен аша аламыз және ұнамаған кез келген зерттеулерді тастай аламыз.
Оркестратор devbox-тарда жұмыс істеп, ешқашан ұйықтамайтындықтан, біз кез келген жерден тапсырмаларды қоса аламыз және оларды агент қабылдайтынына сенімді бола аламыз. Мысалы, біздің командадағы бір инженер нашар wifi бар жайлы үйшікте отырып, телефонындағы Linear қолданбасынан үш елеулі өзгеріс енгізді.
Осылай жұмыс істеу нәтижесінде зерттеу белсенділігінің артуы
Symphony-мен жұмыс істеудің әсерін бақылағанда, ең айқын өзгеріс шығарылатын нәтижеде байқалды. OpenAI-дегі кейбір командаларда алғашқы үш аптада енгізілген PR санының 500%-ға артқанын байқадық. OpenAI-ден тысқары, Linear негізін қалаушы Карри Сааринен біз Symphony-ді шығарған кезде жасалған жұмыс кеңістіктері санының күрт өсуін(жаңа терезеде ашылады) атап өтті. Алайда бұдан да терең өзгеріс командалардың жұмысқа деген көзқарасында жатыр.
Біздің инженерлер Codex сессияларын қадағалауға уақыт жұмсамайтын кезде, кодқа өзгерістер енгізудің экономикасы толығымен өзгереді. Әрбір өзгерістің қабылданатын құны төмендейді, өйткені біз енді енгізудің өзін жүргізуге адам күшін жұмсамаймыз.
Бұл біздің мінез-құлқымызды өзгертті. Symphony-де спекулятивті тапсырмаларды жедел іске қосу қазір өте оңай. Идеяны сынап көріңіз, рефакторингті зерттеңіз, гипотезаны тексеріңіз және тек перспективалы болып көрінетін нәтижелерді ғана сақтаңыз.
Бұл сондай-ақ жұмысты бастай алатын адамдар аясын кеңейтеді. Біздің өнім менеджеріміз бен дизайнеріміз енді мүмкіндік сұрауларын Symphony жүйесіне тікелей жібере алады. Оларға репозиторийді шығарып алу немесе Codex сеансын басқару қажет емес. Олар мүмкіндікті сипаттайды да, нақты өнім ішінде мүмкіндіктің қалай жұмыс істейтінін көрсететін бейне шолу қамтылған шолу пакетін алады.
Symphony сондай-ақ PR-ды енгізудің соңғы кезеңі баяу әрі тұрақсыз болатын үлкен монорепозиторийлерде (мысалы, OpenAI-дегі бізде бар репозиторий сияқты) ерекше тиімді. Жүйе CI-ді бақылайды, қажет болғанда rebase орындайды, қайшылықтарды шешеді, тұрақсыз тексерулерді қайта іске қосады және жалпы өзгерістерді пайплайн арқылы сүйемелдейді. Тикет біріктіру кезеңіне жеткен кезде, өзгерістің адамның тұрақты бақылауынсыз негізгі тармаққа енгізілетініне сеніміміз жоғары.
Symphony енгізгеннен кейін біз көбірек жұмысты агенттерге жүктеп, күрделірек әрі зерттеушілік сипаттағы тапсырмаларға назар аударамыз.
Ілгерілеу өзімен бірге жаңа әрі өзгеше мәселелерді ала келеді
Бұл деңгейде жұмыс істеу кейбір ымыраларға әкеледі. Агенттерді интерактивті түрде бағыттаудан тикет деңгейінде жұмыс тағайындауға көшкенде, біз жұмыс барысында үнемі бағыт беріп, қажет болғанда түзету мүмкіндігінен айырылдық. Кейде агент күткен нәтижеден мүлде алшақ нәрсе жасап шығарды. Бұл пайдалы болды—сол істен шығулар жүйедегі олқылықтарды ашып, оны тұрақтырақ етуге көмектесті.
Нәтижені қолмен түзетудің орнына, біз агенттердің келесі жолы сәтті жұмыс істеуі үшін қорғаныс тетіктері мен дағдылар қостық. Уақыт өте келе, бұл біздің harness жүйемізге соңынан соңына дейінгі тесттерді іске қосу, қолданбаны Chrome DevTools арқылы басқару және QA smoke тесттерін басқару сияқты жаңа мүмкіндіктерді қосуға әкелді. Біз құжаттамамызды айтарлықтай жақсартып, жақсы нәтижеге қалай қол жеткізуге болатынын нақтыладық.
Әр тапсырма Symphony жұмыс стиліне сай келе бермейді. Кейбір мәселелер әлі де инженерлердің интерактивті Codex сеанстарымен тікелей жұмыс істеуін талап етеді, әсіресе анық емес мәселелер немесе салмақты пайым мен сараптаманы қажет ететін жұмыстар. Іс жүзінде, әдетте, бұлар инженерлеріміз үшін уақытын арнауға ең қызықты әрі жағымды тапсырмалар.
Айырмашылығы Symphony күнделікті енгізу жұмысының басым бөлігін атқара алады. Бұл инженерлерге ұсақ тапсырмалар арасында үнемі контекст ауыстырудың орнына, бір уақытта бір күрделі мәселеге назар аударуға мүмкіндік береді.
Сондай-ақ агенттерді күй машинасындағы қатаң түйіндер ретінде қарастырудың жақсы жұмыс істемейтінін білдік. Модельдер ақылдырақ бола түседі және біз оларды сыйғызуға тырысатын қалыптан да анағұрлым ауқымды мәселелерді шеше алады. Агенттік жұмыстың алғашқы нұсқаларымызда біз Codex-тен тапсырманы іске асыруды ғана сұрайтынбыз. Бұл тәсіл тым шектеулі болып шықты. Codex бірнеше PR жасауға, сондай-ақ шолу бойынша кері байланысты оқып, оны ескеруге толықтай қабілетті. Сондықтан біз оған құралдар—gh CLI, CI журналдарын оқуға арналған дағдылар және т.б.—бердік, енді Codex-тен көбірек нәрсе істеуді сұрай аламыз, мысалы, ескі PRs жабу немесе аяқталған және аяқсыз қалған жұмыстар туралы есептер алу. Мұндай тапсырмалар бастапқы мүмкіндікті іске асыру аясынан әлдеқайда тыс болды.
Сондықтан біз ақырында агенттерге қатаң өтулердің орнына мақсаттар беруге көштік, бұл жақсы менеджердің өз командасындағы тікелей бағынышты қызметкерге мақсат қоюына ұқсайды. Модельдердің қуаты олардың ой қорыту қабілетінде, сондықтан оларға құралдар мен контекст беріп, еркін жұмыс істеуіне мүмкіндік жасаңыз.
Symphony-ді құру үшін Symphony-ді пайдалану
Сіз Symphony репозиторийін(жаңа терезеде ашылады) ашқанда, ең алдымен байқайтыныңыз—Symphony техникалық тұрғыдан тек SPEC.md файлы болып табылады, яғни мәселенің және көзделген шешімнің анықтамасы. Күрделі қадағалау жүйесін құрудың орнына, біз мәселені және көзделген шешімдерді анықтап, агенттерге жоғары деңгейлі бағыт-бағдар беруді таңдадық.
Эталондық іске асыру Elixir тілінде жазылған, өйткені код іс жүзінде тегін болғанда, тілдерді олардың мықты тұстарына қарай, мысалы, Elixir-дің қатар орындау мүмкіндіктері үшін таңдай аласыз. Бірақ негізгі идеяны қарапайым Markdown құжатында баяндауға болады. Таңдаулы кодтау агентіңізге спецификацияны көрсетіп, оның өз нұсқасын іске асыруын ұсынамыз.
Symphony-дің алғашқы нұсқасы tmux ішінде жұмыс істейтін, Linear-ды кезең-кезеңімен тексеріп, жаңа тапсырмалар үшін қосалқы агенттерді іске қосатын Codex сеансы ғана болатын. Ол жұмыс істеді, бірақ аса сенімді болмады. Екінші нұсқа агенттерді ескере отырып жасалған негізгі жобамыздың репозиторийінде орналасқан еді. Біз осы репозиторийде жоғары сапалы жұмыс істеуі үшін агенттерге қажетті дағдылар мен контекст беретін агенттерге арналған құралдар жиынтығын әлдеқашан жасап қойғанбыз, сондықтан Symphony оның бәрін жай ғана біріктіреді.
Негізгі функционал дайын болғаннан кейін, біз Symphony бағдарламасын құру үшін оны қолдандық.
Тапсырмаларды басқаруға және орындалған жұмыстың дәлелі ретінде бейнежазбаны тіркеуге мүмкіндік беретін жүйені ішкі демода көрсеткенімізде, қабылдау айрықша оң болды: Symphony жобалық арнамыз кеңейіп, ұйым бойынша түрлі командалар оны өздігінен қолдана бастады. OpenAI-де өнімді сыртқа іске қосудың негізгі алғышарты өнімнің ішкі нарыққа (ішкі пайдаланушыларға) сәйкестігі. OpenAI-дегі қолдану тәжірибесіне қарап, Symphony-ді компаниядан тыс ортаға да ұсыну керектігі анық болды.
Сөйтіп, біз идеяны жеке-дара SPEC.md файлына шығарып, Codex-тен оны іске асыруды сұрадық. Эталондық іске асыру үшін біз Elixir тілін таңдадық: бұл бір уақытта орындалатын процестерді үйлестіруге және қадағалауға арналған тамаша базалық құралдары бар, салыстырмалы түрде тар шеңберде қолданылатын тіл. Codex Elixir іске асыруын бір мысалмен-ақ жасап шықты, содан кейін біз спецификацияны да, іске асыруды да жетілдіруді жалғастырдық. Спецификацияны жетілдіру үшін біз тіпті Codex-тен оны бірнеше басқа тілде—TypeScript, Go, Rust, Java, Python—іске асырып, нәтижелерін екіұштылықтарды анықтау және жүйені қарапайым ету үшін пайдалануды сұрадық. Ол әр тілде сәтті орындалды.
Symphony-ді құру барысында біз нақты репозиторийлерге немесе Linear MCP-ге тәуелділіктер сияқты көптеген ілеспе күрделілікті алып тастадық. Symphony енді біздің ішкі репозиторийлерімізге немесе жұмыс процестерімізге тәуелді емес. Негізгі тәсіл қарапайым болды:
Әрбір ашық тапсырма үшін агенттің өз жұмыс кеңістігінде жұмыс істеп тұрғанына көз жеткізіңіз.
Ағымдағы жұмысқа көмектесумен қатар, әзірлеу жұмыс процесі енді агенттер білетін және ұстанатын процеске айналды. Әзірлеу жұмыс процесі—мәселе бойынша жұмыс істеу, репозиторийді шығарып алу, PM оның өңделіп жатқанын білуі үшін оны орындалу барысына қою, PR қосу, оны қарап шығу күйіне жылжыту, бейнелерді тіркеу және т.б.—енді қарапайым WORKFLOW.md файлында қамтылған. Мұның бәрі адамдар ұстанған процесс, бірақ ол ешқашан құжатталмаған. Осы анық көрсетілмеген қадамдар жиынтығына сүйенудің орнына, біз енді оны құжаттаймыз, ал Symphony агенттердің оны орындауын қамтамасыз етеді. Бұл бізбен қатар жұмыс істейтін агенттерді құруға мүмкіндік береді. Егер агенттер аяқталған жұмысқа өзіндік рефлексияны да қоса тіркеуі керек деп шешсек, оны WORKFLOW.md файлына қосамыз, және Symphony агенттерді сол қадамға бағыттайды.
Сондай-ақ Codex-ті қолданба сервері режимінде(жаңа терезеде ашылады) пайдалану мүмкіндігіне ие болдық, бұл Codex-ке арналған кірістірілген headless (бассыз) режим. Бұл режим бізге Codex-ті іске қосып, онымен ағынды бастау немесе кезектерге реакция білдіру сияқты әрекеттер үшін жақсы құжатталған JSON-RPC API (қолданбалы бағдарламалау интерфейсі) арқылы бағдарламалық түрде байланысуға мүмкіндік берді. Бұл Codex-пен CLI арқылы немесе тікелей tmux сеанстары арқылы өзара әрекеттесуге тырысқаннан гөрі ыңғайлырақ әрі масштабталатын.
Codex App Server біздің қолдану жағдайымызға дәл келді: біз Codex ұсынатын құралдық ортаның артықшылықтарын пайдалана отырып, оған қосылуға арналған реттеу тетіктері мен интеграциялық хуктарды қолданамыз. Мысалы, Linear қол жеткізу токенін қосалқы агенттерге ашпау үшін біз динамикалық құрал шақыруларын(жаңа терезеде ашылады) пайдаланып, MCP-ге сүйенбей және қол жеткізу токенін контейнерлерге ашпай, Linear-ға кез келген сұрауларды орындайтын өңделмеген linear_graphql функциясын қолданамыз.
Келесі қадамдар
Symphony әдейі минималды етіп жасалған оркестрация деңгейі. Біз оны Linear сияқты әртүрлі жұмыс процесі құралдарымен бірге қолданылғанда Codex App Server-дің мүмкіндіктерін көрсету үшін ашық бастапқы код ретінде жариялап жатырмыз. Осыған байланысты, біз Symphony-ді жеке-дара өнім ретінде қолдауды жоспарлап отырған жоқпыз. Оны үлгілік іске асыру ретінде қарастырыңыз. Көптеген әзірлеушілер өз репозиторийлерінің бастапқы құрылымын жасау үшін кодтау агенттерін harness engineering жазбасына бағыттағаны сияқты, біз сіз өз орталарға бейімделген нұсқаларыңызды құрастыру үшін сүйікті кодтау агентіңізді Symphony спецификациясына(жаңа терезеде ашылады) және репозиторийіне(жаңа терезеде ашылады) бағыттайды деп үміттенеміз.
Қуаты Codex және оның қолданба сервері арқылы қамтамасыз етіледі. Symphony біз бұрыннан қолданып жүрген екі құралды Codex пен Linear-ды жұмысты басқару мәселесін шешу үшін байланыстырудың жолы болды. Код жазу агенттері ой қорытуда және нұсқауларды орындауда жетіле түскен сайын, басқа компанияларда да тар орын код жазудан агенттік жұмысты басқаруға қарай ауысады деп болжаймыз. Қызықты тұсы қазір осы кодтау агенті жүйелерімен тәжірибе жасап көруге кедергі таңғаларлықтай аз. Codex арқылы жай ғана нәрселер жасай аласыз.
Қауымдастық алғыстары
Шығарылғаннан кейінгі апталарда инженерлік қауымдастықтың Symphony-ді пайдаланып жатқанын көргенімізге қуаныштымыз, ол 23 сәуірдегі жағдай бойынша GitHub-та 15 мыңнан астам жұлдыз(жаңа терезеде ашылады) жинады.