Rod Johnson, Embabel Creator of Spring
Concise, expressive, safe
Null safety built-in
Extension functions
Great for DSLs
Highly readable
Interoperable with Java
Plays nice with Java ecosystem, unlike Scala
Kotlin just feels right...created by practitioners
@Service class NewsService(val repository: NewsRepository) { fun latestHeadlines(): List<News> = repository.findLatest() }
@ConfigurationProperties("app.news") data class NewsConfig( val feedUrl: String, val refreshInterval: Duration = Duration.ofMinutes(10) )
inline fun <reified O> AgentProcess.resultOfType(): O = resultOfType(O::class.java)
@Autowired private NewsService newsService; public List<News> findStarNews() { return newsService.latestHeadlines() .stream() .filter(news -> news.isStarred()) .collect(Collectors.toList()); }
<plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <configuration> <compilerPlugins> <plugin>spring</plugin> </compilerPlugins> </configuration> </plugin>
PlanningSystem
Planner
@Agent
@Action
@Condition
@Agent class PresentationMaker @Autowired constructor(...) { @Action fun identifyResearchTopics(request: PresentationRequest): List<Topic> @Action fun researchTopics(topics: List<Topic>): List<ResearchReport> @Action fun createDeck(...): SlideDeck // ...more actions }
_background: url('https://raw.githubusercontent.com/embabel/embabel-agent/refs/heads/main/embabel-agent-api/images/315px-Meister_der_Weltenchronik_001.jpg')