123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433 |
- <!doctype html>
- <html lang="en" class="no-js">
- <head>
-
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width,initial-scale=1">
-
-
-
-
- <link rel="prev" href="../env/">
-
-
- <link rel="next" href="../../faq/">
-
-
- <link rel="icon" href="../../assets/images/favicon.png">
- <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.40">
-
-
-
- <title>Environment utils - SWE-agent documentation</title>
-
-
-
- <link rel="stylesheet" href="../../assets/stylesheets/main.8c3ca2c6.min.css">
-
-
- <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
-
-
-
-
-
-
-
-
-
-
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
- <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
- <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
-
-
-
- <link rel="stylesheet" href="../../assets/_mkdocstrings.css">
-
- <link rel="stylesheet" href="../../assets/custom.css">
-
- <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
-
-
-
-
-
- <link href="../../assets/stylesheets/glightbox.min.css" rel="stylesheet"/><style>
- html.glightbox-open { overflow: initial; height: 100%; }
- .gslide-title { margin-top: 0px; user-select: text; }
- .gslide-desc { color: #666; user-select: text; }
- .gslide-image img { background: white; }
- .gscrollbar-fixer { padding-right: 15px; }
- .gdesc-inner { font-size: 0.75rem; }
- body[data-md-color-scheme="slate"] .gdesc-inner { background: var(--md-default-bg-color);}
- body[data-md-color-scheme="slate"] .gslide-title { color: var(--md-default-fg-color);}
- body[data-md-color-scheme="slate"] .gslide-desc { color: var(--md-default-fg-color);}</style> <script src="../../assets/javascripts/glightbox.min.js"></script></head>
-
-
-
-
-
-
-
-
-
- <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo">
-
-
- <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
- <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
- <label class="md-overlay" for="__drawer"></label>
- <div data-md-component="skip">
-
-
- <a href="#environment-utils" class="md-skip">
- Skip to content
- </a>
-
- </div>
- <div data-md-component="announce">
-
- <aside class="md-banner">
- <div class="md-banner__inner md-grid md-typeset">
-
- <button class="md-banner__button md-icon" aria-label="Don't show this again">
-
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
- </button>
-
-
- <!-- This link won't work in local preview -->
- <a href="SWE-agent/background#enigma" class="clickable-banner">
- <div>
- News: SWE-agent <span class="enigma">EniGMA</span> solves cybersecurity and CTF challanges to achieve <span class="enigma">3x improvement over previous SOTA!</span>
- </div>
- </a>
- </div>
-
- <script>var el=document.querySelector("[data-md-component=announce]");if(el){var content=el.querySelector(".md-typeset");__md_hash(content.innerHTML)===__md_get("__announce")&&(el.hidden=!0)}</script>
-
- </aside>
-
- </div>
-
-
-
-
- <header class="md-header md-header--shadow" data-md-component="header">
- <nav class="md-header__inner md-grid" aria-label="Header">
- <a href="../.." title="SWE-agent documentation" class="md-header__button md-logo" aria-label="SWE-agent documentation" data-md-component="logo">
-
- <img src="../../assets/swe-agent.svg" alt="logo">
- </a>
- <label class="md-header__button md-icon" for="__drawer">
-
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
- </label>
- <div class="md-header__title" data-md-component="header-title">
- <div class="md-header__ellipsis">
- <div class="md-header__topic">
- <span class="md-ellipsis">
- SWE-agent documentation
- </span>
- </div>
- <div class="md-header__topic" data-md-component="header-topic">
- <span class="md-ellipsis">
-
- Environment utils
-
- </span>
- </div>
- </div>
- </div>
-
-
- <form class="md-header__option" data-md-component="palette">
-
-
-
-
- <input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
-
- <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
- </label>
-
-
-
-
-
- <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="deep-orange" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
-
- <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></svg>
- </label>
-
-
-
-
-
- <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="deep-orange" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_2">
-
- <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"/></svg>
- </label>
-
-
- </form>
-
-
-
- <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
-
-
-
- <label class="md-header__button md-icon" for="__search">
-
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
- </label>
- <div class="md-search" data-md-component="search" role="dialog">
- <label class="md-search__overlay" for="__search"></label>
- <div class="md-search__inner" role="search">
- <form class="md-search__form" name="search">
- <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
- <label class="md-search__icon md-icon" for="__search">
-
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
-
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
- </label>
- <nav class="md-search__options" aria-label="Search">
-
- <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
-
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
- </button>
- </nav>
-
- </form>
- <div class="md-search__output">
- <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
- <div class="md-search-result" data-md-component="search-result">
- <div class="md-search-result__meta">
- Initializing search
- </div>
- <ol class="md-search-result__list" role="presentation"></ol>
- </div>
- </div>
- </div>
- </div>
- </div>
-
-
- <div class="md-header__source">
- <a href="https://github.com/princeton-nlp/SWE-agent" title="Go to repository" class="md-source" data-md-component="source">
- <div class="md-source__icon md-icon">
-
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
- </div>
- <div class="md-source__repository">
- princeton-nlp/SWE-agent
- </div>
- </a>
- </div>
-
- </nav>
-
- </header>
-
- <div class="md-container" data-md-component="container">
-
-
-
-
-
-
- <main class="md-main" data-md-component="main">
- <div class="md-main__inner md-grid">
-
-
-
- <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
- <div class="md-sidebar__scrollwrap">
- <div class="md-sidebar__inner">
-
- <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
- <label class="md-nav__title" for="__drawer">
- <a href="../.." title="SWE-agent documentation" class="md-nav__button md-logo" aria-label="SWE-agent documentation" data-md-component="logo">
-
- <img src="../../assets/swe-agent.svg" alt="logo">
- </a>
- SWE-agent documentation
- </label>
-
- <div class="md-nav__source">
- <a href="https://github.com/princeton-nlp/SWE-agent" title="Go to repository" class="md-source" data-md-component="source">
- <div class="md-source__icon md-icon">
-
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
- </div>
- <div class="md-source__repository">
- princeton-nlp/SWE-agent
- </div>
- </a>
- </div>
-
- <ul class="md-nav__list" data-md-scrollfix>
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../.." class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Home
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item md-nav__item--nested">
-
-
-
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
-
-
-
- <div class="md-nav__link md-nav__container">
- <a href="../../background/" class="md-nav__link ">
-
-
- <span class="md-ellipsis">
- Project Overview
- </span>
-
- </a>
-
-
- <label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="0">
- <span class="md-nav__icon md-icon"></span>
- </label>
-
- </div>
-
- <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
- <label class="md-nav__title" for="__nav_2">
- <span class="md-nav__icon md-icon"></span>
- Project Overview
- </label>
- <ul class="md-nav__list" data-md-scrollfix>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../background/aci/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Agent-Computer Interface
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../background/iat/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Interactive Agent Tools
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../background/architecture/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Architecture
- </span>
-
- </a>
- </li>
-
-
-
- </ul>
- </nav>
-
- </li>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item md-nav__item--nested">
-
-
-
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
-
-
-
- <div class="md-nav__link md-nav__container">
- <a href="../../installation/" class="md-nav__link ">
-
-
- <span class="md-ellipsis">
- Installation
- </span>
-
- </a>
-
-
- <label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="0">
- <span class="md-nav__icon md-icon"></span>
- </label>
-
- </div>
-
- <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
- <label class="md-nav__title" for="__nav_3">
- <span class="md-nav__icon md-icon"></span>
- Installation
- </label>
- <ul class="md-nav__list" data-md-scrollfix>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../installation/codespaces/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Use in-browser
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../installation/source/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Install from source
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../installation/docker/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Run with docker
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../installation/keys/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- API keys
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../installation/tips/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Installation tips
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../installation/changelog/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Changelog
- </span>
-
- </a>
- </li>
-
-
-
- </ul>
- </nav>
-
- </li>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item md-nav__item--nested">
-
-
-
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
-
-
-
- <div class="md-nav__link md-nav__container">
- <a href="../../usage/" class="md-nav__link ">
-
-
- <span class="md-ellipsis">
- Usage
- </span>
-
- </a>
-
-
- <label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="0">
- <span class="md-nav__icon md-icon"></span>
- </label>
-
- </div>
-
- <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
- <label class="md-nav__title" for="__nav_4">
- <span class="md-nav__icon md-icon"></span>
- Usage
- </label>
- <ul class="md-nav__list" data-md-scrollfix>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../usage/cl_tutorial/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Command line usage
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../usage/enigma/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- EnIGMA usage
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../usage/coding_challenges/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Solving coding challenges
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../usage/web_ui/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Using the web UI
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../usage/trajectories/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Trajectories
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../usage/inspector/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Trajectory inspector
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../usage/usage_faq/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- FAQ
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../usage/benchmarking/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Benchmarking
- </span>
-
- </a>
- </li>
-
-
-
- </ul>
- </nav>
-
- </li>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item md-nav__item--nested">
-
-
-
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
-
-
- <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
-
-
- <span class="md-ellipsis">
- Configuration
- </span>
-
- <span class="md-nav__icon md-icon"></span>
- </label>
-
- <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
- <label class="md-nav__title" for="__nav_5">
- <span class="md-nav__icon md-icon"></span>
- Configuration
- </label>
- <ul class="md-nav__list" data-md-scrollfix>
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../config/config/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Config files
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../config/commands/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Command definitions
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../config/demonstrations/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Demonstrations
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../config/env/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Environment variables
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../config/docker/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Docker images
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../config/summarizers/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Summarizers
- </span>
-
- </a>
- </li>
-
-
-
- </ul>
- </nav>
-
- </li>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item md-nav__item--nested">
-
-
-
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
-
-
- <label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
-
-
- <span class="md-ellipsis">
- Development
- </span>
-
- <span class="md-nav__icon md-icon"></span>
- </label>
-
- <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
- <label class="md-nav__title" for="__nav_6">
- <span class="md-nav__icon md-icon"></span>
- Development
- </label>
- <ul class="md-nav__list" data-md-scrollfix>
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../dev/contribute/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Contribution guide
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../dev/formatting_conflicts/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Formatting conflicts
- </span>
-
- </a>
- </li>
-
-
-
- </ul>
- </nav>
-
- </li>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item md-nav__item--active md-nav__item--nested">
-
-
-
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" checked>
-
-
-
- <div class="md-nav__link md-nav__container">
- <a href="../" class="md-nav__link ">
-
-
- <span class="md-ellipsis">
- Reference
- </span>
-
- </a>
-
-
- <label class="md-nav__link " for="__nav_7" id="__nav_7_label" tabindex="0">
- <span class="md-nav__icon md-icon"></span>
- </label>
-
- </div>
-
- <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="true">
- <label class="md-nav__title" for="__nav_7">
- <span class="md-nav__icon md-icon"></span>
- Reference
- </label>
- <ul class="md-nav__list" data-md-scrollfix>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../agent/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Agent
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../models/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Models
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../env/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- Environment
- </span>
-
- </a>
- </li>
-
-
-
-
-
-
-
-
-
-
-
- <li class="md-nav__item md-nav__item--active">
-
- <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
-
-
-
-
-
- <label class="md-nav__link md-nav__link--active" for="__toc">
-
-
- <span class="md-ellipsis">
- Environment utils
- </span>
-
- <span class="md-nav__icon md-icon"></span>
- </label>
-
- <a href="./" class="md-nav__link md-nav__link--active">
-
-
- <span class="md-ellipsis">
- Environment utils
- </span>
-
- </a>
-
-
- <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
-
-
-
-
-
-
- <label class="md-nav__title" for="__toc">
- <span class="md-nav__icon md-icon"></span>
- Table of contents
- </label>
- <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils" class="md-nav__link">
- <span class="md-ellipsis">
- utils
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.InstanceBuilder" class="md-nav__link">
- <span class="md-ellipsis">
- InstanceBuilder
- </span>
- </a>
-
- <nav class="md-nav" aria-label="InstanceBuilder">
- <ul class="md-nav__list">
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.InstanceBuilder.__init__" class="md-nav__link">
- <span class="md-ellipsis">
- __init__
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.InstanceBuilder.set_problem_statement" class="md-nav__link">
- <span class="md-ellipsis">
- set_problem_statement
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.InstanceBuilder.set_problem_statement_from_challenge_json" class="md-nav__link">
- <span class="md-ellipsis">
- set_problem_statement_from_challenge_json
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.InstanceBuilder.set_server_description" class="md-nav__link">
- <span class="md-ellipsis">
- set_server_description
- </span>
- </a>
-
- </li>
-
- </ul>
- </nav>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.PatchFormatter" class="md-nav__link">
- <span class="md-ellipsis">
- PatchFormatter
- </span>
- </a>
-
- <nav class="md-nav" aria-label="PatchFormatter">
- <ul class="md-nav__list">
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.PatchFormatter.__init__" class="md-nav__link">
- <span class="md-ellipsis">
- __init__
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.PatchFormatter.concat_files_strings" class="md-nav__link">
- <span class="md-ellipsis">
- concat_files_strings
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.PatchFormatter.format_file" class="md-nav__link">
- <span class="md-ellipsis">
- format_file
- </span>
- </a>
-
- </li>
-
- </ul>
- </nav>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.copy_anything_to_container" class="md-nav__link">
- <span class="md-ellipsis">
- copy_anything_to_container
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.copy_file_to_container" class="md-nav__link">
- <span class="md-ellipsis">
- copy_file_to_container
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.format_trajectory_markdown" class="md-nav__link">
- <span class="md-ellipsis">
- format_trajectory_markdown
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.get_associated_commit_urls" class="md-nav__link">
- <span class="md-ellipsis">
- get_associated_commit_urls
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.get_commit" class="md-nav__link">
- <span class="md-ellipsis">
- get_commit
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.get_container" class="md-nav__link">
- <span class="md-ellipsis">
- get_container
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.get_data_path_name" class="md-nav__link">
- <span class="md-ellipsis">
- get_data_path_name
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.get_gh_issue_data" class="md-nav__link">
- <span class="md-ellipsis">
- get_gh_issue_data
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.get_instances" class="md-nav__link">
- <span class="md-ellipsis">
- get_instances
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.get_problem_statement_from_github_issue" class="md-nav__link">
- <span class="md-ellipsis">
- get_problem_statement_from_github_issue
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.image_exists" class="md-nav__link">
- <span class="md-ellipsis">
- image_exists
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.is_github_issue_url" class="md-nav__link">
- <span class="md-ellipsis">
- is_github_issue_url
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.is_github_repo_url" class="md-nav__link">
- <span class="md-ellipsis">
- is_github_repo_url
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.parse_gh_issue_url" class="md-nav__link">
- <span class="md-ellipsis">
- parse_gh_issue_url
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.parse_gh_repo_url" class="md-nav__link">
- <span class="md-ellipsis">
- parse_gh_repo_url
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.read_session_with_timeout" class="md-nav__link">
- <span class="md-ellipsis">
- read_session_with_timeout
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.read_with_timeout" class="md-nav__link">
- <span class="md-ellipsis">
- read_with_timeout
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.read_with_timeout_experimental" class="md-nav__link">
- <span class="md-ellipsis">
- read_with_timeout_experimental
- </span>
- </a>
-
- </li>
-
- </ul>
-
- </nav>
-
- </li>
-
-
-
- </ul>
- </nav>
-
- </li>
-
-
-
-
-
-
-
-
- <li class="md-nav__item">
- <a href="../../faq/" class="md-nav__link">
-
-
- <span class="md-ellipsis">
- FAQ
- </span>
-
- </a>
- </li>
-
-
- </ul>
- </nav>
- </div>
- </div>
- </div>
-
-
-
- <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
- <div class="md-sidebar__scrollwrap">
- <div class="md-sidebar__inner">
-
- <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
-
-
-
-
-
-
- <label class="md-nav__title" for="__toc">
- <span class="md-nav__icon md-icon"></span>
- Table of contents
- </label>
- <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils" class="md-nav__link">
- <span class="md-ellipsis">
- utils
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.InstanceBuilder" class="md-nav__link">
- <span class="md-ellipsis">
- InstanceBuilder
- </span>
- </a>
-
- <nav class="md-nav" aria-label="InstanceBuilder">
- <ul class="md-nav__list">
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.InstanceBuilder.__init__" class="md-nav__link">
- <span class="md-ellipsis">
- __init__
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.InstanceBuilder.set_problem_statement" class="md-nav__link">
- <span class="md-ellipsis">
- set_problem_statement
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.InstanceBuilder.set_problem_statement_from_challenge_json" class="md-nav__link">
- <span class="md-ellipsis">
- set_problem_statement_from_challenge_json
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.InstanceBuilder.set_server_description" class="md-nav__link">
- <span class="md-ellipsis">
- set_server_description
- </span>
- </a>
-
- </li>
-
- </ul>
- </nav>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.PatchFormatter" class="md-nav__link">
- <span class="md-ellipsis">
- PatchFormatter
- </span>
- </a>
-
- <nav class="md-nav" aria-label="PatchFormatter">
- <ul class="md-nav__list">
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.PatchFormatter.__init__" class="md-nav__link">
- <span class="md-ellipsis">
- __init__
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.PatchFormatter.concat_files_strings" class="md-nav__link">
- <span class="md-ellipsis">
- concat_files_strings
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.PatchFormatter.format_file" class="md-nav__link">
- <span class="md-ellipsis">
- format_file
- </span>
- </a>
-
- </li>
-
- </ul>
- </nav>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.copy_anything_to_container" class="md-nav__link">
- <span class="md-ellipsis">
- copy_anything_to_container
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.copy_file_to_container" class="md-nav__link">
- <span class="md-ellipsis">
- copy_file_to_container
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.format_trajectory_markdown" class="md-nav__link">
- <span class="md-ellipsis">
- format_trajectory_markdown
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.get_associated_commit_urls" class="md-nav__link">
- <span class="md-ellipsis">
- get_associated_commit_urls
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.get_commit" class="md-nav__link">
- <span class="md-ellipsis">
- get_commit
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.get_container" class="md-nav__link">
- <span class="md-ellipsis">
- get_container
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.get_data_path_name" class="md-nav__link">
- <span class="md-ellipsis">
- get_data_path_name
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.get_gh_issue_data" class="md-nav__link">
- <span class="md-ellipsis">
- get_gh_issue_data
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.get_instances" class="md-nav__link">
- <span class="md-ellipsis">
- get_instances
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.get_problem_statement_from_github_issue" class="md-nav__link">
- <span class="md-ellipsis">
- get_problem_statement_from_github_issue
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.image_exists" class="md-nav__link">
- <span class="md-ellipsis">
- image_exists
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.is_github_issue_url" class="md-nav__link">
- <span class="md-ellipsis">
- is_github_issue_url
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.is_github_repo_url" class="md-nav__link">
- <span class="md-ellipsis">
- is_github_repo_url
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.parse_gh_issue_url" class="md-nav__link">
- <span class="md-ellipsis">
- parse_gh_issue_url
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.parse_gh_repo_url" class="md-nav__link">
- <span class="md-ellipsis">
- parse_gh_repo_url
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.read_session_with_timeout" class="md-nav__link">
- <span class="md-ellipsis">
- read_session_with_timeout
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.read_with_timeout" class="md-nav__link">
- <span class="md-ellipsis">
- read_with_timeout
- </span>
- </a>
-
- </li>
-
- <li class="md-nav__item">
- <a href="#sweagent.environment.utils.read_with_timeout_experimental" class="md-nav__link">
- <span class="md-ellipsis">
- read_with_timeout_experimental
- </span>
- </a>
-
- </li>
-
- </ul>
-
- </nav>
- </div>
- </div>
- </div>
-
-
-
- <div class="md-content" data-md-component="content">
- <article class="md-content__inner md-typeset">
-
-
-
- <a href="https://github.com/princeton-nlp/SWE-agent/edit/main/docs/reference/env_utils.md" title="Edit this page" class="md-content__button md-icon">
-
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
- </a>
-
-
- <h1 id="environment-utils">Environment utils</h1>
- <div class="doc doc-object doc-module">
- <a id="sweagent.environment.utils"></a>
- <div class="doc doc-contents first">
- <div class="doc doc-children">
- <div class="doc doc-object doc-class">
- <h2 id="sweagent.environment.utils.InstanceBuilder" class="doc doc-heading">
- <code>InstanceBuilder</code>
- </h2>
- <div class="doc doc-contents ">
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">712</span>
- <span class="normal">713</span>
- <span class="normal">714</span>
- <span class="normal">715</span>
- <span class="normal">716</span>
- <span class="normal">717</span>
- <span class="normal">718</span>
- <span class="normal">719</span>
- <span class="normal">720</span>
- <span class="normal">721</span>
- <span class="normal">722</span>
- <span class="normal">723</span>
- <span class="normal">724</span>
- <span class="normal">725</span>
- <span class="normal">726</span>
- <span class="normal">727</span>
- <span class="normal">728</span>
- <span class="normal">729</span>
- <span class="normal">730</span>
- <span class="normal">731</span>
- <span class="normal">732</span>
- <span class="normal">733</span>
- <span class="normal">734</span>
- <span class="normal">735</span>
- <span class="normal">736</span>
- <span class="normal">737</span>
- <span class="normal">738</span>
- <span class="normal">739</span>
- <span class="normal">740</span>
- <span class="normal">741</span>
- <span class="normal">742</span>
- <span class="normal">743</span>
- <span class="normal">744</span>
- <span class="normal">745</span>
- <span class="normal">746</span>
- <span class="normal">747</span>
- <span class="normal">748</span>
- <span class="normal">749</span>
- <span class="normal">750</span>
- <span class="normal">751</span>
- <span class="normal">752</span>
- <span class="normal">753</span>
- <span class="normal">754</span>
- <span class="normal">755</span>
- <span class="normal">756</span>
- <span class="normal">757</span>
- <span class="normal">758</span>
- <span class="normal">759</span>
- <span class="normal">760</span>
- <span class="normal">761</span>
- <span class="normal">762</span>
- <span class="normal">763</span>
- <span class="normal">764</span>
- <span class="normal">765</span>
- <span class="normal">766</span>
- <span class="normal">767</span>
- <span class="normal">768</span>
- <span class="normal">769</span>
- <span class="normal">770</span>
- <span class="normal">771</span>
- <span class="normal">772</span>
- <span class="normal">773</span>
- <span class="normal">774</span>
- <span class="normal">775</span>
- <span class="normal">776</span>
- <span class="normal">777</span>
- <span class="normal">778</span>
- <span class="normal">779</span>
- <span class="normal">780</span>
- <span class="normal">781</span>
- <span class="normal">782</span>
- <span class="normal">783</span>
- <span class="normal">784</span>
- <span class="normal">785</span>
- <span class="normal">786</span>
- <span class="normal">787</span>
- <span class="normal">788</span>
- <span class="normal">789</span>
- <span class="normal">790</span>
- <span class="normal">791</span>
- <span class="normal">792</span>
- <span class="normal">793</span>
- <span class="normal">794</span>
- <span class="normal">795</span>
- <span class="normal">796</span>
- <span class="normal">797</span>
- <span class="normal">798</span>
- <span class="normal">799</span>
- <span class="normal">800</span>
- <span class="normal">801</span>
- <span class="normal">802</span>
- <span class="normal">803</span>
- <span class="normal">804</span>
- <span class="normal">805</span>
- <span class="normal">806</span>
- <span class="normal">807</span>
- <span class="normal">808</span>
- <span class="normal">809</span>
- <span class="normal">810</span>
- <span class="normal">811</span>
- <span class="normal">812</span>
- <span class="normal">813</span>
- <span class="normal">814</span>
- <span class="normal">815</span>
- <span class="normal">816</span>
- <span class="normal">817</span>
- <span class="normal">818</span>
- <span class="normal">819</span>
- <span class="normal">820</span>
- <span class="normal">821</span>
- <span class="normal">822</span>
- <span class="normal">823</span>
- <span class="normal">824</span>
- <span class="normal">825</span>
- <span class="normal">826</span>
- <span class="normal">827</span>
- <span class="normal">828</span>
- <span class="normal">829</span>
- <span class="normal">830</span>
- <span class="normal">831</span>
- <span class="normal">832</span>
- <span class="normal">833</span>
- <span class="normal">834</span>
- <span class="normal">835</span>
- <span class="normal">836</span>
- <span class="normal">837</span>
- <span class="normal">838</span>
- <span class="normal">839</span>
- <span class="normal">840</span>
- <span class="normal">841</span>
- <span class="normal">842</span>
- <span class="normal">843</span>
- <span class="normal">844</span>
- <span class="normal">845</span>
- <span class="normal">846</span>
- <span class="normal">847</span>
- <span class="normal">848</span>
- <span class="normal">849</span>
- <span class="normal">850</span>
- <span class="normal">851</span>
- <span class="normal">852</span>
- <span class="normal">853</span>
- <span class="normal">854</span>
- <span class="normal">855</span>
- <span class="normal">856</span>
- <span class="normal">857</span>
- <span class="normal">858</span>
- <span class="normal">859</span>
- <span class="normal">860</span>
- <span class="normal">861</span>
- <span class="normal">862</span>
- <span class="normal">863</span>
- <span class="normal">864</span>
- <span class="normal">865</span>
- <span class="normal">866</span>
- <span class="normal">867</span>
- <span class="normal">868</span>
- <span class="normal">869</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">InstanceBuilder</span><span class="p">:</span>
- <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
- <span class="w"> </span><span class="sd">"""This helper class is used to build the data for an instance object,</span>
- <span class="sd"> retrieving problem statements from github issues or local files and setting</span>
- <span class="sd"> repo paths from github urls or local paths.</span>
- <span class="sd"> """</span>
- <span class="c1"># Args that will be passed to the Instance constructor</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="n">token</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_instance_id_problem_suffix</span> <span class="o">=</span> <span class="s2">""</span>
- <span class="k">def</span> <span class="nf">set_problem_statement_from_gh_issue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">issue_url</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
- <span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">issue_number</span> <span class="o">=</span> <span class="n">parse_gh_issue_url</span><span class="p">(</span><span class="n">issue_url</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"problem_statement"</span><span class="p">]</span> <span class="o">=</span> <span class="n">get_problem_statement_from_github_issue</span><span class="p">(</span>
- <span class="n">owner</span><span class="p">,</span>
- <span class="n">repo</span><span class="p">,</span>
- <span class="n">issue_number</span><span class="p">,</span>
- <span class="n">token</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">,</span>
- <span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"instance_id"</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">owner</span><span class="si">}</span><span class="s2">__</span><span class="si">{</span><span class="n">repo</span><span class="si">}</span><span class="s2">-i</span><span class="si">{</span><span class="n">issue_number</span><span class="si">}</span><span class="s2">"</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"problem_statement_source"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"online"</span>
- <span class="k">def</span> <span class="nf">set_server_description</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">server_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span> <span class="n">port</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""For CTF challenges"""</span>
- <span class="k">if</span> <span class="n">server_name</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">port</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"server_description"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">""</span>
- <span class="k">return</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"category"</span><span class="p">]</span> <span class="ow">in</span> <span class="p">{</span><span class="s2">"web"</span><span class="p">,</span> <span class="s2">"misc"</span><span class="p">}</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"proto"</span><span class="p">)</span> <span class="o">!=</span> <span class="s2">"nc"</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"server_description"</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
- <span class="sa">f</span><span class="s2">"The challenge web server is running on `</span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2">` port `</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">` and you can access it from within the container environment using `curl http://</span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">`."</span>
- <span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"server_description"</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
- <span class="sa">f</span><span class="s2">"The challenge web server is running on `</span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2">` port `</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">` and you can access it from within the container environment using `connect_start </span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">`."</span>
- <span class="p">)</span>
- <span class="k">def</span> <span class="nf">set_problem_statement_from_challenge_json</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""For CTF challenges"""</span>
- <span class="n">challenge</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">read_text</span><span class="p">())</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"files"</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"files"</span><span class="p">,</span> <span class="p">[])</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"points"</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"points"</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"category_friendly"</span><span class="p">]</span> <span class="o">=</span> <span class="n">CTF_CHALLENGES_CATEGORIES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">challenge</span><span class="p">[</span><span class="s2">"category"</span><span class="p">])</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s2">"docker-compose.yml"</span><span class="p">)</span><span class="o">.</span><span class="n">is_file</span><span class="p">():</span>
- <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Found docker_compose file in </span><span class="si">{</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"docker_compose"</span><span class="p">]</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s2">"docker-compose.yml"</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"port"</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"internal_port"</span><span class="p">)</span> <span class="ow">or</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"port"</span><span class="p">)</span>
- <span class="k">if</span> <span class="s2">"box"</span> <span class="ow">in</span> <span class="n">challenge</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"server_name"</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="p">[</span><span class="s2">"box"</span><span class="p">]</span> <span class="ow">or</span> <span class="s2">"127.0.0.1"</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"server_name"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">""</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"file_path"</span><span class="p">]</span> <span class="o">=</span> <span class="n">file_path</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">set_server_description</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"server_name"</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"port"</span><span class="p">])</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_text</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">challenge</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">challenge</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"instance_id"</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
- <span class="c1"># sanitize 'name' to only alphanumeric characters</span>
- <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"category"</span><span class="p">,</span> <span class="s2">"misc"</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"_"</span> <span class="o">+</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"name"</span><span class="p">]</span> <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">isalnum</span><span class="p">())</span>
- <span class="p">)</span>
- <span class="k">def</span> <span class="nf">set_problem_statement_from_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
- <span class="k">if</span> <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">"challenge.json"</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_challenge_json</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_text</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">read_text</span><span class="p">())</span>
- <span class="k">def</span> <span class="nf">set_problem_statement_from_text</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"problem_statement"</span><span class="p">]</span> <span class="o">=</span> <span class="n">text</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"instance_id"</span><span class="p">]</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"problem_statement"</span><span class="p">]</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()[:</span><span class="mi">6</span><span class="p">]</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"problem_statement_source"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"local"</span>
- <span class="k">def</span> <span class="nf">set_problem_statement</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
- <span class="w"> </span><span class="sd">"""Get problem statement for a single instance from a github issue url or a</span>
- <span class="sd"> path to a markdown or text file.</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="n">data_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"text://"</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_text</span><span class="p">(</span><span class="n">data_path</span><span class="o">.</span><span class="n">removeprefix</span><span class="p">(</span><span class="s2">"text://"</span><span class="p">))</span>
- <span class="k">if</span> <span class="n">is_github_issue_url</span><span class="p">(</span><span class="n">data_path</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_gh_issue</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">Path</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span><span class="o">.</span><span class="n">is_file</span><span class="p">():</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_file</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Not sure how to get problem statement from </span><span class="si">{</span><span class="n">data_path</span><span class="si">=}</span><span class="s2">."</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">set_repo_info_from_gh_url</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">base_commit</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
- <span class="n">owner</span><span class="p">,</span> <span class="n">repo</span> <span class="o">=</span> <span class="n">parse_gh_repo_url</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"repo"</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">owner</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">repo</span><span class="si">}</span><span class="s2">"</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"repo_type"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"github"</span>
- <span class="c1"># Always get commit hash, because base_commit can also be branch or tag</span>
- <span class="n">api</span> <span class="o">=</span> <span class="n">GhApi</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"base_commit"</span><span class="p">]</span> <span class="o">=</span> <span class="n">get_commit</span><span class="p">(</span><span class="n">api</span><span class="p">,</span> <span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">ref</span><span class="o">=</span><span class="n">base_commit</span><span class="p">)</span><span class="o">.</span><span class="n">sha</span>
- <span class="k">if</span> <span class="n">base_commit</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"base_commit"</span><span class="p">]:</span>
- <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Base commit reference </span><span class="si">{</span><span class="n">base_commit</span><span class="si">}</span><span class="s2"> resolved to commit hash </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s1">'base_commit'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"version"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"base_commit"</span><span class="p">][:</span><span class="mi">7</span><span class="p">]</span>
- <span class="k">def</span> <span class="nf">set_repo_info_from_local_path</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">base_commit</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"repo"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">path</span><span class="p">)</span><span class="o">.</span><span class="n">resolve</span><span class="p">())</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"repo_type"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"local"</span>
- <span class="k">if</span> <span class="n">base_commit</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"base_commit"</span><span class="p">]</span> <span class="o">=</span> <span class="n">base_commit</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">repo</span> <span class="o">=</span> <span class="n">Repo</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">search_parent_directories</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
- <span class="k">except</span> <span class="n">InvalidGitRepositoryError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Could not find git repository at </span><span class="si">{</span><span class="n">path</span><span class="si">=}</span><span class="s2">."</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">e</span>
- <span class="k">if</span> <span class="n">repo</span><span class="o">.</span><span class="n">is_dirty</span><span class="p">()</span> <span class="ow">and</span> <span class="s2">"PYTEST_CURRENT_TEST"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Local git repository </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2"> is dirty. Please commit or stash changes."</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"base_commit"</span><span class="p">]</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">head</span><span class="o">.</span><span class="n">object</span><span class="o">.</span><span class="n">hexsha</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"version"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"base_commit"</span><span class="p">][:</span><span class="mi">7</span><span class="p">]</span>
- <span class="k">def</span> <span class="nf">set_repo_info</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">repo</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">base_commit</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
- <span class="k">if</span> <span class="n">is_github_repo_url</span><span class="p">(</span><span class="n">repo</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">set_repo_info_from_gh_url</span><span class="p">(</span><span class="n">repo</span><span class="p">,</span> <span class="n">base_commit</span><span class="o">=</span><span class="n">base_commit</span><span class="p">)</span>
- <span class="k">elif</span> <span class="n">Path</span><span class="p">(</span><span class="n">repo</span><span class="p">)</span><span class="o">.</span><span class="n">is_dir</span><span class="p">():</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">set_repo_info_from_local_path</span><span class="p">(</span><span class="n">repo</span><span class="p">,</span> <span class="n">base_commit</span><span class="o">=</span><span class="n">base_commit</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Could not determine repo path from </span><span class="si">{</span><span class="n">repo</span><span class="si">=}</span><span class="s2">."</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">set_from_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance_dict</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">|=</span> <span class="n">instance_dict</span>
- <span class="k">def</span> <span class="nf">set_missing_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="c1"># TODO: This field is only needed while swe_env is using some questionable logic</span>
- <span class="c1"># to determine whether to clone from a mirror or not. This should be removed in the future.</span>
- <span class="c1"># Values: 'swe-bench' (loaded from json/jsonl for swe-bench style inference),</span>
- <span class="c1"># 'online' (loaded from github issue or similar) or 'local' (loaded from local file)</span>
- <span class="k">if</span> <span class="s2">"problem_statement_source"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"problem_statement_source"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"swe-bench"</span>
- <span class="k">if</span> <span class="s2">"repo_type"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"repo_type"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"github"</span>
- <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="n">required_fields</span> <span class="o">=</span> <span class="p">[</span>
- <span class="s2">"problem_statement"</span><span class="p">,</span>
- <span class="s2">"instance_id"</span><span class="p">,</span>
- <span class="s2">"repo"</span><span class="p">,</span>
- <span class="s2">"repo_type"</span><span class="p">,</span>
- <span class="s2">"base_commit"</span><span class="p">,</span>
- <span class="s2">"version"</span><span class="p">,</span>
- <span class="s2">"problem_statement_source"</span><span class="p">,</span>
- <span class="p">]</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="nb">all</span><span class="p">(</span><span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">required_fields</span><span class="p">):</span>
- <span class="n">missing</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">required_fields</span><span class="p">)</span> <span class="o">-</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Missing required fields: </span><span class="si">{</span><span class="n">missing</span><span class="si">=}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"repo_type"</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">{</span><span class="s2">"github"</span><span class="p">,</span> <span class="s2">"local"</span><span class="p">}:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Invalid repo type: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s1">'repo_type'</span><span class="p">]</span><span class="si">=}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"repo_type"</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"github"</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"repo"</span><span class="p">]</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s2">"/"</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Invalid repo format for </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s1">'repo_type'</span><span class="p">]</span><span class="si">=}</span><span class="s2">: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s1">'repo'</span><span class="p">]</span><span class="si">=}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">build</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">set_missing_fields</span><span class="p">()</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">validate</span><span class="p">()</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
- </code></pre></div></td></tr></table></div>
- </details>
- <div class="doc doc-children">
- <div class="doc doc-object doc-function">
- <h3 id="sweagent.environment.utils.InstanceBuilder.__init__" class="doc doc-heading">
- <code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
- </h3>
- <div class="doc doc-contents ">
- <p>This helper class is used to build the data for an instance object,
- retrieving problem statements from github issues or local files and setting
- repo paths from github urls or local paths.</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">713</span>
- <span class="normal">714</span>
- <span class="normal">715</span>
- <span class="normal">716</span>
- <span class="normal">717</span>
- <span class="normal">718</span>
- <span class="normal">719</span>
- <span class="normal">720</span>
- <span class="normal">721</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
- <span class="w"> </span><span class="sd">"""This helper class is used to build the data for an instance object,</span>
- <span class="sd"> retrieving problem statements from github issues or local files and setting</span>
- <span class="sd"> repo paths from github urls or local paths.</span>
- <span class="sd"> """</span>
- <span class="c1"># Args that will be passed to the Instance constructor</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="n">token</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_instance_id_problem_suffix</span> <span class="o">=</span> <span class="s2">""</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h3 id="sweagent.environment.utils.InstanceBuilder.set_problem_statement" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">set_problem_statement</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span></code>
- </h3>
- <div class="doc doc-contents ">
- <p>Get problem statement for a single instance from a github issue url or a
- path to a markdown or text file.</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">782</span>
- <span class="normal">783</span>
- <span class="normal">784</span>
- <span class="normal">785</span>
- <span class="normal">786</span>
- <span class="normal">787</span>
- <span class="normal">788</span>
- <span class="normal">789</span>
- <span class="normal">790</span>
- <span class="normal">791</span>
- <span class="normal">792</span>
- <span class="normal">793</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">set_problem_statement</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
- <span class="w"> </span><span class="sd">"""Get problem statement for a single instance from a github issue url or a</span>
- <span class="sd"> path to a markdown or text file.</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="n">data_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"text://"</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_text</span><span class="p">(</span><span class="n">data_path</span><span class="o">.</span><span class="n">removeprefix</span><span class="p">(</span><span class="s2">"text://"</span><span class="p">))</span>
- <span class="k">if</span> <span class="n">is_github_issue_url</span><span class="p">(</span><span class="n">data_path</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_gh_issue</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">Path</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span><span class="o">.</span><span class="n">is_file</span><span class="p">():</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_file</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Not sure how to get problem statement from </span><span class="si">{</span><span class="n">data_path</span><span class="si">=}</span><span class="s2">."</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h3 id="sweagent.environment.utils.InstanceBuilder.set_problem_statement_from_challenge_json" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">set_problem_statement_from_challenge_json</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span></code>
- </h3>
- <div class="doc doc-contents ">
- <p>For CTF challenges</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">748</span>
- <span class="normal">749</span>
- <span class="normal">750</span>
- <span class="normal">751</span>
- <span class="normal">752</span>
- <span class="normal">753</span>
- <span class="normal">754</span>
- <span class="normal">755</span>
- <span class="normal">756</span>
- <span class="normal">757</span>
- <span class="normal">758</span>
- <span class="normal">759</span>
- <span class="normal">760</span>
- <span class="normal">761</span>
- <span class="normal">762</span>
- <span class="normal">763</span>
- <span class="normal">764</span>
- <span class="normal">765</span>
- <span class="normal">766</span>
- <span class="normal">767</span>
- <span class="normal">768</span>
- <span class="normal">769</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">set_problem_statement_from_challenge_json</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""For CTF challenges"""</span>
- <span class="n">challenge</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">read_text</span><span class="p">())</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"files"</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"files"</span><span class="p">,</span> <span class="p">[])</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"points"</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"points"</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"category_friendly"</span><span class="p">]</span> <span class="o">=</span> <span class="n">CTF_CHALLENGES_CATEGORIES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">challenge</span><span class="p">[</span><span class="s2">"category"</span><span class="p">])</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s2">"docker-compose.yml"</span><span class="p">)</span><span class="o">.</span><span class="n">is_file</span><span class="p">():</span>
- <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Found docker_compose file in </span><span class="si">{</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"docker_compose"</span><span class="p">]</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s2">"docker-compose.yml"</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"port"</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"internal_port"</span><span class="p">)</span> <span class="ow">or</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"port"</span><span class="p">)</span>
- <span class="k">if</span> <span class="s2">"box"</span> <span class="ow">in</span> <span class="n">challenge</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"server_name"</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="p">[</span><span class="s2">"box"</span><span class="p">]</span> <span class="ow">or</span> <span class="s2">"127.0.0.1"</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"server_name"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">""</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"file_path"</span><span class="p">]</span> <span class="o">=</span> <span class="n">file_path</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">set_server_description</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"server_name"</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"port"</span><span class="p">])</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_text</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">challenge</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">challenge</span><span class="p">[</span><span class="s1">'description'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"instance_id"</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
- <span class="c1"># sanitize 'name' to only alphanumeric characters</span>
- <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"category"</span><span class="p">,</span> <span class="s2">"misc"</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"_"</span> <span class="o">+</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"name"</span><span class="p">]</span> <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">isalnum</span><span class="p">())</span>
- <span class="p">)</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h3 id="sweagent.environment.utils.InstanceBuilder.set_server_description" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">set_server_description</span><span class="p">(</span><span class="n">server_name</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span></code>
- </h3>
- <div class="doc doc-contents ">
- <p>For CTF challenges</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">734</span>
- <span class="normal">735</span>
- <span class="normal">736</span>
- <span class="normal">737</span>
- <span class="normal">738</span>
- <span class="normal">739</span>
- <span class="normal">740</span>
- <span class="normal">741</span>
- <span class="normal">742</span>
- <span class="normal">743</span>
- <span class="normal">744</span>
- <span class="normal">745</span>
- <span class="normal">746</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">set_server_description</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">server_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span> <span class="n">port</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""For CTF challenges"""</span>
- <span class="k">if</span> <span class="n">server_name</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">port</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"server_description"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">""</span>
- <span class="k">return</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"category"</span><span class="p">]</span> <span class="ow">in</span> <span class="p">{</span><span class="s2">"web"</span><span class="p">,</span> <span class="s2">"misc"</span><span class="p">}</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"proto"</span><span class="p">)</span> <span class="o">!=</span> <span class="s2">"nc"</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"server_description"</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
- <span class="sa">f</span><span class="s2">"The challenge web server is running on `</span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2">` port `</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">` and you can access it from within the container environment using `curl http://</span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">`."</span>
- <span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">"challenge"</span><span class="p">][</span><span class="s2">"server_description"</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
- <span class="sa">f</span><span class="s2">"The challenge web server is running on `</span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2">` port `</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">` and you can access it from within the container environment using `connect_start </span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">`."</span>
- <span class="p">)</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="doc doc-object doc-class">
- <h2 id="sweagent.environment.utils.PatchFormatter" class="doc doc-heading">
- <code>PatchFormatter</code>
- </h2>
- <div class="doc doc-contents ">
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1015</span>
- <span class="normal">1016</span>
- <span class="normal">1017</span>
- <span class="normal">1018</span>
- <span class="normal">1019</span>
- <span class="normal">1020</span>
- <span class="normal">1021</span>
- <span class="normal">1022</span>
- <span class="normal">1023</span>
- <span class="normal">1024</span>
- <span class="normal">1025</span>
- <span class="normal">1026</span>
- <span class="normal">1027</span>
- <span class="normal">1028</span>
- <span class="normal">1029</span>
- <span class="normal">1030</span>
- <span class="normal">1031</span>
- <span class="normal">1032</span>
- <span class="normal">1033</span>
- <span class="normal">1034</span>
- <span class="normal">1035</span>
- <span class="normal">1036</span>
- <span class="normal">1037</span>
- <span class="normal">1038</span>
- <span class="normal">1039</span>
- <span class="normal">1040</span>
- <span class="normal">1041</span>
- <span class="normal">1042</span>
- <span class="normal">1043</span>
- <span class="normal">1044</span>
- <span class="normal">1045</span>
- <span class="normal">1046</span>
- <span class="normal">1047</span>
- <span class="normal">1048</span>
- <span class="normal">1049</span>
- <span class="normal">1050</span>
- <span class="normal">1051</span>
- <span class="normal">1052</span>
- <span class="normal">1053</span>
- <span class="normal">1054</span>
- <span class="normal">1055</span>
- <span class="normal">1056</span>
- <span class="normal">1057</span>
- <span class="normal">1058</span>
- <span class="normal">1059</span>
- <span class="normal">1060</span>
- <span class="normal">1061</span>
- <span class="normal">1062</span>
- <span class="normal">1063</span>
- <span class="normal">1064</span>
- <span class="normal">1065</span>
- <span class="normal">1066</span>
- <span class="normal">1067</span>
- <span class="normal">1068</span>
- <span class="normal">1069</span>
- <span class="normal">1070</span>
- <span class="normal">1071</span>
- <span class="normal">1072</span>
- <span class="normal">1073</span>
- <span class="normal">1074</span>
- <span class="normal">1075</span>
- <span class="normal">1076</span>
- <span class="normal">1077</span>
- <span class="normal">1078</span>
- <span class="normal">1079</span>
- <span class="normal">1080</span>
- <span class="normal">1081</span>
- <span class="normal">1082</span>
- <span class="normal">1083</span>
- <span class="normal">1084</span>
- <span class="normal">1085</span>
- <span class="normal">1086</span>
- <span class="normal">1087</span>
- <span class="normal">1088</span>
- <span class="normal">1089</span>
- <span class="normal">1090</span>
- <span class="normal">1091</span>
- <span class="normal">1092</span>
- <span class="normal">1093</span>
- <span class="normal">1094</span>
- <span class="normal">1095</span>
- <span class="normal">1096</span>
- <span class="normal">1097</span>
- <span class="normal">1098</span>
- <span class="normal">1099</span>
- <span class="normal">1100</span>
- <span class="normal">1101</span>
- <span class="normal">1102</span>
- <span class="normal">1103</span>
- <span class="normal">1104</span>
- <span class="normal">1105</span>
- <span class="normal">1106</span>
- <span class="normal">1107</span>
- <span class="normal">1108</span>
- <span class="normal">1109</span>
- <span class="normal">1110</span>
- <span class="normal">1111</span>
- <span class="normal">1112</span>
- <span class="normal">1113</span>
- <span class="normal">1114</span>
- <span class="normal">1115</span>
- <span class="normal">1116</span>
- <span class="normal">1117</span>
- <span class="normal">1118</span>
- <span class="normal">1119</span>
- <span class="normal">1120</span>
- <span class="normal">1121</span>
- <span class="normal">1122</span>
- <span class="normal">1123</span>
- <span class="normal">1124</span>
- <span class="normal">1125</span>
- <span class="normal">1126</span>
- <span class="normal">1127</span>
- <span class="normal">1128</span>
- <span class="normal">1129</span>
- <span class="normal">1130</span>
- <span class="normal">1131</span>
- <span class="normal">1132</span>
- <span class="normal">1133</span>
- <span class="normal">1134</span>
- <span class="normal">1135</span>
- <span class="normal">1136</span>
- <span class="normal">1137</span>
- <span class="normal">1138</span>
- <span class="normal">1139</span>
- <span class="normal">1140</span>
- <span class="normal">1141</span>
- <span class="normal">1142</span>
- <span class="normal">1143</span>
- <span class="normal">1144</span>
- <span class="normal">1145</span>
- <span class="normal">1146</span>
- <span class="normal">1147</span>
- <span class="normal">1148</span>
- <span class="normal">1149</span>
- <span class="normal">1150</span>
- <span class="normal">1151</span>
- <span class="normal">1152</span>
- <span class="normal">1153</span>
- <span class="normal">1154</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">PatchFormatter</span><span class="p">:</span>
- <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
- <span class="bp">self</span><span class="p">,</span>
- <span class="n">patch</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
- <span class="n">read_method</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="nb">str</span><span class="p">],</span> <span class="nb">str</span><span class="p">],</span>
- <span class="p">):</span>
- <span class="w"> </span><span class="sd">"""Given the final patch and access to the container that contains the repository,</span>
- <span class="sd"> extract relevant lines from the modified file.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> patch: The patch as a string.</span>
- <span class="sd"> read_method: Callable with path to file (relative to repository root) as argument</span>
- <span class="sd"> that returns the file content as a string.</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_patch</span> <span class="o">=</span> <span class="n">PatchSet</span><span class="p">(</span><span class="n">patch</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_patched_files</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_original_files</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_patch_applied</span> <span class="o">=</span> <span class="kc">True</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_read_file</span> <span class="o">=</span> <span class="n">read_method</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_read_files</span><span class="p">(</span><span class="n">original</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
- <span class="nd">@staticmethod</span>
- <span class="k">def</span> <span class="nf">_merge_intervals</span><span class="p">(</span><span class="n">starts</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="n">stops</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">])</span> <span class="o">-></span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]]:</span>
- <span class="w"> </span><span class="sd">"""Given two lists of integers, starts and stops, merges all overlapping intervals.</span>
- <span class="sd"> For example `starts=[1, 5, 18]`, `stops=[10, 13, 20]`</span>
- <span class="sd"> should return `starts=[1, 18]`, `stops=[13, 20]`</span>
- <span class="sd"> """</span>
- <span class="n">intervals</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">))</span>
- <span class="n">merged</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="k">for</span> <span class="n">start</span><span class="p">,</span> <span class="n">stop</span> <span class="ow">in</span> <span class="n">intervals</span><span class="p">:</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">merged</span> <span class="ow">or</span> <span class="n">merged</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o"><</span> <span class="n">start</span><span class="p">:</span>
- <span class="c1"># No overlap</span>
- <span class="n">merged</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">start</span><span class="p">,</span> <span class="n">stop</span><span class="p">])</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="c1"># Overlap</span>
- <span class="n">merged</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">merged</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">],</span> <span class="n">stop</span><span class="p">)</span>
- <span class="c1"># Unzip again</span>
- <span class="n">merged_starts</span><span class="p">,</span> <span class="n">merged_stops</span> <span class="o">=</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">merged</span><span class="p">)</span>
- <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">merged_starts</span><span class="p">),</span> <span class="nb">list</span><span class="p">(</span><span class="n">merged_stops</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">format_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">starts</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="n">stops</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="o">*</span><span class="p">,</span> <span class="n">linenos</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""Reads file and returns string representation of the relevant lines.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> path: The path to the file within the repo location</span>
- <span class="sd"> starts: The starting line numbers of the relevant lines. The first line is line 1.</span>
- <span class="sd"> stops: The stopping line numbers of the relevant lines. The stop is not inclusive.</span>
- <span class="sd"> The first line is line 1.</span>
- <span class="sd"> linenos: Whether to include line numbers</span>
- <span class="sd"> """</span>
- <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">starts</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">stops</span><span class="p">)</span>
- <span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="n">start</span> <span class="o">>=</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">start</span> <span class="ow">in</span> <span class="n">starts</span><span class="p">)</span>
- <span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="n">start</span> <span class="o"><</span> <span class="n">stop</span> <span class="k">for</span> <span class="n">start</span><span class="p">,</span> <span class="n">stop</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">))</span>
- <span class="n">starts</span><span class="p">,</span> <span class="n">stops</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_merge_intervals</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">)</span>
- <span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="n">hunk1_start</span> <span class="o"><</span> <span class="n">hunk2_start</span> <span class="k">for</span> <span class="n">hunk1_start</span><span class="p">,</span> <span class="n">hunk2_start</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">starts</span><span class="p">[</span><span class="mi">1</span><span class="p">:]))</span>
- <span class="n">out</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="k">if</span> <span class="n">starts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
- <span class="c1"># Count from 1</span>
- <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"[</span><span class="si">{</span><span class="n">starts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="si">}</span><span class="s2"> lines above omitted]"</span><span class="p">)</span>
- <span class="n">last_stop</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="n">lines</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
- <span class="k">for</span> <span class="n">start</span><span class="p">,</span> <span class="n">stop</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">):</span>
- <span class="k">assert</span> <span class="n">start</span> <span class="o">>=</span> <span class="mi">1</span>
- <span class="k">if</span> <span class="n">last_stop</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">n_omitted</span> <span class="o">=</span> <span class="n">start</span> <span class="o">-</span> <span class="n">last_stop</span>
- <span class="c1"># Check that we have non-overlapping hunks</span>
- <span class="k">assert</span> <span class="n">n_omitted</span> <span class="o">>=</span> <span class="mi">0</span>
- <span class="k">if</span> <span class="n">n_omitted</span><span class="p">:</span>
- <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="se">\n</span><span class="s2">[</span><span class="si">{</span><span class="n">n_omitted</span><span class="si">}</span><span class="s2"> lines omitted]</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
- <span class="c1"># Count from 1</span>
- <span class="n">these_lines</span> <span class="o">=</span> <span class="n">lines</span><span class="p">[</span><span class="n">start</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">:</span> <span class="n">stop</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
- <span class="k">if</span> <span class="n">linenos</span><span class="p">:</span>
- <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">i</span><span class="si">:</span><span class="s2">6d</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">l</span><span class="si">}</span><span class="s2">"</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">l</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">these_lines</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="n">start</span><span class="p">)]))</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">these_lines</span><span class="p">))</span>
- <span class="n">last_stop</span> <span class="o">=</span> <span class="n">stop</span>
- <span class="k">if</span> <span class="n">last_stop</span> <span class="o"><</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">):</span>
- <span class="c1"># Stop is not inclusive</span>
- <span class="n">omitted</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o">-</span> <span class="n">last_stop</span>
- <span class="k">assert</span> <span class="n">omitted</span> <span class="o">></span> <span class="mi">0</span>
- <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"[</span><span class="si">{</span><span class="n">omitted</span><span class="si">}</span><span class="s2"> lines below omitted]"</span><span class="p">)</span>
- <span class="k">return</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">_get_hunk_lines</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">original</span><span class="p">:</span> <span class="nb">bool</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">context_length</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-></span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]]]:</span>
- <span class="w"> </span><span class="sd">"""Get the starts and stops for all files in the patch.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> original: Whether to read the original file or the patched file</span>
- <span class="sd"> context_length: The number of lines to include above and below the hunk</span>
- <span class="sd"> Returns:</span>
- <span class="sd"> A dictionary with the file path as key and a tuple of lists of starts and stops as value.</span>
- <span class="sd"> """</span>
- <span class="n">out</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]]]</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="k">for</span> <span class="n">patch</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_patch</span><span class="p">:</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">patch</span><span class="o">.</span><span class="n">is_modified_file</span><span class="p">:</span>
- <span class="k">continue</span>
- <span class="n">starts</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="n">stops</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="k">for</span> <span class="n">hunk</span> <span class="ow">in</span> <span class="n">patch</span><span class="p">:</span>
- <span class="k">if</span> <span class="n">original</span><span class="p">:</span>
- <span class="c1"># 1 is the lowest line number</span>
- <span class="n">start</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">hunk</span><span class="o">.</span><span class="n">source_start</span> <span class="o">-</span> <span class="n">context_length</span><span class="p">)</span>
- <span class="n">stop</span> <span class="o">=</span> <span class="n">hunk</span><span class="o">.</span><span class="n">source_start</span> <span class="o">+</span> <span class="n">hunk</span><span class="o">.</span><span class="n">source_length</span> <span class="o">+</span> <span class="n">context_length</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">start</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">hunk</span><span class="o">.</span><span class="n">target_start</span> <span class="o">-</span> <span class="n">context_length</span><span class="p">)</span>
- <span class="n">stop</span> <span class="o">=</span> <span class="n">hunk</span><span class="o">.</span><span class="n">target_start</span> <span class="o">+</span> <span class="n">hunk</span><span class="o">.</span><span class="n">target_length</span> <span class="o">+</span> <span class="n">context_length</span>
- <span class="n">starts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
- <span class="n">stops</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">stop</span><span class="p">)</span>
- <span class="n">out</span><span class="p">[</span><span class="n">patch</span><span class="o">.</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">out</span>
- <span class="k">def</span> <span class="nf">_read_files</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">original</span><span class="p">:</span> <span class="nb">bool</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">for</span> <span class="n">patch</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_patch</span><span class="p">:</span>
- <span class="n">path</span> <span class="o">=</span> <span class="n">patch</span><span class="o">.</span><span class="n">path</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">patch</span><span class="o">.</span><span class="n">is_modified_file</span><span class="p">:</span>
- <span class="k">continue</span>
- <span class="k">if</span> <span class="n">original</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="s2">"Original file reading not implemented"</span>
- <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">_patch_applied</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_patched_files</span><span class="p">[</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_read_file</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
- <span class="nd">@staticmethod</span>
- <span class="k">def</span> <span class="nf">concat_files_strings</span><span class="p">(</span><span class="n">files</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""Concatenate multiple `read_files` outputs into a single string."""</span>
- <span class="n">out</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="k">for</span> <span class="n">path</span><span class="p">,</span> <span class="n">content</span> <span class="ow">in</span> <span class="n">files</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
- <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"[File: </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">]</span><span class="se">\n</span><span class="si">{</span><span class="n">content</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
- <span class="k">return</span> <span class="s2">"</span><span class="se">\n\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">get_files_str</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">original</span><span class="p">:</span> <span class="nb">bool</span><span class="p">,</span> <span class="n">context_length</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="mi">50</span><span class="p">,</span> <span class="n">linenos</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
- <span class="n">hunk_lines</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_hunk_lines</span><span class="p">(</span><span class="n">original</span><span class="o">=</span><span class="n">original</span><span class="p">,</span> <span class="n">context_length</span><span class="o">=</span><span class="n">context_length</span><span class="p">)</span>
- <span class="n">sources</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_original_files</span> <span class="k">if</span> <span class="n">original</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_patched_files</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">concat_files_strings</span><span class="p">(</span>
- <span class="p">{</span><span class="n">path</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">format_file</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="o">*</span><span class="n">hunk_lines</span><span class="p">[</span><span class="n">path</span><span class="p">],</span> <span class="n">linenos</span><span class="o">=</span><span class="n">linenos</span><span class="p">)</span> <span class="k">for</span> <span class="n">path</span><span class="p">,</span> <span class="n">text</span> <span class="ow">in</span> <span class="n">sources</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
- <span class="p">)</span>
- </code></pre></div></td></tr></table></div>
- </details>
- <div class="doc doc-children">
- <div class="doc doc-object doc-function">
- <h3 id="sweagent.environment.utils.PatchFormatter.__init__" class="doc doc-heading">
- <code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">patch</span><span class="p">,</span> <span class="n">read_method</span><span class="p">)</span></code>
- </h3>
- <div class="doc doc-contents ">
- <p>Given the final patch and access to the container that contains the repository,
- extract relevant lines from the modified file.</p>
- <p><span class="doc-section-title">Parameters:</span></p>
- <table>
- <thead>
- <tr>
- <th>Name</th>
- <th>Type</th>
- <th>Description</th>
- <th>Default</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td><code>patch</code></td>
- <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>The patch as a string.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>read_method</code></td>
- <td>
- <code><span title="typing.Callable">Callable</span>[[str], str]</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Callable with path to file (relative to repository root) as argument
- that returns the file content as a string.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- </tbody>
- </table>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1016</span>
- <span class="normal">1017</span>
- <span class="normal">1018</span>
- <span class="normal">1019</span>
- <span class="normal">1020</span>
- <span class="normal">1021</span>
- <span class="normal">1022</span>
- <span class="normal">1023</span>
- <span class="normal">1024</span>
- <span class="normal">1025</span>
- <span class="normal">1026</span>
- <span class="normal">1027</span>
- <span class="normal">1028</span>
- <span class="normal">1029</span>
- <span class="normal">1030</span>
- <span class="normal">1031</span>
- <span class="normal">1032</span>
- <span class="normal">1033</span>
- <span class="normal">1034</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
- <span class="bp">self</span><span class="p">,</span>
- <span class="n">patch</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
- <span class="n">read_method</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="nb">str</span><span class="p">],</span> <span class="nb">str</span><span class="p">],</span>
- <span class="p">):</span>
- <span class="w"> </span><span class="sd">"""Given the final patch and access to the container that contains the repository,</span>
- <span class="sd"> extract relevant lines from the modified file.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> patch: The patch as a string.</span>
- <span class="sd"> read_method: Callable with path to file (relative to repository root) as argument</span>
- <span class="sd"> that returns the file content as a string.</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_patch</span> <span class="o">=</span> <span class="n">PatchSet</span><span class="p">(</span><span class="n">patch</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_patched_files</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_original_files</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_patch_applied</span> <span class="o">=</span> <span class="kc">True</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_read_file</span> <span class="o">=</span> <span class="n">read_method</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_read_files</span><span class="p">(</span><span class="n">original</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h3 id="sweagent.environment.utils.PatchFormatter.concat_files_strings" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">concat_files_strings</span><span class="p">(</span><span class="n">files</span><span class="p">)</span></code>
- <span class="doc doc-labels">
- <small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
- </span>
- </h3>
- <div class="doc doc-contents ">
- <p>Concatenate multiple <code>read_files</code> outputs into a single string.</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1141</span>
- <span class="normal">1142</span>
- <span class="normal">1143</span>
- <span class="normal">1144</span>
- <span class="normal">1145</span>
- <span class="normal">1146</span>
- <span class="normal">1147</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@staticmethod</span>
- <span class="k">def</span> <span class="nf">concat_files_strings</span><span class="p">(</span><span class="n">files</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""Concatenate multiple `read_files` outputs into a single string."""</span>
- <span class="n">out</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="k">for</span> <span class="n">path</span><span class="p">,</span> <span class="n">content</span> <span class="ow">in</span> <span class="n">files</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
- <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"[File: </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">]</span><span class="se">\n</span><span class="si">{</span><span class="n">content</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
- <span class="k">return</span> <span class="s2">"</span><span class="se">\n\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h3 id="sweagent.environment.utils.PatchFormatter.format_file" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">format_file</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">linenos</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></code>
- </h3>
- <div class="doc doc-contents ">
- <p>Reads file and returns string representation of the relevant lines.</p>
- <p><span class="doc-section-title">Parameters:</span></p>
- <table>
- <thead>
- <tr>
- <th>Name</th>
- <th>Type</th>
- <th>Description</th>
- <th>Default</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td><code>path</code></td>
- <td>
- </td>
- <td>
- <div class="doc-md-description">
- <p>The path to the file within the repo location</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>starts</code></td>
- <td>
- <code>list[int]</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>The starting line numbers of the relevant lines. The first line is line 1.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>stops</code></td>
- <td>
- <code>list[int]</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>The stopping line numbers of the relevant lines. The stop is not inclusive.
- The first line is line 1.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>linenos</code></td>
- <td>
- <code>bool</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Whether to include line numbers</p>
- </div>
- </td>
- <td>
- <code>True</code>
- </td>
- </tr>
- </tbody>
- </table>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1057</span>
- <span class="normal">1058</span>
- <span class="normal">1059</span>
- <span class="normal">1060</span>
- <span class="normal">1061</span>
- <span class="normal">1062</span>
- <span class="normal">1063</span>
- <span class="normal">1064</span>
- <span class="normal">1065</span>
- <span class="normal">1066</span>
- <span class="normal">1067</span>
- <span class="normal">1068</span>
- <span class="normal">1069</span>
- <span class="normal">1070</span>
- <span class="normal">1071</span>
- <span class="normal">1072</span>
- <span class="normal">1073</span>
- <span class="normal">1074</span>
- <span class="normal">1075</span>
- <span class="normal">1076</span>
- <span class="normal">1077</span>
- <span class="normal">1078</span>
- <span class="normal">1079</span>
- <span class="normal">1080</span>
- <span class="normal">1081</span>
- <span class="normal">1082</span>
- <span class="normal">1083</span>
- <span class="normal">1084</span>
- <span class="normal">1085</span>
- <span class="normal">1086</span>
- <span class="normal">1087</span>
- <span class="normal">1088</span>
- <span class="normal">1089</span>
- <span class="normal">1090</span>
- <span class="normal">1091</span>
- <span class="normal">1092</span>
- <span class="normal">1093</span>
- <span class="normal">1094</span>
- <span class="normal">1095</span>
- <span class="normal">1096</span>
- <span class="normal">1097</span>
- <span class="normal">1098</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">format_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">starts</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="n">stops</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="o">*</span><span class="p">,</span> <span class="n">linenos</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""Reads file and returns string representation of the relevant lines.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> path: The path to the file within the repo location</span>
- <span class="sd"> starts: The starting line numbers of the relevant lines. The first line is line 1.</span>
- <span class="sd"> stops: The stopping line numbers of the relevant lines. The stop is not inclusive.</span>
- <span class="sd"> The first line is line 1.</span>
- <span class="sd"> linenos: Whether to include line numbers</span>
- <span class="sd"> """</span>
- <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">starts</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">stops</span><span class="p">)</span>
- <span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="n">start</span> <span class="o">>=</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">start</span> <span class="ow">in</span> <span class="n">starts</span><span class="p">)</span>
- <span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="n">start</span> <span class="o"><</span> <span class="n">stop</span> <span class="k">for</span> <span class="n">start</span><span class="p">,</span> <span class="n">stop</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">))</span>
- <span class="n">starts</span><span class="p">,</span> <span class="n">stops</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_merge_intervals</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">)</span>
- <span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="n">hunk1_start</span> <span class="o"><</span> <span class="n">hunk2_start</span> <span class="k">for</span> <span class="n">hunk1_start</span><span class="p">,</span> <span class="n">hunk2_start</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">starts</span><span class="p">[</span><span class="mi">1</span><span class="p">:]))</span>
- <span class="n">out</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="k">if</span> <span class="n">starts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
- <span class="c1"># Count from 1</span>
- <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"[</span><span class="si">{</span><span class="n">starts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="si">}</span><span class="s2"> lines above omitted]"</span><span class="p">)</span>
- <span class="n">last_stop</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="n">lines</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
- <span class="k">for</span> <span class="n">start</span><span class="p">,</span> <span class="n">stop</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">):</span>
- <span class="k">assert</span> <span class="n">start</span> <span class="o">>=</span> <span class="mi">1</span>
- <span class="k">if</span> <span class="n">last_stop</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">n_omitted</span> <span class="o">=</span> <span class="n">start</span> <span class="o">-</span> <span class="n">last_stop</span>
- <span class="c1"># Check that we have non-overlapping hunks</span>
- <span class="k">assert</span> <span class="n">n_omitted</span> <span class="o">>=</span> <span class="mi">0</span>
- <span class="k">if</span> <span class="n">n_omitted</span><span class="p">:</span>
- <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="se">\n</span><span class="s2">[</span><span class="si">{</span><span class="n">n_omitted</span><span class="si">}</span><span class="s2"> lines omitted]</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
- <span class="c1"># Count from 1</span>
- <span class="n">these_lines</span> <span class="o">=</span> <span class="n">lines</span><span class="p">[</span><span class="n">start</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">:</span> <span class="n">stop</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
- <span class="k">if</span> <span class="n">linenos</span><span class="p">:</span>
- <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">i</span><span class="si">:</span><span class="s2">6d</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">l</span><span class="si">}</span><span class="s2">"</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">l</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">these_lines</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="n">start</span><span class="p">)]))</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">these_lines</span><span class="p">))</span>
- <span class="n">last_stop</span> <span class="o">=</span> <span class="n">stop</span>
- <span class="k">if</span> <span class="n">last_stop</span> <span class="o"><</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">):</span>
- <span class="c1"># Stop is not inclusive</span>
- <span class="n">omitted</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o">-</span> <span class="n">last_stop</span>
- <span class="k">assert</span> <span class="n">omitted</span> <span class="o">></span> <span class="mi">0</span>
- <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"[</span><span class="si">{</span><span class="n">omitted</span><span class="si">}</span><span class="s2"> lines below omitted]"</span><span class="p">)</span>
- <span class="k">return</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.copy_anything_to_container" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">copy_anything_to_container</span><span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="n">host_path</span><span class="p">,</span> <span class="n">container_path</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Copy files or directories from host to container</p>
- <p>Note: Will need to set ownership on the copied files in the container.</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">122</span>
- <span class="normal">123</span>
- <span class="normal">124</span>
- <span class="normal">125</span>
- <span class="normal">126</span>
- <span class="normal">127</span>
- <span class="normal">128</span>
- <span class="normal">129</span>
- <span class="normal">130</span>
- <span class="normal">131</span>
- <span class="normal">132</span>
- <span class="normal">133</span>
- <span class="normal">134</span>
- <span class="normal">135</span>
- <span class="normal">136</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">copy_anything_to_container</span><span class="p">(</span><span class="n">container</span><span class="p">:</span> <span class="n">Container</span><span class="p">,</span> <span class="n">host_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">container_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""Copy files or directories from host to container</span>
- <span class="sd"> Note: Will need to set ownership on the copied files in the container.</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">Path</span><span class="p">(</span><span class="n">host_path</span><span class="p">)</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Path </span><span class="si">{</span><span class="n">host_path</span><span class="si">}</span><span class="s2"> does not exist, cannot copy it to container."</span>
- <span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"docker"</span><span class="p">,</span> <span class="s2">"cp"</span><span class="p">,</span> <span class="n">host_path</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">container</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">container_path</span><span class="si">}</span><span class="s2">"</span><span class="p">]</span>
- <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Copying </span><span class="si">{</span><span class="n">host_path</span><span class="si">}</span><span class="s2"> to container at </span><span class="si">{</span><span class="n">container_path</span><span class="si">}</span><span class="s2"> with command: </span><span class="si">{</span><span class="n">shlex</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
- <span class="k">except</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">CalledProcessError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Error copying </span><span class="si">{</span><span class="n">host_path</span><span class="si">}</span><span class="s2"> to container at </span><span class="si">{</span><span class="n">container_path</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">e</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.copy_file_to_container" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">copy_file_to_container</span><span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="n">contents</span><span class="p">,</span> <span class="n">container_path</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Copies a given string into a Docker container at a specified path.</p>
- <p><span class="doc-section-title">Parameters:</span></p>
- <table>
- <thead>
- <tr>
- <th>Name</th>
- <th>Type</th>
- <th>Description</th>
- <th>Default</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td><code>container</code></td>
- <td>
- <code><span title="docker.models.containers.Container">Container</span></code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Docker SDK container object.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>contents</code></td>
- <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>The string to copy into the container.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>container_path</code></td>
- <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>The path inside the container where the string should be copied to.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- </tbody>
- </table>
- <p><span class="doc-section-title">Returns:</span></p>
- <table>
- <thead>
- <tr>
- <th>Type</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td>
- <code>None</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>None</p>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 77</span>
- <span class="normal"> 78</span>
- <span class="normal"> 79</span>
- <span class="normal"> 80</span>
- <span class="normal"> 81</span>
- <span class="normal"> 82</span>
- <span class="normal"> 83</span>
- <span class="normal"> 84</span>
- <span class="normal"> 85</span>
- <span class="normal"> 86</span>
- <span class="normal"> 87</span>
- <span class="normal"> 88</span>
- <span class="normal"> 89</span>
- <span class="normal"> 90</span>
- <span class="normal"> 91</span>
- <span class="normal"> 92</span>
- <span class="normal"> 93</span>
- <span class="normal"> 94</span>
- <span class="normal"> 95</span>
- <span class="normal"> 96</span>
- <span class="normal"> 97</span>
- <span class="normal"> 98</span>
- <span class="normal"> 99</span>
- <span class="normal">100</span>
- <span class="normal">101</span>
- <span class="normal">102</span>
- <span class="normal">103</span>
- <span class="normal">104</span>
- <span class="normal">105</span>
- <span class="normal">106</span>
- <span class="normal">107</span>
- <span class="normal">108</span>
- <span class="normal">109</span>
- <span class="normal">110</span>
- <span class="normal">111</span>
- <span class="normal">112</span>
- <span class="normal">113</span>
- <span class="normal">114</span>
- <span class="normal">115</span>
- <span class="normal">116</span>
- <span class="normal">117</span>
- <span class="normal">118</span>
- <span class="normal">119</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">copy_file_to_container</span><span class="p">(</span><span class="n">container</span><span class="p">:</span> <span class="n">Container</span><span class="p">,</span> <span class="n">contents</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">container_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""</span>
- <span class="sd"> Copies a given string into a Docker container at a specified path.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> container: Docker SDK container object.</span>
- <span class="sd"> contents: The string to copy into the container.</span>
- <span class="sd"> container_path: The path inside the container where the string should be copied to.</span>
- <span class="sd"> Returns:</span>
- <span class="sd"> None</span>
- <span class="sd"> """</span>
- <span class="n">temp_file_name</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="c1"># Create a temporary file</span>
- <span class="k">with</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">NamedTemporaryFile</span><span class="p">(</span><span class="n">delete</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="k">as</span> <span class="n">temp_file</span><span class="p">:</span>
- <span class="n">temp_file_name</span> <span class="o">=</span> <span class="n">temp_file</span><span class="o">.</span><span class="n">name</span>
- <span class="c1"># Write the string to the temporary file and ensure it's written to disk</span>
- <span class="n">temp_file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">contents</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span>
- <span class="n">temp_file</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
- <span class="n">os</span><span class="o">.</span><span class="n">fsync</span><span class="p">(</span><span class="n">temp_file</span><span class="o">.</span><span class="n">fileno</span><span class="p">())</span>
- <span class="c1"># Create a TAR archive in memory containing the temporary file</span>
- <span class="k">with</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">NamedTemporaryFile</span><span class="p">():</span>
- <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">temp_file_name</span><span class="p">,</span> <span class="s2">"rb"</span><span class="p">)</span> <span class="k">as</span> <span class="n">temp_file</span><span class="p">:</span>
- <span class="c1"># Prepare the TAR archive</span>
- <span class="k">with</span> <span class="n">BytesIO</span><span class="p">()</span> <span class="k">as</span> <span class="n">tar_stream</span><span class="p">:</span>
- <span class="k">with</span> <span class="n">tarfile</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">fileobj</span><span class="o">=</span><span class="n">tar_stream</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s2">"w"</span><span class="p">)</span> <span class="k">as</span> <span class="n">tar</span><span class="p">:</span>
- <span class="n">tar_info</span> <span class="o">=</span> <span class="n">tarfile</span><span class="o">.</span><span class="n">TarInfo</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">Path</span><span class="p">(</span><span class="n">container_path</span><span class="p">)</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
- <span class="n">tar_info</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">temp_file_name</span><span class="p">)</span><span class="o">.</span><span class="n">stat</span><span class="p">()</span><span class="o">.</span><span class="n">st_size</span>
- <span class="n">tar</span><span class="o">.</span><span class="n">addfile</span><span class="p">(</span><span class="n">tarinfo</span><span class="o">=</span><span class="n">tar_info</span><span class="p">,</span> <span class="n">fileobj</span><span class="o">=</span><span class="n">temp_file</span><span class="p">)</span>
- <span class="n">tar_stream</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
- <span class="c1"># Copy the TAR stream to the container</span>
- <span class="n">container</span><span class="o">.</span><span class="n">put_archive</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">Path</span><span class="p">(</span><span class="n">container_path</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">tar_stream</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
- <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
- <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">"An error occurred: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
- <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">())</span>
- <span class="k">finally</span><span class="p">:</span>
- <span class="c1"># Cleanup: Remove the temporary file if it was created</span>
- <span class="k">if</span> <span class="n">temp_file_name</span> <span class="ow">and</span> <span class="n">Path</span><span class="p">(</span><span class="n">temp_file_name</span><span class="p">)</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
- <span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">temp_file_name</span><span class="p">)</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.format_trajectory_markdown" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">format_trajectory_markdown</span><span class="p">(</span><span class="n">trajectory</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Format a trajectory as a markdown string for use in gh PR description.</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 989</span>
- <span class="normal"> 990</span>
- <span class="normal"> 991</span>
- <span class="normal"> 992</span>
- <span class="normal"> 993</span>
- <span class="normal"> 994</span>
- <span class="normal"> 995</span>
- <span class="normal"> 996</span>
- <span class="normal"> 997</span>
- <span class="normal"> 998</span>
- <span class="normal"> 999</span>
- <span class="normal">1000</span>
- <span class="normal">1001</span>
- <span class="normal">1002</span>
- <span class="normal">1003</span>
- <span class="normal">1004</span>
- <span class="normal">1005</span>
- <span class="normal">1006</span>
- <span class="normal">1007</span>
- <span class="normal">1008</span>
- <span class="normal">1009</span>
- <span class="normal">1010</span>
- <span class="normal">1011</span>
- <span class="normal">1012</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">format_trajectory_markdown</span><span class="p">(</span><span class="n">trajectory</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]]):</span>
- <span class="w"> </span><span class="sd">"""Format a trajectory as a markdown string for use in gh PR description."""</span>
- <span class="n">prefix</span> <span class="o">=</span> <span class="p">[</span>
- <span class="s2">"<details>"</span><span class="p">,</span>
- <span class="s2">"<summary>Thought process ('trajectory') of SWE-agent (click to expand)</summary>"</span><span class="p">,</span>
- <span class="s2">""</span><span class="p">,</span>
- <span class="s2">""</span><span class="p">,</span>
- <span class="p">]</span>
- <span class="n">steps</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">step</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">trajectory</span><span class="p">):</span>
- <span class="n">step_strs</span> <span class="o">=</span> <span class="p">[</span>
- <span class="sa">f</span><span class="s2">"**🧑🚒 Response (</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">)**: "</span><span class="p">,</span>
- <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">step</span><span class="p">[</span><span class="s1">'response'</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
- <span class="sa">f</span><span class="s2">"**👀 Observation (</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">)**:"</span><span class="p">,</span>
- <span class="s2">"```"</span><span class="p">,</span>
- <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">remove_triple_backticks</span><span class="p">(</span><span class="n">step</span><span class="p">[</span><span class="s1">'observation'</span><span class="p">])</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
- <span class="s2">"```"</span><span class="p">,</span>
- <span class="p">]</span>
- <span class="n">steps</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">step_strs</span><span class="p">))</span>
- <span class="n">suffix</span> <span class="o">=</span> <span class="p">[</span>
- <span class="s2">""</span><span class="p">,</span>
- <span class="s2">"</details>"</span><span class="p">,</span>
- <span class="p">]</span>
- <span class="k">return</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">prefix</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n\n</span><span class="s2">---</span><span class="se">\n\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">steps</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">suffix</span><span class="p">)</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.get_associated_commit_urls" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">get_associated_commit_urls</span><span class="p">(</span><span class="n">org</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">issue_number</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">token</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Return the URLs of commits that would close an issue.</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">966</span>
- <span class="normal">967</span>
- <span class="normal">968</span>
- <span class="normal">969</span>
- <span class="normal">970</span>
- <span class="normal">971</span>
- <span class="normal">972</span>
- <span class="normal">973</span>
- <span class="normal">974</span>
- <span class="normal">975</span>
- <span class="normal">976</span>
- <span class="normal">977</span>
- <span class="normal">978</span>
- <span class="normal">979</span>
- <span class="normal">980</span>
- <span class="normal">981</span>
- <span class="normal">982</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_associated_commit_urls</span><span class="p">(</span><span class="n">org</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">repo</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">issue_number</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">""</span><span class="p">)</span> <span class="o">-></span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
- <span class="w"> </span><span class="sd">"""Return the URLs of commits that would close an issue."""</span>
- <span class="n">api</span> <span class="o">=</span> <span class="n">GhApi</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="n">token</span><span class="p">)</span>
- <span class="c1"># Strangely the "pull_request" field of api.issues.get is often not set</span>
- <span class="c1"># so we have to go through the events to check if there's a commit</span>
- <span class="n">events</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">issues</span><span class="o">.</span><span class="n">list_events</span><span class="p">(</span><span class="n">org</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">issue_number</span><span class="p">)</span>
- <span class="n">commit_urls</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">events</span><span class="p">:</span>
- <span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">event</span> <span class="o">!=</span> <span class="s2">"referenced"</span><span class="p">:</span>
- <span class="k">continue</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">event</span><span class="o">.</span><span class="n">commit_id</span><span class="p">:</span>
- <span class="k">continue</span>
- <span class="n">commit</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">repos</span><span class="o">.</span><span class="n">get_commit</span><span class="p">(</span><span class="n">org</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">event</span><span class="o">.</span><span class="n">commit_id</span><span class="p">)</span>
- <span class="n">message</span> <span class="o">=</span> <span class="n">commit</span><span class="o">.</span><span class="n">commit</span><span class="o">.</span><span class="n">message</span>
- <span class="k">if</span> <span class="sa">f</span><span class="s2">"fixes #</span><span class="si">{</span><span class="n">issue_number</span><span class="si">}</span><span class="s2">"</span> <span class="ow">in</span> <span class="n">message</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">or</span> <span class="sa">f</span><span class="s2">"closes #</span><span class="si">{</span><span class="n">issue_number</span><span class="si">}</span><span class="s2">"</span> <span class="ow">in</span> <span class="n">message</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
- <span class="n">commit_urls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">commit</span><span class="o">.</span><span class="n">html_url</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">commit_urls</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.get_commit" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">get_commit</span><span class="p">(</span><span class="n">api</span><span class="p">,</span> <span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">ref</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Get commit object from github api</p>
- <p><span class="doc-section-title">Parameters:</span></p>
- <table>
- <thead>
- <tr>
- <th>Name</th>
- <th>Type</th>
- <th>Description</th>
- <th>Default</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td><code>api</code></td>
- <td>
- <code><span title="ghapi.all.GhApi">GhApi</span></code>
- </td>
- <td>
- <div class="doc-md-description">
-
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>owner</code></td>
- <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Repo owner, e.g., "princeton-nlp"</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>repo</code></td>
- <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Repo, e.g., "SWE-agent"</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>ref</code></td>
- <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Branch, tag or commit hash</p>
- </div>
- </td>
- <td>
- <code>None</code>
- </td>
- </tr>
- </tbody>
- </table>
- <p><span class="doc-section-title">Returns:</span></p>
- <table>
- <thead>
- <tr>
- <th>Name</th> <th>Type</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td><code>_type_</code></td> <td>
- </td>
- <td>
- <div class="doc-md-description">
- <p><em>description</em></p>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">636</span>
- <span class="normal">637</span>
- <span class="normal">638</span>
- <span class="normal">639</span>
- <span class="normal">640</span>
- <span class="normal">641</span>
- <span class="normal">642</span>
- <span class="normal">643</span>
- <span class="normal">644</span>
- <span class="normal">645</span>
- <span class="normal">646</span>
- <span class="normal">647</span>
- <span class="normal">648</span>
- <span class="normal">649</span>
- <span class="normal">650</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_commit</span><span class="p">(</span><span class="n">api</span><span class="p">:</span> <span class="n">GhApi</span><span class="p">,</span> <span class="n">owner</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">repo</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">ref</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
- <span class="w"> </span><span class="sd">"""Get commit object from github api</span>
- <span class="sd"> Args:</span>
- <span class="sd"> api (GhApi):</span>
- <span class="sd"> owner (str): Repo owner, e.g., "princeton-nlp"</span>
- <span class="sd"> repo (str): Repo, e.g., "SWE-agent"</span>
- <span class="sd"> ref (str, optional): Branch, tag or commit hash</span>
- <span class="sd"> Returns:</span>
- <span class="sd"> _type_: _description_</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="n">ref</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">api</span><span class="o">.</span><span class="n">repos</span><span class="o">.</span><span class="n">get_commit</span><span class="p">(</span><span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">ref</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">api</span><span class="o">.</span><span class="n">repos</span><span class="o">.</span><span class="n">list_commits</span><span class="p">(</span><span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.get_container" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">get_container</span><span class="p">(</span><span class="n">ctr_name</span><span class="p">,</span> <span class="n">image_name</span><span class="p">,</span> <span class="n">container_mounts</span><span class="p">,</span> <span class="n">persistent</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Get a container object for a given container name and image name</p>
- <p><span class="doc-section-title">Parameters:</span></p>
- <table>
- <thead>
- <tr>
- <th>Name</th>
- <th>Type</th>
- <th>Description</th>
- <th>Default</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td><code>ctr_name</code></td>
- <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Name of container</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>image_name</code></td>
- <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Name of image</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>persistent</code></td>
- <td>
- <code>bool</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Whether to use a persistent container or not</p>
- </div>
- </td>
- <td>
- <code>False</code>
- </td>
- </tr>
- </tbody>
- </table>
- <p>Returns:
- Container object</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">569</span>
- <span class="normal">570</span>
- <span class="normal">571</span>
- <span class="normal">572</span>
- <span class="normal">573</span>
- <span class="normal">574</span>
- <span class="normal">575</span>
- <span class="normal">576</span>
- <span class="normal">577</span>
- <span class="normal">578</span>
- <span class="normal">579</span>
- <span class="normal">580</span>
- <span class="normal">581</span>
- <span class="normal">582</span>
- <span class="normal">583</span>
- <span class="normal">584</span>
- <span class="normal">585</span>
- <span class="normal">586</span>
- <span class="normal">587</span>
- <span class="normal">588</span>
- <span class="normal">589</span>
- <span class="normal">590</span>
- <span class="normal">591</span>
- <span class="normal">592</span>
- <span class="normal">593</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_container</span><span class="p">(</span>
- <span class="n">ctr_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">image_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">container_mounts</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">persistent</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
- <span class="p">)</span> <span class="o">-></span> <span class="nb">tuple</span><span class="p">[</span><span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">,</span> <span class="nb">set</span><span class="p">]:</span>
- <span class="w"> </span><span class="sd">"""</span>
- <span class="sd"> Get a container object for a given container name and image name</span>
- <span class="sd"> Arguments:</span>
- <span class="sd"> ctr_name (str): Name of container</span>
- <span class="sd"> image_name (str): Name of image</span>
- <span class="sd"> persistent (bool): Whether to use a persistent container or not</span>
- <span class="sd"> Returns:</span>
- <span class="sd"> Container object</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">image_exists</span><span class="p">(</span><span class="n">image_name</span><span class="p">):</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
- <span class="sa">f</span><span class="s2">"Image </span><span class="si">{</span><span class="n">image_name</span><span class="si">}</span><span class="s2"> not found. Please ensure it is built and available. "</span>
- <span class="s2">"Please double-check that you followed all installation/setup instructions from the "</span>
- <span class="s2">"readme."</span>
- <span class="p">)</span>
- <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">persistent</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">_get_persistent_container</span><span class="p">(</span><span class="n">ctr_name</span><span class="p">,</span> <span class="n">image_name</span><span class="p">,</span> <span class="n">container_mounts</span><span class="o">=</span><span class="n">container_mounts</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">_get_non_persistent_container</span><span class="p">(</span><span class="n">ctr_name</span><span class="p">,</span> <span class="n">image_name</span><span class="p">,</span> <span class="n">container_mounts</span><span class="o">=</span><span class="n">container_mounts</span><span class="p">)</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.get_data_path_name" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">get_data_path_name</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>if data_path is a file, return the file stem
- elif it's a github url, return the owner__repo_name</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">51</span>
- <span class="normal">52</span>
- <span class="normal">53</span>
- <span class="normal">54</span>
- <span class="normal">55</span>
- <span class="normal">56</span>
- <span class="normal">57</span>
- <span class="normal">58</span>
- <span class="normal">59</span>
- <span class="normal">60</span>
- <span class="normal">61</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_data_path_name</span><span class="p">(</span><span class="n">data_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""if data_path is a file, return the file stem</span>
- <span class="sd"> elif it's a github url, return the owner__repo_name</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="n">data_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"text://"</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">(</span><span class="n">data_path</span><span class="o">.</span><span class="n">removeprefix</span><span class="p">(</span><span class="s2">"text://"</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()[:</span><span class="mi">6</span><span class="p">]</span>
- <span class="n">match</span> <span class="o">=</span> <span class="n">GITHUB_ISSUE_URL_PATTERN</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">match</span><span class="p">:</span>
- <span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
- <span class="k">return</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">owner</span><span class="si">}</span><span class="s2">__</span><span class="si">{</span><span class="n">repo</span><span class="si">}</span><span class="s2">"</span>
- <span class="k">return</span> <span class="n">Path</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span><span class="o">.</span><span class="n">stem</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.get_gh_issue_data" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">get_gh_issue_data</span><span class="p">(</span><span class="n">issue_url</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">token</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Returns github issue data in the form of a dictionary.
- See <a href="https://docs.github.com/en/rest/issues/issues?apiVersion=2022-11-28#get-an-issue">https://docs.github.com/en/rest/issues/issues?apiVersion=2022-11-28#get-an-issue</a>
- for return format</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">693</span>
- <span class="normal">694</span>
- <span class="normal">695</span>
- <span class="normal">696</span>
- <span class="normal">697</span>
- <span class="normal">698</span>
- <span class="normal">699</span>
- <span class="normal">700</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_gh_issue_data</span><span class="p">(</span><span class="n">issue_url</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">""</span><span class="p">):</span>
- <span class="w"> </span><span class="sd">"""Returns github issue data in the form of a dictionary.</span>
- <span class="sd"> See https://docs.github.com/en/rest/issues/issues?apiVersion=2022-11-28#get-an-issue</span>
- <span class="sd"> for return format</span>
- <span class="sd"> """</span>
- <span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">issue_number</span> <span class="o">=</span> <span class="n">parse_gh_issue_url</span><span class="p">(</span><span class="n">issue_url</span><span class="p">)</span>
- <span class="n">api</span> <span class="o">=</span> <span class="n">GhApi</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="n">token</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">api</span><span class="o">.</span><span class="n">issues</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">issue_number</span><span class="p">)</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.get_instances" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">get_instances</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">base_commit</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">split</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">token</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">repo_path</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Getter function for handling json, jsonl files</p>
- <p><span class="doc-section-title">Parameters:</span></p>
- <table>
- <thead>
- <tr>
- <th>Name</th>
- <th>Type</th>
- <th>Description</th>
- <th>Default</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td><code>file_path</code></td>
- <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Path to file</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- </tbody>
- </table>
- <p><span class="doc-section-title">Returns:</span></p>
- <table>
- <thead>
- <tr>
- <th>Type</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td>
- <code>list[dict[str, <span title="typing.Any">Any</span>]]</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>List of instances as dictionaries</p>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">872</span>
- <span class="normal">873</span>
- <span class="normal">874</span>
- <span class="normal">875</span>
- <span class="normal">876</span>
- <span class="normal">877</span>
- <span class="normal">878</span>
- <span class="normal">879</span>
- <span class="normal">880</span>
- <span class="normal">881</span>
- <span class="normal">882</span>
- <span class="normal">883</span>
- <span class="normal">884</span>
- <span class="normal">885</span>
- <span class="normal">886</span>
- <span class="normal">887</span>
- <span class="normal">888</span>
- <span class="normal">889</span>
- <span class="normal">890</span>
- <span class="normal">891</span>
- <span class="normal">892</span>
- <span class="normal">893</span>
- <span class="normal">894</span>
- <span class="normal">895</span>
- <span class="normal">896</span>
- <span class="normal">897</span>
- <span class="normal">898</span>
- <span class="normal">899</span>
- <span class="normal">900</span>
- <span class="normal">901</span>
- <span class="normal">902</span>
- <span class="normal">903</span>
- <span class="normal">904</span>
- <span class="normal">905</span>
- <span class="normal">906</span>
- <span class="normal">907</span>
- <span class="normal">908</span>
- <span class="normal">909</span>
- <span class="normal">910</span>
- <span class="normal">911</span>
- <span class="normal">912</span>
- <span class="normal">913</span>
- <span class="normal">914</span>
- <span class="normal">915</span>
- <span class="normal">916</span>
- <span class="normal">917</span>
- <span class="normal">918</span>
- <span class="normal">919</span>
- <span class="normal">920</span>
- <span class="normal">921</span>
- <span class="normal">922</span>
- <span class="normal">923</span>
- <span class="normal">924</span>
- <span class="normal">925</span>
- <span class="normal">926</span>
- <span class="normal">927</span>
- <span class="normal">928</span>
- <span class="normal">929</span>
- <span class="normal">930</span>
- <span class="normal">931</span>
- <span class="normal">932</span>
- <span class="normal">933</span>
- <span class="normal">934</span>
- <span class="normal">935</span>
- <span class="normal">936</span>
- <span class="normal">937</span>
- <span class="normal">938</span>
- <span class="normal">939</span>
- <span class="normal">940</span>
- <span class="normal">941</span>
- <span class="normal">942</span>
- <span class="normal">943</span>
- <span class="normal">944</span>
- <span class="normal">945</span>
- <span class="normal">946</span>
- <span class="normal">947</span>
- <span class="normal">948</span>
- <span class="normal">949</span>
- <span class="normal">950</span>
- <span class="normal">951</span>
- <span class="normal">952</span>
- <span class="normal">953</span>
- <span class="normal">954</span>
- <span class="normal">955</span>
- <span class="normal">956</span>
- <span class="normal">957</span>
- <span class="normal">958</span>
- <span class="normal">959</span>
- <span class="normal">960</span>
- <span class="normal">961</span>
- <span class="normal">962</span>
- <span class="normal">963</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_instances</span><span class="p">(</span>
- <span class="n">file_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
- <span class="n">base_commit</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
- <span class="n">split</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
- <span class="n">token</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
- <span class="o">*</span><span class="p">,</span>
- <span class="n">repo_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">""</span><span class="p">,</span>
- <span class="p">)</span> <span class="o">-></span> <span class="nb">list</span><span class="p">[</span><span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]]:</span>
- <span class="w"> </span><span class="sd">"""</span>
- <span class="sd"> Getter function for handling json, jsonl files</span>
- <span class="sd"> Args:</span>
- <span class="sd"> file_path (str): Path to file</span>
- <span class="sd"> Returns:</span>
- <span class="sd"> List of instances as dictionaries</span>
- <span class="sd"> """</span>
- <span class="k">def</span> <span class="nf">instance_from_dict</span><span class="p">(</span><span class="n">instances</span><span class="p">):</span>
- <span class="n">ib</span> <span class="o">=</span> <span class="n">InstanceBuilder</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="n">token</span><span class="p">)</span>
- <span class="n">ib</span><span class="o">.</span><span class="n">set_from_dict</span><span class="p">(</span><span class="n">instances</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">ib</span><span class="o">.</span><span class="n">build</span><span class="p">()</span>
- <span class="k">def</span> <span class="nf">postproc_instance_list</span><span class="p">(</span><span class="n">instances</span><span class="p">):</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">instances</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="s2">"Expected a list of instances, got a dictionary."</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="k">return</span> <span class="p">[</span><span class="n">instance_from_dict</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">instances</span><span class="p">]</span>
- <span class="c1"># The next if statement is very brittle logic to determine if we're processing a single instance</span>
- <span class="k">if</span> <span class="p">(</span>
- <span class="n">file_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"text://"</span><span class="p">)</span>
- <span class="ow">or</span> <span class="p">(</span>
- <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">is_file</span><span class="p">()</span>
- <span class="ow">and</span> <span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">suffix</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">".md"</span><span class="p">,</span> <span class="s2">".txt"</span><span class="p">]</span> <span class="ow">or</span> <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">"challenge.json"</span><span class="p">)</span>
- <span class="p">)</span>
- <span class="ow">or</span> <span class="n">is_github_issue_url</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span>
- <span class="p">):</span>
- <span class="n">ib</span> <span class="o">=</span> <span class="n">InstanceBuilder</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="n">token</span><span class="p">)</span>
- <span class="n">ib</span><span class="o">.</span><span class="n">set_problem_statement</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">repo_path</span><span class="p">:</span>
- <span class="n">ib</span><span class="o">.</span><span class="n">set_repo_info</span><span class="p">(</span><span class="n">repo_path</span><span class="p">,</span> <span class="n">base_commit</span><span class="o">=</span><span class="n">base_commit</span><span class="p">)</span>
- <span class="k">elif</span> <span class="n">is_github_repo_url</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
- <span class="n">ib</span><span class="o">.</span><span class="n">set_repo_info_from_gh_url</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">base_commit</span><span class="o">=</span><span class="n">base_commit</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Could not determine repo path from </span><span class="si">{</span><span class="n">file_path</span><span class="si">=}</span><span class="s2">, </span><span class="si">{</span><span class="n">repo_path</span><span class="si">=}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="k">return</span> <span class="p">[</span><span class="n">ib</span><span class="o">.</span><span class="n">build</span><span class="p">()]</span>
- <span class="k">if</span> <span class="n">base_commit</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="s2">"base_commit must be empty if running over multiple problem statements"</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">repo_path</span><span class="p">:</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">Path</span><span class="p">(</span><span class="n">repo_path</span><span class="p">)</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Specified repository path </span><span class="si">{</span><span class="n">repo_path</span><span class="si">}</span><span class="s2"> does not exist"</span>
- <span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="s2">"repo_path must be empty if running over multiple problem statements"</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="c1"># If file_path is a directory, attempt load from disk</span>
- <span class="k">if</span> <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">is_dir</span><span class="p">():</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">dataset_or_dict</span> <span class="o">=</span> <span class="n">load_from_disk</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dataset_or_dict</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">postproc_instance_list</span><span class="p">(</span><span class="n">dataset_or_dict</span><span class="p">[</span><span class="n">split</span><span class="p">])</span>
- <span class="k">return</span> <span class="n">postproc_instance_list</span><span class="p">(</span><span class="n">dataset_or_dict</span><span class="p">)</span>
- <span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
- <span class="c1"># Raised by load_from_disk if the directory is not a dataset directory</span>
- <span class="k">pass</span>
- <span class="k">if</span> <span class="n">base_commit</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="s2">"base_commit must be None if data_path is not a github issue url"</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="c1"># If file_path is a file, load the file</span>
- <span class="k">if</span> <span class="n">file_path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">".json"</span><span class="p">):</span>
- <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">postproc_instance_list</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">file</span><span class="p">))</span>
- <span class="k">if</span> <span class="n">file_path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">".jsonl"</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">postproc_instance_list</span><span class="p">([</span><span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">read_text</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">(</span><span class="n">keepends</span><span class="o">=</span><span class="kc">True</span><span class="p">)])</span>
- <span class="c1"># Attempt load from HF datasets as a last resort</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">postproc_instance_list</span><span class="p">(</span><span class="n">load_dataset</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">split</span><span class="o">=</span><span class="n">split</span><span class="p">))</span>
- <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
- <span class="sa">f</span><span class="s2">"Could not load instances from </span><span class="si">{</span><span class="n">file_path</span><span class="si">}</span><span class="s2">. "</span>
- <span class="s2">"Please ensure --data_path is a GitHub URL, a SWE-bench HuggingFace dataset, or a JSON/JSONL file."</span>
- <span class="p">)</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">e</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.get_problem_statement_from_github_issue" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">get_problem_statement_from_github_issue</span><span class="p">(</span><span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">issue_number</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">token</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Return problem statement from github issue</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">703</span>
- <span class="normal">704</span>
- <span class="normal">705</span>
- <span class="normal">706</span>
- <span class="normal">707</span>
- <span class="normal">708</span>
- <span class="normal">709</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_problem_statement_from_github_issue</span><span class="p">(</span><span class="n">owner</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">repo</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">issue_number</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="s2">""</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""Return problem statement from github issue"""</span>
- <span class="n">api</span> <span class="o">=</span> <span class="n">GhApi</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="n">token</span><span class="p">)</span>
- <span class="n">issue</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">issues</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">issue_number</span><span class="p">)</span>
- <span class="n">title</span> <span class="o">=</span> <span class="n">issue</span><span class="o">.</span><span class="n">title</span> <span class="k">if</span> <span class="n">issue</span><span class="o">.</span><span class="n">title</span> <span class="k">else</span> <span class="s2">""</span>
- <span class="n">body</span> <span class="o">=</span> <span class="n">issue</span><span class="o">.</span><span class="n">body</span> <span class="k">if</span> <span class="n">issue</span><span class="o">.</span><span class="n">body</span> <span class="k">else</span> <span class="s2">""</span>
- <span class="k">return</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">title</span><span class="si">}</span><span class="se">\n</span><span class="si">{</span><span class="n">body</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.image_exists" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">image_exists</span><span class="p">(</span><span class="n">image_name</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Check that the image exists and give some better error messages.</p>
- <p><span class="doc-section-title">Parameters:</span></p>
- <table>
- <thead>
- <tr>
- <th>Name</th>
- <th>Type</th>
- <th>Description</th>
- <th>Default</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td><code>image_name</code></td>
- <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Name of image</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- </tbody>
- </table>
- <p>Returns:
- bool: True if image exists</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">596</span>
- <span class="normal">597</span>
- <span class="normal">598</span>
- <span class="normal">599</span>
- <span class="normal">600</span>
- <span class="normal">601</span>
- <span class="normal">602</span>
- <span class="normal">603</span>
- <span class="normal">604</span>
- <span class="normal">605</span>
- <span class="normal">606</span>
- <span class="normal">607</span>
- <span class="normal">608</span>
- <span class="normal">609</span>
- <span class="normal">610</span>
- <span class="normal">611</span>
- <span class="normal">612</span>
- <span class="normal">613</span>
- <span class="normal">614</span>
- <span class="normal">615</span>
- <span class="normal">616</span>
- <span class="normal">617</span>
- <span class="normal">618</span>
- <span class="normal">619</span>
- <span class="normal">620</span>
- <span class="normal">621</span>
- <span class="normal">622</span>
- <span class="normal">623</span>
- <span class="normal">624</span>
- <span class="normal">625</span>
- <span class="normal">626</span>
- <span class="normal">627</span>
- <span class="normal">628</span>
- <span class="normal">629</span>
- <span class="normal">630</span>
- <span class="normal">631</span>
- <span class="normal">632</span>
- <span class="normal">633</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">image_exists</span><span class="p">(</span><span class="n">image_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""</span>
- <span class="sd"> Check that the image exists and give some better error messages.</span>
- <span class="sd"> Arguments:</span>
- <span class="sd"> image_name: Name of image</span>
- <span class="sd"> Returns:</span>
- <span class="sd"> bool: True if image exists</span>
- <span class="sd"> """</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">client</span> <span class="o">=</span> <span class="n">docker</span><span class="o">.</span><span class="n">from_env</span><span class="p">()</span>
- <span class="k">except</span> <span class="n">docker</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">DockerException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
- <span class="n">docker_not_running</span> <span class="o">=</span> <span class="nb">any</span><span class="p">(</span>
- <span class="p">(</span>
- <span class="s2">"connection aborted"</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span>
- <span class="s2">"connection refused"</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span>
- <span class="s2">"error while fetching server api version"</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span>
- <span class="p">),</span>
- <span class="p">)</span>
- <span class="k">if</span> <span class="n">docker_not_running</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
- <span class="s2">"Probably the Docker daemon is not running. Please start the Docker daemon and try again. "</span>
- <span class="s2">"If Docker issues persist, please check out https://princeton-nlp.github.io/SWE-agent/installation/tips/"</span>
- <span class="p">)</span>
- <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">e</span>
- <span class="k">raise</span>
- <span class="n">filterred_images</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">images</span><span class="o">.</span><span class="n">list</span><span class="p">(</span><span class="n">filters</span><span class="o">=</span><span class="p">{</span><span class="s2">"reference"</span><span class="p">:</span> <span class="n">image_name</span><span class="p">})</span>
- <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">filterred_images</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
- <span class="k">return</span> <span class="kc">False</span>
- <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">filterred_images</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
- <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Multiple images found for </span><span class="si">{</span><span class="n">image_name</span><span class="si">}</span><span class="s2">, that's weird."</span><span class="p">)</span>
- <span class="n">attrs</span> <span class="o">=</span> <span class="n">filterred_images</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">attrs</span>
- <span class="k">if</span> <span class="n">attrs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
- <span class="sa">f</span><span class="s2">"Found image </span><span class="si">{</span><span class="n">image_name</span><span class="si">}</span><span class="s2"> with tags: </span><span class="si">{</span><span class="n">attrs</span><span class="p">[</span><span class="s1">'RepoTags'</span><span class="p">]</span><span class="si">}</span><span class="s2">, created: </span><span class="si">{</span><span class="n">attrs</span><span class="p">[</span><span class="s1">'Created'</span><span class="p">]</span><span class="si">}</span><span class="s2"> "</span>
- <span class="sa">f</span><span class="s2">"for </span><span class="si">{</span><span class="n">attrs</span><span class="p">[</span><span class="s1">'Os'</span><span class="p">]</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">attrs</span><span class="p">[</span><span class="s1">'Architecture'</span><span class="p">]</span><span class="si">}</span><span class="s2">."</span><span class="p">,</span>
- <span class="p">)</span>
- <span class="k">return</span> <span class="kc">True</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.is_github_issue_url" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">is_github_issue_url</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Check if data_path is an URL pointing to a github issue</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">64</span>
- <span class="normal">65</span>
- <span class="normal">66</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">is_github_issue_url</span><span class="p">(</span><span class="n">data_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""Check if data_path is an URL pointing to a github issue"""</span>
- <span class="k">return</span> <span class="n">GITHUB_ISSUE_URL_PATTERN</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.is_github_repo_url" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">is_github_repo_url</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Check if data_path is an URL pointing to a github repository.
- Paths to issues or PRs will also match this pattern.</p>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">69</span>
- <span class="normal">70</span>
- <span class="normal">71</span>
- <span class="normal">72</span>
- <span class="normal">73</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">is_github_repo_url</span><span class="p">(</span><span class="n">data_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""Check if data_path is an URL pointing to a github repository.</span>
- <span class="sd"> Paths to issues or PRs will also match this pattern.</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="n">GITHUB_REPO_URL_PATTERN</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.parse_gh_issue_url" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">parse_gh_issue_url</span><span class="p">(</span><span class="n">issue_url</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p><span class="doc-section-title">Returns:</span></p>
- <table>
- <thead>
- <tr>
- <th>Name</th> <th>Type</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td><code>owner</code></td> <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Repo owner</p>
- </div>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>repo</code></td> <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Repo name</p>
- </div>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td></td> <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>issue number: Issue number as str</p>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- <p><span class="doc-section-title">Raises:</span></p>
- <table>
- <thead>
- <tr>
- <th>Type</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td>
- <code><span title="sweagent.environment.utils.InvalidGithubURL">InvalidGithubURL</span></code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>If the URL is not a valid github issue URL</p>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">656</span>
- <span class="normal">657</span>
- <span class="normal">658</span>
- <span class="normal">659</span>
- <span class="normal">660</span>
- <span class="normal">661</span>
- <span class="normal">662</span>
- <span class="normal">663</span>
- <span class="normal">664</span>
- <span class="normal">665</span>
- <span class="normal">666</span>
- <span class="normal">667</span>
- <span class="normal">668</span>
- <span class="normal">669</span>
- <span class="normal">670</span>
- <span class="normal">671</span>
- <span class="normal">672</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">parse_gh_issue_url</span><span class="p">(</span><span class="n">issue_url</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
- <span class="w"> </span><span class="sd">"""</span>
- <span class="sd"> Returns:</span>
- <span class="sd"> owner: Repo owner</span>
- <span class="sd"> repo: Repo name</span>
- <span class="sd"> issue number: Issue number as str</span>
- <span class="sd"> Raises:</span>
- <span class="sd"> InvalidGithubURL: If the URL is not a valid github issue URL</span>
- <span class="sd"> """</span>
- <span class="n">match</span> <span class="o">=</span> <span class="n">GITHUB_ISSUE_URL_PATTERN</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">issue_url</span><span class="p">)</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">match</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Invalid GitHub issue URL: </span><span class="si">{</span><span class="n">issue_url</span><span class="si">}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="n">InvalidGithubURL</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="n">res</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
- <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="o">==</span> <span class="mi">3</span>
- <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="c1"># type: ignore</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.parse_gh_repo_url" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">parse_gh_repo_url</span><span class="p">(</span><span class="n">repo_url</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p><span class="doc-section-title">Returns:</span></p>
- <table>
- <thead>
- <tr>
- <th>Name</th> <th>Type</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td><code>owner</code></td> <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Repo owner/org</p>
- </div>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>repo</code></td> <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Repo name</p>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- <p><span class="doc-section-title">Raises:</span></p>
- <table>
- <thead>
- <tr>
- <th>Type</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td>
- <code><span title="sweagent.environment.utils.InvalidGithubURL">InvalidGithubURL</span></code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>If the URL is not a valid github repo URL</p>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">675</span>
- <span class="normal">676</span>
- <span class="normal">677</span>
- <span class="normal">678</span>
- <span class="normal">679</span>
- <span class="normal">680</span>
- <span class="normal">681</span>
- <span class="normal">682</span>
- <span class="normal">683</span>
- <span class="normal">684</span>
- <span class="normal">685</span>
- <span class="normal">686</span>
- <span class="normal">687</span>
- <span class="normal">688</span>
- <span class="normal">689</span>
- <span class="normal">690</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">parse_gh_repo_url</span><span class="p">(</span><span class="n">repo_url</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
- <span class="w"> </span><span class="sd">"""</span>
- <span class="sd"> Returns:</span>
- <span class="sd"> owner: Repo owner/org</span>
- <span class="sd"> repo: Repo name</span>
- <span class="sd"> Raises:</span>
- <span class="sd"> InvalidGithubURL: If the URL is not a valid github repo URL</span>
- <span class="sd"> """</span>
- <span class="n">match</span> <span class="o">=</span> <span class="n">GITHUB_REPO_URL_PATTERN</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">repo_url</span><span class="p">)</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">match</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Invalid GitHub issue URL: </span><span class="si">{</span><span class="n">repo_url</span><span class="si">}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="n">InvalidGithubURL</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="n">res</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
- <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span>
- <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="c1"># type: ignore</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.read_session_with_timeout" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">read_session_with_timeout</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">terminal_pattern</span><span class="p">,</span> <span class="n">timeout_duration</span><span class="p">,</span> <span class="n">no_output_timeout_duration</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Read data from a subprocess with a timeout.
- This function uses a file descriptor to read data from the subprocess in a non-blocking way.</p>
- <p><span class="doc-section-title">Parameters:</span></p>
- <table>
- <thead>
- <tr>
- <th>Name</th>
- <th>Type</th>
- <th>Description</th>
- <th>Default</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td><code>session</code></td>
- <td>
- <code><span title="subprocess.Popen">Popen</span></code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>The session subprocess.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>terminal_pattern</code></td>
- <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>the terminal pattern to indicate end of output.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>timeout_duration</code></td>
- <td>
- <code>int | float</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>The timeout duration in seconds.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- </tbody>
- </table>
- <p><span class="doc-section-title">Returns:</span></p>
- <table>
- <thead>
- <tr>
- <th>Type</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Output</p>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- <p><span class="doc-section-title">Raises:</span></p>
- <table>
- <thead>
- <tr>
- <th>Type</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td>
- <code>TimeoutError</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>If the timeout duration is reached while reading from the subprocess.</p>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">299</span>
- <span class="normal">300</span>
- <span class="normal">301</span>
- <span class="normal">302</span>
- <span class="normal">303</span>
- <span class="normal">304</span>
- <span class="normal">305</span>
- <span class="normal">306</span>
- <span class="normal">307</span>
- <span class="normal">308</span>
- <span class="normal">309</span>
- <span class="normal">310</span>
- <span class="normal">311</span>
- <span class="normal">312</span>
- <span class="normal">313</span>
- <span class="normal">314</span>
- <span class="normal">315</span>
- <span class="normal">316</span>
- <span class="normal">317</span>
- <span class="normal">318</span>
- <span class="normal">319</span>
- <span class="normal">320</span>
- <span class="normal">321</span>
- <span class="normal">322</span>
- <span class="normal">323</span>
- <span class="normal">324</span>
- <span class="normal">325</span>
- <span class="normal">326</span>
- <span class="normal">327</span>
- <span class="normal">328</span>
- <span class="normal">329</span>
- <span class="normal">330</span>
- <span class="normal">331</span>
- <span class="normal">332</span>
- <span class="normal">333</span>
- <span class="normal">334</span>
- <span class="normal">335</span>
- <span class="normal">336</span>
- <span class="normal">337</span>
- <span class="normal">338</span>
- <span class="normal">339</span>
- <span class="normal">340</span>
- <span class="normal">341</span>
- <span class="normal">342</span>
- <span class="normal">343</span>
- <span class="normal">344</span>
- <span class="normal">345</span>
- <span class="normal">346</span>
- <span class="normal">347</span>
- <span class="normal">348</span>
- <span class="normal">349</span>
- <span class="normal">350</span>
- <span class="normal">351</span>
- <span class="normal">352</span>
- <span class="normal">353</span>
- <span class="normal">354</span>
- <span class="normal">355</span>
- <span class="normal">356</span>
- <span class="normal">357</span>
- <span class="normal">358</span>
- <span class="normal">359</span>
- <span class="normal">360</span>
- <span class="normal">361</span>
- <span class="normal">362</span>
- <span class="normal">363</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">read_session_with_timeout</span><span class="p">(</span>
- <span class="n">session</span><span class="p">:</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">,</span>
- <span class="n">terminal_pattern</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
- <span class="n">timeout_duration</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span><span class="p">,</span>
- <span class="n">no_output_timeout_duration</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span><span class="p">,</span>
- <span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""</span>
- <span class="sd"> Read data from a subprocess with a timeout.</span>
- <span class="sd"> This function uses a file descriptor to read data from the subprocess in a non-blocking way.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> session: The session subprocess.</span>
- <span class="sd"> terminal_pattern: the terminal pattern to indicate end of output.</span>
- <span class="sd"> timeout_duration: The timeout duration in seconds.</span>
- <span class="sd"> Returns:</span>
- <span class="sd"> Output</span>
- <span class="sd"> Raises:</span>
- <span class="sd"> TimeoutError: If the timeout duration is reached while reading from the subprocess.</span>
- <span class="sd"> """</span>
- <span class="n">buffer</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span>
- <span class="n">fd</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span>
- <span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
- <span class="n">end_time</span> <span class="o">=</span> <span class="n">start_time</span> <span class="o">+</span> <span class="n">timeout_duration</span>
- <span class="n">end_time_no_output</span> <span class="o">=</span> <span class="n">start_time</span> <span class="o">+</span> <span class="n">no_output_timeout_duration</span>
- <span class="c1"># Select is not available on windows</span>
- <span class="kn">import</span> <span class="nn">select</span>
- <span class="k">def</span> <span class="nf">ready_to_read</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
- <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">([</span><span class="n">fd</span><span class="p">],</span> <span class="p">[],</span> <span class="p">[],</span> <span class="mf">0.01</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
- <span class="n">command_done</span> <span class="o">=</span> <span class="kc">False</span>
- <span class="k">while</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o"><</span> <span class="nb">min</span><span class="p">(</span><span class="n">end_time</span><span class="p">,</span> <span class="n">end_time_no_output</span><span class="p">)</span> <span class="ow">and</span> <span class="n">session</span><span class="o">.</span><span class="n">poll</span><span class="p">()</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">if</span> <span class="n">ready_to_read</span><span class="p">(</span><span class="n">fd</span><span class="p">):</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">data</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mi">4096</span><span class="p">)</span>
- <span class="k">except</span> <span class="ne">BlockingIOError</span><span class="p">:</span>
- <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"BlockingIOError while reading from subprocess."</span><span class="p">,</span> <span class="n">exc_info</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
- <span class="k">break</span>
- <span class="k">if</span> <span class="n">data</span><span class="p">:</span>
- <span class="n">end_time_no_output</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">no_output_timeout_duration</span>
- <span class="n">buffer</span> <span class="o">+=</span> <span class="n">data</span>
- <span class="k">if</span> <span class="n">terminal_pattern</span> <span class="ow">in</span> <span class="n">buffer</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">"backslashreplace"</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"</span><span class="se">\r\n</span><span class="s2">"</span><span class="p">,</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">):</span>
- <span class="n">command_done</span> <span class="o">=</span> <span class="kc">True</span>
- <span class="k">break</span>
- <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.01</span><span class="p">)</span> <span class="c1"># Prevents CPU hogging</span>
- <span class="n">decoded</span> <span class="o">=</span> <span class="n">buffer</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">"backslashreplace"</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"</span><span class="se">\r\n</span><span class="s2">"</span><span class="p">,</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
- <span class="n">body</span> <span class="o">=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">line</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">decoded</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">terminal_pattern</span><span class="p">))</span>
- <span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">poll</span><span class="p">()</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Subprocess exited unexpectedly.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">decoded</span><span class="si">}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
- <span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">command_done</span> <span class="ow">and</span> <span class="n">current_time</span> <span class="o">>=</span> <span class="nb">min</span><span class="p">(</span><span class="n">end_time</span><span class="p">,</span> <span class="n">end_time_no_output</span><span class="p">):</span>
- <span class="k">if</span> <span class="n">current_time</span> <span class="o">>=</span> <span class="n">end_time</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Timeout reached while reading from subprocess.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">decoded</span><span class="si">}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="ne">TimeoutError</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"No output timeout reached while reading from subprocess.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">decoded</span><span class="si">}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="n">NoOutputTimeoutError</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">body</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.read_with_timeout" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">read_with_timeout</span><span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="n">pid_func</span><span class="p">,</span> <span class="n">timeout_duration</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Read data from a subprocess with a timeout.
- This function uses a file descriptor to read data from the subprocess in a non-blocking way.</p>
- <p><span class="doc-section-title">Parameters:</span></p>
- <table>
- <thead>
- <tr>
- <th>Name</th>
- <th>Type</th>
- <th>Description</th>
- <th>Default</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td><code>container</code></td>
- <td>
- <code><span title="subprocess.Popen">Popen</span></code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>The subprocess container.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>pid_func</code></td>
- <td>
- <code><span title="typing.Callable">Callable</span></code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>A function that returns a list of process IDs (except the PID of the main process).</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>timeout_duration</code></td>
- <td>
- <code>int | float</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>The timeout duration in seconds.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- </tbody>
- </table>
- <p><span class="doc-section-title">Returns:</span></p>
- <table>
- <thead>
- <tr>
- <th>Name</th> <th>Type</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td><code>output</code></td> <td>
- <code>str</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>The data read from the subprocess, stripped of trailing newline characters.</p>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- <p><span class="doc-section-title">Raises:</span></p>
- <table>
- <thead>
- <tr>
- <th>Type</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td>
- <code>TimeoutError</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>If the timeout duration is reached while reading from the subprocess.</p>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">139</span>
- <span class="normal">140</span>
- <span class="normal">141</span>
- <span class="normal">142</span>
- <span class="normal">143</span>
- <span class="normal">144</span>
- <span class="normal">145</span>
- <span class="normal">146</span>
- <span class="normal">147</span>
- <span class="normal">148</span>
- <span class="normal">149</span>
- <span class="normal">150</span>
- <span class="normal">151</span>
- <span class="normal">152</span>
- <span class="normal">153</span>
- <span class="normal">154</span>
- <span class="normal">155</span>
- <span class="normal">156</span>
- <span class="normal">157</span>
- <span class="normal">158</span>
- <span class="normal">159</span>
- <span class="normal">160</span>
- <span class="normal">161</span>
- <span class="normal">162</span>
- <span class="normal">163</span>
- <span class="normal">164</span>
- <span class="normal">165</span>
- <span class="normal">166</span>
- <span class="normal">167</span>
- <span class="normal">168</span>
- <span class="normal">169</span>
- <span class="normal">170</span>
- <span class="normal">171</span>
- <span class="normal">172</span>
- <span class="normal">173</span>
- <span class="normal">174</span>
- <span class="normal">175</span>
- <span class="normal">176</span>
- <span class="normal">177</span>
- <span class="normal">178</span>
- <span class="normal">179</span>
- <span class="normal">180</span>
- <span class="normal">181</span>
- <span class="normal">182</span>
- <span class="normal">183</span>
- <span class="normal">184</span>
- <span class="normal">185</span>
- <span class="normal">186</span>
- <span class="normal">187</span>
- <span class="normal">188</span>
- <span class="normal">189</span>
- <span class="normal">190</span>
- <span class="normal">191</span>
- <span class="normal">192</span>
- <span class="normal">193</span>
- <span class="normal">194</span>
- <span class="normal">195</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">read_with_timeout</span><span class="p">(</span><span class="n">container</span><span class="p">:</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">,</span> <span class="n">pid_func</span><span class="p">:</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">timeout_duration</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
- <span class="w"> </span><span class="sd">"""</span>
- <span class="sd"> Read data from a subprocess with a timeout.</span>
- <span class="sd"> This function uses a file descriptor to read data from the subprocess in a non-blocking way.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> container: The subprocess container.</span>
- <span class="sd"> pid_func: A function that returns a list of process IDs (except the PID of the main process).</span>
- <span class="sd"> timeout_duration: The timeout duration in seconds.</span>
- <span class="sd"> Returns:</span>
- <span class="sd"> output: The data read from the subprocess, stripped of trailing newline characters.</span>
- <span class="sd"> Raises:</span>
- <span class="sd"> TimeoutError: If the timeout duration is reached while reading from the subprocess.</span>
- <span class="sd"> """</span>
- <span class="n">buffer</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span>
- <span class="n">fd</span> <span class="o">=</span> <span class="n">container</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span>
- <span class="n">end_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout_duration</span>
- <span class="c1"># Select is not available on windows</span>
- <span class="n">is_windows</span> <span class="o">=</span> <span class="n">platform</span><span class="o">.</span><span class="n">system</span><span class="p">()</span> <span class="o">==</span> <span class="s2">"Windows"</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">is_windows</span><span class="p">:</span>
- <span class="kn">import</span> <span class="nn">select</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">os</span><span class="o">.</span><span class="n">set_blocking</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">ready_to_read</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
- <span class="k">if</span> <span class="n">is_windows</span><span class="p">:</span>
- <span class="c1"># We can't do the extra check</span>
- <span class="k">return</span> <span class="kc">True</span>
- <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">([</span><span class="n">fd</span><span class="p">],</span> <span class="p">[],</span> <span class="p">[],</span> <span class="mf">0.01</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
- <span class="k">while</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o"><</span> <span class="n">end_time</span><span class="p">:</span>
- <span class="n">pids</span> <span class="o">=</span> <span class="n">pid_func</span><span class="p">()</span>
- <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">pids</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
- <span class="c1"># There are still PIDs running</span>
- <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.05</span><span class="p">)</span>
- <span class="k">continue</span>
- <span class="k">if</span> <span class="n">ready_to_read</span><span class="p">(</span><span class="n">fd</span><span class="p">):</span>
- <span class="n">data</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mi">4096</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">data</span><span class="p">:</span>
- <span class="n">buffer</span> <span class="o">+=</span> <span class="n">data</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="c1"># No more data to read</span>
- <span class="k">break</span>
- <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.05</span><span class="p">)</span> <span class="c1"># Prevents CPU hogging</span>
- <span class="k">if</span> <span class="n">container</span><span class="o">.</span><span class="n">poll</span><span class="p">()</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Subprocess exited unexpectedly.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">buffer</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span><span class="si">}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">>=</span> <span class="n">end_time</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Timeout reached while reading from subprocess.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">buffer</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span><span class="si">}</span><span class="se">\n</span><span class="s2">Running PIDs: </span><span class="si">{</span><span class="n">pids</span><span class="si">}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="ne">TimeoutError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="n">decoded</span> <span class="o">=</span> <span class="n">buffer</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">"backslashreplace"</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"</span><span class="se">\r\n</span><span class="s2">"</span><span class="p">,</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
- <span class="k">return</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">line</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">decoded</span><span class="o">.</span><span class="n">splitlines</span><span class="p">())</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- <div class="doc doc-object doc-function">
- <h2 id="sweagent.environment.utils.read_with_timeout_experimental" class="doc doc-heading">
- <code class="highlight language-python"><span class="n">read_with_timeout_experimental</span><span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="n">timeout_duration</span><span class="p">,</span> <span class="n">no_output_timeout_duration</span><span class="p">)</span></code>
- </h2>
- <div class="doc doc-contents ">
- <p>Read data from a subprocess with a timeout.
- This function uses a file descriptor to read data from the subprocess in a non-blocking way.</p>
- <p>NOTE: This is an experimental implementation that is faster than <code>read_with_timeout</code>, but
- has not been thoroughly tested.</p>
- <p><span class="doc-section-title">Parameters:</span></p>
- <table>
- <thead>
- <tr>
- <th>Name</th>
- <th>Type</th>
- <th>Description</th>
- <th>Default</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td><code>container</code></td>
- <td>
- <code><span title="subprocess.Popen">Popen</span></code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>The subprocess container.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>timeout_duration</code></td>
- <td>
- <code>int | float</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>The timeout duration in seconds.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- <tr class="doc-section-item">
- <td><code>no_output_timeout_duration</code></td>
- <td>
- <code>int | float</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>The timeout duration to wait if no output is produced, in seconds.</p>
- </div>
- </td>
- <td>
- <em>required</em>
- </td>
- </tr>
- </tbody>
- </table>
- <p><span class="doc-section-title">Returns:</span></p>
- <table>
- <thead>
- <tr>
- <th>Type</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td>
- <code>tuple[str, str]</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>Output and exit code, both as strings (!)</p>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- <p><span class="doc-section-title">Raises:</span></p>
- <table>
- <thead>
- <tr>
- <th>Type</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr class="doc-section-item">
- <td>
- <code>TimeoutError</code>
- </td>
- <td>
- <div class="doc-md-description">
- <p>If the timeout duration is reached while reading from the subprocess.</p>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- <details class="quote">
- <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">217</span>
- <span class="normal">218</span>
- <span class="normal">219</span>
- <span class="normal">220</span>
- <span class="normal">221</span>
- <span class="normal">222</span>
- <span class="normal">223</span>
- <span class="normal">224</span>
- <span class="normal">225</span>
- <span class="normal">226</span>
- <span class="normal">227</span>
- <span class="normal">228</span>
- <span class="normal">229</span>
- <span class="normal">230</span>
- <span class="normal">231</span>
- <span class="normal">232</span>
- <span class="normal">233</span>
- <span class="normal">234</span>
- <span class="normal">235</span>
- <span class="normal">236</span>
- <span class="normal">237</span>
- <span class="normal">238</span>
- <span class="normal">239</span>
- <span class="normal">240</span>
- <span class="normal">241</span>
- <span class="normal">242</span>
- <span class="normal">243</span>
- <span class="normal">244</span>
- <span class="normal">245</span>
- <span class="normal">246</span>
- <span class="normal">247</span>
- <span class="normal">248</span>
- <span class="normal">249</span>
- <span class="normal">250</span>
- <span class="normal">251</span>
- <span class="normal">252</span>
- <span class="normal">253</span>
- <span class="normal">254</span>
- <span class="normal">255</span>
- <span class="normal">256</span>
- <span class="normal">257</span>
- <span class="normal">258</span>
- <span class="normal">259</span>
- <span class="normal">260</span>
- <span class="normal">261</span>
- <span class="normal">262</span>
- <span class="normal">263</span>
- <span class="normal">264</span>
- <span class="normal">265</span>
- <span class="normal">266</span>
- <span class="normal">267</span>
- <span class="normal">268</span>
- <span class="normal">269</span>
- <span class="normal">270</span>
- <span class="normal">271</span>
- <span class="normal">272</span>
- <span class="normal">273</span>
- <span class="normal">274</span>
- <span class="normal">275</span>
- <span class="normal">276</span>
- <span class="normal">277</span>
- <span class="normal">278</span>
- <span class="normal">279</span>
- <span class="normal">280</span>
- <span class="normal">281</span>
- <span class="normal">282</span>
- <span class="normal">283</span>
- <span class="normal">284</span>
- <span class="normal">285</span>
- <span class="normal">286</span>
- <span class="normal">287</span>
- <span class="normal">288</span>
- <span class="normal">289</span>
- <span class="normal">290</span>
- <span class="normal">291</span>
- <span class="normal">292</span>
- <span class="normal">293</span>
- <span class="normal">294</span>
- <span class="normal">295</span>
- <span class="normal">296</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">read_with_timeout_experimental</span><span class="p">(</span>
- <span class="n">container</span><span class="p">:</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">,</span> <span class="n">timeout_duration</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span><span class="p">,</span> <span class="n">no_output_timeout_duration</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span>
- <span class="p">)</span> <span class="o">-></span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
- <span class="w"> </span><span class="sd">"""</span>
- <span class="sd"> Read data from a subprocess with a timeout.</span>
- <span class="sd"> This function uses a file descriptor to read data from the subprocess in a non-blocking way.</span>
- <span class="sd"> NOTE: This is an experimental implementation that is faster than `read_with_timeout`, but</span>
- <span class="sd"> has not been thoroughly tested.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> container: The subprocess container.</span>
- <span class="sd"> timeout_duration: The timeout duration in seconds.</span>
- <span class="sd"> no_output_timeout_duration: The timeout duration to wait if no output is produced, in seconds.</span>
- <span class="sd"> Returns:</span>
- <span class="sd"> Output and exit code, both as strings (!)</span>
- <span class="sd"> Raises:</span>
- <span class="sd"> TimeoutError: If the timeout duration is reached while reading from the subprocess.</span>
- <span class="sd"> """</span>
- <span class="n">buffer</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span>
- <span class="n">fd</span> <span class="o">=</span> <span class="n">container</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span>
- <span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
- <span class="n">end_time</span> <span class="o">=</span> <span class="n">start_time</span> <span class="o">+</span> <span class="n">timeout_duration</span>
- <span class="n">end_time_no_output</span> <span class="o">=</span> <span class="n">start_time</span> <span class="o">+</span> <span class="n">no_output_timeout_duration</span>
- <span class="c1"># Select is not available on windows</span>
- <span class="n">is_windows</span> <span class="o">=</span> <span class="n">platform</span><span class="o">.</span><span class="n">system</span><span class="p">()</span> <span class="o">==</span> <span class="s2">"Windows"</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">is_windows</span><span class="p">:</span>
- <span class="kn">import</span> <span class="nn">select</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">os</span><span class="o">.</span><span class="n">set_blocking</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">ready_to_read</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
- <span class="k">if</span> <span class="n">is_windows</span><span class="p">:</span>
- <span class="c1"># We can't do the extra check</span>
- <span class="k">return</span> <span class="kc">True</span>
- <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">([</span><span class="n">fd</span><span class="p">],</span> <span class="p">[],</span> <span class="p">[],</span> <span class="mf">0.01</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
- <span class="n">process_done</span> <span class="o">=</span> <span class="kc">False</span>
- <span class="k">while</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o"><</span> <span class="nb">min</span><span class="p">(</span><span class="n">end_time</span><span class="p">,</span> <span class="n">end_time_no_output</span><span class="p">):</span>
- <span class="k">if</span> <span class="n">ready_to_read</span><span class="p">(</span><span class="n">fd</span><span class="p">):</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">data</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mi">4096</span><span class="p">)</span>
- <span class="k">except</span> <span class="ne">BlockingIOError</span><span class="p">:</span>
- <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"BlockingIOError while reading from subprocess."</span><span class="p">,</span> <span class="n">exc_info</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
- <span class="k">break</span>
- <span class="k">if</span> <span class="n">data</span><span class="p">:</span>
- <span class="n">end_time_no_output</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">no_output_timeout_duration</span>
- <span class="n">buffer</span> <span class="o">+=</span> <span class="n">data</span>
- <span class="k">if</span> <span class="n">PROCESS_DONE_MARKER_START</span> <span class="ow">in</span> <span class="n">buffer</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">"backslashreplace"</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"</span><span class="se">\r\n</span><span class="s2">"</span><span class="p">,</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">):</span>
- <span class="n">process_done</span> <span class="o">=</span> <span class="kc">True</span>
- <span class="k">break</span>
- <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.01</span><span class="p">)</span> <span class="c1"># Prevents CPU hogging</span>
- <span class="n">decoded</span> <span class="o">=</span> <span class="n">buffer</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">"backslashreplace"</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"</span><span class="se">\r\n</span><span class="s2">"</span><span class="p">,</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
- <span class="n">body</span> <span class="o">=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">line</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">decoded</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">PROCESS_DONE_MARKER_START</span><span class="p">))</span>
- <span class="k">if</span> <span class="n">container</span><span class="o">.</span><span class="n">poll</span><span class="p">()</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Subprocess exited unexpectedly.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">decoded</span><span class="si">}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
- <span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">process_done</span> <span class="ow">and</span> <span class="n">current_time</span> <span class="o">>=</span> <span class="nb">min</span><span class="p">(</span><span class="n">end_time</span><span class="p">,</span> <span class="n">end_time_no_output</span><span class="p">):</span>
- <span class="k">if</span> <span class="n">current_time</span> <span class="o">>=</span> <span class="n">end_time</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Timeout reached while reading from subprocess.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">decoded</span><span class="si">}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="ne">TimeoutError</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"No output timeout reached while reading from subprocess.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">decoded</span><span class="si">}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="n">NoOutputTimeoutError</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
- <span class="n">_check_for_too_many_non_unicode_bytes</span><span class="p">(</span><span class="n">buffer</span><span class="o">=</span><span class="n">buffer</span><span class="p">)</span>
- <span class="n">_results</span> <span class="o">=</span> <span class="n">PROCESS_DONE_REGEX</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">decoded</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">_results</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Could not find process done marker in last line: </span><span class="si">{</span><span class="n">decoded</span><span class="si">=}</span><span class="s2">, </span><span class="si">{</span><span class="n">body</span><span class="si">=}</span><span class="s2">"</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="n">exit_code</span> <span class="o">=</span> <span class="n">_results</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">body</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">PROCESS_DONE_MARKER_START</span><span class="si">}{</span><span class="n">exit_code</span><span class="si">}{</span><span class="n">PROCESS_DONE_MARKER_END</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span> <span class="s2">""</span><span class="p">),</span> <span class="n">exit_code</span>
- </code></pre></div></td></tr></table></div>
- </details>
- </div>
- </div>
- </div>
- </div>
- </div>
-
- </article>
- </div>
-
-
- <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
- </div>
-
- </main>
-
- <footer class="md-footer">
-
-
-
- <nav class="md-footer__inner md-grid" aria-label="Footer" >
-
-
- <a href="../env/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Environment">
- <div class="md-footer__button md-icon">
-
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
- </div>
- <div class="md-footer__title">
- <span class="md-footer__direction">
- Previous
- </span>
- <div class="md-ellipsis">
- Environment
- </div>
- </div>
- </a>
-
-
-
- <a href="../../faq/" class="md-footer__link md-footer__link--next" aria-label="Next: FAQ">
- <div class="md-footer__title">
- <span class="md-footer__direction">
- Next
- </span>
- <div class="md-ellipsis">
- FAQ
- </div>
- </div>
- <div class="md-footer__button md-icon">
-
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
- </div>
- </a>
-
- </nav>
-
-
- <div class="md-footer-meta md-typeset">
- <div class="md-footer-meta__inner md-grid">
- <div class="md-copyright">
-
-
- Made with
- <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
- Material for MkDocs
- </a>
-
- </div>
-
- </div>
- </div>
- </footer>
-
- </div>
- <div class="md-dialog" data-md-component="dialog">
- <div class="md-dialog__inner md-typeset"></div>
- </div>
-
-
- <script id="__config" type="application/json">{"base": "../..", "features": ["navigation.indexes", "content.action.edit", "navigation.footer", "content.code.copy", "content.footnote.tooltips", "header.autohide", "announce.dismiss"], "search": "../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
-
-
- <script src="../../assets/javascripts/bundle.525ec568.min.js"></script>
-
-
- <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
- document$.subscribe(() => { lightbox.reload() });
- </script></body>
- </html>
|