stream.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. """流式输出事件系统"""
  2. from typing import Optional, Dict, Any, Literal
  3. from dataclasses import dataclass, field
  4. StreamEventType = Literal[
  5. "text",
  6. "thought",
  7. "action",
  8. "observation",
  9. "tool_call",
  10. "tool_result",
  11. "status",
  12. "error",
  13. "done",
  14. ]
  15. @dataclass
  16. class StreamEvent:
  17. event_type: StreamEventType
  18. content: str
  19. metadata: Optional[Dict[str, Any]] = field(default_factory=dict)
  20. @classmethod
  21. def text(cls, content: str) -> "StreamEvent":
  22. return cls(event_type="text", content=content)
  23. @classmethod
  24. def thought(cls, content: str) -> "StreamEvent":
  25. return cls(event_type="thought", content=content)
  26. @classmethod
  27. def action(cls, content: str, **metadata) -> "StreamEvent":
  28. return cls(event_type="action", content=content, metadata=metadata)
  29. @classmethod
  30. def observation(cls, content: str, **metadata) -> "StreamEvent":
  31. return cls(event_type="observation", content=content, metadata=metadata)
  32. @classmethod
  33. def tool_call(cls, tool_name: str, parameters: str) -> "StreamEvent":
  34. return cls(
  35. event_type="tool_call",
  36. content=f"[TOOL_CALL:{tool_name}:{parameters}]",
  37. metadata={"tool_name": tool_name, "parameters": parameters},
  38. )
  39. @classmethod
  40. def tool_result(cls, tool_name: str, result: str) -> "StreamEvent":
  41. return cls(
  42. event_type="tool_result", content=result, metadata={"tool_name": tool_name}
  43. )
  44. @classmethod
  45. def status(cls, content: str, **metadata) -> "StreamEvent":
  46. return cls(event_type="status", content=content, metadata=metadata)
  47. @classmethod
  48. def error(cls, content: str) -> "StreamEvent":
  49. return cls(event_type="error", content=content)
  50. @classmethod
  51. def done(cls, full_response: str) -> "StreamEvent":
  52. return cls(event_type="done", content=full_response)