OpenRAG 0.6.0.dev19__py3-none-any.whl → 0.6.0.dev21__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openrag
3
- Version: 0.6.0.dev19
3
+ Version: 0.6.0.dev21
4
4
  Summary: OpenRAG is a comprehensive Retrieval-Augmented Generation platform that enables intelligent document search and AI-powered conversations.
5
5
  Classifier: Development Status :: 4 - Beta
6
6
  Classifier: Environment :: Console
@@ -128,7 +128,7 @@ models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
128
  models/processors.py,sha256=F0LOVNOOrDS9zCfb-piYf3uRYawiPbmNGO2Da4g6G4I,70039
129
129
  models/tasks.py,sha256=BByR2xDl4zqvbCbTGgBC3aChJ_uJoRpHy0TTJrvW5Dc,3152
130
130
  models/url.py,sha256=KMleXhlwd3W59axcubMJxIEtHpyBQTvfxkycc-o0kOY,5601
131
- openrag-0.6.0.dev19.dist-info/licenses/LICENSE,sha256=jWcnPXkUxEinX60Yn-_zjsY9i84vz2QSb0fi53djOkg,11334
131
+ openrag-0.6.0.dev21.dist-info/licenses/LICENSE,sha256=jWcnPXkUxEinX60Yn-_zjsY9i84vz2QSb0fi53djOkg,11334
132
132
  services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
133
133
  services/api_key_service.py,sha256=m04jVSJyDqIl-NgNROKLIfy4QYArZxlvz_WkjqQK7TA,13269
134
134
  services/auth_service.py,sha256=qxg5Mj1KvR23dBaZnwe2gjQia5DqvNNi7VQCkkKxq8k,23794
@@ -164,7 +164,7 @@ services/task_service.py,sha256=wnvmd9MEYl_BDWUqmEtjmN08Iik1ANaZrJYyp71lqNA,6455
164
164
  services/user_service.py,sha256=KsqQN0qPSwxQsBUBkIxE60TDJNveaDk-5rhQE9bN2Fs,11993
165
165
  services/workspace_config_service.py,sha256=Ij-fvy0zd3OSsML4ZwG4WG-QmOuxLWcCf9f3HvtD6iY,16544
166
166
  tui/__init__.py,sha256=RICZ8Cht-_36b6KVVCkwdNFQIOG40GnDe2NZJlkphd4,138
167
- tui/cli.py,sha256=utCk0OtchNNHG1CYTTAOeuIp17sHuB1NIn9-GuInZdc,17982
167
+ tui/cli.py,sha256=YtDle-1hHQFoyL5PXAuMojo8SaBU2jd15W1nfAvR1i8,19011
168
168
  tui/config_fields.py,sha256=pzvzGdykIW4x7vr056Vydgy9sJpzK6BWarqYCf6-cAE,16595
169
169
  tui/main.py,sha256=fPfkw81ay4xJVO1HpwADqs-H8IsbECJdjwZHhkoIMms,31246
170
170
  tui/_assets/docker-compose.gpu.yml,sha256=tV8pkI3hTEk2yvpIS6m5ONavEQdmwhuqkGW8RIhQvhk,290
@@ -183,7 +183,7 @@ tui/_assets/openrag-documents/docling.pdf,sha256=gt1HBxLOg4nxnyDrkzBHXiFmooH4x5k
183
183
  tui/_assets/openrag-documents/ibm_anthropic.pdf,sha256=ZepdgkwiEzS3-J3nN04X2QpDofIg1Ek9mOwS-do_GqY,1969939
184
184
  tui/_assets/openrag-documents/warmup_ocr.pdf,sha256=gm-KtSjldMVcmRuldtxSBEUS8vZeF5fNQ1emxknATK4,9612
185
185
  tui/managers/__init__.py,sha256=NQFBkKkxOjEXoDSoMxN0byy-XjbwdsJJeT3p_foEERU,28
186
- tui/managers/container_manager.py,sha256=DbDYNdwD9WQnUlmIOeAjkYF_AttvLHGNMCID9-kjQ_s,65996
186
+ tui/managers/container_manager.py,sha256=NAxicaVBkXCMCcFLjHnqWaSDZkf9_yl-xnqHU8YaJDE,66566
187
187
  tui/managers/docling_manager.py,sha256=5LwMsHMO5ph4hs3GsVpurk4U8rxp52pKPoreJU2kN2U,23766
188
188
  tui/managers/env_manager.py,sha256=EJyiRhbuBTWMmaHfwq2uacdPG0BvmLhbrFfJjUZ6Ly8,40837
189
189
  tui/screens/__init__.py,sha256=ZzB_lbAnSTwDqiG0ppafOE-sAiOUVaNy4V6x5AJvqyM,27
@@ -240,8 +240,8 @@ utils/telemetry/__init__.py,sha256=xoStY8hoYWnVe0B_jNthSdzRb7AxCT0rhM8ba9Q0Obg,2
240
240
  utils/telemetry/category.py,sha256=wei3V5WyUaiadYjEE5s0ys9PY0TjnebIvTykQU0P_2k,1114
241
241
  utils/telemetry/client.py,sha256=RhjW1a27w7W6gHt9X7AxdRPdZGmCEQDPskkxj5nsuiQ,12500
242
242
  utils/telemetry/message_id.py,sha256=05CvlKW_LaD00INxd3WV8uXBZ9f_5Cvy-jAyOPmpxTk,9600
243
- openrag-0.6.0.dev19.dist-info/METADATA,sha256=CF2Z-QYMINwAljaYaWpYsUO56NM-ILJqbMwPuzVT_YA,8728
244
- openrag-0.6.0.dev19.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
245
- openrag-0.6.0.dev19.dist-info/entry_points.txt,sha256=ArKNHB63I3K8vynNkogvZOLmmQFpIsHDL7MvreCmju4,45
246
- openrag-0.6.0.dev19.dist-info/top_level.txt,sha256=TpFyXTBO-cpphRZHx7Vgwgzg4KmPXwNkkfOo93D5qOk,132
247
- openrag-0.6.0.dev19.dist-info/RECORD,,
243
+ openrag-0.6.0.dev21.dist-info/METADATA,sha256=sPPCaC6QowkGR6FGO2_BJJKYtZyidl15RjsB-x7Yg5A,8728
244
+ openrag-0.6.0.dev21.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
245
+ openrag-0.6.0.dev21.dist-info/entry_points.txt,sha256=ArKNHB63I3K8vynNkogvZOLmmQFpIsHDL7MvreCmju4,45
246
+ openrag-0.6.0.dev21.dist-info/top_level.txt,sha256=TpFyXTBO-cpphRZHx7Vgwgzg4KmPXwNkkfOo93D5qOk,132
247
+ openrag-0.6.0.dev21.dist-info/RECORD,,
tui/cli.py CHANGED
@@ -227,15 +227,18 @@ def _setup_walkthrough(
227
227
  _, _, already_running = _get_service_states(container_manager, docling_manager)
228
228
  if already_running:
229
229
  _stop_services_cli(container_manager, docling_manager)
230
- _start_services_cli(container_manager, docling_manager)
230
+ fully_started = _start_services_cli(container_manager, docling_manager)
231
231
 
232
- console.print()
233
- frontend_url = f"http://localhost:{os.getenv('FRONTEND_PORT', '3000')}"
234
- console.print(f"[bold green]OpenRAG is running at {frontend_url}[/bold green]")
235
- try:
236
- webbrowser.open(frontend_url)
237
- except Exception:
238
- pass
232
+ # Only announce the app URL / open the browser once everything is up;
233
+ # _start_services_cli already surfaced a warning for a partial startup.
234
+ if fully_started:
235
+ console.print()
236
+ frontend_url = f"http://localhost:{os.getenv('FRONTEND_PORT', '3000')}"
237
+ console.print(f"[bold green]OpenRAG is running at {frontend_url}[/bold green]")
238
+ try:
239
+ webbrowser.open(frontend_url)
240
+ except Exception:
241
+ pass
239
242
 
240
243
 
241
244
  def _collect_config(
@@ -345,11 +348,14 @@ def _start_services_cli(
345
348
  console.print("Starting OpenRAG services...", style="bold")
346
349
 
347
350
  async def _inner():
351
+ containers_ok = True
352
+ docling_ok = docling_manager.is_running()
353
+
348
354
  # Start container services
349
355
  if container_manager.is_available():
350
356
  async for item in container_manager.start_services():
351
357
  # start_services yields (success, message) or (success, message, replace_last)
352
- success = item[0]
358
+ containers_ok = item[0]
353
359
  message = item[1]
354
360
  replace_last = item[2] if len(item) > 2 else False
355
361
  if replace_last:
@@ -358,24 +364,40 @@ def _start_services_cli(
358
364
  else:
359
365
  console.print(f" {message}")
360
366
 
361
- if not success and "error" in message.lower():
362
- console.print(f" [red]✗ {message}[/red]")
367
+ if not containers_ok:
368
+ statuses = await container_manager.get_service_status(force_refresh=True)
369
+ containers_ok = bool(statuses) and all(
370
+ s.status == ServiceStatus.RUNNING for s in statuses.values()
371
+ )
363
372
  else:
364
373
  console.print(" [yellow]No container runtime available[/yellow]")
374
+ containers_ok = False
365
375
 
366
- # Start docling
367
- if not docling_manager.is_running():
368
- success, message = await docling_manager.start()
369
- if success:
376
+ if not docling_ok:
377
+ docling_ok, message = await docling_manager.start()
378
+ if docling_ok:
370
379
  console.print(f" {message}")
371
380
  else:
372
381
  console.print(f" [yellow]{message}[/yellow]")
373
382
 
383
+ return containers_ok, docling_ok
384
+
374
385
  try:
375
- asyncio.run(_inner())
376
- console.print("[green]✓ All services started[/green]")
386
+ containers_ok, docling_ok = asyncio.run(_inner())
387
+
388
+ # On full success the menu header already reports "Services are running",
389
+ # so only surface partial/failed startup here to avoid a duplicate message.
390
+ results = {"containers": containers_ok, "docling-serve": docling_ok}
391
+ failed = [name for name, ok in results.items() if not ok]
392
+ if failed:
393
+ console.print(
394
+ f"[yellow]⚠ Startup incomplete: {', '.join(failed)} did not start "
395
+ "(run Show status for details)[/yellow]"
396
+ )
397
+ return not failed
377
398
  except Exception as e:
378
399
  console.print(f"[red]✗ Error starting services: {e}[/red]")
400
+ return False
379
401
 
380
402
 
381
403
  def _stop_services_cli(
@@ -393,7 +415,7 @@ def _stop_services_cli(
393
415
  console.print(f" {message}")
394
416
  # Stop docling
395
417
  if docling_manager.is_running():
396
- success, message = await docling_manager.stop()
418
+ _success, message = await docling_manager.stop()
397
419
  console.print(f" {message}")
398
420
 
399
421
  try:
@@ -644,6 +644,13 @@ class ContainerManager:
644
644
 
645
645
  return True, images, ""
646
646
 
647
+ def _resolve_service_name(self, compose_service: str | None, container_name: str) -> str | None:
648
+ """Resolve a container to its canonical OpenRAG service name"""
649
+ if compose_service and compose_service in self.expected_services:
650
+ return compose_service
651
+
652
+ return self.container_name_map.get(container_name)
653
+
647
654
  def _process_service_json(self, service: dict, services: dict[str, ServiceInfo]) -> None:
648
655
  """Process a service JSON object and add it to the services dict."""
649
656
  # Debug print to see the actual service data
@@ -651,8 +658,8 @@ class ContainerManager:
651
658
 
652
659
  container_name = service.get("Name", "")
653
660
 
654
- # Map container name to service name
655
- service_name = self.container_name_map.get(container_name)
661
+ # Resolve to canonical service name (compose 'Service' field first, then name map)
662
+ service_name = self._resolve_service_name(service.get("Service"), container_name)
656
663
  if not service_name:
657
664
  return
658
665
 
@@ -802,7 +809,10 @@ class ContainerManager:
802
809
  continue
803
810
 
804
811
  container_name = names[0]
805
- service_name = self.container_name_map.get(container_name)
812
+ labels = container.get("Labels") or {}
813
+ service_name = self._resolve_service_name(
814
+ labels.get("com.docker.compose.service"), container_name
815
+ )
806
816
  if not service_name:
807
817
  continue
808
818