rossum-agent 1.0.0rc3__tar.gz → 1.0.0rc4__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 (83) hide show
  1. {rossum_agent-1.0.0rc3/rossum_agent.egg-info → rossum_agent-1.0.0rc4}/PKG-INFO +1 -1
  2. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/pyproject.toml +1 -1
  3. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/__init__.py +1 -1
  4. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/services/agent_service.py +53 -25
  5. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4/rossum_agent.egg-info}/PKG-INFO +1 -1
  6. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/LICENSE +0 -0
  7. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/README.md +0 -0
  8. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/agent/__init__.py +0 -0
  9. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/agent/core.py +0 -0
  10. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/agent/memory.py +0 -0
  11. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/agent/models.py +0 -0
  12. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/agent/request_classifier.py +0 -0
  13. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/agent/skills.py +0 -0
  14. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/agent/types.py +0 -0
  15. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/agent_logging.py +0 -0
  16. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/__init__.py +0 -0
  17. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/cli.py +0 -0
  18. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/dependencies.py +0 -0
  19. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/main.py +0 -0
  20. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/models/__init__.py +0 -0
  21. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/models/schemas.py +0 -0
  22. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/routes/__init__.py +0 -0
  23. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/routes/chats.py +0 -0
  24. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/routes/files.py +0 -0
  25. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/routes/health.py +0 -0
  26. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/routes/messages.py +0 -0
  27. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/services/__init__.py +0 -0
  28. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/services/chat_service.py +0 -0
  29. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/api/services/file_service.py +0 -0
  30. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/assets/Primary_light_logo.png +0 -0
  31. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/bedrock_client.py +0 -0
  32. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/prompts/__init__.py +0 -0
  33. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/prompts/base_prompt.py +0 -0
  34. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/prompts/system_prompt.py +0 -0
  35. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/py.typed +0 -0
  36. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/redis_storage.py +0 -0
  37. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/rossum_mcp_integration.py +0 -0
  38. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/skills/hook-debugging.md +0 -0
  39. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/skills/organization-setup.md +0 -0
  40. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/skills/rossum-deployment.md +0 -0
  41. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/skills/schema-patching.md +0 -0
  42. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/skills/schema-pruning.md +0 -0
  43. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/skills/ui-settings.md +0 -0
  44. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/streamlit_app/__init__.py +0 -0
  45. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/streamlit_app/app.py +0 -0
  46. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/streamlit_app/beep_sound.py +0 -0
  47. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/streamlit_app/cli.py +0 -0
  48. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/streamlit_app/render_modules.py +0 -0
  49. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/streamlit_app/response_formatting.py +0 -0
  50. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/tools/__init__.py +0 -0
  51. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/tools/core.py +0 -0
  52. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/tools/deploy.py +0 -0
  53. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/tools/dynamic_tools.py +0 -0
  54. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/tools/file_tools.py +0 -0
  55. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/tools/formula.py +0 -0
  56. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/tools/skills.py +0 -0
  57. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/tools/spawn_mcp.py +0 -0
  58. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/tools/subagents/__init__.py +0 -0
  59. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/tools/subagents/base.py +0 -0
  60. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/tools/subagents/hook_debug.py +0 -0
  61. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/tools/subagents/knowledge_base.py +0 -0
  62. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/tools/subagents/mcp_helpers.py +0 -0
  63. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/tools/subagents/schema_patching.py +0 -0
  64. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/url_context.py +0 -0
  65. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/user_detection.py +0 -0
  66. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent/utils.py +0 -0
  67. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent.egg-info/SOURCES.txt +0 -0
  68. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent.egg-info/dependency_links.txt +0 -0
  69. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent.egg-info/entry_points.txt +0 -0
  70. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent.egg-info/requires.txt +0 -0
  71. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/rossum_agent.egg-info/top_level.txt +0 -0
  72. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/setup.cfg +0 -0
  73. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/tests/test_agent_logging.py +0 -0
  74. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/tests/test_app_llm_response_formatting.py +0 -0
  75. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/tests/test_bedrock_client.py +0 -0
  76. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/tests/test_beep_sound.py +0 -0
  77. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/tests/test_dynamic_tools.py +0 -0
  78. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/tests/test_redis_storage.py +0 -0
  79. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/tests/test_rossum_mcp_integration.py +0 -0
  80. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/tests/test_smoke.py +0 -0
  81. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/tests/test_url_context.py +0 -0
  82. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/tests/test_user_detection.py +0 -0
  83. {rossum_agent-1.0.0rc3 → rossum_agent-1.0.0rc4}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rossum-agent
3
- Version: 1.0.0rc3
3
+ Version: 1.0.0rc4
4
4
  Summary: AI agent toolkit for Rossum: document workflows conversationally, debug pipelines automatically, and enable agentic configuration of intelligent document processing.
5
5
  Author-email: "Dan Stancl (Rossum AI)" <daniel.stancl@gmail.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "rossum-agent"
7
- version = "1.0.0rc3"
7
+ version = "1.0.0rc4"
8
8
  description = "AI agent toolkit for Rossum: document workflows conversationally, debug pipelines automatically, and enable agentic configuration of intelligent document processing."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -4,6 +4,6 @@ from __future__ import annotations
4
4
 
5
5
  from rossum_agent.agent import AgentConfig, AgentStep, RossumAgent, create_agent
6
6
 
7
- __version__ = "1.0.0rc3"
7
+ __version__ = "1.0.0rc4"
8
8
 
9
9
  __all__ = ["AgentConfig", "AgentStep", "RossumAgent", "create_agent"]
@@ -3,7 +3,9 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import asyncio
6
+ import contextvars
6
7
  import logging
8
+ from dataclasses import dataclass
7
9
  from typing import TYPE_CHECKING, Any, Literal
8
10
 
9
11
  from rossum_agent.agent.core import RossumAgent, create_agent
@@ -43,6 +45,18 @@ if TYPE_CHECKING:
43
45
  logger = logging.getLogger(__name__)
44
46
 
45
47
 
48
+ @dataclass
49
+ class _RequestContext:
50
+ """Per-request context for agent execution."""
51
+
52
+ output_dir: Path | None = None
53
+ sub_agent_queue: asyncio.Queue[SubAgentProgressEvent | SubAgentTextEvent] | None = None
54
+ last_memory: AgentMemory | None = None
55
+
56
+
57
+ _request_context: contextvars.ContextVar[_RequestContext] = contextvars.ContextVar("request_context")
58
+
59
+
46
60
  def convert_sub_agent_progress_to_event(progress: SubAgentProgress) -> SubAgentProgressEvent:
47
61
  """Convert a SubAgentProgress to a SubAgentProgressEvent for SSE streaming.
48
62
 
@@ -133,28 +147,36 @@ class AgentService:
133
147
  """Service for running the Rossum Agent.
134
148
 
135
149
  Manages MCP connection lifecycle and agent execution for API requests.
150
+ Uses contextvars for per-request state to support concurrent requests.
136
151
  """
137
152
 
138
153
  def __init__(self) -> None:
139
154
  """Initialize agent service."""
140
- self._output_dir: Path | None = None
141
- self._sub_agent_queue: asyncio.Queue[SubAgentProgressEvent | SubAgentTextEvent] | None = None
142
- self._last_memory: AgentMemory | None = None
155
+
156
+ def _get_context(self) -> _RequestContext:
157
+ """Get the current request context, creating if needed."""
158
+ try:
159
+ return _request_context.get()
160
+ except LookupError:
161
+ ctx = _RequestContext()
162
+ _request_context.set(ctx)
163
+ return ctx
143
164
 
144
165
  @property
145
166
  def output_dir(self) -> Path | None:
146
167
  """Get the output directory for the current run."""
147
- return self._output_dir
168
+ return self._get_context().output_dir
148
169
 
149
170
  def _on_sub_agent_progress(self, progress: SubAgentProgress) -> None:
150
171
  """Callback for sub-agent progress updates.
151
172
 
152
173
  Converts the progress to an event and puts it on the queue for streaming.
153
174
  """
154
- if self._sub_agent_queue is not None:
175
+ ctx = self._get_context()
176
+ if ctx.sub_agent_queue is not None:
155
177
  event = convert_sub_agent_progress_to_event(progress)
156
178
  try:
157
- self._sub_agent_queue.put_nowait(event)
179
+ ctx.sub_agent_queue.put_nowait(event)
158
180
  except asyncio.QueueFull:
159
181
  logger.warning("Sub-agent progress queue full, dropping event")
160
182
 
@@ -163,10 +185,11 @@ class AgentService:
163
185
 
164
186
  Converts the text to an event and puts it on the queue for streaming.
165
187
  """
166
- if self._sub_agent_queue is not None:
188
+ ctx = self._get_context()
189
+ if ctx.sub_agent_queue is not None:
167
190
  event = SubAgentTextEvent(tool_name=text.tool_name, text=text.text, is_final=text.is_final)
168
191
  try:
169
- self._sub_agent_queue.put_nowait(event)
192
+ ctx.sub_agent_queue.put_nowait(event)
170
193
  except asyncio.QueueFull:
171
194
  logger.warning("Sub-agent text queue full, dropping event")
172
195
 
@@ -196,16 +219,19 @@ class AgentService:
196
219
  if documents:
197
220
  logger.info(f"Including {len(documents)} documents in the prompt")
198
221
 
199
- self._output_dir = create_session_output_dir()
200
- set_session_output_dir(self._output_dir)
201
- set_output_dir(self._output_dir)
222
+ ctx = _RequestContext()
223
+ _request_context.set(ctx)
224
+
225
+ ctx.output_dir = create_session_output_dir()
226
+ set_session_output_dir(ctx.output_dir)
227
+ set_output_dir(ctx.output_dir)
202
228
  set_rossum_credentials(rossum_api_base_url, rossum_api_token)
203
- logger.info(f"Created session output directory: {self._output_dir}")
229
+ logger.info(f"Created session output directory: {ctx.output_dir}")
204
230
 
205
231
  if documents:
206
232
  self._save_documents_to_output_dir(documents)
207
233
 
208
- self._sub_agent_queue = asyncio.Queue(maxsize=100)
234
+ ctx.sub_agent_queue = asyncio.Queue(maxsize=100)
209
235
  set_progress_callback(self._on_sub_agent_progress)
210
236
  set_text_callback(self._on_sub_agent_text)
211
237
 
@@ -237,9 +263,9 @@ class AgentService:
237
263
 
238
264
  try:
239
265
  async for step in agent.run(user_content):
240
- while not self._sub_agent_queue.empty():
266
+ while not ctx.sub_agent_queue.empty():
241
267
  try:
242
- sub_event = self._sub_agent_queue.get_nowait()
268
+ sub_event = ctx.sub_agent_queue.get_nowait()
243
269
  yield sub_event
244
270
  except asyncio.QueueEmpty:
245
271
  break
@@ -251,14 +277,14 @@ class AgentService:
251
277
  total_input_tokens = agent._total_input_tokens
252
278
  total_output_tokens = agent._total_output_tokens
253
279
 
254
- while not self._sub_agent_queue.empty():
280
+ while not ctx.sub_agent_queue.empty():
255
281
  try:
256
- sub_event = self._sub_agent_queue.get_nowait()
282
+ sub_event = ctx.sub_agent_queue.get_nowait()
257
283
  yield sub_event
258
284
  except asyncio.QueueEmpty:
259
285
  break
260
286
 
261
- self._last_memory = agent.memory
287
+ ctx.last_memory = agent.memory
262
288
 
263
289
  yield StreamDoneEvent(
264
290
  total_steps=total_steps,
@@ -281,7 +307,6 @@ class AgentService:
281
307
  set_text_callback(None)
282
308
  set_output_dir(None)
283
309
  set_rossum_credentials(None, None)
284
- self._sub_agent_queue = None
285
310
 
286
311
  def _save_documents_to_output_dir(self, documents: list[DocumentContent]) -> None:
287
312
  """Save uploaded documents to the output directory.
@@ -291,12 +316,13 @@ class AgentService:
291
316
  """
292
317
  import base64 # noqa: PLC0415 - import here to avoid circular import at module level
293
318
 
294
- if self._output_dir is None:
319
+ ctx = self._get_context()
320
+ if ctx.output_dir is None:
295
321
  logger.warning("Cannot save documents: output directory not set")
296
322
  return
297
323
 
298
324
  for doc in documents:
299
- file_path = self._output_dir / doc.filename
325
+ file_path = ctx.output_dir / doc.filename
300
326
  try:
301
327
  file_data = base64.b64decode(doc.data)
302
328
  file_path.write_bytes(file_data)
@@ -320,6 +346,7 @@ class AgentService:
320
346
  if not images and not documents:
321
347
  return prompt
322
348
 
349
+ ctx = self._get_context()
323
350
  content: list[ImageBlockParam | TextBlockParam] = []
324
351
  if images:
325
352
  for img in images:
@@ -333,8 +360,8 @@ class AgentService:
333
360
  },
334
361
  }
335
362
  )
336
- if documents and self._output_dir:
337
- doc_paths = [str(self._output_dir / doc.filename) for doc in documents]
363
+ if documents and ctx.output_dir:
364
+ doc_paths = [str(ctx.output_dir / doc.filename) for doc in documents]
338
365
  doc_info = "\n".join(f"- {path}" for path in doc_paths)
339
366
  content.append({"type": "text", "text": f"[Uploaded documents available for processing:\n{doc_info}]"})
340
367
  content.append({"type": "text", "text": prompt})
@@ -416,9 +443,10 @@ class AgentService:
416
443
  images: Optional list of images included with the user prompt.
417
444
  documents: Optional list of documents included with the user prompt.
418
445
  """
419
- if self._last_memory is not None:
446
+ ctx = self._get_context()
447
+ if ctx.last_memory is not None:
420
448
  lean_history: list[dict[str, Any]] = []
421
- for step_dict in self._last_memory.to_dict():
449
+ for step_dict in ctx.last_memory.to_dict():
422
450
  if step_dict.get("type") == "task_step":
423
451
  lean_history.append(step_dict)
424
452
  elif step_dict.get("type") == "memory_step":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rossum-agent
3
- Version: 1.0.0rc3
3
+ Version: 1.0.0rc4
4
4
  Summary: AI agent toolkit for Rossum: document workflows conversationally, debug pipelines automatically, and enable agentic configuration of intelligent document processing.
5
5
  Author-email: "Dan Stancl (Rossum AI)" <daniel.stancl@gmail.com>
6
6
  License: MIT
File without changes