59 lines
2.1 KiB
Markdown
59 lines
2.1 KiB
Markdown
# getting-started
|
|
|
|
Companion code for [Spring AI 2.0 in 10 Minutes: ChatClient on Spring Boot 4.1](https://ankurm.com/spring-ai-2-0-chatclient-boot-4-1/)
|
|
on [ankurm.com](https://ankurm.com). One `ChatClient` bean, three endpoints, and a test that
|
|
proves `spring.ai.model.chat` switches the provider without touching either.
|
|
|
|
The deeper walkthrough (what each test caught, the API references) lives in the article's
|
|
accordion sections, not in this README -- see the versions callout and the "going deeper" list
|
|
at the end of each section.
|
|
|
|
## Versions
|
|
|
|
| Component | Version |
|
|
|---|---|
|
|
| Spring Boot | 4.1.1 |
|
|
| Spring AI | 2.0.1 |
|
|
| Java | 25 (LTS) |
|
|
|
|
## Quickstart
|
|
|
|
```bash
|
|
mvn -o test # runs against a scripted ChatModel, no key needed, ~10s
|
|
OPENAI_API_KEY=sk-... ./scripts/run.sh # the real app, port 8080
|
|
```
|
|
|
|
## Endpoints
|
|
|
|
| Method | Path | What it shows |
|
|
|---|---|---|
|
|
| GET | `/api/chat?message=` | `ChatClient.prompt().user(...).call().content()` |
|
|
| GET | `/api/chat/as?voice=&message=` | a templated system prompt filled via `.param(...)` |
|
|
| GET | `/api/chat/stream?message=` | `.stream().content()`, a `Flux<String>` |
|
|
|
|
## Switching providers
|
|
|
|
One property, no code change:
|
|
|
|
```properties
|
|
spring.ai.model.chat=openai # org.springframework.ai.openai.OpenAiChatModel
|
|
spring.ai.model.chat=ollama # org.springframework.ai.ollama.OllamaChatModel
|
|
```
|
|
|
|
`ProviderSwitchTest` proves this mechanically -- it never calls either provider's server, only
|
|
inspects which `ChatModel` bean class the Spring context assembled under each property value.
|
|
|
|
## Output
|
|
|
|
| File | Regenerated by |
|
|
|---|---|
|
|
| `output/01-plain-call.txt` | `ChatClientEndpointsTest` |
|
|
| `output/02-system-template.txt` | `ChatClientEndpointsTest` |
|
|
| `output/03-streaming.txt` | `ChatClientEndpointsTest` |
|
|
| `output/04-provider-switch.txt` | `ProviderSwitchTest` |
|
|
| `output/05-real-network-round-trip.txt` | captured manually against the real OpenAI API; see its own header |
|
|
|
|
`scripts/run-all.sh` regenerates 01-04. 05 is not part of that script -- it needs a live network
|
|
path and a real (even if invalid) key, and is included once as evidence that the wiring reaches
|
|
OpenAI's own server.
|