java-ai-cookbook
Runnable, minimal LLM examples for Java - Spring AI & LangChain4j. RAG, agents, MCP servers, tool calling, structured output, evals.
One folder = one command. Every example is isolated, has its own build, and runs in under a minute.
Why this exists
Most "AI in Java" examples are either a single hello-world or a full demo app with 40 dependencies. This repo sits in between: each recipe shows one pattern, in one file where possible, with no framework magic hidden.
- Same pattern implemented in both Spring AI and LangChain4j, so you can compare them honestly
- Works with OpenAI, Anthropic, and local models via Ollama - switch with an env var
- Every recipe has a test, so the examples don't silently rot
Quick start
git clone https://github.com/alxkm/java-ai-cookbook.git
cd java-ai-cookbook/spring-ai/01-chat-basic
export OPENAI_API_KEY=sk-... # or: export OLLAMA_BASE_URL=http://localhost:11434
./mvnw spring-boot:run
That's it. Open the folder of any recipe and run the command in its README.
Recipes
More recipes are added regularly - see open issues for what's next, or propose one.
Docs
- Spring AI vs LangChain4j - a side-by-side comparison written after implementing all 20 patterns twice, with links into the code for every claim.
- Choosing a model - which model for which recipe, what it costs, and what breaks when you go smaller.
- CONTRIBUTING.md - the recipe template and the conventions.
Repository layout
java-ai-cookbook/
├── spring-ai/
│ ├── 01-chat-basic/ # independent Maven project
│ │ ├── README.md # what it shows, how to run, what to look at
│ │ ├── pom.xml
│ │ └── src/
│ └── ...
├── langchain4j/
│ └── ... # same numbering, same patterns
├── docs/
│ ├── spring-ai-vs-langchain4j.md # honest side-by-side comparison
│ └── choosing-a-model.md
├── .github/workflows/build.yml # one CI job per recipe, no API keys
├── tools/ # run-all-tests, link and config-key checks
├── CONTRIBUTING.md
└── .env.example
Each recipe README follows the same shape: What / Run / Where to look / Gotchas.
Configuration
All recipes read the same environment variables:
Copy .env.example to .env and fill in what you have. Nothing else is required.
Requirements
- Java 21+
- Docker (only for recipes marked with pgvector / Testcontainers)
- One of: an OpenAI key, an Anthropic key, or Ollama running locally
Contributing
Recipes are welcome. Keep them small, keep them runnable, keep them tested. See CONTRIBUTING.md for the recipe template.