KI
Chat
Bilde
Transkriber
Oversett
API
Bildesøk
Instillinger

API Dokumentasjon

KitKI består av tre hoved-applikasjoner:

  • KitKi Backend - En FastAPI Python Backend med en Postgres database i bunn. Denne løsningen har ansvaret for å tilby et enhetlig API for KulturITs KI-tjenester slik at de enkelt kan tilbys internt i applikasjonene hos KulturIT, samtidig som det fortinnsvis kun kreves config-endringer for å bytte ut eller tilby andre modeller i sluttbruker-applikasjonene
  • KitKI LLM Service - Et sett med LLM modeller som kjøres i egen infrastruktur for å tilby økt sikkerhet, personvern og/eller nye tjenester
  • KitKi Frontend - En React applikasjon som fungerer som en sluttbrukerapplikasjon, samt en chatbot for å bruke KI-modellene som er tilgjengelig i KitKI

KitKI APIene støtter både sykrone og asynkrone (streaming) forespørsler. Dersom forespørselen sendes over HTTPS, kommer svaret synkront. For asynkrone kall, brukes WebService endepunktene.

Synkrone tekst baserte forespørsler

For å bruke de synkrone tekst baserte forespørslene, send en POST forespørsel til /api-v1/message med følgende JSON payload:

{ "sessionId": "UUID", "model": "o4-mini", "service": "openai", "message": "Can you write two paragraphs about Barrack Obama?" }

Dersom sesionId ikke er angitt, vil backend opprette en sessionId for forespørselen. SessionId benyttes dersom du ønsker å fortsette dialogen med KI-tjenesten slik at den benytter tidligere spørsmål og svar som kontekst til forespørselen. Dersom SessionId er ny, eller ikke er lagt ved behandler KitKI forespørselen som ny og svarer kun på forespørselen angitt i "message".

Når forespørselen er ferdig behandlet, svarer den med følgende JSON struktur:

{ "sessionId": "6bb8ff50-2666-4560-a432-3ff723e2a8a8", "sessionName": "New Session", "content": "Tekstbasert svar fra KI tjenesten", "service": "openai", "model": "o4-mini", "kitkiChatStatus": { "kitkiChatStatus": "done", "sessionId": "6bb8ff50-2666-4560-a432-3ff723e2a8a8", "promptTokens": 17, "responseTokens": 893, "totalTokens": 910, "pricePerInputToken": 1e-06, "pricePerOutputToken": 4e-06, "timestamp": "2025-05-16T11:55:48.039089" }, "createdAt": "2025-05-16T11:55:48.039186" }

Asynkrone forespørsler (WebSockets)

Dersom sessionId opprettes av KitKI, eller dersom sessionId er ny for KitKI, svarer KitKI med den oppdaterte sessionId. For WebService-grensesnittet svarer KI tjenesten aller først med følgende JSON melding:

{ "status":"created", "sessionId":"558e5d7b-5340-4df3-9f49-7091ea246ea1", "sessionName":"Lesning og skriving.", "selectedModel":"o4-mini", "selectedService":"openai" }

Her er:

  • status: angir om chat-session er opprettet ved å angi "created"
  • sessionId: den oppdaterte sessionId for chat-session
  • SessionName: En 4 ords oppsummering av forespørselen
  • selectedModel: Modellen som er benyttet
  • selectedService: KI tjenesten som har behandlet forespørselen

Deretter etterfølges ett og ett token som streames over WebSocketen. Hvert token sendes som ren tekst, og kan være en del av et ord eller en hel setning. Klienten har ansvaret for å sy sammen svaret, som stort sett består av å konkatinere tokene i den rekkefølgen de ankommer uten ytterligere formatering. Svaret som kommer er stort sett i Markdown format.

Når WebService forepørselen er ferdig, sendes det helt til slutt et JSON objekt som oppsummerer forespørslen:

{ "kitkiChatStatus":"done", "sessionId":"9090ba49-b21e-4012-a33a-0644f476d8cd", "promptTokens":20, "responseTokens":333, "totalTokens":353, "pricePerInputToken":"0.000001", "pricePerOutputToken":"0.000004", "timestamp":"2025-05-16T11:06:31.087773" }

Bildeanalyse

Bilder kan analyseres ved å sende en POST til /api-v1/image-analysis. Innholdet er et FORM med feltene:

  • image (binary)
  • description (valgfri tekst)
  • keywords (valgfri komma separert liste)

Responsen kommer som en JSON struktur med liknende innhold som /message APIet:

{ "filename": "tertitt.png", "content_type": "image/png", "description": "Jernbanetrasse", "keywords": "Jernbane, trasse, gammel", "content": { "sessionId": "00fc064a-905f-40cb-bf3b-db9d480c4259", "sessionName": "Ny chat Session", "content": "Bildet viser et gammelt damplokomotiv som trekker en rød passasjervogn langs en jernbanestrekning. Lokomotivet er svart med røde detaljer, og har en karakteristisk skorstein som slipper ut røyk. Passasjervognen er rød med mange vinduer. \n\nJernbanesporet ligger på en grusmasse, og det er flere parallelle spor. Bakgrunnen består av et tett skoglandskap og en bygning. Himelen er lys og tilsynelatende klar. \n\nBildet gir et inntrykk av en tidlig tid innen jernbanens historie, med fokus på en gammel jernbanetrasse.", "service": "ollama", "model": "gemma3:27b", "kitkiChatStatus": { "kitkiChatStatus": "done", "sessionId": "00fc064a-905f-40cb-bf3b-db9d480c4259", "promptTokens": 0, "responseTokens": 0, "totalTokens": 0, "pricePerInputToken": 1e-06, "pricePerOutputToken": 4e-06, "timestamp": "2025-05-20T07:00:54.814289" }, "createdAt": "2025-05-20T07:00:54.814667" } }

Transkribering av tekst fra bilde

Bilder kan transkriberes ved å sende en POST til /api-v1/transcribe. Innholdet er et FORM med feltene:

  • image (binary)
  • description (valgfri tekst)
  • keywords (valgfri komma separert liste)

Responsen kommer som en JSON struktur med liknende innhold som /message APIet:

{ "filename": "handskrevet.png", "content_type": "image/png", "description": "", "keywords": "", "content": { "sessionId": "f8bf014d-be74-43fd-a2d2-e9d613bf0a3e", "sessionName": "Ny chat Session", "content": "Her er en transkripsjon av teksten fra bildet:\n\nBro over Fossum.\n\nDenne Bro er bygget dels som Jernbanebro og dels som Kiørebbro, saaledes at Jernbanen passerer paa Toppen og Kiørebane og Gaande lige nedenunder. Den er opført paa samme Brokar som i 1852 byggede Kiørebbro; af Materiale er hovedsagelig anvendt Jern; og Skinnelegemet er anbragt meget højt, Broen forlænger til begge\n\nSider af de gamle Brokar, saaledes, at den samlede Længde mellem Landkarrene udgjør 760 fod, hvoraf 170 fod udgjør Længden mellem de to midterste Brokar. Skinnernes Højde over Fosens laveste Vandstand udgjør 65 fod, og Høiden over Kiørebanen 21 fod. Fundamenteringen er hovedsagelig lagt paa Fjord, og alt Murverk i Dagen af Granit, sat i Cement. \n\nJernbanematerialerne er fra Firmaet Lecoq & Co. i Belgien, og deres samlede Vægt omtrent 297 Tons eller 606,000 pd. Broen er konstrueret af Ingeniør C. A. Peterson og opført af de fem Jernbanebroer, denne Bro er den største af over Glommen.\n\nNedenfor Broen, hvor Fosens lutter, er opført en Kende, der gaar i smaa Retning, dens Bestemmelse er at give Lagen Anledning til at passere forbi Fosens, hvilket ogsaa skal have været Tilfældet, da den er seet lige til Morfos.", "service": "ollama", "model": "gemma3:27b", "kitkiChatStatus": { "kitkiChatStatus": "done", "sessionId": "f8bf014d-be74-43fd-a2d2-e9d613bf0a3e", "promptTokens": 0, "responseTokens": 0, "totalTokens": 0, "pricePerInputToken": 1e-06, "pricePerOutputToken": 4e-06, "timestamp": "2025-05-20T07:04:13.525056" }, "createdAt": "2025-05-20T07:04:13.525573" } }

Oversettelse av tekst

Bilder kan oversettes ved å sende en POST til /api-v1/translate. Innholdet er en JSON payload:

{ "translateText": { "text": "Oversett denne teksten til engelsk", "toLanguage": "Engelsk", "model": "gemma3:4b" } }

Modellene som foreløpig er tilgjengelige her er gemma3:4b og gemma3:12b. Oversettelsen kommer som en JSON struktur:

{ "translatedText": { "sessionId": "293add40-9087-4fed-b1b7-5541bdd9d4d0", "sessionName": "Ny chat Session", "content": "Albert Einstein was a German-Swiss-American ...", "service": "ollama", "model": "gemma3:4b", "kitkiChatStatus": { "kitkiChatStatus": "done", "sessionId": "293add40-9087-4fed-b1b7-5541bdd9d4d0", "promptTokens": 0, "responseTokens": 0, "totalTokens": 0, "pricePerInputToken": 1e-06, "pricePerOutputToken": 4e-06, "timestamp": "2025-05-20T07:04:55.257400" }, "createdAt": "2025-05-20T07:04:55.257516" } }