ZKRINET Docs
Byggblock

AI med egen nyckel

På Zkrinet: lägg till blocket under Byggblock i panelen — ett klick, din egen kod rörs inte och en ögonblicksbild tas först. Installationsstegen nedan gäller om du kör PocketBase själv, till exempel efter en export.

Låt din app prata med en AI-modell — med din egen API-nyckel, som aldrig lämnar servern. Appen anropar en enda rutt; vilken leverantör, modell och systemprompt som används bestäms i adminpanelen. Med kvot per användare, månadsbudget och logg.

Stödjer Anthropic (Claude), OpenAI, Google Gemini och OpenAI-kompatibla tjänster — t.ex. Mistral (EU) eller en egen modell i Ollama/vLLM.

Testat mot PocketBase 0.40.4.

Installation

  1. Kopiera pb_hooks/ och pb_migrations/ till din PocketBase och starta om.
  2. Skapa en rad i zk_ai_installningar:
Fält
leverantoranthropic, openai, gemini eller kompatibel
nyckelDin API-nyckel (dold — bara superusers ser den). Alternativt miljövariabeln ZK_AI_NYCKEL, som vinner. Kan lämnas tom för en lokal modell utan nyckel.
modellKrävs för OpenAI, Gemini och kompatibla. För Anthropic är standard claude-opus-5-5.
bas_urlBara för kompatibel (t.ex. https://api.mistral.ai eller http://localhost:11434), eller om du går via en proxy
max_tokensTak för svarets längd. Anthropic: standard 16 000
anstrangningBara Anthropic: low/medium/high — lägre = snabbare och billigare
dagsgrans_per_anvandareFrågor per användare och dygn (UTC). Standard 50
manadsgrans_tokensStoppa alla anrop när månadens tokens (in + ut) nått gränsen. Tom = ingen gräns — sätt den, det är din nyckel som betalar
spara_innehallAv som standard: loggen sparar bara antal tokens, inte vad som frågades. Slå bara på om du behöver det, och nämn det i din integritetspolicy.
  1. Uppdrag: i zk_ai_uppdrag finns redan assistent. Lägg till fler (t.ex. sammanfatta, oversatt) med egen systemprompt, och vid behov egen modell och max_tokens. Systemprompterna stannar på servern — appen kan varken läsa eller ändra dem.

Användning från appen

const r = await pb.send("/api/zk/ai/chatt", { method: "POST", body: {
  uppdrag: "assistent",                     // valfritt, standard "assistent"
  meddelanden: [
    { roll: "anvandare", text: "Vad kostar frakten?" },
    { roll: "assistent", text: "Frakten kostar 49 kr." },
    { roll: "anvandare", text: "Och till Norge?" },
  ],
}})
// r = { svar: "…", vagrad: false, modell: "…", tokens: { in: 412, ut: 38 }, kvar_idag: 47 }

// Visa hur många frågor som är kvar
const { kvar_idag } = await pb.send("/api/zk/ai/kvot")

Appen skickar hela samtalet varje gång (max 50 meddelanden / 50 000 tecken). Det ska börja och sluta med användarens meddelande. Inloggning krävs.

SvarBetyder
200, vagrad: falseSvaret i svar
200, vagrad: trueModellen avböjde frågan. Visa ett vänligt meddelande.
400Fel i anropet (okänt uppdrag, felaktigt samtal)
429Dagens kvot eller månadens budget är slut
502Leverantören svarade med fel — det riktiga felet står i zk_ai_logg, appen får ett allmänt meddelande
503Inte konfigurerat

Användaren kan läsa sina egna rader i zk_ai_logg (t.ex. för att visa förbrukning).

Bra att veta

Begränsningar

Testa

./bank.py ai

14 tester mot en låtsas-leverantör (inget når internet): rätt format för alla fyra leverantörer, reservmodell bara där den gäller, vägran, att leverantörsfel inte läcker till appen, ogiltiga samtal, dagskvot, månadsbudget, innehållsloggning av/på, behörighet och nyckel ur miljön. Skydden är mutantverifierade.

Vem som ser dina anrop

Blocket skickar texten du bearbetar till den leverantör du valt, med din egen nyckel: Anthropic, OpenAI, Google Gemini eller en egen kompatibel tjänst. Leverantören är då din leverantör, inte Zkrinets. Innehåller anropen personuppgifter ansvarar du för att ha ett biträdesavtal med leverantören och för var datan hamnar. Loggen sparar bara antal tokens om du inte slår på annat.