projectdavid 1.32.6__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.6 → projectdavid-1.32.8}/CHANGELOG.md +15 -0
  2. {projectdavid-1.32.6/src/projectdavid.egg-info → projectdavid-1.32.8}/PKG-INFO +1 -1
  3. {projectdavid-1.32.6 → projectdavid-1.32.8}/pyproject.toml +1 -1
  4. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/synchronous_inference_wrapper.py +29 -32
  5. {projectdavid-1.32.6 → projectdavid-1.32.8/src/projectdavid.egg-info}/PKG-INFO +1 -1
  6. {projectdavid-1.32.6 → projectdavid-1.32.8}/LICENSE +0 -0
  7. {projectdavid-1.32.6 → projectdavid-1.32.8}/MANIFEST.in +0 -0
  8. {projectdavid-1.32.6 → projectdavid-1.32.8}/README.md +0 -0
  9. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/assistants.md +0 -0
  10. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/code_interpretation.md +0 -0
  11. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/database.md +0 -0
  12. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/database_assistant_example.md +0 -0
  13. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/docker_comtainers.md +0 -0
  14. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/file_search.md +0 -0
  15. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/files.md +0 -0
  16. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/function_call_definition.md +0 -0
  17. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/function_calls.md +0 -0
  18. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/handling_function_calls.md +0 -0
  19. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/inference.md +0 -0
  20. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/messages.md +0 -0
  21. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/runs.md +0 -0
  22. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/streams.md +0 -0
  23. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/threads.md +0 -0
  24. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/tools.md +0 -0
  25. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/users.md +0 -0
  26. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/vector_store.md +0 -0
  27. {projectdavid-1.32.6 → projectdavid-1.32.8}/docs/versioning.md +0 -0
  28. {projectdavid-1.32.6 → projectdavid-1.32.8}/setup.cfg +0 -0
  29. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/__init__.py +0 -0
  30. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/_version.py +0 -0
  31. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/actions_client.py +0 -0
  32. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/api_key_client.py +0 -0
  33. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/assistants_client.py +0 -0
  34. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/base_client.py +0 -0
  35. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/base_vector_store.py +0 -0
  36. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/event_handler.py +0 -0
  37. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/file_processor.py +0 -0
  38. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/file_search.py +0 -0
  39. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/files_client.py +0 -0
  40. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/inference_client.py +0 -0
  41. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/messages_client.py +0 -0
  42. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/runs.py +0 -0
  43. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/threads_client.py +0 -0
  44. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/tools_client.py +0 -0
  45. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/users_client.py +0 -0
  46. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/vector_store_manager.py +0 -0
  47. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/clients/vectors.py +0 -0
  48. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/constants/platform.py +0 -0
  49. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/entity.py +0 -0
  50. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/events.py +0 -0
  51. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/serializers.py +0 -0
  52. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/services/logging_service.py +0 -0
  53. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/synthesis/__init__.py +0 -0
  54. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/synthesis/llm_synthesizer.py +0 -0
  55. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/synthesis/prompt.py +0 -0
  56. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/synthesis/reranker.py +0 -0
  57. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/synthesis/retriever.py +0 -0
  58. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/utils/__init__.py +0 -0
  59. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/utils/function_call_suppressor.py +0 -0
  60. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/utils/monitor_launcher.py +0 -0
  61. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/utils/peek_gate.py +0 -0
  62. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/utils/run_monitor.py +0 -0
  63. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid/utils/vector_search_formatter.py +0 -0
  64. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid.egg-info/SOURCES.txt +0 -0
  65. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid.egg-info/dependency_links.txt +0 -0
  66. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid.egg-info/requires.txt +0 -0
  67. {projectdavid-1.32.6 → projectdavid-1.32.8}/src/projectdavid.egg-info/top_level.txt +0 -0
  68. {projectdavid-1.32.6 → projectdavid-1.32.8}/tests/test_clients.py +0 -0
@@ -1,3 +1,18 @@
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
+
8
+ ## [1.32.7](https://github.com/frankie336/projectdavid/compare/v1.32.6...v1.32.7) (2025-06-08)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * Let every other chunk pass straight through ([c0a11bb](https://github.com/frankie336/projectdavid/commit/c0a11bbfd5fbbb0247792fdfb12f4001b76dc8aa))
14
+ * Let every other chunk pass straight through-1 ([bf102db](https://github.com/frankie336/projectdavid/commit/bf102dbaa71d610f4ba4b6e2ed99ffe640fdd40c)), closes [throu#1](https://github.com/throu/issues/1)
15
+
1
16
  ## [1.32.6](https://github.com/frankie336/projectdavid/compare/v1.32.5...v1.32.6) (2025-06-08)
2
17
 
3
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: projectdavid
3
- Version: 1.32.6
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.6"
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,14 +11,12 @@ LOG = UtilsInterface.LoggingUtility()
11
11
 
12
12
 
13
13
  class SynchronousInferenceStream:
14
- """Wrap an async streaming generator and expose it synchronously."""
15
-
16
14
  _GLOBAL_LOOP = asyncio.new_event_loop()
17
15
  asyncio.set_event_loop(_GLOBAL_LOOP)
18
16
 
19
- # ------------------------------------------------------------------ #
20
- # construction / setup
21
- # ------------------------------------------------------------------ #
17
+ # --------------------------------------------------------------
18
+ # ctor / setup
19
+ # --------------------------------------------------------------
22
20
  def __init__(self, inference) -> None:
23
21
  self.inference_client = inference
24
22
  self.user_id: Optional[str] = None
@@ -44,9 +42,9 @@ class SynchronousInferenceStream:
44
42
  self.run_id = run_id
45
43
  self.api_key = api_key
46
44
 
47
- # ------------------------------------------------------------------ #
45
+ # --------------------------------------------------------------
48
46
  # main streaming entry-point
49
- # ------------------------------------------------------------------ #
47
+ # --------------------------------------------------------------
50
48
  def stream_chunks(
51
49
  self,
52
50
  provider: str,
@@ -56,13 +54,6 @@ class SynchronousInferenceStream:
56
54
  timeout_per_chunk: float = 280.0,
57
55
  suppress_fc: bool = True,
58
56
  ) -> Generator[dict, None, None]:
59
- """
60
- Yield provider chunks synchronously. When *suppress_fc* is True we
61
-
62
- 1. completely drop top-level `type="function_call"` chunks, and
63
- 2. scrub inline `<fc> … </fc>` sections inside text using the
64
- PeekGate + FunctionCallSuppressor chain.
65
- """
66
57
 
67
58
  resolved_api_key = api_key or self.api_key
68
59
 
@@ -80,36 +71,38 @@ class SynchronousInferenceStream:
80
71
 
81
72
  agen = _stream_chunks_async().__aiter__()
82
73
 
83
- # ---------- build inline filter --------------------------------
74
+ # ---------- suppression chain ----------
84
75
  if suppress_fc:
85
- suppressor = FunctionCallSuppressor()
86
- peek_gate = PeekGate(suppressor)
76
+ _suppressor = FunctionCallSuppressor()
77
+ _peek_gate = PeekGate(_suppressor)
87
78
 
88
79
  def _filter_text(txt: str) -> str:
89
- return peek_gate.feed(txt)
80
+ return _peek_gate.feed(txt)
90
81
 
91
82
  else:
92
83
 
93
84
  def _filter_text(txt: str) -> str: # no-op
94
85
  return txt
95
86
 
96
- # ---------- main loop ------------------------------------------
87
+ # ---------------------------------------
88
+
97
89
  while True:
98
90
  try:
99
91
  chunk = self._GLOBAL_LOOP.run_until_complete(
100
92
  asyncio.wait_for(agen.__anext__(), timeout=timeout_per_chunk)
101
93
  )
102
94
 
103
- # ① drop provider-labelled function_call objects
95
+ # provider-labelled function_call
104
96
  if suppress_fc and chunk.get("type") == "function_call":
105
- LOG.debug("[SUPPRESSOR] stripped top-level function_call chunk")
97
+ LOG.debug("[SUPPRESSOR] blocked provider-labelled function_call")
106
98
  continue
107
99
 
108
- # never touch hot-code or code-interpreter file previews
100
+ # allow hot_code to bypass suppression
109
101
  if chunk.get("type") == "hot_code":
110
102
  yield chunk
111
103
  continue
112
104
 
105
+ # allow code_interpreter_stream to bypass suppression
113
106
  if (
114
107
  chunk.get("stream_type") == "code_execution"
115
108
  and chunk.get("chunk", {}).get("type") == "code_interpreter_stream"
@@ -117,12 +110,18 @@ class SynchronousInferenceStream:
117
110
  yield chunk
118
111
  continue
119
112
 
120
- # ③ filter inline text (<fc> blocks) *only* when content is str
113
+ # inline content
121
114
  if isinstance(chunk.get("content"), str):
122
115
  chunk["content"] = _filter_text(chunk["content"])
123
116
  if chunk["content"] == "":
124
- # Either the text is still in PeekGate’s buffer
125
- # or it was fully suppressed – skip for now.
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")
126
125
  continue
127
126
 
128
127
  yield chunk
@@ -131,17 +130,15 @@ class SynchronousInferenceStream:
131
130
  LOG.info("Stream completed normally.")
132
131
  break
133
132
  except asyncio.TimeoutError:
134
- LOG.error(
135
- "[Timeout] chunk wait exceeded %.1f s – aborting", timeout_per_chunk
136
- )
133
+ LOG.error("[TimeoutError] Timeout occurred, stopping stream.")
137
134
  break
138
- except Exception as exc: # pylint: disable=broad-except
139
- LOG.error("Unexpected streaming error: %s", exc, exc_info=True)
135
+ except Exception as e:
136
+ LOG.error("Unexpected error during streaming completions: %s", e)
140
137
  break
141
138
 
142
- # ------------------------------------------------------------------ #
139
+ # --------------------------------------------------------------
143
140
  # housekeeping
144
- # ------------------------------------------------------------------ #
141
+ # --------------------------------------------------------------
145
142
  @classmethod
146
143
  def shutdown_loop(cls) -> None:
147
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.6
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