AI-Labb1 är en Spring Boot-baserad AI-integration som kommunicerar med språkmodeller via OpenRouter.
Projektet innehåller:
- REST API för AI-chat
- eget webbgränssnitt byggt med JTE
- stöd för olika AI-personligheter
- sessionsbaserad chat history
- retry/backoff och robust felhantering
- Swagger/OpenAPI-dokumentation
- WireMock-baserade integrationstester
- Docker-stöd
Användaren kan skicka meddelanden till en AI-modell via:
- REST API
- webbgränssnitt
Svar genereras via OpenRouter API.
Applikationen stödjer flera personligheter:
| Personality | Beskrivning |
|---|---|
| helper | Hjälpsam och pedagogisk |
| coder | Programmeringslärare |
| pirate | Svarar i piratstil |
Varje session får ett unikt sessionId.
Tidigare meddelanden sparas i minnet så att modellen får kontext mellan requests.
Projektet använder flera resilience-mekanismer via Resilience4j för att hantera fel mot externa AI-tjänster.
Implementerade mekanismer:
- Retry
- Exponential backoff
- Jitter
- Circuit Breaker
- Timeout-hantering
- Concurrency limiting
- Fallback responses
- Global exception handling
Retry används endast för transienta fel såsom:
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
- nätverksfel/timeouts
Retry används INTE för permanenta klientfel såsom:
- 400 Bad Request
- 401 Unauthorized
- 403 Forbidden
Vid upprepade temporära fel aktiveras fallback-logik som returnerar ett kontrollerat felmeddelande istället för att krascha applikationen.
Projektet tar även hänsyn till failure patterns i distribuerade system såsom:
- Retry Storm
- Thundering Herd
- Cascading Failures
- Latency Spikes
Motåtgärder:
- exponential backoff
- jitter
- transient error classification
- circuit breaker
- concurrency limiting
| Klass | Ansvar |
|---|---|
ChatController |
REST-endpoint |
ChatService |
Orkestrerar chatflödet |
OpenRouterClient |
Kommunikation med OpenRouter |
PersonalityService |
Hanterar system prompts/personligheter |
ChatMemoryService |
Sessionshistorik |
GlobalExceptionHandler |
API-felhantering |
OpenRouterClient |
Kommunikation med OpenRouter + resilience/fallback |
{
"personality": "coder",
"message": "skriv hello world i java",
"sessionId": "abc123"
}{
"answer": "public class HelloWorld { ... }",
"sessionId": "abc123"
}Swagger UI finns på:
http://localhost:8080/swagger-ui.html
Chat UI finns på:
http://localhost:8080/chat
Projektet kräver en giltig OpenRouter API-nyckel för att kunna startas och använda AI-funktionerna.
Skapa en API-nyckel via:
ai.base-url=https://openrouter.ai/api/v1
ai.api-key=${OPENROUTER_API_KEY}
ai.model=z-ai/glm-4.5-air:freeProjektet läser INTE automatiskt .env-filer.
Miljövariabeln måste därför sättas manuellt i terminalen eller i IntelliJ innan applikationen startas.
Om API-nyckeln saknas kommer applikationen inte kunna anropa OpenRouter.
ai.base-url=https://openrouter.ai/api/v1
ai.api-key=${OPENROUTER_API_KEY}
ai.model=z-ai/glm-4.5-air:freegit clone <repo-url>
cd AI-Labb1$env:OPENROUTER_API_KEY="din-api-nyckel"set OPENROUTER_API_KEY=din-api-nyckelexport OPENROUTER_API_KEY="din-api-nyckel"echo $env:OPENROUTER_API_KEYecho %OPENROUTER_API_KEY%echo $OPENROUTER_API_KEYOm projektet körs via IntelliJ behöver miljövariabeln sättas i Run Configuration.
- Open Run Configuration
- Välj applikationen
- Gå till "Environment Variables"
- Lägg till:
OPENROUTER_API_KEY=din-api-nyckel
- Starta applikationen
mvn spring-boot:runhttp://localhost:8080/chat
http://localhost:8080/swagger-ui.html
Projektet innehåller:
| Testtyp | Beskrivning |
|---|---|
| Unit tests | Service-logik |
| Controller tests | MockMvc |
| Integration tests | WireMock |
Testerna verifierar bland annat:
- retry-beteende
- retry + fallback
- circuit breaker
- transient vs permanenta fel
- API-fel
- session memory
- personality prompts
- transient felhantering