@@ -3,13 +3,49 @@ package io.cequence.openaiscala
3
3
import akka .actor .{ActorSystem , Scheduler }
4
4
import akka .pattern .after
5
5
import akka .stream .Materializer
6
- import io .cequence .openaiscala .RetryHelpers .RetrySettings
6
+ import io .cequence .openaiscala .RetryHelpers .{ RetrySettings , retry }
7
7
8
8
import scala .concurrent .duration .{DurationInt , FiniteDuration }
9
9
import scala .concurrent .{ExecutionContext , Future }
10
10
import scala .util .control .NonFatal
11
11
12
12
object RetryHelpers {
13
+ private [openaiscala] def delay (
14
+ n : Integer
15
+ )(implicit retrySettings : RetrySettings ): FiniteDuration =
16
+ FiniteDuration (
17
+ scala.math.round(
18
+ retrySettings.delayOffset.length + scala.math.pow(
19
+ retrySettings.delayBase,
20
+ n.doubleValue()
21
+ )
22
+ ),
23
+ retrySettings.delayOffset.unit
24
+ )
25
+
26
+ private [openaiscala] def retry [T ](
27
+ attempt : () => Future [T ],
28
+ attempts : Int
29
+ )(implicit
30
+ ec : ExecutionContext ,
31
+ scheduler : Scheduler ,
32
+ retrySettings : RetrySettings
33
+ ): Future [T ] = {
34
+ try {
35
+ if (attempts > 0 ) {
36
+ attempt().recoverWith { case Retryable (_) =>
37
+ after(delay(attempts), scheduler) {
38
+ retry(attempt, attempts - 1 )
39
+ }
40
+ }
41
+ } else {
42
+ attempt()
43
+ }
44
+ } catch {
45
+ case NonFatal (error) => Future .failed(error)
46
+ }
47
+ }
48
+
13
49
final case class RetrySettings (
14
50
maxRetries : Int = 5 ,
15
51
delayOffset : FiniteDuration = 2 .seconds,
@@ -18,13 +54,15 @@ object RetryHelpers {
18
54
def constantInterval (interval : FiniteDuration ): RetrySettings =
19
55
copy(delayBase = 0 ).copy(delayOffset = interval)
20
56
}
57
+
21
58
object RetrySettings {
22
59
def apply (interval : FiniteDuration ): RetrySettings =
23
60
RetrySettings ().constantInterval(
24
61
interval
25
62
)
26
63
27
64
}
65
+
28
66
}
29
67
30
68
trait RetryHelpers {
@@ -41,42 +79,6 @@ trait RetryHelpers {
41
79
): Future [T ] = {
42
80
retry(() => f, retrySettings.maxRetries)
43
81
}
44
-
45
- private [openaiscala] def delay (
46
- n : Integer
47
- )(implicit retrySettings : RetrySettings ): FiniteDuration =
48
- FiniteDuration (
49
- scala.math.round(
50
- retrySettings.delayOffset.length + scala.math.pow(
51
- retrySettings.delayBase,
52
- n.doubleValue()
53
- )
54
- ),
55
- retrySettings.delayOffset.unit
56
- )
57
-
58
- private [openaiscala] def retry (
59
- attempt : () => Future [T ],
60
- attempts : Int
61
- )(implicit
62
- ec : ExecutionContext ,
63
- scheduler : Scheduler ,
64
- retrySettings : RetrySettings
65
- ): Future [T ] = {
66
- try {
67
- if (attempts > 0 ) {
68
- attempt().recoverWith { case Retryable (_) =>
69
- after(delay(attempts), scheduler) {
70
- retry(attempt, attempts - 1 )
71
- }
72
- }
73
- } else {
74
- attempt()
75
- }
76
- } catch {
77
- case NonFatal (error) => Future .failed(error)
78
- }
79
- }
80
-
81
82
}
83
+
82
84
}
0 commit comments