projectdavid 1.32.7__tar.gz → 1.32.8__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.

Potentially problematic release.


This version of projectdavid might be problematic. Click here for more details.

Files changed (68) hide show
  1. {projectdavid-1.32.7 → projectdavid-1.32.8}/CHANGELOG.md +7 -0
  2. {projectdavid-1.32.7/src/projectdavid.egg-info → projectdavid-1.32.8}/PKG-INFO +1 -1
  3. {projectdavid-1.32.7 → projectdavid-1.32.8}/pyproject.toml +1 -1
  4. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/synchronous_inference_wrapper.py +32 -41
  5. {projectdavid-1.32.7 → projectdavid-1.32.8/src/projectdavid.egg-info}/PKG-INFO +1 -1
  6. {projectdavid-1.32.7 → projectdavid-1.32.8}/LICENSE +0 -0
  7. {projectdavid-1.32.7 → projectdavid-1.32.8}/MANIFEST.in +0 -0
  8. {projectdavid-1.32.7 → projectdavid-1.32.8}/README.md +0 -0
  9. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/assistants.md +0 -0
  10. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/code_interpretation.md +0 -0
  11. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/database.md +0 -0
  12. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/database_assistant_example.md +0 -0
  13. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/docker_comtainers.md +0 -0
  14. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/file_search.md +0 -0
  15. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/files.md +0 -0
  16. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/function_call_definition.md +0 -0
  17. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/function_calls.md +0 -0
  18. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/handling_function_calls.md +0 -0
  19. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/inference.md +0 -0
  20. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/messages.md +0 -0
  21. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/runs.md +0 -0
  22. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/streams.md +0 -0
  23. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/threads.md +0 -0
  24. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/tools.md +0 -0
  25. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/users.md +0 -0
  26. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/vector_store.md +0 -0
  27. {projectdavid-1.32.7 → projectdavid-1.32.8}/docs/versioning.md +0 -0
  28. {projectdavid-1.32.7 → projectdavid-1.32.8}/setup.cfg +0 -0
  29. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/__init__.py +0 -0
  30. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/_version.py +0 -0
  31. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/actions_client.py +0 -0
  32. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/api_key_client.py +0 -0
  33. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/assistants_client.py +0 -0
  34. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/base_client.py +0 -0
  35. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/base_vector_store.py +0 -0
  36. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/event_handler.py +0 -0
  37. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/file_processor.py +0 -0
  38. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/file_search.py +0 -0
  39. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/files_client.py +0 -0
  40. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/inference_client.py +0 -0
  41. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/messages_client.py +0 -0
  42. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/runs.py +0 -0
  43. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/threads_client.py +0 -0
  44. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/tools_client.py +0 -0
  45. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/users_client.py +0 -0
  46. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/vector_store_manager.py +0 -0
  47. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/clients/vectors.py +0 -0
  48. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/constants/platform.py +0 -0
  49. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/entity.py +0 -0
  50. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/events.py +0 -0
  51. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/serializers.py +0 -0
  52. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/services/logging_service.py +0 -0
  53. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/synthesis/__init__.py +0 -0
  54. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/synthesis/llm_synthesizer.py +0 -0
  55. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/synthesis/prompt.py +0 -0
  56. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/synthesis/reranker.py +0 -0
  57. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/synthesis/retriever.py +0 -0
  58. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/utils/__init__.py +0 -0
  59. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/utils/function_call_suppressor.py +0 -0
  60. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/utils/monitor_launcher.py +0 -0
  61. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/utils/peek_gate.py +0 -0
  62. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/utils/run_monitor.py +0 -0
  63. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid/utils/vector_search_formatter.py +0 -0
  64. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid.egg-info/SOURCES.txt +0 -0
  65. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid.egg-info/dependency_links.txt +0 -0
  66. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid.egg-info/requires.txt +0 -0
  67. {projectdavid-1.32.7 → projectdavid-1.32.8}/src/projectdavid.egg-info/top_level.txt +0 -0
  68. {projectdavid-1.32.7 → projectdavid-1.32.8}/tests/test_clients.py +0 -0
@@ -1,3 +1,10 @@
1
+ ## [1.32.8](https://github.com/frankie336/projectdavid/compare/v1.32.7...v1.32.8) (2025-06-08)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Let every other chunk pass straight through-2 ([0bf280e](https://github.com/frankie336/projectdavid/commit/0bf280e9acd612fc3e788bda7cccc35e910324d2)), closes [throu#2](https://github.com/throu/issues/2)
7
+
1
8
  ## [1.32.7](https://github.com/frankie336/projectdavid/compare/v1.32.6...v1.32.7) (2025-06-08)
2
9
 
3
10
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: projectdavid
3
- Version: 1.32.7
3
+ Version: 1.32.8
4
4
  Summary: Python SDK for interacting with the Entities Assistant API.
5
5
  Author-email: Francis Neequaye Armah <francis.neequaye@projectdavid.co.uk>
6
6
  License: PolyForm Noncommercial License 1.0.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "projectdavid"
7
- version = "1.32.7"
7
+ version = "1.32.8"
8
8
  description = "Python SDK for interacting with the Entities Assistant API."
9
9
  readme = "README.md"
10
10
  authors = [
@@ -11,16 +11,12 @@ LOG = UtilsInterface.LoggingUtility()
11
11
 
12
12
 
13
13
  class SynchronousInferenceStream:
14
- """Wrap an async token/JSON stream in a synchronous iterator while
15
- hiding function-call payloads from the UI.
16
- """
17
-
18
14
  _GLOBAL_LOOP = asyncio.new_event_loop()
19
15
  asyncio.set_event_loop(_GLOBAL_LOOP)
20
16
 
21
- # ------------------------------------------------------------------ #
22
- # construction / setup
23
- # ------------------------------------------------------------------ #
17
+ # --------------------------------------------------------------
18
+ # ctor / setup
19
+ # --------------------------------------------------------------
24
20
  def __init__(self, inference) -> None:
25
21
  self.inference_client = inference
26
22
  self.user_id: Optional[str] = None
@@ -46,9 +42,9 @@ class SynchronousInferenceStream:
46
42
  self.run_id = run_id
47
43
  self.api_key = api_key
48
44
 
49
- # ------------------------------------------------------------------ #
45
+ # --------------------------------------------------------------
50
46
  # main streaming entry-point
51
- # ------------------------------------------------------------------ #
47
+ # --------------------------------------------------------------
52
48
  def stream_chunks(
53
49
  self,
54
50
  provider: str,
@@ -58,23 +54,14 @@ class SynchronousInferenceStream:
58
54
  timeout_per_chunk: float = 280.0,
59
55
  suppress_fc: bool = True,
60
56
  ) -> Generator[dict, None, None]:
61
- """
62
- Yield provider chunks synchronously.
63
-
64
- When *suppress_fc* is True:
65
-
66
- • `{"type":"function_call", …}` chunks are dropped.
67
- • Inline `<fc> … </fc>` text is stripped.
68
- • *Everything else* is forwarded unchanged.
69
- """
70
57
 
71
- resolved_key = api_key or self.api_key
58
+ resolved_api_key = api_key or self.api_key
72
59
 
73
- async def _async_gen():
60
+ async def _stream_chunks_async():
74
61
  async for chk in self.inference_client.stream_inference_response(
75
62
  provider=provider,
76
63
  model=model,
77
- api_key=resolved_key,
64
+ api_key=resolved_api_key,
78
65
  thread_id=self.thread_id,
79
66
  message_id=self.message_id,
80
67
  run_id=self.run_id,
@@ -82,9 +69,9 @@ class SynchronousInferenceStream:
82
69
  ):
83
70
  yield chk
84
71
 
85
- agen = _async_gen().__aiter__()
72
+ agen = _stream_chunks_async().__aiter__()
86
73
 
87
- # ---------- inline suppressor chain ----------------------------
74
+ # ---------- suppression chain ----------
88
75
  if suppress_fc:
89
76
  _suppressor = FunctionCallSuppressor()
90
77
  _peek_gate = PeekGate(_suppressor)
@@ -94,27 +81,28 @@ class SynchronousInferenceStream:
94
81
 
95
82
  else:
96
83
 
97
- def _filter_text(txt: str) -> str: # noqa: D401
98
- return txt # pass-through
84
+ def _filter_text(txt: str) -> str: # no-op
85
+ return txt
86
+
87
+ # ---------------------------------------
99
88
 
100
- # ---------- main loop ------------------------------------------
101
89
  while True:
102
90
  try:
103
91
  chunk = self._GLOBAL_LOOP.run_until_complete(
104
92
  asyncio.wait_for(agen.__anext__(), timeout=timeout_per_chunk)
105
93
  )
106
94
 
107
- # provider-labelled function_call → drop
95
+ # provider-labelled function_call
108
96
  if suppress_fc and chunk.get("type") == "function_call":
109
- LOG.debug("[SUPPRESSOR] dropped provider function_call chunk")
97
+ LOG.debug("[SUPPRESSOR] blocked provider-labelled function_call")
110
98
  continue
111
99
 
112
- # never touch hot_code
100
+ # allow hot_code to bypass suppression
113
101
  if chunk.get("type") == "hot_code":
114
102
  yield chunk
115
103
  continue
116
104
 
117
- # never touch code_interpreter_stream previews
105
+ # allow code_interpreter_stream to bypass suppression
118
106
  if (
119
107
  chunk.get("stream_type") == "code_execution"
120
108
  and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
@@ -122,32 +110,35 @@ class SynchronousInferenceStream:
122
110
  yield chunk
123
111
  continue
124
112
 
125
- # ④ scrub inline <fc> tags in plain-text content
113
+ # inline content
126
114
  if isinstance(chunk.get("content"), str):
127
115
  chunk["content"] = _filter_text(chunk["content"])
128
116
  if chunk["content"] == "":
129
- # completely removed (or still buffering) – skip emit
117
+ continue # fully suppressed (or still peeking)
118
+
119
+ if (
120
+ suppress_fc
121
+ and '"name": "code_interpreter"' in chunk["content"]
122
+ and '"arguments": {"code"' in chunk["content"]
123
+ ):
124
+ LOG.debug("[SUPPRESSOR] inline code_interpreter match blocked")
130
125
  continue
131
126
 
132
- # ⑤ forward every other chunk verbatim
133
127
  yield chunk
134
128
 
135
129
  except StopAsyncIteration:
136
130
  LOG.info("Stream completed normally.")
137
131
  break
138
132
  except asyncio.TimeoutError:
139
- LOG.error(
140
- "[TimeoutError] no chunk received for %.1f s – aborting",
141
- timeout_per_chunk,
142
- )
133
+ LOG.error("[TimeoutError] Timeout occurred, stopping stream.")
143
134
  break
144
- except Exception as exc: # pylint: disable=broad-except
145
- LOG.error("Streaming error: %s", exc, exc_info=True)
135
+ except Exception as e:
136
+ LOG.error("Unexpected error during streaming completions: %s", e)
146
137
  break
147
138
 
148
- # ------------------------------------------------------------------ #
139
+ # --------------------------------------------------------------
149
140
  # housekeeping
150
- # ------------------------------------------------------------------ #
141
+ # --------------------------------------------------------------
151
142
  @classmethod
152
143
  def shutdown_loop(cls) -> None:
153
144
  if cls._GLOBAL_LOOP and not cls._GLOBAL_LOOP.is_closed():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: projectdavid
3
- Version: 1.32.7
3
+ Version: 1.32.8
4
4
  Summary: Python SDK for interacting with the Entities Assistant API.
5
5
  Author-email: Francis Neequaye Armah <francis.neequaye@projectdavid.co.uk>
6
6
  License: PolyForm Noncommercial License 1.0.0
File without changes
File without changes
File without changes
File without changes