@@ -218,74 +218,87 @@ private Flowable<Event> callLlm(
218218 Event eventForCallbackUsage ) {
219219 LlmRequest .Builder llmRequestBuilder = llmRequest .toBuilder ();
220220
221- return handleBeforeModelCallback (context , llmRequestBuilder , eventForCallbackUsage )
222- .toFlowable ()
223- .concatMap (
224- llmResp ->
225- postprocess (
226- context ,
227- eventForCallbackUsage ,
228- llmRequestBuilder .build (),
229- llmResp ,
230- spanContext ))
231- .switchIfEmpty (
232- Flowable .defer (
233- () -> {
234- LlmAgent agent = (LlmAgent ) context .agent ();
235- BaseLlm llm =
236- agent .resolvedModel ().model ().isPresent ()
237- ? agent .resolvedModel ().model ().get ()
238- : LlmRegistry .getLlm (agent .resolvedModel ().modelName ().get ());
239- LlmRequest finalLlmRequest = llmRequestBuilder .build ();
240-
241- Span span =
242- Tracing .getTracer ()
243- .spanBuilder ("call_llm" )
244- .setParent (spanContext )
245- .startSpan ();
246- Context callLlmContext = spanContext .with (span );
247-
248- Flowable <Event > flowable =
249- llm .generateContent (
250- finalLlmRequest ,
251- context .runConfig ().streamingMode () == StreamingMode .SSE )
252- .onErrorResumeNext (
253- exception ->
254- handleOnModelErrorCallback (
255- context ,
256- llmRequestBuilder ,
257- eventForCallbackUsage ,
258- exception )
259- .switchIfEmpty (Single .error (exception ))
260- .toFlowable ())
261- .doOnError (
262- error -> {
263- span .setStatus (StatusCode .ERROR , error .getMessage ());
264- span .recordException (error );
265- })
221+ return Flowable .defer (
222+ () -> {
223+ Span span =
224+ Tracing .getTracer ().spanBuilder ("call_llm" ).setParent (spanContext ).startSpan ();
225+ Context callLlmContext = spanContext .with (span );
226+
227+ return Tracing .traceFlowable (
228+ callLlmContext ,
229+ span ,
230+ () ->
231+ handleBeforeModelCallback (context , llmRequestBuilder , eventForCallbackUsage )
232+ .toFlowable ()
266233 .concatMap (
267- llmResp ->
268- handleAfterModelCallback (context , llmResp , eventForCallbackUsage )
269- .toFlowable ())
270- .flatMap (
271234 llmResp ->
272235 postprocess (
273236 context ,
274237 eventForCallbackUsage ,
275- finalLlmRequest ,
238+ llmRequestBuilder . build () ,
276239 llmResp ,
277240 callLlmContext )
278241 .doOnSubscribe (
279- s ->
242+ subscription ->
280243 traceCallLlm (
281244 span ,
282245 context ,
283246 eventForCallbackUsage .id (),
284- finalLlmRequest ,
285- llmResp )));
286-
287- return Tracing .traceFlowable (callLlmContext , span , () -> flowable );
288- }));
247+ llmRequestBuilder .build (),
248+ llmResp )))
249+ .switchIfEmpty (
250+ Flowable .defer (
251+ () -> {
252+ LlmAgent agent = (LlmAgent ) context .agent ();
253+ BaseLlm llm =
254+ agent .resolvedModel ().model ().isPresent ()
255+ ? agent .resolvedModel ().model ().get ()
256+ : LlmRegistry .getLlm (
257+ agent .resolvedModel ().modelName ().get ());
258+ LlmRequest finalLlmRequest = llmRequestBuilder .build ();
259+
260+ return llm .generateContent (
261+ finalLlmRequest ,
262+ context .runConfig ().streamingMode ()
263+ == StreamingMode .SSE )
264+ .onErrorResumeNext (
265+ exception ->
266+ handleOnModelErrorCallback (
267+ context ,
268+ llmRequestBuilder ,
269+ eventForCallbackUsage ,
270+ exception )
271+ .switchIfEmpty (Single .error (exception ))
272+ .toFlowable ())
273+ .doOnError (
274+ error -> {
275+ span .setStatus (StatusCode .ERROR , error .getMessage ());
276+ span .recordException (error );
277+ })
278+ .concatMap (
279+ llmResp ->
280+ handleAfterModelCallback (
281+ context , llmResp , eventForCallbackUsage )
282+ .toFlowable ())
283+ .flatMap (
284+ llmResp ->
285+ postprocess (
286+ context ,
287+ eventForCallbackUsage ,
288+ finalLlmRequest ,
289+ llmResp ,
290+ callLlmContext )
291+ .doOnSubscribe (
292+ subscription ->
293+ traceCallLlm (
294+ span ,
295+ context ,
296+ eventForCallbackUsage .id (),
297+ finalLlmRequest ,
298+ llmResp )));
299+ })))
300+ .compose (Tracing .withContext (spanContext ));
301+ });
289302 }
290303
291304 /**
@@ -667,10 +680,12 @@ public void onError(Throwable e) {
667680 "Agent not found: " + event .actions ().transferToAgent ().get ());
668681 }
669682 Flowable <Event > nextAgentEvents =
670- nextAgent
671- .get ()
672- .runLive (invocationContext )
673- .compose (Tracing .withContext (spanContext ));
683+ Flowable .defer (
684+ () -> {
685+ try (Scope scope = spanContext .makeCurrent ()) {
686+ return nextAgent .get ().runLive (invocationContext );
687+ }
688+ });
674689 events = Flowable .concat (events , nextAgentEvents );
675690 }
676691 return events ;
@@ -693,11 +708,12 @@ public void onError(Throwable e) {
693708 });
694709
695710 return Tracing .traceFlowable (
696- callLlmContext ,
697- span ,
698- () ->
699- receiveFlow .takeWhile (
700- event -> !event .actions ().endInvocation ().orElse (false )));
711+ callLlmContext ,
712+ span ,
713+ () ->
714+ receiveFlow .takeWhile (
715+ event -> !event .actions ().endInvocation ().orElse (false )))
716+ .compose (Tracing .withContext (spanContext ));
701717 }));
702718 }
703719
0 commit comments