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