|
14 | 14 | from contextlib import asynccontextmanager |
15 | 15 |
|
16 | 16 | import dspy |
| 17 | +import langsmith as ls |
17 | 18 | import structlog |
18 | 19 | import uvicorn |
19 | | -from dspy.adapters import XMLAdapter |
| 20 | +from dspy.adapters import ChatAdapter, XMLAdapter |
20 | 21 | from fastapi import Depends, FastAPI, Header, HTTPException, Request |
21 | 22 | from fastapi.middleware.cors import CORSMiddleware |
22 | 23 | from fastapi.responses import StreamingResponse |
@@ -185,7 +186,7 @@ def __init__( |
185 | 186 | embedder = dspy.Embedder("gemini/gemini-embedding-001", dimensions=3072, batch_size=512) |
186 | 187 | dspy.configure( |
187 | 188 | lm=dspy.LM("gemini/gemini-flash-latest", max_tokens=30000, cache=False), |
188 | | - adapter=XMLAdapter(), |
| 189 | + adapter=ChatAdapter(), |
189 | 190 | embedder=embedder, |
190 | 191 | callbacks=[AgentLoggingCallback()], |
191 | 192 | track_usage=True, |
@@ -420,49 +421,51 @@ async def _stream_chat_completion( |
420 | 421 | content_buffer = "" |
421 | 422 |
|
422 | 423 | try: |
423 | | - async for event in agent.aforward_streaming( |
424 | | - query=query, chat_history=history, mcp_mode=mcp_mode |
425 | | - ): |
426 | | - if event.type == "sources": |
427 | | - # Emit sources event for clients to display |
428 | | - sources_chunk = { |
429 | | - "type": "sources", |
430 | | - "data": event.data, |
431 | | - } |
432 | | - yield f"data: {json.dumps(sources_chunk)}\n\n" |
433 | | - elif event.type == "response": |
434 | | - content_buffer += event.data |
435 | | - |
436 | | - # Send content chunk |
437 | | - chunk = { |
438 | | - "id": response_id, |
439 | | - "object": "chat.completion.chunk", |
440 | | - "created": created, |
441 | | - "model": "cairo-coder", |
442 | | - "choices": [ |
443 | | - {"index": 0, "delta": {"content": event.data}, "finish_reason": None} |
444 | | - ], |
445 | | - } |
446 | | - yield f"data: {json.dumps(chunk)}\n\n" |
447 | | - elif event.type == "error": |
448 | | - # Emit an error as a final delta and stop |
449 | | - error_chunk = { |
450 | | - "id": response_id, |
451 | | - "object": "chat.completion.chunk", |
452 | | - "created": created, |
453 | | - "model": "cairo-coder", |
454 | | - "choices": [ |
455 | | - { |
456 | | - "index": 0, |
457 | | - "delta": {"content": f"\n\nError: {event.data}"}, |
458 | | - "finish_reason": "stop", |
459 | | - } |
460 | | - ], |
461 | | - } |
462 | | - yield f"data: {json.dumps(error_chunk)}\n\n" |
463 | | - break |
464 | | - elif event.type == "end": |
465 | | - break |
| 424 | + with ls.trace(name="RagPipelineStreaming", run_type="chain", inputs={"query": query, "chat_history": history, "mcp_mode": mcp_mode}) as rt: |
| 425 | + async for event in agent.aforward_streaming( |
| 426 | + query=query, chat_history=history, mcp_mode=mcp_mode |
| 427 | + ): |
| 428 | + if event.type == "sources": |
| 429 | + # Emit sources event for clients to display |
| 430 | + sources_chunk = { |
| 431 | + "type": "sources", |
| 432 | + "data": event.data, |
| 433 | + } |
| 434 | + yield f"data: {json.dumps(sources_chunk)}\n\n" |
| 435 | + elif event.type == "response": |
| 436 | + content_buffer += event.data |
| 437 | + |
| 438 | + # Send content chunk |
| 439 | + chunk = { |
| 440 | + "id": response_id, |
| 441 | + "object": "chat.completion.chunk", |
| 442 | + "created": created, |
| 443 | + "model": "cairo-coder", |
| 444 | + "choices": [ |
| 445 | + {"index": 0, "delta": {"content": event.data}, "finish_reason": None} |
| 446 | + ], |
| 447 | + } |
| 448 | + yield f"data: {json.dumps(chunk)}\n\n" |
| 449 | + elif event.type == "error": |
| 450 | + # Emit an error as a final delta and stop |
| 451 | + error_chunk = { |
| 452 | + "id": response_id, |
| 453 | + "object": "chat.completion.chunk", |
| 454 | + "created": created, |
| 455 | + "model": "cairo-coder", |
| 456 | + "choices": [ |
| 457 | + { |
| 458 | + "index": 0, |
| 459 | + "delta": {"content": f"\n\nError: {event.data}"}, |
| 460 | + "finish_reason": "stop", |
| 461 | + } |
| 462 | + ], |
| 463 | + } |
| 464 | + yield f"data: {json.dumps(error_chunk)}\n\n" |
| 465 | + break |
| 466 | + elif event.type == "end": |
| 467 | + break |
| 468 | + rt.end(outputs={"output": content_buffer}) |
466 | 469 |
|
467 | 470 | except Exception as e: |
468 | 471 | logger.error("Error during agent streaming", error=str(e), exc_info=True) |
|
0 commit comments