File tree Expand file tree Collapse file tree 4 files changed +41
-2
lines changed
openai-core/src/main/scala/io/cequence/openaiscala/service/adapter Expand file tree Collapse file tree 4 files changed +41
-2
lines changed Original file line number Diff line number Diff line change @@ -31,5 +31,4 @@ private class ChatCompletionServiceAdapter[S <: CloseableService](
31
31
chatCompletionService.close()
32
32
underlying.close()
33
33
}
34
-
35
34
}
Original file line number Diff line number Diff line change @@ -36,4 +36,4 @@ private class RandomOrderAdapter[+S <: CloseableService](
36
36
val underlyings : Seq [S ]
37
37
) extends MultiServiceAdapter [S ] {
38
38
protected def calcIndex : Int = Random .nextInt(count)
39
- }
39
+ }
Original file line number Diff line number Diff line change 1
1
package io .cequence .openaiscala .service .adapter
2
2
3
3
import akka .actor .Scheduler
4
+ import akka .stream .Materializer
4
5
import io .cequence .openaiscala .RetryHelpers .RetrySettings
5
6
import io .cequence .openaiscala .domain .BaseMessage
6
7
import io .cequence .openaiscala .domain .settings .CreateChatCompletionSettings
@@ -34,6 +35,12 @@ trait OpenAIServiceAdapters[S <: CloseableService] {
34
35
): S =
35
36
wrapAndDelegate(new RandomOrderAdapter (underlyings))
36
37
38
+ def parallelTakeFirst (
39
+ underlyings : S * )(
40
+ implicit materializer : Materializer
41
+ ): S =
42
+ wrapAndDelegate(new ParallelTakeFirstAdapter (underlyings))
43
+
37
44
def retry (
38
45
underlying : S ,
39
46
log : Option [String => Unit ] = None
Original file line number Diff line number Diff line change
1
+ package io .cequence .openaiscala .service .adapter
2
+
3
+ import akka .stream .Materializer
4
+ import akka .stream .scaladsl .{Sink , Source }
5
+ import io .cequence .wsclient .service .CloseableService
6
+ import org .slf4j .LoggerFactory
7
+
8
+ import scala .concurrent .Future
9
+
10
+ private class ParallelTakeFirstAdapter [+ S <: CloseableService ](
11
+ underlyings : Seq [S ]
12
+ )(
13
+ implicit materializer : Materializer
14
+ ) extends ServiceWrapper [S ]
15
+ with CloseableService {
16
+
17
+ private val logger = LoggerFactory .getLogger(getClass)
18
+
19
+ override protected [adapter] def wrap [T ](
20
+ fun : S => Future [T ]
21
+ ): Future [T ] = {
22
+ logger.debug(s " Running parallel/redundant processing with ${underlyings.size} services. " )
23
+
24
+ val sources = Source
25
+ .fromIterator(() => underlyings.toIterator)
26
+ .mapAsyncUnordered(underlyings.size)(fun)
27
+
28
+ sources.runWith(Sink .head)
29
+ }
30
+
31
+ override def close (): Unit =
32
+ underlyings.foreach(_.close())
33
+ }
You can’t perform that action at this time.
0 commit comments