metergraph 0.6.2__tar.gz → 0.6.3__tar.gz

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 (24) hide show
  1. {metergraph-0.6.2/src/metergraph.egg-info → metergraph-0.6.3}/PKG-INFO +1 -1
  2. {metergraph-0.6.2 → metergraph-0.6.3}/pyproject.toml +1 -1
  3. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph/_capture.py +34 -10
  4. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph/_version.py +1 -1
  5. {metergraph-0.6.2 → metergraph-0.6.3/src/metergraph.egg-info}/PKG-INFO +1 -1
  6. {metergraph-0.6.2 → metergraph-0.6.3}/MANIFEST.in +0 -0
  7. {metergraph-0.6.2 → metergraph-0.6.3}/README.md +0 -0
  8. {metergraph-0.6.2 → metergraph-0.6.3}/setup.cfg +0 -0
  9. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph/__init__.py +0 -0
  10. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph/_batch_first.py +0 -0
  11. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph/_config.py +0 -0
  12. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph/_context.py +0 -0
  13. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph/_failure_log.py +0 -0
  14. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph/_provider_batch.py +0 -0
  15. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph/_repo_config.py +0 -0
  16. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph/_session.py +0 -0
  17. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph/_template.py +0 -0
  18. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph/_track.py +0 -0
  19. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph/_transport.py +0 -0
  20. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph/opentelemetry.py +0 -0
  21. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph.egg-info/SOURCES.txt +0 -0
  22. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph.egg-info/dependency_links.txt +0 -0
  23. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph.egg-info/requires.txt +0 -0
  24. {metergraph-0.6.2 → metergraph-0.6.3}/src/metergraph.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metergraph
3
- Version: 0.6.2
3
+ Version: 0.6.3
4
4
  Summary: Fire-and-forget LLM spend capture for Metergraph
5
5
  Author: Pioneer Square Labs
6
6
  License-Expression: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "metergraph"
3
- version = "0.6.2"
3
+ version = "0.6.3"
4
4
  description = "Fire-and-forget LLM spend capture for Metergraph"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -858,14 +858,22 @@ class CallState:
858
858
 
859
859
  class _StreamState:
860
860
  def __init__(self, stream: Any, call: CallState) -> None:
861
+ self.manager = stream
861
862
  self.stream = stream
862
863
  self.call = call
863
864
  self.iterator = None
865
+ self.entered = False
864
866
  self.last = None
865
867
  self.parts: list[str] = []
866
868
  self.chunks: list[Any] = []
867
869
  self.ttft_ms: int | None = None
868
870
 
871
+ def use_entered_stream(self, stream: Any) -> None:
872
+ if stream is not None:
873
+ self.stream = stream
874
+ self.iterator = None
875
+ self.entered = True
876
+
869
877
  def chunk(self, value: Any) -> Any:
870
878
  self.last = value
871
879
  self.chunks.append(value)
@@ -955,17 +963,21 @@ class SyncStream:
955
963
  raise
956
964
 
957
965
  def __enter__(self) -> "SyncStream":
958
- enter = getattr(self._state.stream, "__enter__", None)
966
+ enter = getattr(self._state.manager, "__enter__", None)
959
967
  if enter:
960
- enter()
968
+ try:
969
+ self._state.use_entered_stream(enter())
970
+ except BaseException as exc:
971
+ self._state.finish(error=exc)
972
+ raise
961
973
  return self
962
974
 
963
975
  def __exit__(self, exc_type, exc, tb) -> Any:
964
976
  if exc:
965
977
  self._state.finish(error=exc)
966
978
  elif not self._state.call.done:
967
- self._state.finish(status="abandoned")
968
- exit_fn = getattr(self._state.stream, "__exit__", None)
979
+ self._state.finish(status=None if self._state.entered else "abandoned")
980
+ exit_fn = getattr(self._state.manager, "__exit__", None)
969
981
  return exit_fn(exc_type, exc, tb) if exit_fn else None
970
982
 
971
983
  def close(self) -> None:
@@ -1012,17 +1024,23 @@ class AsyncStream:
1012
1024
  raise
1013
1025
 
1014
1026
  async def __aenter__(self) -> "AsyncStream":
1015
- enter = getattr(self._state.stream, "__aenter__", None)
1027
+ enter = getattr(self._state.manager, "__aenter__", None)
1016
1028
  if enter:
1017
- await enter()
1029
+ try:
1030
+ self._state.use_entered_stream(await enter())
1031
+ except BaseException as exc:
1032
+ await self._state.finish_async(error=exc)
1033
+ raise
1018
1034
  return self
1019
1035
 
1020
1036
  async def __aexit__(self, exc_type, exc, tb) -> Any:
1021
1037
  if exc:
1022
1038
  await self._state.finish_async(error=exc)
1023
1039
  elif not self._state.call.done:
1024
- await self._state.finish_async(status="abandoned")
1025
- exit_fn = getattr(self._state.stream, "__aexit__", None)
1040
+ await self._state.finish_async(
1041
+ status=None if self._state.entered else "abandoned"
1042
+ )
1043
+ exit_fn = getattr(self._state.manager, "__aexit__", None)
1026
1044
  return await exit_fn(exc_type, exc, tb) if exit_fn else None
1027
1045
 
1028
1046
  async def aclose(self) -> None:
@@ -1375,9 +1393,15 @@ def _finish_or_stream(
1375
1393
  result: Any, call: CallState, endpoint: str, request: Mapping[str, Any]
1376
1394
  ):
1377
1395
  is_stream = endpoint.endswith(".stream") or bool(request.get("stream"))
1378
- if is_stream and hasattr(result, "__aiter__"):
1396
+ if is_stream and (
1397
+ hasattr(result, "__aiter__")
1398
+ or (hasattr(result, "__aenter__") and hasattr(result, "__aexit__"))
1399
+ ):
1379
1400
  return AsyncStream(result, call)
1380
- if is_stream and hasattr(result, "__iter__"):
1401
+ if is_stream and (
1402
+ hasattr(result, "__iter__")
1403
+ or (hasattr(result, "__enter__") and hasattr(result, "__exit__"))
1404
+ ):
1381
1405
  return SyncStream(result, call)
1382
1406
  call.finish(result)
1383
1407
  return result
@@ -8,4 +8,4 @@ import importlib.metadata
8
8
  try:
9
9
  SDK_VERSION = importlib.metadata.version("metergraph")
10
10
  except Exception:
11
- SDK_VERSION = "0.6.2"
11
+ SDK_VERSION = "0.6.3"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metergraph
3
- Version: 0.6.2
3
+ Version: 0.6.3
4
4
  Summary: Fire-and-forget LLM spend capture for Metergraph
5
5
  Author: Pioneer Square Labs
6
6
  License-Expression: Apache-2.0
File without changes
File without changes
File without changes