Artikel Beroenden · Risk

Beroenden som AI föreslår

Du ber om datumhantering och får tre rader kod, en importrad och ett paketnamn du inte känner igen. Namnet ser rimligt ut, koden ser rimlig ut, och installationskommandot ligger färdigt att klistra in. Frågan ingen ställer är hur modellen vet att paketet finns — och svaret är att den inte vet det.

Senast granskad: 31 jul 2026

En mörk metallplatta med en fyrkantig öppning i mitten, genomlyst av en skarp grön ljusstråle. Till höger svävar en enskild modul utanför öppningen, och från vänster lutar sig en abstrakt primatprofil byggd av sammanlänkade noder in mot ljuset.
Kontrollen görs medan modulen fortfarande är utanför — väl på plats är den svår att få ut igen.

Kort sagt

Ett paketförslag utan färsk registerkontroll är ett minne, inte en uppslagning. Modellen återger vad som var vanligt i träningsdatan. Därför uppstår två olika fel: paketet finns inte alls, eller det finns men är fel val i dag. Båda avgörs på några minuter före installationen — och blir dyra att upptäcka efteråt, eftersom ett beroende är den svåraste raden att ta bort.

Utan färska källor minns modellen namn — den slår inte upp dem

Ett språkmodellsvar som inte använder registret eller någon annan aktuell källa bygger på mönster i text modellen har sett. Paketnamn förekommer ofta i den texten — i kodexempel, svar på forum, blogginlägg och dokumentation. Att generera ett namn som ser ut som ett paketnamn är därför lätt, och det säger ingenting om huruvida namnet motsvarar något som går att installera.

Det gäller även när modellen råkar ha rätt. Utan en redovisad källa kan du inte se om namnet hämtades från registret eller genererades ur samma mönster som ett påhittat. Tonfallet avslöjar inte skillnaden. Det gör däremot en länk till registerposten, publiceraren och det släpp som förslaget bygger på.

Lägg till tidsaspekten. Träningsdata har en horisont, och paketvärlden rör sig snabbare än den. Ett bibliotek kan sedan dess ha bytt namn, delats upp, ersatts av något inbyggt i språket eller slutat underhållas. Ett verktyg med nätåtkomst kan överbrygga glappet, men bara om det faktiskt hämtar aktuell registerdata — nätåtkomst i sig gör inte svaret färskt.

Be agenten visa registerkontrollen

En agent som kan söka i registret kan kontrollera paketet före förslaget. Be då om register-URL, publicerare och datum för senaste släpp. Att i stället köra installationen är ingen säker kontroll: ett lyckat kommando betyder bara att något med namnet finns, inte att det är rätt paket, underhållet eller rimligt licensierat.

Fel ett: paketet finns inte

Det ofarliga utfallet är att installationen misslyckas direkt. Du får ett felmeddelande, konstaterar att namnet var påhittat och letar vidare. Kostnaden är några minuter.

Det obehagliga utfallet är att den lyckas. En studie från USENIX Security visar att påhittade paketnamn kan återkomma, vilket gör ett ledigt namn förutsägbart för den som vill publicera skadlig kod under det. Registret vet inte att namnet uppstod i ett modellsvar. Risken börjar dessutom före importen: npm kör installationsskript, och pip kan köra paketets byggbackend vid installation från en källdistribution.

Det här är också skälet till att felet inte kan hanteras som ett stavfel. Ett namn du aldrig har sett förut ska kontrolleras mot det officiella registret innan det körs, inte testas genom att installeras och se vad som händer.

Ett namn du inte känner igen

Fel två: paketet finns, men är fel val

Det vanligare felet är tråkigare och märks senare. Paketet existerar, gör ungefär det du bad om, och passerar därför obemärkt in i bygget. Problemet visar sig först månader senare, när det ska uppgraderas eller bytas.

Övergivet
Fungerar i dag, men ingen har rört det på länge. Det som stannar är säkerhetsfixar och kompatibilitet med nya språkversioner. Modellen föreslår det just för att det var populärt när träningsdatan skrevs.
Fel licens
En licens som är oproblematisk i ett internt verktyg kan vara oacceptabel i en produkt ni distribuerar. Modellen känner inte era regler och tar sällan upp frågan självmant.
Drar in för mycket
Ett paket som löser din uppgift och femtio andra tar med sig hela sitt träd av beroenden. Varje sådant är något ni ärver: dess buggar, dess uppgraderingar och dess angreppsyta.
Löser ett annat problem
Rätt kategori, fel användningsfall — byggt för en miljö, en skala eller ett dataformat som inte är ert. Det märks först när ett gränsfall inte går att uttrycka.

Ingen av de här bristerna syns i diffen. Där står bara en rad i manifestet och en import. Det är därför granskningen av beroenden måste ske när valet görs, inte när koden läses.

Fyra kontroller före installationen

Kontrollerna nedan tar tillsammans några minuter och besvarar frågorna i den ordning som är billigast. Faller den första behövs ingen av de andra.

1
Existens och avsändare. Finns paketet i det officiella registret under exakt det namnet? Stämmer beskrivningen med det modellen påstod? Vem publicerar det, vart leder källkodslänken och finns verifierbar proveniens när registret stöder det? npm beskriver hur proveniens knyter ett paket till publicerare, källcommit och byggmiljö.
2
Underhåll. När kom senaste släppet, och hur ser flödet av öppna ärenden ut? Ett projekt utan aktivitet är inte diskvalificerat — små, färdiga bibliotek finns — men då ska du välja det medvetet och veta att ni får underhålla det själva.
3
Licens. Vilken licens gäller, och är den förenlig med hur er kod distribueras? Fråga en gång vad som gäller hos er och skriv ned svaret — det är exakt en sådan sak som hör hemma i en beslutslogg.
4
Vad följer med? Vilka direkta och transitiva beroenden dras in? Finns installationsskript, binära komponenter eller andra steg som körs under bygget? Ett litet träd är inte automatiskt säkert, men varje oförklarad del ökar det ni behöver granska, uppgradera och kunna ersätta.

Lägg märke till att ingen av kontrollerna kräver att du förstår paketets kod. De handlar om vem som står bakom det, hur levande det är och vad det förpliktigar er till — frågor som inte blir enklare av att läsa implementationen.

Frågan före paketet: behövs det alls?

En modell som ombeds lösa ett problem svarar gärna med ett bibliotek, eftersom det är så problem löses i den text den har läst. Men en del av de föreslagna beroendena ersätter något som redan finns i språket eller ramverket, eller några rader du hade kunnat äga själv.

Ta in paketet
När problemet är genuint svårt eller riskfyllt att göra själv: kryptografi, tidszoner, teckenkodning, protokoll, parsning av format med gränsfall. Här är egen kod nästan alltid sämre än ett underhållet bibliotek.
Skriv det själv
När det rör sig om en handfull rader utan gränsfall, eller om ni bara skulle använda en bråkdel av paketet. Kod ni äger går att läsa, ändra och ta bort — ett beroende går att uppgradera och hoppas på.

Det finns ingen skarp gräns, och den ska inte heller sättas dogmatiskt. Poängen är att frågan ställs. Modellen ställer den inte åt dig, och den föreslår sällan spontant att du klarar dig utan.

Prompten som gör förslaget kontrollerbart

Du kan inte prompta bort behovet av källkontroll. Men du kan be om ett svar som är lätt att kontrollera i stället för ett som är lätt att lita på. Det följer samma tanke som promptguiden: be om det verifierbara, inte om det som låter komplett.

Prompt vid biblioteksval Före installation

Jag behöver lösa [problemet] i [språk och miljö].

Föreslå två alternativ och beskriv vad som skiljer dem — inte bara vilket du föredrar.

Säg också om problemet går att lösa med standardbiblioteket eller några rader egen kod, och vad man i så fall förlorar.

För varje paket: ange register-URL, publicerare, senaste släppdatum, licens och direkta beroenden. Skilj på uppgifter du har hämtat från registret och sådant du antar. Gissa inte namn.

Jag kontrollerar uppgifterna mot registret själv — skriv dem så att källan och kontrolltidpunkten går att se.

Sista raden ändrar mer än den ser ut att göra. Den flyttar svaret från rekommendation till underlag, och den gör det naturligt för modellen att skriva "jag är osäker på om det här paketet fortfarande underhålls" i stället för att välja den formulering som låter mest hjälpsam.

Den svåraste raden att ta bort

Nästan all annan AI-genererad kod går att ändra i efterhand. En funktion kan skrivas om, en modul kan flyttas, en dålig abstraktion kan rivas när någon orkar. Ett beroende beter sig annorlunda: när det väl finns i bygget växer det in i koden på ställen ingen planerade, och kostnaden för att byta stiger med varje månad.

Det är hela argumentet för att lägga minuterna före installationen i stället för i granskningen. Kodgranskningsguiden frågar om nya beroenden behövdes, men vid det laget är importen redan skriven och koden byggd runt den. Verktygsguiden beskriver kontextfilen som verktygen läser — där hör era regler för biblioteksval hemma, så att förslagen kommer rätt formulerade från början.

Modellen får gärna föreslå. Den är ofta bra på att komma på vilka kategorier av lösningar som finns, och betydligt sämre på att avgöra vilken ni ska leva med. Det beslutet — och risken i det — är fortfarande ert.

Läs vidare
Säkerhet och känsliga data: vad som får lämna huset