Skip to content

Commit b53bfe0

Browse files
committed
Responses API - add example implementations for creating model responses with image, text, file search, functions, and web search
1 parent 7647b2c commit b53bfe0

File tree

5 files changed

+185
-0
lines changed

5 files changed

+185
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package io.cequence.openaiscala.examples.responsesapi
2+
3+
import scala.concurrent.Future
4+
import io.cequence.openaiscala.domain.responsesapi.Inputs
5+
import io.cequence.openaiscala.domain.responsesapi.InputMessageContent
6+
import io.cequence.openaiscala.domain.ChatRole
7+
import io.cequence.openaiscala.examples.Example
8+
9+
object CreateModelResponseForImage extends Example {
10+
11+
override def run: Future[Unit] =
12+
service.createModelResponse(
13+
Inputs.Items(
14+
io.cequence.openaiscala.domain.responsesapi.Message.InputContent(
15+
Seq(
16+
InputMessageContent.Text("what is in this image?"),
17+
InputMessageContent.Image(
18+
imageUrl = Some("https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg")
19+
)
20+
),
21+
role = ChatRole.User
22+
)
23+
)
24+
).map { response =>
25+
import response.usage._
26+
27+
println(response.outputText.getOrElse("N/A"))
28+
println(inputTokens)
29+
println(outputTokens)
30+
println(totalTokens)
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.cequence.openaiscala.examples.responsesapi
2+
3+
import scala.concurrent.Future
4+
import io.cequence.openaiscala.domain.responsesapi.Inputs
5+
import io.cequence.openaiscala.examples.Example
6+
7+
object CreateModelResponseForText extends Example {
8+
9+
override def run: Future[Unit] =
10+
service.createModelResponse(
11+
Inputs.Text("What is the capital of France?")
12+
).map { response =>
13+
import response.usage._
14+
15+
println(response.outputText.getOrElse("N/A"))
16+
println(inputTokens)
17+
println(outputTokens)
18+
println(totalTokens)
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package io.cequence.openaiscala.examples.responsesapi
2+
3+
import scala.concurrent.Future
4+
import io.cequence.openaiscala.domain.responsesapi.{Inputs, CreateModelResponseSettings}
5+
import io.cequence.openaiscala.examples.Example
6+
import io.cequence.openaiscala.domain.ModelId
7+
import io.cequence.openaiscala.domain.responsesapi.tools.FileSearchTool
8+
import io.cequence.openaiscala.domain.responsesapi.Annotation
9+
import io.cequence.openaiscala.domain.responsesapi.OutputMessageContent.OutputText
10+
11+
object CreateModelResponseWithFileSearch extends Example {
12+
13+
override def run: Future[Unit] =
14+
service
15+
.createModelResponse(
16+
Inputs.Text("What are the attributes of an ancient brown dragon?"),
17+
settings = CreateModelResponseSettings(
18+
model = ModelId.gpt_4o_2024_08_06,
19+
tools = Seq(
20+
FileSearchTool(
21+
vectorStoreIds = Seq("vs_1234567890"),
22+
maxNumResults = Some(20),
23+
filters = None,
24+
rankingOptions = None
25+
)
26+
)
27+
)
28+
)
29+
.map { response =>
30+
println(response.outputText.getOrElse("N/A"))
31+
32+
// citations
33+
val citations: Seq[Annotation.FileCitation] = response.outputMessageContents.collect { case e: OutputText =>
34+
e.annotations.collect { case citation: Annotation.FileCitation => citation }
35+
}.flatten
36+
37+
println("Citations:")
38+
citations.foreach { citation =>
39+
println(s"${citation.fileId} - ${citation.filename}")
40+
}
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package io.cequence.openaiscala.examples.responsesapi
2+
3+
import scala.concurrent.Future
4+
import io.cequence.openaiscala.domain.responsesapi.{Inputs, CreateModelResponseSettings}
5+
import io.cequence.openaiscala.examples.Example
6+
import io.cequence.openaiscala.domain.ModelId
7+
import io.cequence.openaiscala.domain.responsesapi.tools.FunctionTool
8+
import io.cequence.openaiscala.domain.JsonSchema
9+
import io.cequence.openaiscala.domain.responsesapi.tools.ToolChoice
10+
11+
object CreateModelResponseWithFunctions extends Example {
12+
13+
override def run: Future[Unit] =
14+
service
15+
.createModelResponse(
16+
Inputs.Text("What is the weather like in Boston today?"),
17+
settings = CreateModelResponseSettings(
18+
model = ModelId.gpt_4o_2024_08_06,
19+
tools = Seq(
20+
FunctionTool(
21+
name = "get_current_weather",
22+
parameters = JsonSchema.Object(
23+
properties = Map(
24+
"location" -> JsonSchema.String(
25+
description = Some("The city and state, e.g. San Francisco, CA")
26+
),
27+
"unit" -> JsonSchema.String(
28+
enum = Seq("celsius", "fahrenheit")
29+
)
30+
),
31+
required = Seq("location", "unit")
32+
),
33+
description = Some("Get the current weather in a given location"),
34+
strict = true
35+
)
36+
),
37+
toolChoice = Some(ToolChoice.Mode.Auto)
38+
)
39+
)
40+
.map { response =>
41+
val functionCall = response.outputFunctionCalls.headOption.getOrElse(throw new RuntimeException("No function call output found"))
42+
43+
println(
44+
s"""Function Call Details:
45+
|Name: ${functionCall.name}
46+
|Arguments: ${functionCall.arguments}
47+
|Call ID: ${functionCall.callId}
48+
|ID: ${functionCall.id}
49+
|Status: ${functionCall.status}""".stripMargin
50+
)
51+
52+
val toolsUsed = response.tools.map(_.typeString)
53+
54+
println(s"${toolsUsed.size} tools used: ${toolsUsed.mkString(", ")}")
55+
}
56+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package io.cequence.openaiscala.examples.responsesapi
2+
3+
import scala.concurrent.Future
4+
import io.cequence.openaiscala.domain.responsesapi.{Inputs, CreateModelResponseSettings}
5+
import io.cequence.openaiscala.examples.Example
6+
import io.cequence.openaiscala.domain.ModelId
7+
import io.cequence.openaiscala.domain.responsesapi.OutputMessageContent.OutputText
8+
import io.cequence.openaiscala.domain.responsesapi.tools.WebSearchTool
9+
import io.cequence.openaiscala.domain.responsesapi.Annotation
10+
11+
object CreateModelResponseWithWebSearch extends Example {
12+
13+
override def run: Future[Unit] =
14+
service
15+
.createModelResponse(
16+
Inputs.Text("What was a positive news story from today?"),
17+
settings = CreateModelResponseSettings(
18+
model = ModelId.gpt_4o_2024_08_06,
19+
tools = Seq(WebSearchTool())
20+
)
21+
)
22+
.map { response =>
23+
println(response.outputText.getOrElse("N/A"))
24+
25+
// citations
26+
val citations: Seq[Annotation.UrlCitation] = response.outputMessageContents.collect { case e: OutputText =>
27+
e.annotations.collect { case citation: Annotation.UrlCitation => citation }
28+
}.flatten
29+
30+
println("Citations:")
31+
citations.foreach { citation =>
32+
println(s"${citation.title} - ${citation.url}")
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)