https://github.com/kpavlov/ai-mocks
Mock Http and LLM servers, inspired by wiremock, but with response streaming and SSE
https://github.com/kpavlov/ai-mocks
kotlin ktor ktor-server langchain4j llm mock mock-server openai-api
Last synced: about 1 year ago
JSON representation
Mock Http and LLM servers, inspired by wiremock, but with response streaming and SSE
- Host: GitHub
- URL: https://github.com/kpavlov/ai-mocks
- Owner: kpavlov
- License: mit
- Created: 2025-01-30T09:34:08.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-04-14T22:35:31.000Z (about 1 year ago)
- Last Synced: 2025-04-15T06:52:14.084Z (about 1 year ago)
- Topics: kotlin, ktor, ktor-server, langchain4j, llm, mock, mock-server, openai-api
- Language: Kotlin
- Homepage: https://kpavlov.github.io/ai-mocks/
- Size: 2.52 MB
- Stars: 12
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
# Mokksy and AI-Mocks
[](https://repo1.maven.org/maven2/me/kpavlov/aimocks/ai-mocks-openai/)
[](https://github.com/kpavlov/ai-mocks/actions/workflows/gradle.yml)

[](https://app.codacy.com/gh/kpavlov/ai-mocks/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
[](https://app.codacy.com/gh/kpavlov/ai-mocks/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage)
[](https://codecov.io/github/kpavlov/ai-mocks)
[](https://kpavlov.github.io/ai-mocks/) [](https://kpavlov.github.io/ai-mocks/api/)


_Mokksy_ and _AI-Mocks_ are mock HTTP and LLM (Large Language Model) servers inspired by WireMock, with support for
response streaming and Server-Side Events (SSE). They are designed to build, test, and mock OpenAI API responses for
development purposes.
# Mokksy

**[Mokksy](mokksy/README.md)** is a mock HTTP server built with [Kotlin](https://kotlinlang.org/)
and [Ktor](https://ktor.io/). It addresses the limitations of WireMock by supporting true SSE and streaming responses,
making it particularly useful for integration testing LLM clients.
## Core Features
- Flexibility to control server response directly via ApplicationCall object.
- Built with Kotest Assertions.
- Fluent modern Kotlin DSL API.
- Support for simulating streamed responses and Server-Side Events (SSE) with delays between chunks.
- Support for simulating response delays.
## Example Usages
### Responding with Predefined Responses
```kotlin
// given
val expectedResponse =
// language=json
"""
{
"response": "Pong"
}
""".trimIndent()
mokksy.get {
path = beEqual("/ping")
containsHeader("Foo", "bar")
} respondsWith {
body = expectedResponse
}
// when
val result = client.get("/ping") {
headers.append("Foo", "bar")
}
// then
assertThat(result.status).isEqualTo(HttpStatusCode.OK)
assertThat(result.bodyAsText()).isEqualTo(expectedResponse)
```
### POST Request
```kotlin
// given
val id = Random.nextInt()
val expectedResponse =
// language=json
"""
{
"id": "$id",
"name": "thing-$id"
}
""".trimIndent()
mokksy.post {
path = beEqual("/things")
bodyContains("\"$id\"")
} respondsWith {
body = expectedResponse
httpStatus = HttpStatusCode.Created
headers {
// type-safe builder style
append(HttpHeaders.Location, "/things/$id")
}
headers += "Foo" to "bar" // list style
}
// when
val result =
client.post("/things") {
headers.append("Content-Type", "application/json")
setBody(
// language=json
"""
{
"id": "$id"
}
""".trimIndent(),
)
}
// then
assertThat(result.status).isEqualTo(HttpStatusCode.Created)
assertThat(result.bodyAsText()).isEqualTo(expectedResponse)
assertThat(result.headers["Location"]).isEqualTo("/things/$id")
assertThat(result.headers["Foo"]).isEqualTo("bar")
```
### Server-Side Events (SSE) Response
Server-Side Events (SSE) is a technology that allows a server to push updates to the client over a single, long-lived
HTTP connection, enabling real-time updates without requiring the client to continuously poll the server for new data.
```kotlin
mokksy.post {
path = beEqual("/sse")
} respondsWithSseStream {
flow =
flow {
delay(200.milliseconds)
emit(
ServerSentEvent(
data = "One",
),
)
delay(50.milliseconds)
emit(
ServerSentEvent(
data = "Two",
),
)
}
}
// when
val result = client.post("/sse")
// then
assertThat(result.status)
.isEqualTo(HttpStatusCode.OK)
assertThat(result.contentType())
.isEqualTo(ContentType.Text.EventStream.withCharsetIfNeeded(Charsets.UTF_8))
assertThat(result.bodyAsText())
.isEqualTo("data: One\r\ndata: Two\r\n")
```
# AI-Mocks
**AI-Mocks** is a specialized mock server implementations (e.g., mocking OpenAI API) built using Mokksy.
It supports mocking following LLMs:
1. [OpenAI](https://platform.openai.com/docs/api-reference/) - [ai-mocks-openai](https://kpavlov.github.io/ai-mocks/docs/ai-mocks-openai/)
2. [Anthropic](https://docs.anthropic.com/en/api) - [ai-mocks-anthropic](https://kpavlov.github.io/ai-mocks/docs/ai-mocks-anthropic/)
**_NB! Not all API endpoints and parameters are supported!_**
## How to build
Building project locally:
```shell
gradle build
```
or using Make:
```shell
make
```
## Contributing
I do welcome contributions! Please see the [Contributing Guidelines](CONTRIBUTING.md) for details.
## Enjoying LLM integration testing? :heart:
[](https://buymeacoffee.com/mailsk)