@recombine-ai/platform 0.9.1-test.2 → 0.9.1-test.4
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.
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{YRWW-SW8.js → AHiDv00n.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/AHiDv00n.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/AHiDv00n.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{CdiiHmb_.js → B85uAto8.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/B85uAto8.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/B85uAto8.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{COI2cH3y.js → BQd-oRUg.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/BQd-oRUg.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/BQd-oRUg.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{B3sRmUmR.js → CKe6BxWL.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CKe6BxWL.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CKe6BxWL.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/{BIYJrTTr.js → MfNXj3Ue.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/MfNXj3Ue.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/MfNXj3Ue.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/{app.0r1adPhk.js → app.DKwJRMGa.js} +2 -2
- package/build/bosun-app/frontend/client/_app/immutable/entry/app.DKwJRMGa.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/app.DKwJRMGa.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.Shg1qVuj.js +1 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.Shg1qVuj.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.Shg1qVuj.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{0.BCslgDHp.js → 0.CM_uGID6.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/0.CM_uGID6.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/0.CM_uGID6.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{1.DfDHVqM0.js → 1.424_xIvV.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/1.424_xIvV.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/1.424_xIvV.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{10.BXbQQ1q5.js → 10.CBmyaxPa.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.CBmyaxPa.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.CBmyaxPa.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{17.DSps31HJ.js → 17.d8VRcLNZ.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/17.d8VRcLNZ.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/17.d8VRcLNZ.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{18.8hAfbPPt.js → 18.xvo_JAG6.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.xvo_JAG6.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.xvo_JAG6.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{2.DLZcnXo3.js → 2.BMIMNLut.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.BMIMNLut.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.BMIMNLut.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{3.Dzl7FcjU.js → 3.DH723ik1.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.DH723ik1.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.DH723ik1.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{4.BlHeYRVW.js → 4.D7MQfqBW.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/4.D7MQfqBW.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/4.D7MQfqBW.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{5.DE3muGEs.js → 5.CgFgE7jv.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/5.CgFgE7jv.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/5.CgFgE7jv.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{6.DauPUI6w.js → 6.CAfGncmh.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CAfGncmh.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/6.CAfGncmh.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{8.DIwMEVk7.js → 8.BaUuXdDP.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/8.BaUuXdDP.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/8.BaUuXdDP.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/{9.BoyHpLCi.js → 9.CdDczpYU.js} +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.CdDczpYU.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.CdDczpYU.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/version.json +1 -1
- package/build/bosun-app/frontend/client/_app/version.json.br +0 -0
- package/build/bosun-app/frontend/client/_app/version.json.gz +0 -0
- package/build/bosun-app/frontend/handler.js +4 -4
- package/build/bosun-app/frontend/index.js +4 -4
- package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-Cr3b1H4k.js → internal.js-grF_FC95.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/chunks/{internal.js-Cr3b1H4k.js.map → internal.js-grF_FC95.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/{handler-DqsNau3u.js → handler-DtRK2f71.js} +3 -3
- package/build/bosun-app/frontend/server/chunks/{handler-DqsNau3u.js.map → handler-DtRK2f71.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/{index.js-DZUC5rml.js → index.js-CGN8fkKf.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/{index.js-DZUC5rml.js.map → index.js-CGN8fkKf.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/{manifest.js-Ba8Iww95.js → manifest.js-4yfNPJrj.js} +14 -14
- package/build/bosun-app/frontend/server/chunks/{manifest.js-Ba8Iww95.js.map → manifest.js-4yfNPJrj.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{0.js-ErWLOg9o.js → 0.js-VI8hFMMF.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{0.js-ErWLOg9o.js.map → 0.js-VI8hFMMF.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{1.js-BucIct8J.js → 1.js-CcFXNzkf.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{1.js-BucIct8J.js.map → 1.js-CcFXNzkf.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{10.js-CmuGuxqs.js → 10.js-B4Y1IcD4.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{10.js-CmuGuxqs.js.map → 10.js-B4Y1IcD4.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{17.js-R-YLRxxY.js → 17.js-CgVKVxzg.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{17.js-R-YLRxxY.js.map → 17.js-CgVKVxzg.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{18.js-Bwqlseie.js → 18.js-BMMFbpKI.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{18.js-Bwqlseie.js.map → 18.js-BMMFbpKI.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{2.js-DWsjBpYQ.js → 2.js-C9DJjLy5.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{2.js-DWsjBpYQ.js.map → 2.js-C9DJjLy5.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{3.js-Bw_XtVfk.js → 3.js-Cao3jg5z.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{3.js-Bw_XtVfk.js.map → 3.js-Cao3jg5z.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{4.js-ZjhIMlzQ.js → 4.js-BVIkfL-J.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{4.js-ZjhIMlzQ.js.map → 4.js-BVIkfL-J.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{5.js-1hrIQeCi.js → 5.js-DxBXI3Tn.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{5.js-1hrIQeCi.js.map → 5.js-DxBXI3Tn.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{6.js-DqwEZ7GV.js → 6.js-GyWS2kBZ.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{6.js-DqwEZ7GV.js.map → 6.js-GyWS2kBZ.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{8.js-DN3WDIfO.js → 8.js-BejmyzcM.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{8.js-DN3WDIfO.js.map → 8.js-BejmyzcM.js.map} +1 -1
- package/build/bosun-app/frontend/server/chunks/nodes/{9.js-C_SjLW8b.js → 9.js-BOGJ7h8n.js} +2 -2
- package/build/bosun-app/frontend/server/chunks/nodes/{9.js-C_SjLW8b.js.map → 9.js-BOGJ7h8n.js.map} +1 -1
- package/build/call-control/schemas.generated.d.ts +2 -0
- package/build/call-control/schemas.generated.d.ts.map +1 -1
- package/build/call-control/schemas.generated.js +2 -0
- package/build/call-control/voice-agent-config.d.ts +2 -0
- package/build/call-control/voice-agent-config.d.ts.map +1 -1
- package/build/engine/interfaces/stream.d.ts +7 -0
- package/build/engine/interfaces/stream.d.ts.map +1 -1
- package/build/engine/stream/jev-prediction-chooser.d.ts.map +1 -1
- package/build/engine/stream/jev-prediction-chooser.js +45 -11
- package/build/engine/stream/predictive-workflow.d.ts.map +1 -1
- package/build/engine/stream/predictive-workflow.js +172 -21
- package/package.json +1 -1
- package/build/bosun-app/frontend/client/_app/immutable/chunks/B3sRmUmR.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/B3sRmUmR.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/BIYJrTTr.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/BIYJrTTr.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/COI2cH3y.js.br +0 -3
- package/build/bosun-app/frontend/client/_app/immutable/chunks/COI2cH3y.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CdiiHmb_.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/CdiiHmb_.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/YRWW-SW8.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/chunks/YRWW-SW8.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/app.0r1adPhk.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/app.0r1adPhk.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.BNSaABB8.js +0 -1
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.BNSaABB8.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/entry/start.BNSaABB8.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/0.BCslgDHp.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/0.BCslgDHp.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/1.DfDHVqM0.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/1.DfDHVqM0.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.BXbQQ1q5.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/10.BXbQQ1q5.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/17.DSps31HJ.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/17.DSps31HJ.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.8hAfbPPt.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/18.8hAfbPPt.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DLZcnXo3.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/2.DLZcnXo3.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.Dzl7FcjU.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/3.Dzl7FcjU.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/4.BlHeYRVW.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/4.BlHeYRVW.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/5.DE3muGEs.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/5.DE3muGEs.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DauPUI6w.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/6.DauPUI6w.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/8.DIwMEVk7.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/8.DIwMEVk7.js.gz +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BoyHpLCi.js.br +0 -0
- package/build/bosun-app/frontend/client/_app/immutable/nodes/9.BoyHpLCi.js.gz +0 -0
|
@@ -123,6 +123,8 @@ export declare const configSchema: z.ZodObject<{
|
|
|
123
123
|
eleven_flash_v2: "eleven_flash_v2";
|
|
124
124
|
eleven_v3: "eleven_v3";
|
|
125
125
|
eleven_v3_conversational: "eleven_v3_conversational";
|
|
126
|
+
eleven_v4: "eleven_v4";
|
|
127
|
+
eleven_v4_turbo: "eleven_v4_turbo";
|
|
126
128
|
}>>;
|
|
127
129
|
tts_text_prefix: z.ZodDefault<z.ZodString>;
|
|
128
130
|
tts_inactivity_timeout: z.ZodDefault<z.ZodNumber>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.generated.d.ts","sourceRoot":"","sources":["../../src/call-control/schemas.generated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"schemas.generated.d.ts","sourceRoot":"","sources":["../../src/call-control/schemas.generated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0TvB,CAAA"}
|
|
@@ -122,6 +122,8 @@ export declare const voiceAgentConfigSchema: import("zod").ZodObject<{
|
|
|
122
122
|
eleven_flash_v2: "eleven_flash_v2";
|
|
123
123
|
eleven_v3: "eleven_v3";
|
|
124
124
|
eleven_v3_conversational: "eleven_v3_conversational";
|
|
125
|
+
eleven_v4: "eleven_v4";
|
|
126
|
+
eleven_v4_turbo: "eleven_v4_turbo";
|
|
125
127
|
}>>;
|
|
126
128
|
tts_text_prefix: import("zod").ZodDefault<import("zod").ZodString>;
|
|
127
129
|
tts_inactivity_timeout: import("zod").ZodDefault<import("zod").ZodNumber>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voice-agent-config.d.ts","sourceRoot":"","sources":["../../src/call-control/voice-agent-config.ts"],"names":[],"mappings":"AAyDA,eAAO,MAAM,sBAAsB
|
|
1
|
+
{"version":3,"file":"voice-agent-config.d.ts","sourceRoot":"","sources":["../../src/call-control/voice-agent-config.ts"],"names":[],"mappings":"AAyDA,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAGjC,CAAA;AAEF,wBAAgB,uCAAuC,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAK/E"}
|
|
@@ -39,9 +39,16 @@ export interface PredictionChooserResult {
|
|
|
39
39
|
inputTokens: number;
|
|
40
40
|
outputTokens: number;
|
|
41
41
|
};
|
|
42
|
+
diagnostics?: {
|
|
43
|
+
requestDurationMs: number;
|
|
44
|
+
upstreamDurationMs?: number;
|
|
45
|
+
requestId?: string;
|
|
46
|
+
retryCount: number;
|
|
47
|
+
};
|
|
42
48
|
}
|
|
43
49
|
export interface PredictionChooser {
|
|
44
50
|
choose: (input: PredictionChooserInput) => Promise<PredictionChooserResult>;
|
|
51
|
+
prewarm?: () => Promise<void>;
|
|
45
52
|
getOptions: () => unknown;
|
|
46
53
|
getProviderInfo?: () => LlmProviderInfo;
|
|
47
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../src/engine/interfaces/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAEtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEnC,MAAM,WAAW,cAAc,CAAC,GAAG,SAAS,MAAM;IAE9C,cAAc,EAAE,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,CAAC,KAAK;QAOnD,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAA;KACjF,CAAA;IAED,wBAAwB,EAAE,CACtB,MAAM,EAAE,wBAAwB,CAAC,GAAG,CAAC,KACpC,2BAA2B,CAAC,GAAG,CAAC,CAAA;CACxC;AAED,MAAM,WAAW,qBAAqB;IAElC,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,YAAY,CAAC,EAAE,YAAY,CAAA;IAE3B,UAAU,CAAC,EAAE,UAAU,CAAA;IAKvB,WAAW,CAAC,EAAE,WAAW,CAAA;IAEzB,WAAW,CAAC,EAAE,WAAW,CAAA;IAEzB,UAAU,CAAC,EAAE;QACT,cAAc,EAAE,UAAU,CAAA;QAC1B,OAAO,EAAE,iBAAiB,CAAA;KAC7B,CAAA;CACJ;AAED,MAAM,WAAW,mBAAmB;IAChC,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,sBAAsB;IACnC,OAAO,EAAE,OAAO,EAAE,CAAA;IAClB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,UAAU,EAAE,SAAS,mBAAmB,EAAE,CAAA;CAC7C;AAED,MAAM,WAAW,uBAAuB;IAEpC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE;QACJ,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,EAAE,MAAM,CAAA;KACvB,CAAA;CACJ;AAED,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../src/engine/interfaces/stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jev-prediction-chooser.d.ts","sourceRoot":"","sources":["../../../src/engine/stream/jev-prediction-chooser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAA2C,MAAM,kBAAkB,CAAA;AAEtF,OAAO,KAAK,EAAE,iBAAiB,EAA2B,MAAM,wBAAwB,CAAA;AAGxF,MAAM,WAAW,2BAA2B;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IAEjB,KAAK,CAAC,EAAE,KAAK,CAAA;CAChB;AAED,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,2BAA2B,GACrC,iBAAiB,
|
|
1
|
+
{"version":3,"file":"jev-prediction-chooser.d.ts","sourceRoot":"","sources":["../../../src/engine/stream/jev-prediction-chooser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAA2C,MAAM,kBAAkB,CAAA;AAEtF,OAAO,KAAK,EAAE,iBAAiB,EAA2B,MAAM,wBAAwB,CAAA;AAGxF,MAAM,WAAW,2BAA2B;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IAEjB,KAAK,CAAC,EAAE,KAAK,CAAA;CAChB;AAED,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,2BAA2B,GACrC,iBAAiB,CA6EnB"}
|
|
@@ -2,13 +2,7 @@ import { TypeSafeClient, noul } from '@typesafe-ai/sdk';
|
|
|
2
2
|
import { chooserPrompt } from './predictive-prompts.js';
|
|
3
3
|
export function createJevPredictionChooser(options) {
|
|
4
4
|
validateOptions(options);
|
|
5
|
-
const
|
|
6
|
-
apiKey: options.apiKey,
|
|
7
|
-
defaultModel: options.model,
|
|
8
|
-
fetch: options.fetch,
|
|
9
|
-
logLevel: 'off',
|
|
10
|
-
timeout: options.timeoutMs,
|
|
11
|
-
});
|
|
5
|
+
const transport = options.fetch ?? ((input, init) => globalThis.fetch(input, init));
|
|
12
6
|
return {
|
|
13
7
|
getOptions: () => ({
|
|
14
8
|
model: options.model,
|
|
@@ -16,14 +10,24 @@ export function createJevPredictionChooser(options) {
|
|
|
16
10
|
timeoutMs: options.timeoutMs,
|
|
17
11
|
}),
|
|
18
12
|
getProviderInfo: () => ({ provider: 'typesafe', model: options.model }),
|
|
13
|
+
async prewarm() {
|
|
14
|
+
await Promise.all([prewarm(transport, options), prewarm(transport, options)]);
|
|
15
|
+
},
|
|
19
16
|
async choose(input) {
|
|
20
17
|
if (input.candidates.length === 0) {
|
|
21
18
|
throw new Error('Jev prediction chooser requires at least one candidate.');
|
|
22
19
|
}
|
|
20
|
+
let attemptCount = 0;
|
|
21
|
+
const client = createClient(options, async (request, init) => {
|
|
22
|
+
attemptCount += 1;
|
|
23
|
+
return transport(request, init);
|
|
24
|
+
});
|
|
23
25
|
const questions = createQuestions(input.candidates.length);
|
|
24
|
-
const
|
|
26
|
+
const startedAt = Date.now();
|
|
27
|
+
const request = client.systemOne({
|
|
25
28
|
model: options.model,
|
|
26
29
|
state: {
|
|
30
|
+
reply_safety_policy: chooserPrompt,
|
|
27
31
|
conversation_history: input.history.map((message) => ({
|
|
28
32
|
role: message.sender,
|
|
29
33
|
text: message.text,
|
|
@@ -36,6 +40,7 @@ export function createJevPredictionChooser(options) {
|
|
|
36
40
|
},
|
|
37
41
|
questions,
|
|
38
42
|
});
|
|
43
|
+
const { data: result, response, requestId } = await request.withResponse();
|
|
39
44
|
const scores = input.candidates.map((_, index) => {
|
|
40
45
|
const answer = result.answers[questionId(index)];
|
|
41
46
|
if (!answer ||
|
|
@@ -56,6 +61,12 @@ export function createJevPredictionChooser(options) {
|
|
|
56
61
|
inputTokens: result.usage.input_tokens,
|
|
57
62
|
outputTokens: result.usage.output_tokens,
|
|
58
63
|
},
|
|
64
|
+
diagnostics: {
|
|
65
|
+
requestDurationMs: Date.now() - startedAt,
|
|
66
|
+
upstreamDurationMs: parseDurationHeader(response.headers.get('x-envoy-upstream-service-time')),
|
|
67
|
+
requestId,
|
|
68
|
+
retryCount: Math.max(0, attemptCount - 1),
|
|
69
|
+
},
|
|
59
70
|
};
|
|
60
71
|
},
|
|
61
72
|
};
|
|
@@ -63,12 +74,35 @@ export function createJevPredictionChooser(options) {
|
|
|
63
74
|
function createQuestions(candidateCount) {
|
|
64
75
|
return Object.fromEntries(Array.from({ length: candidateCount }, (_, index) => [
|
|
65
76
|
questionId(index),
|
|
66
|
-
noul(
|
|
67
|
-
true: '
|
|
68
|
-
false: '
|
|
77
|
+
noul(`Is \`candidates[${index}].prepared_agent_response\` safe and natural immediately after \`actual_user_response\`? The predicted user response only explains where the prepared response came from. It does not replace the actual response. Apply every rule in \`reply_safety_policy\`.`, {
|
|
78
|
+
true: 'Every requirement in reply_safety_policy is met.',
|
|
79
|
+
false: 'At least one requirement in reply_safety_policy is not met.',
|
|
69
80
|
}),
|
|
70
81
|
]));
|
|
71
82
|
}
|
|
83
|
+
function createClient(options, fetch) {
|
|
84
|
+
return new TypeSafeClient({
|
|
85
|
+
apiKey: options.apiKey,
|
|
86
|
+
defaultModel: options.model,
|
|
87
|
+
fetch,
|
|
88
|
+
logLevel: 'off',
|
|
89
|
+
timeout: options.timeoutMs,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
async function prewarm(transport, options) {
|
|
93
|
+
const client = createClient(options, transport);
|
|
94
|
+
await client.systemOne({
|
|
95
|
+
model: options.model,
|
|
96
|
+
state: 'Hello.',
|
|
97
|
+
questions: { greeting: noul('Is this a greeting?') },
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function parseDurationHeader(value) {
|
|
101
|
+
if (value === null)
|
|
102
|
+
return undefined;
|
|
103
|
+
const duration = Number(value);
|
|
104
|
+
return Number.isFinite(duration) && duration >= 0 ? duration : undefined;
|
|
105
|
+
}
|
|
72
106
|
function selectCandidate(scores, threshold) {
|
|
73
107
|
let selectedIndex;
|
|
74
108
|
let selectedScore = threshold;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"predictive-workflow.d.ts","sourceRoot":"","sources":["../../../src/engine/stream/predictive-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAM/B,OAAO,KAAK,EAOR,2BAA2B,EAC3B,wBAAwB,EAExB,qBAAqB,EAExB,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"predictive-workflow.d.ts","sourceRoot":"","sources":["../../../src/engine/stream/predictive-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAM/B,OAAO,KAAK,EAOR,2BAA2B,EAC3B,wBAAwB,EAExB,qBAAqB,EAExB,MAAM,wBAAwB,CAAA;AAkD/B,wBAAgB,wBAAwB,CAAC,GAAG,SAAS,MAAM,EACvD,MAAM,EAAE,wBAAwB,CAAC,GAAG,CAAC,EACrC,YAAY,EAAE,qBAAqB,EACnC,WAAW,EAAE,QAAQ,CAAC,WAAW,GAClC,2BAA2B,CAAC,GAAG,CAAC,CAumBlC"}
|
|
@@ -48,8 +48,10 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
|
|
|
48
48
|
state.stopCurrent?.();
|
|
49
49
|
state.requestGeneration += 1;
|
|
50
50
|
const generation = state.requestGeneration;
|
|
51
|
-
const
|
|
52
|
-
const
|
|
51
|
+
const lastMessage = messages.at(-1);
|
|
52
|
+
const isUserTurn = lastMessage?.sender === 'user';
|
|
53
|
+
const isSubstantiveUserTurn = isUserTurn && lastMessage.text.trim().length > 0;
|
|
54
|
+
const predictionSets = isSubstantiveUserTurn
|
|
53
55
|
? [state.preparedPrewarm, state.preparedNormal].filter(isPreparedSet)
|
|
54
56
|
: [];
|
|
55
57
|
const predictions = predictionSets.flatMap((set) => set.pairs);
|
|
@@ -57,6 +59,7 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
|
|
|
57
59
|
const renderedPrompt = nunjucksEnv.renderString(template, ctx || {});
|
|
58
60
|
const stringifiedConversation = stringifyMessages(messages);
|
|
59
61
|
const runId = crypto.randomUUID();
|
|
62
|
+
const responseStartedAt = Date.now();
|
|
60
63
|
const mainTrace = {
|
|
61
64
|
workflowId: config.name,
|
|
62
65
|
workflowRunId: runId,
|
|
@@ -69,6 +72,18 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
|
|
|
69
72
|
renderedPrompt,
|
|
70
73
|
stringifiedConversation,
|
|
71
74
|
};
|
|
75
|
+
logger.info('Predictive response started', {
|
|
76
|
+
callId,
|
|
77
|
+
runId,
|
|
78
|
+
generation,
|
|
79
|
+
messageCount: messages.length,
|
|
80
|
+
lastMessageSender: lastMessage?.sender,
|
|
81
|
+
lastMessageLength: lastMessage?.text.length ?? 0,
|
|
82
|
+
isSubstantiveUserTurn,
|
|
83
|
+
prewarmPredictionCount: state.preparedPrewarm?.pairs.length ?? 0,
|
|
84
|
+
normalPredictionCount: state.preparedNormal?.pairs.length ?? 0,
|
|
85
|
+
chooserCandidateCount: predictions.length,
|
|
86
|
+
});
|
|
72
87
|
let active = true;
|
|
73
88
|
let output = '';
|
|
74
89
|
let outputStarted = false;
|
|
@@ -88,23 +103,48 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
|
|
|
88
103
|
return active && !state.closed && state.requestGeneration === generation;
|
|
89
104
|
}
|
|
90
105
|
function consumePredictions() {
|
|
106
|
+
const consumesPrewarm = isSubstantiveUserTurn && !state.prewarmConsumed;
|
|
107
|
+
const consumedPrewarmCount = consumesPrewarm
|
|
108
|
+
? (state.preparedPrewarm?.pairs.length ?? 0)
|
|
109
|
+
: 0;
|
|
110
|
+
let consumedNormalCount = 0;
|
|
91
111
|
for (const set of predictionSets) {
|
|
92
|
-
if (state.preparedPrewarm?.id === set.id) {
|
|
93
|
-
state.preparedPrewarm = undefined;
|
|
94
|
-
state.prewarmConsumed = true;
|
|
95
|
-
}
|
|
96
112
|
if (state.preparedNormal?.id === set.id) {
|
|
113
|
+
consumedNormalCount = set.pairs.length;
|
|
97
114
|
state.preparedNormal = undefined;
|
|
98
115
|
}
|
|
99
116
|
}
|
|
117
|
+
if (consumesPrewarm) {
|
|
118
|
+
state.preparedPrewarm = undefined;
|
|
119
|
+
state.prewarmConsumed = true;
|
|
120
|
+
}
|
|
121
|
+
if (isSubstantiveUserTurn || consumedNormalCount > 0) {
|
|
122
|
+
logger.info('Prepared predictions consumed', {
|
|
123
|
+
callId,
|
|
124
|
+
runId,
|
|
125
|
+
generation,
|
|
126
|
+
prewarmPredictionCount: consumedPrewarmCount,
|
|
127
|
+
normalPredictionCount: consumedNormalCount,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
100
130
|
}
|
|
101
|
-
function publish(controller, delta) {
|
|
131
|
+
function publish(controller, delta, source, match) {
|
|
102
132
|
if (!isCurrent() || !delta)
|
|
103
133
|
return false;
|
|
104
134
|
if (!outputStarted) {
|
|
105
135
|
outputStarted = true;
|
|
106
136
|
consumePredictions();
|
|
107
137
|
logger.debug(`[MARK] Predictive workflow TTFT: ${config.name}`);
|
|
138
|
+
logger.info('Predictive response winner selected', {
|
|
139
|
+
callId,
|
|
140
|
+
runId,
|
|
141
|
+
generation,
|
|
142
|
+
source,
|
|
143
|
+
ttftMs: Date.now() - responseStartedAt,
|
|
144
|
+
chooserCandidateCount: predictions.length,
|
|
145
|
+
selectedIndex: match?.index,
|
|
146
|
+
selectedScore: match?.score,
|
|
147
|
+
});
|
|
108
148
|
}
|
|
109
149
|
output += delta;
|
|
110
150
|
controller.enqueue({ role: 'agent', delta });
|
|
@@ -118,6 +158,13 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
|
|
|
118
158
|
state.stopCurrent = undefined;
|
|
119
159
|
mainTrace.response = output;
|
|
120
160
|
void addAndFlushTrace(stepTracer, mainTrace, logger);
|
|
161
|
+
logger.info('Predictive response completed', {
|
|
162
|
+
callId,
|
|
163
|
+
runId,
|
|
164
|
+
generation,
|
|
165
|
+
durationMs: Date.now() - responseStartedAt,
|
|
166
|
+
outputLength: output.length,
|
|
167
|
+
});
|
|
121
168
|
if (!state.closed) {
|
|
122
169
|
startNormalPrediction(messages, output, renderedPrompt, ctx, state, generation);
|
|
123
170
|
}
|
|
@@ -126,6 +173,13 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
|
|
|
126
173
|
if (!active)
|
|
127
174
|
return;
|
|
128
175
|
active = false;
|
|
176
|
+
logger.info('Predictive response stopped', {
|
|
177
|
+
callId,
|
|
178
|
+
runId,
|
|
179
|
+
generation,
|
|
180
|
+
outputStarted,
|
|
181
|
+
durationMs: Date.now() - responseStartedAt,
|
|
182
|
+
});
|
|
129
183
|
void provisionalReader?.cancel();
|
|
130
184
|
try {
|
|
131
185
|
publicController?.close();
|
|
@@ -172,20 +226,20 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
|
|
|
172
226
|
void firstProvisionalChunk
|
|
173
227
|
.then(({ reader }) => reader.cancel())
|
|
174
228
|
.catch(() => undefined);
|
|
175
|
-
publish(controller, winner.pair.agentResponse);
|
|
229
|
+
publish(controller, winner.pair.agentResponse, winner.kind, winner);
|
|
176
230
|
controller.close();
|
|
177
231
|
finishSuccessfulResponse();
|
|
178
232
|
return;
|
|
179
233
|
}
|
|
180
234
|
provisionalReader = winner.reader;
|
|
181
|
-
if (!publish(controller, winner.chunk))
|
|
235
|
+
if (!publish(controller, winner.chunk, winner.kind))
|
|
182
236
|
return;
|
|
183
237
|
while (isCurrent()) {
|
|
184
238
|
try {
|
|
185
239
|
const next = await winner.reader.read();
|
|
186
240
|
if (next.done)
|
|
187
241
|
break;
|
|
188
|
-
if (!publish(controller, next.value))
|
|
242
|
+
if (!publish(controller, next.value, winner.kind))
|
|
189
243
|
return;
|
|
190
244
|
}
|
|
191
245
|
catch (error) {
|
|
@@ -212,14 +266,42 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
|
|
|
212
266
|
});
|
|
213
267
|
}
|
|
214
268
|
function prewarmForUsersHello(ctx) {
|
|
215
|
-
if (config.prewarmPredictions.length === 0)
|
|
216
|
-
return;
|
|
217
269
|
const callId = getCallId(ctx);
|
|
218
270
|
const state = getOrCreateState(callId);
|
|
219
|
-
if (state.prewarmStarted || state.prewarmConsumed)
|
|
271
|
+
if (state.prewarmStarted || state.prewarmConsumed) {
|
|
272
|
+
logger.debug('Opening prediction prewarm skipped', {
|
|
273
|
+
callId,
|
|
274
|
+
prewarmStarted: state.prewarmStarted,
|
|
275
|
+
prewarmConsumed: state.prewarmConsumed,
|
|
276
|
+
});
|
|
220
277
|
return;
|
|
278
|
+
}
|
|
221
279
|
state.prewarmStarted = true;
|
|
280
|
+
logger.info('Opening prediction prewarm started', {
|
|
281
|
+
callId,
|
|
282
|
+
predictionCount: config.prewarmPredictions.length,
|
|
283
|
+
chooserPrewarmEnabled: chooser.prewarm !== undefined,
|
|
284
|
+
});
|
|
285
|
+
const chooserPrewarmStartedAt = Date.now();
|
|
286
|
+
void chooser
|
|
287
|
+
.prewarm?.()
|
|
288
|
+
.then(() => {
|
|
289
|
+
logger.info('Prediction chooser prewarm completed', {
|
|
290
|
+
callId,
|
|
291
|
+
durationMs: Date.now() - chooserPrewarmStartedAt,
|
|
292
|
+
});
|
|
293
|
+
})
|
|
294
|
+
.catch((error) => {
|
|
295
|
+
logger.warn('Prediction chooser prewarm failed', {
|
|
296
|
+
callId,
|
|
297
|
+
durationMs: Date.now() - chooserPrewarmStartedAt,
|
|
298
|
+
error,
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
if (config.prewarmPredictions.length === 0)
|
|
302
|
+
return;
|
|
222
303
|
const generation = state.requestGeneration;
|
|
304
|
+
const predictionStartedAt = Date.now();
|
|
223
305
|
const task = (async () => {
|
|
224
306
|
const template = typeof config.prompt === 'string' ? config.prompt : await config.prompt.content();
|
|
225
307
|
const renderedPrompt = nunjucksEnv.renderString(template, ctx || {});
|
|
@@ -231,18 +313,32 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
|
|
|
231
313
|
supplementalPredictions: config.prewarmPredictions,
|
|
232
314
|
traceName: 'predictor[prewarm]',
|
|
233
315
|
});
|
|
234
|
-
|
|
316
|
+
const stored = !state.closed && !state.prewarmConsumed;
|
|
317
|
+
if (stored) {
|
|
235
318
|
state.preparedPrewarm = { id: crypto.randomUUID(), pairs: prediction.pairs };
|
|
319
|
+
}
|
|
320
|
+
logger.info('Opening prediction prewarm completed', {
|
|
321
|
+
callId,
|
|
322
|
+
durationMs: Date.now() - predictionStartedAt,
|
|
323
|
+
predictionCount: prediction.pairs.length,
|
|
324
|
+
stored,
|
|
325
|
+
discardReason: state.closed
|
|
326
|
+
? 'call-closed'
|
|
327
|
+
: state.prewarmConsumed
|
|
328
|
+
? 'opening-turn-consumed'
|
|
329
|
+
: undefined,
|
|
330
|
+
});
|
|
331
|
+
if (!state.closed) {
|
|
236
332
|
await addAndFlushTrace(stepTracer, prediction.trace, logger);
|
|
237
333
|
}
|
|
238
334
|
})();
|
|
239
|
-
trackPrediction(task, state, ctx, generation);
|
|
335
|
+
trackPrediction(task, state, ctx, generation, () => !state.prewarmConsumed);
|
|
240
336
|
}
|
|
241
337
|
async function waitForPendingPrediction(callId) {
|
|
242
338
|
const state = states.get(callId);
|
|
243
339
|
if (!state)
|
|
244
340
|
return;
|
|
245
|
-
await Promise.all([...
|
|
341
|
+
await Promise.all([...state.pendingPredictions.values()].flatMap((predictions) => [...predictions]));
|
|
246
342
|
}
|
|
247
343
|
function clear(callId) {
|
|
248
344
|
const state = states.get(callId);
|
|
@@ -269,6 +365,12 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
|
|
|
269
365
|
return state;
|
|
270
366
|
}
|
|
271
367
|
function startNormalPrediction(messages, agentResponse, renderedMainPrompt, ctx, state, generation) {
|
|
368
|
+
const callId = getCallId(ctx);
|
|
369
|
+
const predictionStartedAt = Date.now();
|
|
370
|
+
logger.debug('Normal prediction generation started', {
|
|
371
|
+
callId,
|
|
372
|
+
generation,
|
|
373
|
+
});
|
|
272
374
|
const conversationWithResponse = [
|
|
273
375
|
stringifyMessages(messages).trim(),
|
|
274
376
|
`Agent: ${agentResponse.trim()}`,
|
|
@@ -283,16 +385,31 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
|
|
|
283
385
|
supplementalPredictions: config.normalFlowPredictions,
|
|
284
386
|
traceName: 'predictor[normal]',
|
|
285
387
|
}).then(async (prediction) => {
|
|
286
|
-
|
|
388
|
+
const stored = !state.closed && state.requestGeneration === generation;
|
|
389
|
+
if (stored) {
|
|
287
390
|
state.preparedNormal = { id: crypto.randomUUID(), pairs: prediction.pairs };
|
|
391
|
+
}
|
|
392
|
+
logger.info('Normal prediction generation completed', {
|
|
393
|
+
callId,
|
|
394
|
+
generation,
|
|
395
|
+
durationMs: Date.now() - predictionStartedAt,
|
|
396
|
+
predictionCount: prediction.pairs.length,
|
|
397
|
+
stored,
|
|
398
|
+
discardReason: state.closed
|
|
399
|
+
? 'call-closed'
|
|
400
|
+
: state.requestGeneration !== generation
|
|
401
|
+
? 'conversation-changed'
|
|
402
|
+
: undefined,
|
|
403
|
+
});
|
|
404
|
+
if (!state.closed) {
|
|
288
405
|
await addAndFlushTrace(stepTracer, prediction.trace, logger);
|
|
289
406
|
}
|
|
290
407
|
});
|
|
291
408
|
trackPrediction(task, state, ctx, generation);
|
|
292
409
|
}
|
|
293
|
-
function trackPrediction(task, state, ctx, generation) {
|
|
410
|
+
function trackPrediction(task, state, ctx, generation, isRelevant = () => state.requestGeneration === generation) {
|
|
294
411
|
const handled = task.catch(async (error) => {
|
|
295
|
-
if (state.closed ||
|
|
412
|
+
if (state.closed || !isRelevant())
|
|
296
413
|
return;
|
|
297
414
|
const operation = isOperationError(error) ? error : undefined;
|
|
298
415
|
const cause = operation?.cause ?? error;
|
|
@@ -367,6 +484,8 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
|
|
|
367
484
|
return { pairs, trace };
|
|
368
485
|
}
|
|
369
486
|
async function choosePrediction(pairs, messages, ctx, parentRunId, isActive) {
|
|
487
|
+
const callId = getCallId(ctx);
|
|
488
|
+
const chooserStartedAt = Date.now();
|
|
370
489
|
const actualUserResponse = messages.at(-1)?.text ?? '';
|
|
371
490
|
const history = messages.slice(0, -1);
|
|
372
491
|
const stringifiedHistory = stringifyMessages(history);
|
|
@@ -390,13 +509,29 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
|
|
|
390
509
|
catch (error) {
|
|
391
510
|
throw createOperationError(error, chooser, trace);
|
|
392
511
|
}
|
|
393
|
-
if (!isActive())
|
|
512
|
+
if (!isActive()) {
|
|
513
|
+
logger.debug('Prediction chooser result ignored', {
|
|
514
|
+
callId,
|
|
515
|
+
parentRunId,
|
|
516
|
+
durationMs: Date.now() - chooserStartedAt,
|
|
517
|
+
reason: 'response-replaced',
|
|
518
|
+
});
|
|
394
519
|
return new Promise(() => undefined);
|
|
520
|
+
}
|
|
395
521
|
trace.response = JSON.stringify(result);
|
|
396
522
|
if (result.scores.length !== pairs.length) {
|
|
397
523
|
throw createOperationError(new Error('Chooser returned the wrong number of candidate scores.'), chooser, trace);
|
|
398
524
|
}
|
|
399
525
|
if (result.selectedIndex === undefined) {
|
|
526
|
+
logger.info('Prediction chooser completed', {
|
|
527
|
+
callId,
|
|
528
|
+
parentRunId,
|
|
529
|
+
durationMs: Date.now() - chooserStartedAt,
|
|
530
|
+
candidateCount: pairs.length,
|
|
531
|
+
scores: result.scores,
|
|
532
|
+
usage: result.usage,
|
|
533
|
+
diagnostics: result.diagnostics,
|
|
534
|
+
});
|
|
400
535
|
void addAndFlushTrace(stepTracer, trace, logger);
|
|
401
536
|
return new Promise(() => undefined);
|
|
402
537
|
}
|
|
@@ -405,8 +540,24 @@ export function createPredictiveWorkflow(config, engineConfig, nunjucksEnv) {
|
|
|
405
540
|
result.selectedIndex >= pairs.length) {
|
|
406
541
|
throw createOperationError(new Error('Chooser returned an invalid candidate index.'), chooser, trace);
|
|
407
542
|
}
|
|
543
|
+
logger.info('Prediction chooser completed', {
|
|
544
|
+
callId,
|
|
545
|
+
parentRunId,
|
|
546
|
+
durationMs: Date.now() - chooserStartedAt,
|
|
547
|
+
candidateCount: pairs.length,
|
|
548
|
+
selectedIndex: result.selectedIndex,
|
|
549
|
+
selectedScore: result.scores[result.selectedIndex],
|
|
550
|
+
scores: result.scores,
|
|
551
|
+
usage: result.usage,
|
|
552
|
+
diagnostics: result.diagnostics,
|
|
553
|
+
});
|
|
408
554
|
void addAndFlushTrace(stepTracer, trace, logger);
|
|
409
|
-
return {
|
|
555
|
+
return {
|
|
556
|
+
kind: 'prediction',
|
|
557
|
+
pair: pairs[result.selectedIndex],
|
|
558
|
+
index: result.selectedIndex,
|
|
559
|
+
score: result.scores[result.selectedIndex],
|
|
560
|
+
};
|
|
410
561
|
}
|
|
411
562
|
return { run, prewarmForUsersHello, waitForPendingPrediction, clear };
|
|
412
563
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@recombine-ai/platform",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.9.1-test.
|
|
4
|
+
"version": "0.9.1-test.4",
|
|
5
5
|
"description": "The Recombine platform: engine, telescope, dockyard, call control, the voice agent API, and the Bosun bindings in one package",
|
|
6
6
|
"license": "EULA",
|
|
7
7
|
"author": "recombine.ai",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as r}from"../chunks/B3sRmUmR.js";import{y as t}from"../chunks/YRWW-SW8.js";export{t as load_css,r as start};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|