Skip to content

Commit 959d4ba

Browse files
committed
Chat completion JSON/case-class example
1 parent 3ffa6fb commit 959d4ba

File tree

3 files changed

+36
-34
lines changed

3 files changed

+36
-34
lines changed
Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,53 @@
11
package io.cequence.openaiscala.examples
22

33
import io.cequence.openaiscala.domain._
4-
import io.cequence.openaiscala.domain.settings.JsonSchemaDef
5-
import io.cequence.openaiscala.examples.fixtures.TestFixtures
6-
import io.cequence.openaiscala.service.{JsonSchemaReflectionHelper, OpenAIServiceConsts}
7-
import play.api.libs.json.Json
4+
import io.cequence.openaiscala.domain.settings.{CreateChatCompletionSettings, JsonSchemaDef}
5+
import io.cequence.openaiscala.service.JsonSchemaReflectionHelper
6+
import play.api.libs.json.{Format, Json}
7+
import io.cequence.openaiscala.service.OpenAIChatCompletionExtra._
88

99
import scala.concurrent.Future
1010

11-
// experimental
12-
object CreateChatCompletionJsonForCaseClass
13-
extends Example
14-
with TestFixtures
15-
with JsonSchemaReflectionHelper
16-
with OpenAIServiceConsts {
11+
// due to the reflection used in jsonSchemaFor, this example currently works only for Scala 2.12 and 2.13
12+
object CreateChatCompletionJsonForCaseClass extends Example with JsonSchemaReflectionHelper {
1713

18-
private val messages = Seq(
19-
SystemMessage(capitalsPrompt),
20-
UserMessage("List only african countries")
21-
)
22-
23-
// Case class(es)
24-
private case class CapitalsResponse(
25-
countries: Seq[Country]
26-
)
27-
28-
private case class Country(
14+
// data model
15+
case class Country(
2916
country: String,
30-
capital: String
17+
capital: String,
18+
populationMil: Double
3119
)
20+
case class CapitalsResponse(capitals: Seq[Country])
3221

33-
// json schema def
34-
private val jsonSchemaDef: JsonSchemaDef = JsonSchemaDef(
22+
// JSON format and schema
23+
implicit val countryFormat: Format[Country] = Json.format[Country]
24+
implicit val capitalsResponseFormat: Format[CapitalsResponse] = Json.format[CapitalsResponse]
25+
26+
val jsonSchema: JsonSchemaDef = JsonSchemaDef(
3527
name = "capitals_response",
3628
strict = true,
37-
// reflective json schema for case class
38-
structure = jsonSchemaFor[CapitalsResponse]()
29+
jsonSchemaFor[CapitalsResponse]()
30+
)
31+
32+
// messages / prompts
33+
val messages: Seq[BaseMessage] = Seq(
34+
SystemMessage("You are an expert geographer"),
35+
UserMessage("List the most populous African countries in the prescribed JSON format")
3936
)
4037

41-
override protected def run: Future[_] =
38+
override protected def run: Future[_] = {
39+
// chat completion JSON run
4240
service
43-
.createChatCompletion(
44-
messages = messages,
45-
settings = DefaultSettings.createJsonChatCompletion(jsonSchemaDef)
41+
.createChatCompletionWithJSON[CapitalsResponse](
42+
messages,
43+
settings = CreateChatCompletionSettings(
44+
model = ModelId.gpt_4o_2024_08_06,
45+
temperature = Some(0),
46+
jsonSchema = Some(jsonSchema)
47+
)
4648
)
4749
.map { response =>
48-
val json = Json.parse(messageContent(response))
49-
println(Json.prettyPrint(json))
50+
response.capitals.foreach(println)
5051
}
52+
}
5153
}

openai-examples/src/main/scala/io/cequence/openaiscala/examples/Example.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.cequence.openaiscala.examples
22

3-
import akka.actor.ActorSystem
3+
import akka.actor.{ActorSystem, Scheduler}
44
import akka.stream.Materializer
55
import io.cequence.openaiscala.domain.response.ChatCompletionResponse
66
import io.cequence.openaiscala.service.{OpenAIService, OpenAIServiceFactory}
@@ -16,6 +16,7 @@ trait ExampleBase[T <: CloseableService] {
1616

1717
implicit val system: ActorSystem = ActorSystem()
1818
implicit val materializer: Materializer = Materializer(system)
19+
implicit val scheduler: Scheduler = system.scheduler
1920
implicit val ec: ExecutionContext = ExecutionContext.Implicits.global
2021

2122
protected val service: T

openai-examples/src/main/scala/io/cequence/openaiscala/examples/adapter/RetryAdapterExample.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ object RetryAdapterExample extends ExampleBase[OpenAIService] {
1818

1919
// implicit retry settings and scheduler
2020
private implicit val retrySettings: RetrySettings = RetrySettings(maxRetries = 4)
21-
private implicit val scheduler: Scheduler = system.scheduler
2221

2322
// regular OpenAI service
2423
private val regularService = OpenAIServiceFactory()

0 commit comments

Comments
 (0)