LLM4S is now onboarded and tracked on Linux Foundation LFX Insights, providing an independent, data-driven view of project health, maintainer activity, development, contributors, and security practices. LFX Insights tracking does not mean that LLM4S is hosted by or part of the Linux Foundation.
This visibility helps contributors, adopters, and organizations evaluate the project's activity and sustainability, strengthening transparency, trust, and readiness for broader community and enterprise adoption.
LLM4S appears in the LLM API Gateways & Local Inference collection alongside widely adopted projects such as Ollama, vLLM, LiteLLM, and Vercel AI SDK. For developers exploring production-minded LLM infrastructure—especially on the JVM and Scala—this makes LLM4S easier to discover, compare, and explore. Collection inclusion provides category context; it does not imply ranking or endorsement.
LLM4S provides a simple, robust, and scalable framework for building LLM applications in Scala. While most LLM work is done in Python, we believe that Scala offers a fundamentally better foundation for building reliable, maintainable AI-powered applications.
LLM4S is under active pre-1.0 development. The latest published release is v0.4.1, targeting Scala 3.7.1 and JDK 21. Its APIs are usable today but are still being stabilized ahead of the 1.0 compatibility commitment.
The framework already provides multi-provider clients, agents and tool calling, RAG and vector stores, memory, guardrails, tracing and metrics, reliability wrappers, workspace isolation, MCP support, and image and speech APIs.
On main, every modularization slice has landed. RAG, knowledge graph, memory, MCP, shared media types, image, and speech have been carved out of llm4s-core into focused modules with smaller dependency footprints, and providers register through an SPI. Provider clients have moved into modules of their own - llm4s-ollama, llm4s-gemini, llm4s-anthropic, llm4s-openai, llm4s-openai-compatible (DeepSeek, Z.ai, OpenRouter, Mistral, Cohere and any OpenAI-compatible endpoint) and llm4s-voyage - and llm4s-core holds none. Langfuse tracing, the trace collector and store, and CostTracker are in llm4s-observability, and Prometheus metrics in llm4s-observability-prometheus, leaving llm4s-core with only the tracing and metrics contracts, console and no-op tracing, and no observability dependency. The agent runtime is in llm4s-agent and the built-in tools in llm4s-agent-tools, so llm4s-core is now a ~19k-line spine, and its API has been cleaned up ahead of the compatibility baseline. The remaining step is the release (#1281): publishing 0.5.0 with the split artifacts and setting the MiMa baseline. These split modules are in the build but have not yet been published as separate artifacts; v0.4.1 still ships this functionality through llm4s-core. See the 1.0 scope and migration guide for module maturity and upgrade details.
The path to 1.0 is focused on stable API boundaries, provider capability parity and contract tests, Java/Kotlin/Spring/Gradle interoperability, security hardening, deterministic CI, production observability and cost controls, runnable documentation, and maintained reference applications. See the roadmap for the full stabilization plan.
- Type Safety: Catch errors at compile time, not in production.
- Functional Programming: Immutable data and pure functions for predictable, maintainable systems.
- JVM Ecosystem: Access to mature, production-grade libraries and tooling.
- Concurrency: Advanced models for safe, efficient parallelism.
- Performance: JVM speed with functional elegance.
- Ecosystem Interoperability: Seamless integration with enterprise JVM systems and cloud-native tooling.
- Multi-Provider Support: Connect to multiple LLM providers, including OpenAI, Anthropic, Azure OpenAI, Google Gemini, DeepSeek, Cohere, Mistral, OpenRouter, Requesty, Z.ai, and Ollama.
- Execution Environments: Run LLM-driven operations in secure, containerized or non-containerized setups.
- Error Handling: Robust mechanisms to catch, log, and recover from failures gracefully.
- MCP Support: Model Context Protocol primitives for richer tool and context integration.
- Agent Framework: Build single or multi-agent workflows with standardized interfaces.
- Multimodal Generation: Support for text, image, voice, and other LLM modalities.
- RAG (Retrieval-Augmented Generation): Built-in tools for search, embedding, retrieval workflows, and RAGAS evaluation with benchmarking harness.
- Observability: Detailed trace logging, monitoring, and analytics for debugging and performance insights.
- Raw Provider Exchange Logging: Persist request/response exchanges, including streaming responses for streaming-capable providers, to inspect raw provider payloads during development and debugging.
┌───────────────────────────┐
│ LLM4S API Layer │
└──────────┬────────────────┘
│
Multi-Provider Connector
(OpenAI | Anthropic | DeepSeek | ...)
│
┌─────────┴─────────┐
│ Execution Manager │
└─────────┬─────────┘
│
┌──────────┴──────────┐
│ Agent Framework │
└──────────┬──────────┘
│
┌────────────┴────────────┐
│ RAG Engine + Tooling │
└────────────┬────────────┘
│
┌─────────────┴─────────────┐
│ Observability Layer │
└───────────────────────────┘
- modules/core: Core LLM4S framework
- modules/workspace: Workspace runner/client/shared
- modules/samples: Usage examples
- docs: Documentation site and references
- hooks: Pre-commit hook installer
To get started with the LLM4S project, check out this teaser talk presented by Kannupriya Kalra at the Bay Area Scala Conference. This recording is essential for understanding where we’re headed:
🎥 Teaser Talk: https://www.youtube.com/watch?v=SXybj2P3_DE&ab_channel=SalarRahmanian
LLM4S was officially introduced at the Bay Area Scala Conference in San Francisco on February 25, 2025.
To ensure code quality, we use a Git pre-commit hook that automatically checks code formatting and runs tests before allowing commits:
# Install the pre-commit hook
./hooks/install.sh
# The hook will automatically:
# - Check code formatting with scalafmt
# - Compile code
# - Run tests
# To skip the hook temporarily (not recommended):
# git commit --no-verify- JDK 21+
- SBT
- Docker
java -versionSet JAVA_HOME and update your PATH.
brew install openjdk@21
echo 'export PATH="/opt/homebrew/opt/openjdk@21/bin:$PATH"' >> ~/.zshrcsbt compile
# Build and test
sbt buildAllYou will need an API key for at least one cloud provider, or a local Ollama installation for local models.
llm4s reads providers from named sections under llm4s.providers in application.conf. Each
provider module binds its vendor's API-key variable (OPENAI_API_KEY, ANTHROPIC_API_KEY, ...)
to a shared key, so with the variable set a section needs only provider and model - a section
for a second account sets its own apiKey = ${?OTHER_VAR}. Nothing reads LLM_MODEL:
llm4s {
providers {
provider = "openai-main" # the default: the name of a section below
openai-main {
provider = "openai"
model = "gpt-4o-mini"
}
}
}The samples in this repository already have an application.conf whose default is a local Ollama
section (ollama-local, model llama3:latest, overridable with OLLAMA_MODEL and
OLLAMA_BASE_URL). Run ollama pull llama3 once, or set OLLAMA_MODEL to a model you already
have (ollama list). To run them against a cloud provider, put a section like the one above in
modules/samples/src/main/resources/application.local.conf (ignored by git) and select it:
export OPENAI_API_KEY=<your_openai_api_key>
export LLM4S_PROVIDER=openai-main # bound by the samples' application.confAnthropic, Gemini, Azure, OpenRouter, Z.ai, DeepSeek, Mistral, Cohere and generic OpenAI-compatible
endpoints work the same way with provider = "anthropic", "gemini", "azure", "openrouter",
"zai", "deepseek", "mistral", "cohere" or "openai-compatible", and the vendor's own
key variable (ANTHROPIC_API_KEY, GOOGLE_API_KEY/GEMINI_API_KEY, AZURE_OPENAI_API_KEY, ...);
each provider module's reference.conf has an example section. See the
API keys table, the
configuration guide for all of them
and running the samples for the
samples' own bindings.
The quickest start is the cookbook: complete, runnable programs that need no API key
(a scripted client stands in for the model; add --live for your configured provider), each run in CI. Recipes:
classify text into an enum, extract data from an email, summarise a long document, answer questions over a folder of files, an agent that calls two tools, a guardrailed chatbot, stream tokens, fall back between providers, cache repeated calls, evaluate an answer with a judge, keyword search, memory, several agents in one graph.
sbt "samples/runMain org.llm4s.samples.cookbook.StructuredOutputRecipe"Every other sample:
# Using Scala 3
sbt "samples/runMain org.llm4s.samples.basic.BasicLLMCallingExample"sbt docker:publishLocal
sbt "workspaceSamples/runMain org.llm4s.samples.workspace.ContainerisedWorkspaceDemo"LLM4S now targets Scala 3.7.1 only. The build keeps compatibility-oriented aliases for Scala 3 verification:
src/main/scala- Common code for all versionssrc/main/scala-3- Scala 3 specific code (add when needed)
We've kept convenient build aliases:
# Compile the repo
sbt compileAll
# Test the repo
sbt testAll
# Clean, compile, and test
sbt buildAll
# Publish current Scala 3 artifacts
sbt publishAllOur goal is to build a production-grade, type-safe AI application framework for Scala and the JVM, with multi-provider, multimodal, agentic, RAG, observability, and governance capabilities.
For the current roadmap, see the LLM4S Roadmap.
The roadmap covers:
- Current Capability Map: What exists today and what still needs hardening
- Production Pillars: Testing, API stability, provider parity, JVM adoption, security, performance, cost, documentation, and observability
- 2026 Stabilization Phases: The path from broad pre-1.0 functionality to a production-ready v1.0
- Reference Applications: The maintained end-to-end apps needed before v1.0
| Goal | Current state | Next focus |
|---|---|---|
| Single API access to multiple LLM providers | Implemented across many providers | Capability matrix, contract tests, parity for streaming/tools/structured output/timeouts/cost |
| Tooling for LLM applications | Tool calling, built-in tools, RAG, retrieval, evaluation, tracing, metrics, and reliability primitives exist | Stable APIs, security policies, runnable docs, and production examples |
| Agentic framework | Single-agent workflows, handoffs, memory, guardrails, streaming events, async tools, reasoning modes, and serialization exist | API freeze, replay/debugging, maintained reference apps |
| RAG and retrieval | Vector stores, hybrid search, reranking, permission-aware RAG, RAGAS-style evaluation, and benchmarking exist | Cost/latency tracking, deployment patterns, compile-tested golden paths |
| JVM ecosystem adoption | Scala-first path is the main supported API | Java facade, Kotlin coroutine API, Spring Boot starter, Maven/Gradle examples |
| Stable v1.0 platform | Pre-1.0, API stabilizing | MiMa or equivalent compatibility checks, threat model, benchmarks, docs cleanup, release gates |
Tool calling is a critical integration - designed to work seamlessly with multi-provider support and agent frameworks. We use ScalaMeta to auto-generate tool definitions, support dynamic mapping, and run in secure execution environments.
Tools can run:
- In containerized sandboxes for isolation and safety.
- In multi-modal pipelines where LLMs interact with text, images, and voice.
- With observability hooks for trace analysis.
Using ScalaMeta to automatically generate tool definitions from Scala methods:
/** My tool does some funky things with a & b...
* @param a The first thing
* @param b The second thing
*/
def myTool(a: Int, b: String): ToolResponse = {
// Implementation
}ScalaMeta extracts method parameters, types, and documentation to generate OpenAI-compatible tool definitions.
Mapping LLM tool call requests to actual method invocations through:
- Code generation
- Reflection-based approaches
- ScalaMeta-based parameter mapping
Tools run in a protected Docker container environment to prevent accidental system damage or data leakage.
Tracing isn’t just for debugging - it’s the backbone of understanding model behavior.LLM4S’s observability layer includes:
- Detailed token usage reporting
- Multi-backend trace output (console and none in
llm4s-core; Langfuse fromllm4s-observability, OpenTelemetry fromllm4s-observability-otel) - Agent state visualization
- Integration with monitoring dashboards
Configure tracing behavior using the TRACING_MODE environment variable. Console output
(the default) and no tracing are built into llm4s-core; every other mode comes from a
backend module you add as a dependency:
# Send traces to Langfuse - needs "org.llm4s" %% "llm4s-observability"
TRACING_MODE=langfuse
LANGFUSE_PUBLIC_KEY=pk-lf-your-key
LANGFUSE_SECRET_KEY=sk-lf-your-secret
# Print detailed traces to console with colors and token usage
TRACING_MODE=print
# Disable tracing completely
TRACING_MODE=noneimport org.llm4s.config.Llm4sConfig
import org.llm4s.trace.{ ConsoleTracing, Tracing }
// Build the tracer llm4s.tracing.mode selects; fall back to the console tracer
val tracer: Tracing = Llm4sConfig
.tracing()
.flatMap(Tracing.fromSettings)
.fold(_ => new ConsoleTracing(), identity)
// Trace events, completions, and token usage
tracer.traceEvent("Starting LLM operation")
tracer.traceCompletion(completion, completion.model) // prefer the model reported by the API
tracer.traceTokenUsage(tokenUsage, completion.model, "chat-completion")
// An agent built withTracing(tracer) ends each run with a TraceEvent.AgentRunEndedNote: The LLM4S template has moved to its own repository for better maintainability and independent versioning.
The llm4s.g8 starter kit helps you quickly create AI-powered applications using llm4s.
It is a starter kit for building AI-powered applications using llm4s with improved SDK usability and developer ergonomics. You can now spin up a fully working scala project with a single sbt command.
The starter kit comes pre-configured with best practices, prompt execution examples, CI, formatting hooks, unit testing, documentation, and cross-platform support.
Template Repository: github.com/llm4s/llm4s.g8
Using sbt, do:
sbt new llm4s/llm4s.g8 \
--name=<your.project.name> \
--package=<your.organization> \
--version=<your.project.version> \
--llm4s_version=0.3.2 \
--scala_version=3.7.1 \
--munit_version=1.1.1 \
--directory=<your.project.name> \
--force
to create new project.
For more information about the template, including compatibility matrix and documentation, visit the template repository. Use the comprehensive documentation to get started with the project using starter kit.
llm4s exposes a single configuration flow with sensible precedence:
- Precedence:
-Dsystem properties >application.conf(if your app provides it) >reference.confdefaults. - Environment variables are read only where a
${?ENV}substitution binds them: in a module'sreference.conf(tracing, embeddings, tools, and each provider module's vendor key underllm4s.credentials) or in your ownapplication.conf. No.envreader is required, and nothing readsLLM_MODEL.
Preferred typed entry points (PureConfig-backed via Llm4sConfig):
- Provider / model:
Llm4sConfig.defaultProvider(): Result[ProviderConfig]– the typed config of the sectionllm4s.providers.providernames.Llm4sConfig.provider(name: String): Result[ProviderConfig]– the typed config of the sectionllm4s.providers.<name>.LLMConnect.getClient(config: ProviderConfig): Result[LLMClient]– builds a client from a typed config (with agiven ModelRegistryServicefromLlm4sConfig.modelRegistryService()).
- Tracing:
Llm4sConfig.tracing(): Result[TracingSettings]– returns typed tracing settings.Tracing.fromSettings(settings: TracingSettings): Result[Tracing]– builds the tracer the mode selects; a missing backend is an error.Tracing.create(settings: TracingSettings): Tracing– the same, falling back toNoOpTracingwith an error logged.
- Embeddings:
Llm4sConfig.embeddings(): Result[(String, EmbeddingProviderConfig)]– returns(provider, config)with validation.EmbeddingClient.from(provider: String, cfg: EmbeddingProviderConfig): Result[EmbeddingClient]– builds an embeddings client from typed config.
Recommended usage patterns:
- Model name for display:
Llm4sConfig.defaultProvider().map(_.model)or prefercompletion.modelfrom API responses. - Tracing:
Llm4sConfig.tracing().flatMap(Tracing.fromSettings), or.map(Tracing.create)to fall back to no tracing.
- Workspace (samples):
WorkspaceConfigSupport.load()to getworkspaceDir,imageName,hostPort. - Embeddings sample (samples):
EmbeddingUiSettings.loadFromEnv,EmbeddingTargets.loadFromEnv,EmbeddingQuery.loadFromEnv(sample helpers backed byLlm4sConfig).
Use these loaders to convert flat keys and HOCON paths into typed, validated settings used by the code:
-
LLM provider and model selection
- Keys:
llm4s.providers.provider(the default section's name) andllm4s.providers.<name>.{provider, model, apiKey, baseUrl, ...}. No environment variable is bound: bind your own with${?VAR}inapplication.conf - Type:
ProviderConfig(with provider-specific subtypes) - Loader:
Llm4sConfig.defaultProvider()orLlm4sConfig.provider("name")+LLMConnect.getClient(...)
- Keys:
-
Tracing configuration
- Keys:
llm4s.tracing.mode|TRACING_MODE(llm4s-core);llm4s.tracing.langfuse.*|LANGFUSE_URL,LANGFUSE_PUBLIC_KEY,LANGFUSE_SECRET_KEY,LANGFUSE_ENV,LANGFUSE_RELEASE,LANGFUSE_VERSION(bound byllm4s-observability);llm4s.tracing.opentelemetry.*|OTEL_SERVICE_NAME,OTEL_EXPORTER_OTLP_ENDPOINT(bound byllm4s-observability-otel) - Type:
TracingSettings(the mode, plus the selected mode's block asextras);LangfuseConfigviaLangfuseConfigLoader.default() - Loader:
Llm4sConfig.tracing()→ thenTracing.fromSettingsorTracing.create
- Keys:
-
Workspace settings (samples)
- Keys:
llm4s.workspace.dir|WORKSPACE_DIR,llm4s.workspace.image|WORKSPACE_IMAGE,llm4s.workspace.port|WORKSPACE_PORT - Type:
WorkspaceSettings - Loader:
WorkspaceConfigSupport.load()
- Keys:
-
Embeddings: inputs and UI (samples)
- Input paths:
EMBEDDING_INPUT_PATHSorEMBEDDING_INPUT_PATH→EmbeddingTargets.loadFromEnv()→EmbeddingTargets - Query:
EMBEDDING_QUERY→EmbeddingQuery.loadFromEnv()→EmbeddingQuery - UI knobs:
MAX_ROWS_PER_FILE,TOP_DIMS_PER_ROW,GLOBAL_TOPK,SHOW_GLOBAL_TOP,COLOR,TABLE_WIDTH→EmbeddingUiSettings.loadFromEnv()→EmbeddingUiSettings
- Input paths:
-
Embeddings: provider configuration
- Key:
EMBEDDING_MODEL/llm4s.embeddings.modelasprovider/model(or legacyEMBEDDING_PROVIDER/llm4s.embeddings.provider) - Supported providers:
openai(llm4s-openai),voyage(llm4s-voyage),ollama(llm4s-ollama); each from its module once published - Type:
(String, EmbeddingProviderConfig) - Loader:
Llm4sConfig.embeddings() - Provider-specific keys:
- OpenAI:
OPENAI_EMBEDDING_BASE_URL,OPENAI_EMBEDDING_MODEL, andOPENAI_API_KEY- the same key OpenAI chat sections use - Voyage:
VOYAGE_EMBEDDING_BASE_URL,VOYAGE_EMBEDDING_MODEL,VOYAGE_API_KEY - Ollama (local):
OLLAMA_EMBEDDING_BASE_URL(default:http://localhost:11434),OLLAMA_EMBEDDING_MODEL
- OpenAI:
- Key:
-
Provider API keys and endpoints
- Keys:
apiKeyandbaseUrlinside eachllm4s.providers.<name>section, plus the provider's own keys -organization(OpenAI, Requesty, OpenRouter),endpointandapiVersion(Azure),projectandlocation(Vertex AI). A section withoutapiKeyuses its vendor's sharedllm4s.credentials.<provider>.apiKey, which the provider module binds toOPENAI_API_KEY,ANTHROPIC_API_KEYand so on; a section's ownapiKeywins - Type: concrete
ProviderConfig(e.g.,OpenAIConfig,AnthropicConfig,AzureConfig,OllamaConfig,GeminiConfig,DeepSeekConfig,CohereConfig) - Loader:
Llm4sConfig.defaultProvider()orLlm4sConfig.provider("name")
- Keys:
Tracing
- Configure mode via
llm4s.tracing.mode(default:console). Supported:consoleandnoop(built intollm4s-core),langfuse(withllm4s-observability),opentelemetry(withllm4s-observability-otel), and any mode aTracingBackendon the classpath registers. - Override with env:
TRACING_MODE=langfuse(or system property-Dllm4s.tracing.mode=langfuse). - Build tracers:
- Checked:
Llm4sConfig.tracing().flatMap(Tracing.fromSettings)→Result[Tracing] - Falling back to no tracing:
Llm4sConfig.tracing().map(Tracing.create) - Low-level:
LangfuseConfigLoader.default().map(LangfuseTracing.from)(llm4s-observability)
- Checked:
Example (no application.conf required):
sbt -Dllm4s.providers.provider=openai-main -Dllm4s.providers.openai-main.provider=openai -Dllm4s.providers.openai-main.model=gpt-4o -Dllm4s.providers.openai-main.apiKey=sk-... "samples/runMain org.llm4s.samples.basic.BasicLLMCallingExample"
Or with an openai-main section (provider = "openai" and a model) in
modules/samples/src/main/resources/application.local.conf and the samples' LLM4S_PROVIDER binding:
export LLM4S_PROVIDER=openai-main
export OPENAI_API_KEY=sk-...
sbt "samples/runMain org.llm4s.samples.basic.BasicLLMCallingExample"
LLM4S uses GitHub Actions for continuous integration to ensure code quality and compatibility across supported platforms.
Our unified CI workflow runs on every push and pull request to main/master branches:
- Quick Checks: Fast-failing checks for code formatting and compilation
- Cross-Platform Testing: Tests run on Ubuntu and Windows with Scala 3.7.1
- Template Validation: Verifies the g8 template works correctly
- Caching: Optimized caching strategy with Coursier for faster builds
Automated AI-powered code review for pull requests:
- Automatic Reviews: Trusted PRs get automatic Claude reviews
- Security: External PRs require manual trigger by maintainers
- Manual Trigger: Maintainers can request reviews with
@claudecomment
Automated release process triggered by version tags (format: v0.3.2):
- Tag Format: Must use
vprefix (e.g.,v0.3.2, not0.3.2) - Pre-release Checks: Runs full CI suite before publishing
- GPG Signing: Artifacts are signed for security
- Maven Central: Publishes to Sonatype/Maven Central
See RELEASE.md for detailed release instructions.
You can run the same checks locally before pushing:
# Check formatting
sbt scalafmtCheckAll
# Compile
sbt compile
# Run all tests
sbt test
# Full build (compile + test)
sbt buildAllStay hands-on with LLM4S! Join us for interactive mob programming sessions, live debugging, and open-source collaboration. These events are great for developers, contributors, and anyone curious about Scala + GenAI.
🗓️ Weekly live coding and collaboration during LLM4S Dev Hour, join us every Sunday at 09:00 London time on Discord!
| Date | Session Title | Description | Location | Hosts | Details URL | Featured In |
|---|---|---|---|---|---|---|
| 20-Jul-2025 onwards (Weekly Sundays, 09:00 London time) | 🗓️ LLM4S Dev Hour - Weekly Live Coding & Collaboration | A weekly mob programming session where we code, debug, and learn together - open to all! 📌 Updates are shared by the host in the #llm4s-dev-hour Discord channel after each session. Weekly changing Luma invite link (for scheduling in your calendar) |
Online, London, UK (9am local time) | Kannupriya Kalra, Rory Graves | LinkedIn Reddit1 Reddit2 Bluesky Mastodon X/Twitter |
Scala Times – Issue #537 |
When is Dev Hour in your time zone? LLM4S is a global community: the maintainers and contributors are spread across the world, and everyone joins from where they are. Dev Hour is every Sunday at 09:00 London time:
| London | Italy, Germany | India | Singapore | New York | San Francisco |
|---|---|---|---|---|---|
| 09:00 | 10:00 | 13:30 (summer) / 14:30 (winter) | 16:00 (summer) / 17:00 (winter) | 04:00 | 01:00 |
"Summer" is while the UK is on British Summer Time (late March to late October). The time follows London's clocks, so it can move by an hour elsewhere when clocks change; see the full schedule and the Luma calendar for details.
See the talks being given by maintainers and open source developers globally and witness the engagement by developers around the world.
Stay updated with talks, workshops, and presentations about LLM4S happening globally. These sessions dive into the architecture, features, and future plans of the project.
Snapshots from LLM4S talks held around the world 🌍.
| Date | Event/Conference | Talk Title | Location | Speaker Name | Details URL | Recording Link URL | Featured In |
|---|---|---|---|---|---|---|---|
| 25-Feb-2025 | Bay Area Scala | Let's Teach LLMs to Write Great Scala! (Original version) | Tubi office, San Francisco, CA, USA 🇺🇸 | Kannupriya Kalra | Event Info , Reddit Discussion , Mastodon Post , Bluesky Post , X/Twitter Post , Meetup Event | Watch Recording | – |
| 20-Apr-2025 | Scala India | Let's Teach LLMs to Write Great Scala! (Updated from Feb 2025) | India 🇮🇳 | Kannupriya Kalra | Event Info , Reddit Discussion , X/Twitter Post | Watch Recording | – |
| 28-May-2025 | Functional World 2025 by Scalac | Let's Teach LLMs to Write Great Scala! (Updated from Apr 2025) | Gdansk, Poland 🇵🇱 | Kannupriya Kalra | LinkedIn Post 1 , LinkedIn Post 2 , Reddit Discussion , Meetup Link , X/Twitter Post | Watch Recording | Scalendar (May 2025) , Scala Times 1 , Scala Times 2 |
| 13-Jun-2025 | Dallas Scala Enthusiasts | Let's Teach LLMs to Write Great Scala! (Updated from May 2025) | Dallas, Texas, USA 🇺🇸 | Kannupriya Kalra | Meetup Event , LinkedIn Post , X/Twitter Post , Reddit Discussion , Bluesky Post , Mastodon Post | Watch Recording | Scalendar (June 2025) |
| 13-Aug-2025 | London Scala Users Group | Scala Meets GenAI: Build the Cool Stuff with LLM4S | The Trade Desk office, London, UK 🇬🇧 | Kannupriya Kalra, Rory Graves | Meetup Event , X/Twitter Post , Bluesky Post , LinkedIn Post | Recording pending | Scalendar (August 2025) |
| 21-Aug-2025 | Scala Days 2025 | Scala Meets GenAI: Build the Cool Stuff with LLM4S | SwissTech Convention Center,EPFL campus, Lausanne, Switzerland 🇨🇭 | Kannupriya Kalra, Rory Graves | Talk Info , LinkedIn Post , X/Twitter Post , Reddit Discussion , Bluesky Post , Mastodon Post | Recording pending | Scala Days 2025: August in Lausanne – Code, Community & Innovation , Scalendar (August 2025) , Scala Days 2025 LinkedIn Post , Scala Days 2025 Highlights , Scala Days 2025 Wrap , Scala Days 2025 Recap – A Scala Community Reunion , Xebia Scala days blog |
| 25-Aug-2025 | Zürich Scala Enthusiasts | Fork It Till You Make It: Career Building with Scala OSS | Rivero AG, ABB Historic Building, Elias-Canetti-Strasse 7, Zürich, Switzerland 🇨🇭 | Kannupriya Kalra | Meetup Event , LinkedIn Post , X/Twitter Post , Bluesky Post , Mastodon Post , Reddit Discussion | Recording pending | Scalendar (August 2025) |
| 18-Sept-2025 | Scala Center Talks | Lightning Talks Powered by GSoC 2025 for Scala | EPFL campus, Lausanne, Switzerland 🇨🇭 | Kannupriya Kalra | Event Invite , LinkedIn Post , Scala Center's LinkedIn Post , X/Twitter Post , Mastodon Post , Bluesky Post , Reddit Discussion | Recording pending, View LLM4S Slides 1, 2, 3, 4, Download LLM4S Slides 1, 2, 3, 4 | – |
| 12-18-Oct-2025 | ICFP/SPLASH 2025 (The Scala Workshop 2025) | Mentoring in the Scala Ecosystem: Insights from Google Summer of Code | Peony West, Marina Bay Sands Convention Center, Singapore 🇸🇬 | Kannupriya Kalra | ICFP/SPLASH 2025 Event Website , The Scala Workshop 2025 Schedule , LinkedIn Post , X/Twitter Post , Mastodon Post , Bluesky Post , Reddit Discussion | Watch Recording | – |
| 23-25-Oct-2025 | Google Summer Of Code Mentor Summit 2025 | LLM4S x GSoC 2025: Engineering GenAI Agents in Functional Scala | Google Office, Munich, Erika-Mann-Str. 33 · 80636 München, Germany 🇩🇪 | Kannupriya Kalra | Event Website | Recording pending. View Scala Center Slides, Download Scala Center Slides, View GSoC Mentor Summit All Speakers Slides, Download GSoC Mentor Summit All Speakers Slides | – |
| 24-Oct-2025 | GEN AI London 2025 | Building Reliable AI systems: From Hype to Practical Toolkits | Queen Elizabeth II Center in the City of Westminster, London, UK 🇬🇧 | Kannupriya Kalra | GEN AI London Event Website , GEN AI London 2025 Schedule , LinkedIn Post 1 , LinkedIn Post 2 , LinkedIn Post 3 , X/Twitter Post , Mastodon Post , Bluesky Post , Reddit Discussion | Recording pending, View Slides, Download Slides | – |
| 29-30-Nov-2025 | Oaisys Conf 2025: AI Practitioners Conference | LLM4S: Building Reliable AI Systems in the JVM Ecosystem | MCCIA, Pune, India 🇮🇳 | Kannupriya Kalra, Shubham Vishwakarma | Event Website, LinkedIn Post, X/Twitter Post, Mastodon Post, Bluesky Post, Reddit Post | Recording pending. View Slides, Download Slides | – |
| 10-Dec-2025 | AI Compute & Hardware Conference 2025 | Functional Intelligence: Building Scalable AI Systems for the Hardware Era | Samsung HQ, San Jose, California, USA 🇺🇸 | Kannupriya Kalra | Event Website, Event details on Meetup, LinkedIn Post, X/Twitter Post, Mastodon Post, Bluesky Post, Reddit Post | Recording pending. Slides pending | – |
| 16-Sep-2026 | Microsoft Global Hackathon 2026 | Build with LLMs: Open Source AI for the JVM | Microsoft Silicon Valley Campus, 1045 La Avenida St, Mountain View, CA 94043, USA 🇺🇸 | Kannupriya Kalra | Event Website, LinkedIn Post, X/Twitter Post, Bluesky Post, Mastodon Post | Recording pending. View Slides, Download Slides | – |
| 27-Nov-2026 | LLMday + Prompt Engineering Conference London Q4 2026 | LLM4S 1.0: From Idea to Production AI in Scala/JVM | Everyman Canary Wharf, London, UK 🇬🇧 | Kannupriya Kalra, Rory Graves | Event Website | Recording pending | – |
📝 Want to invite us for a talk or workshop? Reach out via our respective emails or connect on Discord: https://discord.gg/4uvTPn6qww
- Build AI-powered applications in a statically typed, functional language designed for large systems.
- Help shape the Scala ecosystem’s future in the AI/LLM space.
- Learn modern LLM techniques like zero-shot prompting, tool calling, and agentic workflows.
- Collaborate with experienced Scala engineers and open-source contributors.
- Gain real-world experience working with Dockerized environments and multi-LLM providers.
- Contribute to a project that offers you the opportunity to become a mentor or contributor funded by Google through its Google Summer of Code (GSoC) program.
- Join a global developer community focused on type-safe, maintainable AI systems.
Interested in contributing? Start here:
LLM4S GitHub Issues: https://lnkd.in/eXrhwgWY
Security: to report a vulnerability, follow SECURITY.md; please do not use a public issue.
Want to be part of developing this and interact with other developers? Join our Discord community!
Please review our Code of Conduct to understand our community guidelines and expectations.
Help and adopters: see SUPPORT.md for where to ask what, and add your organisation to ADOPTERS.md if you use LLM4S.
LLM4S Discord: https://lnkd.in/eb4ZFdtG
LLM4S was selected for GSoC 2025 under the Scala Center Organisation.
LLM4S participated in Google Summer of Code (GSoC) 2025 under the Scala Center organisation. To learn about the 2025 projects and contributors, check out the details here:
👉 Scala Center GSoC Ideas: https://lnkd.in/enXAepQ3
To know everything about GSoC and how it works, check out this talk:
🎥 GSoC Process Explained: https://lnkd.in/e_dM57bZ
To learn about the experience of GSoC contributors of LLM4S, check out their blogs in the section below.
📚 Explore Past GSoC Projects with Scala Center: https://www.gsocorganizations.dev/organization/scala-center/ This page includes detailed information on all GSoC projects with Scala Center from past years - including project descriptions, code repositories, contributor blogs, and mentor details.
Hello GSoCers and future GSoC aspirants! Here are some essential onboarding links to help you collaborate and stay organized within the LLM4S community.
- 🔗 LLM4S GSoC GitHub Team:You have been invited to join the LLM4S GitHub team for GSoC participants. Accepting this invite will grant you access to internal resources and coordination tools.👉 https://github.com/orgs/llm4s/teams/gsoc/members
- 📌 Private GSoC Project Tracking Board: Once you're part of the team, you will have access to our private GSoC tracking board. This board helps you track tasks, timelines, and project deliverables throughout the GSoC period. 👉 https://github.com/orgs/llm4s/projects/3
- Contributor: Elvan Konukseven | GSoC Final Report URL
- LinkedIn: https://www.linkedin.com/in/elvan-konukseven/ | Email: elvankonukseven0@gmail.com | Discord:
elvan_31441 - Mentors: Kannupriya Kalra (Email: kannupriyakalra@gmail.com), Rory Graves (Email: rory.graves@fieldmark.co.uk)
- Announcement: Official Acceptance Post | Volunteering at Scala Center 1, 2, 3 | Python Vs Scala
- Contributor Blogs: 📌 elvankonukseven.com/blog
- Work log: 📌 GitHub Project Board
- Contributor: Gopi Trinadh Maddikunta | GSoC Final Report URL
- LinkedIn: https://www.linkedin.com/in/gopitrinadhmaddikunta/ | Email: trinadh7341@gmail.com | Discord:
g3nadh_58439 - Mentors: Kannupriya Kalra (Email: kannupriyakalra@gmail.com), Rory Graves (Email: rory.graves@fieldmark.co.uk), Dmitry Mamonov (Email: dmitry.s.mamonov@gmail.com)
- Announcement: Official Acceptance Post | Midterm evaluation post | Lightning talk post| GSoC Final Report post
- Contributor Blogs: 📌 Main Blog | 📌 Scala at Light Speed – Part 1 | 📌 Scala at Light Speed – Part 2
- Work log: 📌 Work Log → GitHub Project
- Contributor: Anshuman Awasthi | GSoC Final Report URL
- LinkedIn: https://www.linkedin.com/in/let-me-try-to-fork-your-responsibilities/ | Email: mcs23026@iiitl.ac.in | Discord:
anshuman23026 - Mentors: Kannupriya Kalra (Email: kannupriyakalra@gmail.com), Rory Graves (Email: rory.graves@fieldmark.co.uk)
- Announcement: Official Acceptance Post | Midterm evaluation post | Rock the JVM post | Lightning talk post | GSoC Final Report post
- Contributor Blogs: 📌 Anshuman's GSoC Journey
- Work Log: 📌 GitHub Project Board
- Contributor: Shubham Vishwakarma | GSoC Final Report URL
- LinkedIn: https://www.linkedin.com/in/shubham-vish/ | Email: smsharma3121@gmail.com | Discord:
oxygen4076 - Mentors: Kannupriya Kalra (Email: kannupriyakalra@gmail.com), Rory Graves (Email: rory.graves@fieldmark.co.uk), Dmitry Mamonov (Email: dmitry.s.mamonov@gmail.com)
- Announcement: Official Acceptance Post | Midterm evaluation post | Midway journey post | Lightning talk post | Rock the JVM post
- Contributor Blogs: 📌 Cracking the Code: My GSoC 2025 Story
- Work log: 📌 GitHub Project Board
Feel free to reach out to the contributors or mentors listed for any guidance or questions related to GSoC 2026.
Contributors selected across the globe for GSoC 2025 program.
We’ve got exciting news to share - Scalac, one of the leading Scala development companies, has officially partnered with LLM4S for a dedicated AI-focused blog series!
This collaboration was initiated after our talk at Functional World 2025, and it’s now evolving into a full-fledged multi-part series and an upcoming eBook hosted on Scalac’s platform. The series will combine practical Scala code, GenAI architecture, and reflections from the LLM4S team - making it accessible for Scala developers everywhere who want to build with LLMs.
📝 The first post is already drafted and under review by the Scalac editorial team. We’re working together to ensure this content is both technically insightful and visually engaging.
🎉 Thanks to Matylda Kamińska, Rafał Kruczek, and the Scalac marketing team for this opportunity and collaboration!
Stay tuned - the series will be published soon on scalac.io/blog, and we’ll link it here as it goes live.
LLM4S blogs powered by Scalac.
Technical deep-dives, production stories, and insights from LLM4S contributors. These articles chronicle real-world implementations, architectural decisions, and lessons learned from building type-safe LLM infrastructure in Scala.
| Author | Title | Topics Covered | Part of Series | Link |
|---|---|---|---|---|
| Vitthal Mirji | llm4s: type-safe LLM infrastructure for Scala that stay 1-step ahead of everything | Introduction to llm4s, why type safety matters, runtime → compile-time errors, provider abstraction, agent framework overview | Building type-safe LLM infrastructure (Part 1/7) | Read article |
| Vitthal Mirji | Developer experience: How we turned 20-minute llm4s setup into 60 seconds | Giter8 template creation, onboarding friction elimination, starter kit design, 95% time savings (PR #101) | Building type-safe LLM infrastructure (Part 2/7) | Read article |
| Vitthal Mirji | Production error handling: When our LLM pipeline threw 'Unknown error' for everything | Type-safe error hierarchies, ADTs, Either-based error handling, 60% faster debugging (PR #137) | Building type-safe LLM infrastructure (Part 3/7) | Read article |
| Vitthal Mirji | Error hierarchy refinement: Smart constructors and the code we deleted | Smart constructors, trait-based error classification, eliminating boolean flags, -263 lines (PR #197) | Building type-safe LLM infrastructure (Part 4/7) | Read article |
| Vitthal Mirji | Type system upgrades: The 'asistant' typo that compiled and ran in production | String literals → MessageRole enum, 6 type classes, compile-time typo prevention, 43-file migration (PR #216) | Building type-safe LLM infrastructure (Part 5/7) | Read article |
| Vitthal Mirji | Safety refactor: The P1 streaming bug that showed wrong errors and 47 try-catch blocks | Eliminating 47 try-catch blocks, safety utilities, resource management, streaming bug fix, -260 net lines (PR #260) | Building type-safe LLM infrastructure (Part 6/7) | Read article |
| Vitthal Mirji | 5 Production patterns from building llm4s: What actually works | Pattern-based design, type-safe foundations, developer experience first, migration playbooks, production lessons learned | Building type-safe LLM infrastructure (Part 7/7) | Read article |
💡 You can contribute writing blogs Share your LLM4S experience, architectural insights, or production lessons. Reach out to maintainers on Discord or create a PR updating this table.
Our Google Summer of Code (GSoC) 2025 contributors have actively documented their journeys, sharing insights and implementation deep-dives from their projects. These blog posts offer valuable perspectives on how LLM4S is evolving from a contributor-first lens.
| Contributor | Blog(s) | Project |
|---|---|---|
| Elvan Konukseven | elvankonukseven.com/blog | Agentic Toolkit for LLMs |
| Gopi Trinadh Maddikunta | Main Blog Scala at Light Speed – Part 1 Scala at Light Speed – Part 2 |
RAG in a Box |
| Anshuman Awasthi | Anshuman's GSoC Journey | Multimodal LLM Support |
| Shubham Vishwakarma | Cracking the Code: My GSoC 2025 Story | Tracing and Observability |
💡 These blogs reflect first-hand experience in building real-world AI tools using Scala, and are great resources for future contributors and researchers alike.
- 🌐 Main Blog
- 📝 Articles:
- 🌐 Main Blog
- 📝 Articles:
- Spark of Curiosity
- The Hunt Begins
- Enter Scala Center
- Understanding the Mission
- Locking the Vision
- The Proposal Sprint)
- The Acceptance Moment
- Stepping In
- Fiel for the Mission
- Scala at Light Speed – Part 1
- Scala at Light Speed – Part 2
- From Documents to Embeddings
- Universal Extraction + Embedding Client = One step closer to RAG
- Midterm Milestone- Modular RAG in Motion
- GSoC Final Report URL
- 🌐 Main Blog : Anshuman's GSoC Journey
- 📝 Articles:
- 🌐 Main Blog : Shubham's GSoC Journey
- 📝 Articles:
Want to connect with maintainers? The LLM4S project is maintained by:
- Rory Graves - https://www.linkedin.com/in/roryjgraves/ | Email: rory@llm4s.org, rory.graves@fieldmark.co.uk | Discord:
rorybot1 - Kannupriya Kalra - https://www.linkedin.com/in/kannupriyakalra/ | Email: kannupriya@llm4s.org, kannupriyakalra@gmail.com | Discord:
kannupriyakalra_46520
- CHANGELOG.md — full release history from v0.1.0 to present, following Keep a Changelog format
- Migration guides — step-by-step upgrade instructions between versions
- 0.x → 1.0 consolidated guide — all breaking changes across the 0.x series
- v0.2.9 → v0.3.0 — migrate throwing APIs to type-safe
Result[T]
This project is licensed under the MIT License - see the LICENSE file for details.


















