Gå til indhold

Kom hurtigt i gang

Fra en tom konto til en hukommelse, du kan søge i

Otte trin, omkring fem minutter, og ét af dem kan ikke fortrydes. Trin to viser en hemmelighed præcis én gang — læs det, før du kører det.

Før du går i gang: hvad en erindring er

To valg former alt, hvad du gemmer — hvis erindring det er, og hvilken samtale den kom fra. Begge er lettere at få rigtige nu end at ændre senere.

Du skriver aldrig en erindring direkte. Du sender samtalebeskeder; de gemmes ordret, og udtrækningen læser dem og skriver de varige fakta, den finder. Derfor kan der ikke søges i noget i samme øjeblik en skrivning returnerer — og derfor er det værd at sende beskederne i deres fulde form: et faktum, der aldrig blev sagt, kan ikke udtrækkes.

Det, en nøgle skriver, er ikke godkendt, før et menneske godkender det. Siden under Gennemgang — Markeret til gennemgang — er der, hvor det sker, og det er det eneste sted i produktet, hvor det kan: en nøgle beviser, hvilken legitimationsoplysning der skrev noget, aldrig at et menneske mente det. Indtil da får en agent, der læser posten, besked via en markering foran teksten.

Et arbejdsområde rummer én ting mere ved siden af erindringerne, og det er værd at vide, før du går i gang. En erindring er et faktum, udtrækningen fandt i en samtale. En procedure er en fremgangsmåde, du skriver med vilje — hvordan I udgiver, hvordan I griber en alarm an, de trin, nogen ellers skulle regne ud igen — og den er versioneret fra oprettelsen, kan deles med arbejdsområdet og læses tilbage i sin helhed. Din agent læser en, før den går i gang, i stedet for at genopfinde den. API-referencen har endpoints og reglerne for, hvem der må ændre en; kommandoreferencen har kommandoerne.

De to slags emner, en erindring kan tilhøre
EmneBrug det tilFor eksempel
memory_type: userDet, du lærer om en person — præferencer, begrænsninger, historik; alt, der stadig bør gælde, næste gang de taler med en af dine agenter.Foretrækker dansk. Allergisk over for skaldyr. Arbejder i Aarhus. Vil have korte svar.
memory_type: agentDet, en agent lærer for sin egen skyld — beslutninger den traf, fremgangsmåder der slog fejl, konventioner den lagde sig fast på. Viden, der tilhører arbejderen, ikke den person den betjente.Prøver dette API to gange, aldrig tre. Denne kundes eksport skal bruge det gamle format.

Vælg én pr. kald: en bruger-erindring kræver et bruger-id, en agent-erindring kræver et agent-id, og en uoverensstemmelse afvises i stedet for stiltiende at blive besvaret fra den forkerte side. Læsninger fungerer på samme måde — og ved en læsning må du helt undlade at nævne et emne, hvilket spænder over alle de emner, nøglen i forvejen kan se. Er du i tvivl om, hvad et faktum er, så spørg, hvem der ville tage fejl, hvis det blev glemt: personen eller agenten.

I praksis skriver du sjældent et id. pfmem init spørger én gang — en person eller en agent, og hvilket id, foreslået ud fra den adresse, din git-opsætning allerede har — og gemmer svaret, så subjekt-flagene er valgfrie derefter. En nøgle kan også bindes til et subjekt, når den udstedes; så bestemmer serveren, det gemte id ignoreres, og POST /api/v2/me fortæller dig, hvad den nøgle, du sidder med, står for. Ved en læsning udvider --all-subjects igen til alle de subjekter, nøglen må se.

Et samtale-id grupperer beskederne i én udveksling. Udtrækning sker pr. samtale, så id'et afgør, hvad der læses sammen — og genbruger du ét id til urelaterede udvekslinger, smelter de sammen til én kontekst. Brug et nyt id pr. samtale, og hold det uændret, så længe samtalen kører.

Skrivninger er asynkrone og returnerer et opgave-id. Spørg til det, eller fremtving arbejdet med en flush, når du har brug for resultater med det samme. En opgave, der fejler, kan køres igen — fra kontrolpanelet eller fra kommandolinjen — og det er sikkert at gentage: udtrækning behandler kun det, der ikke allerede er behandlet, så en gentagelse duplikerer intet.

Værd at gøre fra starten

  • Send en samlet portion ved slutningen af en tur eller en samtale, ikke ét kald pr. besked. Op til 100 beskeder pr. kald.
  • Et id skal blot være stabilt og staves ens, uanset hvor du kalder fra. En e-mailadresse er et fint valg, og det er den, pfmem init foreslår, for de fleste har én, og den skifter sjældent; det, der for alvor koster dig genkaldelse, er at kalde den samme person to forskellige ting.
  • Ét samtale-id pr. samtale, uændret mens den kører, aldrig genbrugt til en anden.
  • Kald flush ved en samtales afslutning. Det koster intet, når der ikke er noget at udtrække, og det er forskellen på, at en erindring er tilgængelig nu og om lidt.
  • Indsnævr læsninger med et app- eller projekt-id frem for at filtrere bagefter. Indsnævring er gratis; det kan aldrig udvide, hvad en nøgle må se.
  • Giv hver agent sin egen nøgle med den snævreste rolle, der virker. En nøgle er der, hvor tilladelsen bor, så en nøgle med mindre rækkevidde er den billigste sikkerhed, du kan købe.
  • Hold øje med fejlede opgaver. En fejl, der er markeret som ikke-genkørbar, betyder, at årsagen ligger i forespørgslen eller opsætningen, og at en uændret gentagelse vil fejle på samme måde.
  1. Opret en konto

    Tilmeld dig med en e-mail, en adgangskode og et navn. Tilmelding kræver en personlig invitation: brug den adresse, den blev sendt til, eller åbn linket i invitationsmailen og tilmeld dig i browseren. Adressen skal bekræftes, før kontoen kan bruges, så dette kald returnerer ingen session — det sender i stedet et link. Åbn linket, og log derefter ind; det andet kald er det, der sætter den cookie, næste trin har brug for.

    POST /api/auth/sign-up/email
    curl -fsS -X POST https://pfmem-api.packagefactory.dk/api/auth/sign-up/email \
      -H 'content-type: application/json' \
      -c cookies.txt \
      -d '{"email":"[email protected]","password":"a-long-passphrase","name":"Your Name"}'

    Indtil adressen er bekræftet, svarer login 403 med EMAIL_NOT_VERIFIED. Linket gælder i én time, og den side, det lander på, kan sende et nyt.

    POST /api/auth/sign-in/email
    curl -fsS -X POST https://pfmem-api.packagefactory.dk/api/auth/sign-in/email \
      -H 'content-type: application/json' \
      -c cookies.txt \
      -d '{"email":"[email protected]","password":"a-long-passphrase"}'

    Du kan også gøre det i browseren. Resultatet er den samme session-cookie. At oprette sig med en adresse, der allerede findes, giver det samme svar som en ny — svaret er bevidst ikke en måde at spørge om, hvilke adresser der er registreret.

  2. Udsted master-nøglen

    Dette ene kald opretter kontoen og udsteder dens første master-nøgle. Det autentificerer med session-cookien frem for en bearer-nøgle, og fordi en cookie følger med af sig selv, skal kaldet gentage sessionens CSRF-token i en header. Hent tokenet først, og udsted så nøglen.

    GET /api/v2/account/csrf-token
    curl -fsS https://pfmem-api.packagefactory.dk/api/v2/account/csrf-token \
      -b cookies.txt
    POST /api/v2/account/master-key
    curl -fsS -X POST https://pfmem-api.packagefactory.dk/api/v2/account/master-key \
      -H 'content-type: application/json' \
      -H 'x-csrf-token: <the token from the call above>' \
      -b cookies.txt \
      -d '{"label":"bootstrap master key","account_name":"Acme"}'
    200 OK
    {
      "request_id": "23ba77f0c6474ccb8dc5d65d1a44d069",
      "data": {
        "key": {
          "key_id": "key_01HQ",
          "tier": "master",
          "label": "bootstrap master key",
          "prefix": "mk_live_",
          "tenant_slug": null,
          "role": null,
          "verbs": ["read", "write", "delete"],
          "created_at": 1755640000000
        },
        "secret": "mk_live_<shown here and nowhere else, ever>"
      }
    }

    Et kald nummer to afvises, fordi en konto har én første master-nøgle, og der er intet at udstede igen. Er hemmeligheden væk, går vejen tilbage gennem rotation, ikke gennem et nyt forsøg.

  3. Opret et arbejdsområde

    Et arbejdsområde er en grænse omkring ét sæt hukommelser — ét pr. kunde, pr. miljø eller pr. projekt. Når du opretter det, får det sit eget private rum, hvor der ikke ligger andet, og hvor intet deles med noget andet arbejdsområde. Slug'en vælger du selv inden for den tilladte form; det interne navn udledes af den og returneres til dig, det sendes aldrig.

    POST /api/v2/admin/tenants
    curl -fsS -X POST https://pfmem-api.packagefactory.dk/api/v2/admin/tenants \
      -H 'authorization: Bearer mk_live_...' \
      -H 'content-type: application/json' \
      -d '{"slug":"acme_prod","display_name":"Acme (production)",
          "active_embedding_version":"external_v1"}'

    Autentificér med master-nøglen som bearer-token herfra og frem. En slug består af små bogstaver, cifre og understreger, op til fyrre tegn — en bindestreg er en valideringsfejl, ikke en slug med en bindestreg i. Embedding-versionen navngiver en post, der allerede findes i registret; det er ikke en betegnelse, du finder på pr. arbejdsområde.

  4. Udsted en nøgle afgrænset til det arbejdsområde

    Master-nøgler er til administration. Daglig trafik bør bære den snævreste legitimation, der stadig virker, så udsted en nøgle afgrænset til ét arbejdsområde, og giv den til klienten. Niveauet og slug'en i bodyen herunder er det, der afgrænser den.

    POST /api/v2/admin/keys
    curl -fsS -X POST https://pfmem-api.packagefactory.dk/api/v2/admin/keys \
      -H 'authorization: Bearer mk_live_...' \
      -H 'content-type: application/json' \
      -d '{"tier":"tenant","label":"acme_prod client","tenant_slug":"acme_prod"}'

    Request-bodyen valideres strengt: et ukendt felt er en valideringsfejl frem for et felt, der stille ignoreres, så et stavet forkert navn fejler højlydt i stedet for at udvide ingenting.

  5. Tilføj dine modelnøgler

    MemoryAgent kører på dine egne modeller: én læser samtaler og trækker de varige fakta ud (udtræk), én gør dem søgbare (embeddings). Intet udtrækkes eller findes, før begge er tilføjet. Gemt uden et arbejdsområde, som nedenfor, gælder en nøgle for alle arbejdsområder, også dem, der oprettes senere. Du kan også tilføje dem på siden Modelnøgler.

    POST /api/v2/admin/credentials
    curl -fsS -X POST https://pfmem-api.packagefactory.dk/api/v2/admin/credentials \
      -H 'authorization: Bearer mk_live_...' \
      -H 'content-type: application/json' \
      -d '{"provider":"deepseek","api_key":"sk-...","uses":[{"purpose":"extraction","model":"deepseek-v4-flash"}]}'
    
    curl -fsS -X POST https://pfmem-api.packagefactory.dk/api/v2/admin/credentials \
      -H 'authorization: Bearer mk_live_...' \
      -H 'content-type: application/json' \
      -d '{"provider":"cohere","api_key":"...","uses":[{"purpose":"embedding","model":"embed-v5.0-fast","dimension":1536}]}'

    Hver nøgle tjekkes, før den gemmes: en udtræksnøgle med et kald på ét token, en embedding-nøgle ved at embedde en kort tekst i den størrelse, du angiver. En model, udbyderen ikke tilbyder, eller en størrelse, den ikke giver, afvises. Ethvert OpenAI-kompatibelt endpoint virker, med bearer-token, egen header, basic auth eller OAuth client credentials.

  6. Installér klienten, og gem nøglen

    Send nøglen ind på standard input frem for som et argument. Et argument er synligt i proceslisten for hver bruger på maskinen og skrives til din shell-historik; standard input er ingen af delene.

    pfmem init
    curl -fsSL https://pfmem-api.packagefactory.dk/install.sh | sh
    cat key.txt | pfmem init

    Konfigurationsfilen oprettes, så kun ejeren kan læse den, og den nøgle, den indeholder, sendes kun til et https-origin eller til loopback.

  7. Gem en samtale

    Indlæsningen er asynkron. Kaldet returnerer, så snart beskederne er persisteret, og giver et task-id tilbage; udtrækningen til søgbare hukommelser sker bagefter. Intet er søgbart i det øjeblik, kaldet returnerer, og det er præcis det, næste trin er til for.

    pfmem add
    pfmem add --mode chat --user-id u_42 --session-id s_1 \
      --idempotency-key batch-2026-08-18-01 \
      --messages '[{"role":"user","content":"I moved to Berlin"}]'

    Idempotensnøglen gør et nyt forsøg efter en timeout sikkert: en gentagelse returnerer det første resultat i stedet for at indlæse den samme batch to gange.

  8. Hent den frem igen

    Fremtving den ventende udtrækning frem for at vente på baggrundspipelinen, og stil så et spørgsmål. Flush blokerer så længe, du tillader; søgningen holder dit spørgsmål op mod det, arbejdsområdet indeholder — både efter betydning og efter de præcise ord — og returnerer et rangeret sæt fakta, ikke et referat.

    pfmem flush · pfmem search
    pfmem flush --session-id s_1 --wait-ms 10000
    pfmem search --memory-type user --user-id u_42 --query "where does he live now?"

    Brug den rangerede søgning, når du har et spørgsmål. Brug den almindelige visning, når du vil have alt, der er gemt om et subjekt, i en stabil rækkefølge og med rigtig paginering.

    pfmem get
    pfmem get --memory-type user --user-id u_42 --limit 50

    Læs det igen: indhold, som ingen har godkendt, kommer med en markering foran, og det, der er tilbageholdt for denne nøgle, oplyses som et antal i stedet for et resultat. Godkendelsen sker i dashboardet under Gennemgang.

Hvor du går hen herfra

Kommandoreferencen dækker hvert flag, exit-koderne og logfilen. API-referencen dækker konvolutten, statuskoderne og de endpoints, disse kommandoer kalder. Begge dækker de procedurer, et arbejdsområde kan holde ved siden af sine erindringer.