@effect-uai/core 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +30 -16
  2. package/dist/{AiError-eLV9t1lU.d.mts → AiError-DvhLIbmd.d.mts} +15 -4
  3. package/dist/{AiError-eLV9t1lU.d.mts.map → AiError-DvhLIbmd.d.mts.map} +1 -1
  4. package/dist/{Loop-B54AB1ME.d.mts → Loop-ChpaO-ya.d.mts} +2 -2
  5. package/dist/{Loop-B54AB1ME.d.mts.map → Loop-ChpaO-ya.d.mts.map} +1 -1
  6. package/dist/MessengerError-CeK6VAcu.d.mts +64 -0
  7. package/dist/MessengerError-CeK6VAcu.d.mts.map +1 -0
  8. package/dist/{Toolkit-DAjJ9Tvl.d.mts → Toolkit-tlL0F2YR.d.mts} +2 -2
  9. package/dist/{Toolkit-DAjJ9Tvl.d.mts.map → Toolkit-tlL0F2YR.d.mts.map} +1 -1
  10. package/dist/chunker/Chunker.d.mts +1 -1
  11. package/dist/domain/AiError.d.mts +2 -2
  12. package/dist/domain/AiError.mjs +9 -2
  13. package/dist/domain/AiError.mjs.map +1 -1
  14. package/dist/domain/Realtime.d.mts +616 -0
  15. package/dist/domain/Realtime.d.mts.map +1 -0
  16. package/dist/domain/Realtime.mjs +21 -0
  17. package/dist/domain/Realtime.mjs.map +1 -0
  18. package/dist/domain/Transcript.d.mts +17 -3
  19. package/dist/domain/Transcript.d.mts.map +1 -1
  20. package/dist/domain/Transcript.mjs +30 -1
  21. package/dist/domain/Transcript.mjs.map +1 -1
  22. package/dist/domain/Transcript.test.d.mts +1 -0
  23. package/dist/domain/Transcript.test.mjs +110 -0
  24. package/dist/domain/Transcript.test.mjs.map +1 -0
  25. package/dist/embedding-model/EmbeddingModel.d.mts +1 -1
  26. package/dist/image-generator/ImageGenerator.d.mts +1 -1
  27. package/dist/index.d.mts +11 -4
  28. package/dist/index.mjs +9 -2
  29. package/dist/job/Job.d.mts +1 -1
  30. package/dist/language-model/LanguageModel.d.mts +2 -2
  31. package/dist/loop/Loop.d.mts +1 -1
  32. package/dist/messenger/Messenger.d.mts +472 -0
  33. package/dist/messenger/Messenger.d.mts.map +1 -0
  34. package/dist/messenger/Messenger.mjs +66 -0
  35. package/dist/messenger/Messenger.mjs.map +1 -0
  36. package/dist/messenger/MessengerAdapter.d.mts +35 -0
  37. package/dist/messenger/MessengerAdapter.d.mts.map +1 -0
  38. package/dist/messenger/MessengerAdapter.mjs +102 -0
  39. package/dist/messenger/MessengerAdapter.mjs.map +1 -0
  40. package/dist/messenger/MessengerAdapter.test.d.mts +1 -0
  41. package/dist/messenger/MessengerAdapter.test.mjs +138 -0
  42. package/dist/messenger/MessengerAdapter.test.mjs.map +1 -0
  43. package/dist/messenger/MessengerError.d.mts +2 -0
  44. package/dist/messenger/MessengerError.mjs +39 -0
  45. package/dist/messenger/MessengerError.mjs.map +1 -0
  46. package/dist/music-generator/MusicGenerator.d.mts +1 -1
  47. package/dist/realtime/RealtimeSession.d.mts +50 -0
  48. package/dist/realtime/RealtimeSession.d.mts.map +1 -0
  49. package/dist/realtime/RealtimeSession.mjs +45 -0
  50. package/dist/realtime/RealtimeSession.mjs.map +1 -0
  51. package/dist/realtime/RealtimeSession.test.d.mts +1 -0
  52. package/dist/realtime/RealtimeSession.test.mjs +95 -0
  53. package/dist/realtime/RealtimeSession.test.mjs.map +1 -0
  54. package/dist/reranker/Reranker.d.mts +1 -1
  55. package/dist/research/DeepResearch.d.mts +1 -1
  56. package/dist/retry/Retry.d.mts +1 -1
  57. package/dist/speech-synthesizer/SpeechSynthesizer.d.mts +1 -1
  58. package/dist/streaming/Settle.d.mts +45 -0
  59. package/dist/streaming/Settle.d.mts.map +1 -0
  60. package/dist/streaming/Settle.mjs +95 -0
  61. package/dist/streaming/Settle.mjs.map +1 -0
  62. package/dist/streaming/Settle.test.d.mts +1 -0
  63. package/dist/streaming/Settle.test.mjs +252 -0
  64. package/dist/streaming/Settle.test.mjs.map +1 -0
  65. package/dist/streaming/WebSocketSession.d.mts +36 -0
  66. package/dist/streaming/WebSocketSession.d.mts.map +1 -0
  67. package/dist/streaming/WebSocketSession.mjs +89 -0
  68. package/dist/streaming/WebSocketSession.mjs.map +1 -0
  69. package/dist/streaming/WebSocketSession.test.d.mts +1 -0
  70. package/dist/streaming/WebSocketSession.test.mjs +51 -0
  71. package/dist/streaming/WebSocketSession.test.mjs.map +1 -0
  72. package/dist/testing/FakeWebSocket.d.mts +25 -0
  73. package/dist/testing/FakeWebSocket.d.mts.map +1 -0
  74. package/dist/testing/FakeWebSocket.mjs +79 -0
  75. package/dist/testing/FakeWebSocket.mjs.map +1 -0
  76. package/dist/testing/MockMessenger.d.mts +192 -0
  77. package/dist/testing/MockMessenger.d.mts.map +1 -0
  78. package/dist/testing/MockMessenger.mjs +76 -0
  79. package/dist/testing/MockMessenger.mjs.map +1 -0
  80. package/dist/testing/MockRealtimeSession.d.mts +30 -0
  81. package/dist/testing/MockRealtimeSession.d.mts.map +1 -0
  82. package/dist/testing/MockRealtimeSession.mjs +52 -0
  83. package/dist/testing/MockRealtimeSession.mjs.map +1 -0
  84. package/dist/tool/Toolkit.d.mts +1 -1
  85. package/dist/transcriber/Transcriber.d.mts +1 -1
  86. package/dist/web-read/WebRead.d.mts +1 -1
  87. package/dist/web-read/WebReadTool.d.mts +1 -1
  88. package/dist/web-search/WebSearch.d.mts +1 -1
  89. package/dist/web-search/WebSearchTool.d.mts +1 -1
  90. package/package.json +41 -1
  91. package/src/domain/AiError.ts +11 -0
  92. package/src/domain/Realtime.ts +101 -0
  93. package/src/domain/Transcript.test.ts +98 -0
  94. package/src/domain/Transcript.ts +53 -1
  95. package/src/index.ts +7 -0
  96. package/src/messenger/Messenger.ts +293 -0
  97. package/src/messenger/MessengerAdapter.test.ts +179 -0
  98. package/src/messenger/MessengerAdapter.ts +189 -0
  99. package/src/messenger/MessengerError.ts +67 -0
  100. package/src/realtime/RealtimeSession.test.ts +100 -0
  101. package/src/realtime/RealtimeSession.ts +77 -0
  102. package/src/streaming/Settle.test.ts +344 -0
  103. package/src/streaming/Settle.ts +196 -0
  104. package/src/streaming/WebSocketSession.test.ts +52 -0
  105. package/src/streaming/WebSocketSession.ts +132 -0
  106. package/src/testing/FakeWebSocket.ts +120 -0
  107. package/src/testing/MockMessenger.ts +147 -0
  108. package/src/testing/MockRealtimeSession.ts +92 -0
@@ -0,0 +1,92 @@
1
+ import { Cause, Effect, Layer, Queue, Ref, Stream } from "effect"
2
+ import type { CommonSessionRequest, RealtimeEvent, RealtimeInput } from "../domain/Realtime.js"
3
+ import {
4
+ RealtimeSession,
5
+ RealtimeVideoInput,
6
+ type RealtimeSessionHandle,
7
+ type RealtimeSessionService,
8
+ } from "../realtime/RealtimeSession.js"
9
+
10
+ export type MockRealtimeSessionRecorder = {
11
+ readonly openCalls: ReadonlyArray<CommonSessionRequest>
12
+ readonly sent: ReadonlyArray<RealtimeInput>
13
+ }
14
+
15
+ export type MockRealtimeSessionScript = {
16
+ /** Emitted as soon as the session opens. */
17
+ readonly initial?: ReadonlyArray<RealtimeEvent>
18
+ /** The server's answer to each input. */
19
+ readonly onInput?: (input: RealtimeInput) => ReadonlyArray<RealtimeEvent>
20
+ }
21
+
22
+ type Recorders = {
23
+ readonly open: (request: CommonSessionRequest) => Effect.Effect<void>
24
+ readonly send: (input: RealtimeInput) => Effect.Effect<void>
25
+ }
26
+
27
+ const makeService = (
28
+ script: MockRealtimeSessionScript,
29
+ record: Recorders,
30
+ ): RealtimeSessionService => ({
31
+ open: (request) =>
32
+ Effect.gen(function* () {
33
+ yield* record.open(request)
34
+ const queue = yield* Queue.unbounded<RealtimeEvent, Cause.Done>()
35
+ // Closing the scope ends `events`, leaving anything already queued to drain.
36
+ yield* Effect.addFinalizer(() => Queue.end(queue))
37
+ yield* Queue.offerAll(queue, script.initial ?? [])
38
+ const handle: RealtimeSessionHandle = {
39
+ send: (input) =>
40
+ Effect.andThen(
41
+ record.send(input),
42
+ Queue.offerAll(queue, script.onInput?.(input) ?? []),
43
+ ).pipe(Effect.asVoid),
44
+ events: Stream.fromQueue(queue),
45
+ }
46
+ return handle
47
+ }),
48
+ })
49
+
50
+ const build = (script: MockRealtimeSessionScript) => {
51
+ const openCalls = Ref.makeUnsafe<ReadonlyArray<CommonSessionRequest>>([])
52
+ const sent = Ref.makeUnsafe<ReadonlyArray<RealtimeInput>>([])
53
+ const sessionLayer = Layer.succeed(
54
+ RealtimeSession,
55
+ makeService(script, {
56
+ open: (request) => Ref.update(openCalls, (xs) => [...xs, request]),
57
+ send: (input) => Ref.update(sent, (xs) => [...xs, input]),
58
+ }),
59
+ )
60
+ const recorder: Effect.Effect<MockRealtimeSessionRecorder> = Effect.gen(function* () {
61
+ return { openCalls: yield* Ref.get(openCalls), sent: yield* Ref.get(sent) }
62
+ })
63
+ return { sessionLayer, recorder }
64
+ }
65
+
66
+ /** Scripted session that also ships the `RealtimeVideoInput` marker. */
67
+ export const layer = (
68
+ script: MockRealtimeSessionScript,
69
+ ): {
70
+ readonly layer: Layer.Layer<RealtimeSession | RealtimeVideoInput>
71
+ readonly recorder: Effect.Effect<MockRealtimeSessionRecorder>
72
+ } => {
73
+ const { sessionLayer, recorder } = build(script)
74
+ return {
75
+ layer: Layer.merge(sessionLayer, Layer.succeed(RealtimeVideoInput, undefined)),
76
+ recorder,
77
+ }
78
+ }
79
+
80
+ /**
81
+ * The same without the marker, to test that a caller sending video against an
82
+ * audio-only provider fails to compile.
83
+ */
84
+ export const layerAudioOnly = (
85
+ script: MockRealtimeSessionScript,
86
+ ): {
87
+ readonly layer: Layer.Layer<RealtimeSession>
88
+ readonly recorder: Effect.Effect<MockRealtimeSessionRecorder>
89
+ } => {
90
+ const { sessionLayer, recorder } = build(script)
91
+ return { layer: sessionLayer, recorder }
92
+ }