unrealon 1.0.8__py3-none-any.whl → 1.1.0__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.
Files changed (302) hide show
  1. unrealon/__init__.py +23 -21
  2. unrealon-1.1.0.dist-info/METADATA +164 -0
  3. unrealon-1.1.0.dist-info/RECORD +82 -0
  4. {unrealon-1.0.8.dist-info → unrealon-1.1.0.dist-info}/WHEEL +1 -1
  5. unrealon-1.1.0.dist-info/entry_points.txt +9 -0
  6. {unrealon-1.0.8.dist-info → unrealon-1.1.0.dist-info/licenses}/LICENSE +1 -1
  7. unrealon_bridge/__init__.py +114 -0
  8. unrealon_bridge/cli.py +316 -0
  9. unrealon_bridge/client/__init__.py +93 -0
  10. unrealon_bridge/client/base.py +78 -0
  11. unrealon_bridge/client/commands.py +89 -0
  12. unrealon_bridge/client/connection.py +90 -0
  13. unrealon_bridge/client/events.py +65 -0
  14. unrealon_bridge/client/health.py +38 -0
  15. unrealon_bridge/client/html_parser.py +146 -0
  16. unrealon_bridge/client/logging.py +139 -0
  17. unrealon_bridge/client/proxy.py +70 -0
  18. unrealon_bridge/client/scheduler.py +450 -0
  19. unrealon_bridge/client/session.py +70 -0
  20. unrealon_bridge/configs/__init__.py +14 -0
  21. unrealon_bridge/configs/bridge_config.py +212 -0
  22. unrealon_bridge/configs/bridge_config.yaml +39 -0
  23. unrealon_bridge/models/__init__.py +138 -0
  24. unrealon_bridge/models/base.py +28 -0
  25. unrealon_bridge/models/command.py +41 -0
  26. unrealon_bridge/models/events.py +40 -0
  27. unrealon_bridge/models/html_parser.py +79 -0
  28. unrealon_bridge/models/logging.py +55 -0
  29. unrealon_bridge/models/parser.py +63 -0
  30. unrealon_bridge/models/proxy.py +41 -0
  31. unrealon_bridge/models/requests.py +95 -0
  32. unrealon_bridge/models/responses.py +88 -0
  33. unrealon_bridge/models/scheduler.py +592 -0
  34. unrealon_bridge/models/session.py +28 -0
  35. unrealon_bridge/server/__init__.py +91 -0
  36. unrealon_bridge/server/base.py +171 -0
  37. unrealon_bridge/server/handlers/__init__.py +23 -0
  38. unrealon_bridge/server/handlers/command.py +110 -0
  39. unrealon_bridge/server/handlers/html_parser.py +139 -0
  40. unrealon_bridge/server/handlers/logging.py +95 -0
  41. unrealon_bridge/server/handlers/parser.py +95 -0
  42. unrealon_bridge/server/handlers/proxy.py +75 -0
  43. unrealon_bridge/server/handlers/scheduler.py +545 -0
  44. unrealon_bridge/server/handlers/session.py +66 -0
  45. unrealon_browser/__init__.py +61 -18
  46. unrealon_browser/{src/cli → cli}/browser_cli.py +6 -13
  47. unrealon_browser/{src/cli → cli}/cookies_cli.py +5 -1
  48. unrealon_browser/{src/core → core}/browser_manager.py +2 -2
  49. unrealon_browser/{src/managers → managers}/captcha.py +1 -1
  50. unrealon_browser/{src/managers → managers}/cookies.py +1 -1
  51. unrealon_browser/managers/logger_bridge.py +231 -0
  52. unrealon_browser/{src/managers → managers}/profile.py +1 -1
  53. unrealon_driver/__init__.py +73 -19
  54. unrealon_driver/browser/__init__.py +8 -0
  55. unrealon_driver/browser/config.py +74 -0
  56. unrealon_driver/browser/manager.py +416 -0
  57. unrealon_driver/exceptions.py +28 -0
  58. unrealon_driver/parser/__init__.py +55 -0
  59. unrealon_driver/parser/cli_manager.py +141 -0
  60. unrealon_driver/parser/daemon_manager.py +227 -0
  61. unrealon_driver/parser/managers/__init__.py +46 -0
  62. unrealon_driver/parser/managers/browser.py +51 -0
  63. unrealon_driver/parser/managers/config.py +281 -0
  64. unrealon_driver/parser/managers/error.py +412 -0
  65. unrealon_driver/parser/managers/html.py +732 -0
  66. unrealon_driver/parser/managers/logging.py +609 -0
  67. unrealon_driver/parser/managers/result.py +321 -0
  68. unrealon_driver/parser/parser_manager.py +628 -0
  69. unrealon/sdk_config.py +0 -88
  70. unrealon-1.0.8.dist-info/METADATA +0 -803
  71. unrealon-1.0.8.dist-info/RECORD +0 -246
  72. unrealon_browser/pyproject.toml +0 -182
  73. unrealon_browser/src/__init__.py +0 -62
  74. unrealon_browser/src/managers/logger_bridge.py +0 -395
  75. unrealon_driver/README.md +0 -204
  76. unrealon_driver/pyproject.toml +0 -187
  77. unrealon_driver/src/__init__.py +0 -90
  78. unrealon_driver/src/cli/__init__.py +0 -10
  79. unrealon_driver/src/cli/main.py +0 -66
  80. unrealon_driver/src/cli/simple.py +0 -510
  81. unrealon_driver/src/config/__init__.py +0 -11
  82. unrealon_driver/src/config/auto_config.py +0 -478
  83. unrealon_driver/src/core/__init__.py +0 -18
  84. unrealon_driver/src/core/exceptions.py +0 -289
  85. unrealon_driver/src/core/parser.py +0 -638
  86. unrealon_driver/src/dto/__init__.py +0 -66
  87. unrealon_driver/src/dto/cli.py +0 -119
  88. unrealon_driver/src/dto/config.py +0 -18
  89. unrealon_driver/src/dto/events.py +0 -237
  90. unrealon_driver/src/dto/execution.py +0 -313
  91. unrealon_driver/src/dto/services.py +0 -311
  92. unrealon_driver/src/execution/__init__.py +0 -23
  93. unrealon_driver/src/execution/daemon_mode.py +0 -317
  94. unrealon_driver/src/execution/interactive_mode.py +0 -88
  95. unrealon_driver/src/execution/modes.py +0 -45
  96. unrealon_driver/src/execution/scheduled_mode.py +0 -209
  97. unrealon_driver/src/execution/test_mode.py +0 -250
  98. unrealon_driver/src/logging/__init__.py +0 -24
  99. unrealon_driver/src/logging/driver_logger.py +0 -512
  100. unrealon_driver/src/services/__init__.py +0 -24
  101. unrealon_driver/src/services/browser_service.py +0 -726
  102. unrealon_driver/src/services/llm/__init__.py +0 -15
  103. unrealon_driver/src/services/llm/browser_llm_service.py +0 -363
  104. unrealon_driver/src/services/llm/llm.py +0 -195
  105. unrealon_driver/src/services/logger_service.py +0 -232
  106. unrealon_driver/src/services/metrics_service.py +0 -185
  107. unrealon_driver/src/services/scheduler_service.py +0 -489
  108. unrealon_driver/src/services/websocket_service.py +0 -362
  109. unrealon_driver/src/utils/__init__.py +0 -16
  110. unrealon_driver/src/utils/service_factory.py +0 -317
  111. unrealon_driver/src/utils/time_formatter.py +0 -338
  112. unrealon_llm/README.md +0 -44
  113. unrealon_llm/__init__.py +0 -26
  114. unrealon_llm/pyproject.toml +0 -154
  115. unrealon_llm/src/__init__.py +0 -228
  116. unrealon_llm/src/cli/__init__.py +0 -0
  117. unrealon_llm/src/core/__init__.py +0 -11
  118. unrealon_llm/src/core/smart_client.py +0 -438
  119. unrealon_llm/src/dto/__init__.py +0 -155
  120. unrealon_llm/src/dto/models/__init__.py +0 -0
  121. unrealon_llm/src/dto/models/config.py +0 -343
  122. unrealon_llm/src/dto/models/core.py +0 -328
  123. unrealon_llm/src/dto/models/enums.py +0 -123
  124. unrealon_llm/src/dto/models/html_analysis.py +0 -345
  125. unrealon_llm/src/dto/models/statistics.py +0 -473
  126. unrealon_llm/src/dto/models/translation.py +0 -383
  127. unrealon_llm/src/dto/models/type_conversion.py +0 -462
  128. unrealon_llm/src/dto/schemas/__init__.py +0 -0
  129. unrealon_llm/src/exceptions.py +0 -392
  130. unrealon_llm/src/llm_config/__init__.py +0 -20
  131. unrealon_llm/src/llm_config/logging_config.py +0 -178
  132. unrealon_llm/src/llm_logging/__init__.py +0 -42
  133. unrealon_llm/src/llm_logging/llm_events.py +0 -107
  134. unrealon_llm/src/llm_logging/llm_logger.py +0 -466
  135. unrealon_llm/src/managers/__init__.py +0 -15
  136. unrealon_llm/src/managers/cache_manager.py +0 -67
  137. unrealon_llm/src/managers/cost_manager.py +0 -107
  138. unrealon_llm/src/managers/request_manager.py +0 -298
  139. unrealon_llm/src/modules/__init__.py +0 -0
  140. unrealon_llm/src/modules/html_processor/__init__.py +0 -25
  141. unrealon_llm/src/modules/html_processor/base_processor.py +0 -415
  142. unrealon_llm/src/modules/html_processor/details_processor.py +0 -85
  143. unrealon_llm/src/modules/html_processor/listing_processor.py +0 -91
  144. unrealon_llm/src/modules/html_processor/models/__init__.py +0 -20
  145. unrealon_llm/src/modules/html_processor/models/processing_models.py +0 -40
  146. unrealon_llm/src/modules/html_processor/models/universal_model.py +0 -56
  147. unrealon_llm/src/modules/html_processor/processor.py +0 -102
  148. unrealon_llm/src/modules/llm/__init__.py +0 -0
  149. unrealon_llm/src/modules/translator/__init__.py +0 -0
  150. unrealon_llm/src/provider.py +0 -116
  151. unrealon_llm/src/utils/__init__.py +0 -95
  152. unrealon_llm/src/utils/common.py +0 -64
  153. unrealon_llm/src/utils/data_extractor.py +0 -188
  154. unrealon_llm/src/utils/html_cleaner.py +0 -767
  155. unrealon_llm/src/utils/language_detector.py +0 -308
  156. unrealon_llm/src/utils/models_cache.py +0 -592
  157. unrealon_llm/src/utils/smart_counter.py +0 -229
  158. unrealon_llm/src/utils/token_counter.py +0 -189
  159. unrealon_sdk/README.md +0 -25
  160. unrealon_sdk/__init__.py +0 -30
  161. unrealon_sdk/pyproject.toml +0 -231
  162. unrealon_sdk/src/__init__.py +0 -150
  163. unrealon_sdk/src/cli/__init__.py +0 -12
  164. unrealon_sdk/src/cli/commands/__init__.py +0 -22
  165. unrealon_sdk/src/cli/commands/benchmark.py +0 -42
  166. unrealon_sdk/src/cli/commands/diagnostics.py +0 -573
  167. unrealon_sdk/src/cli/commands/health.py +0 -46
  168. unrealon_sdk/src/cli/commands/integration.py +0 -498
  169. unrealon_sdk/src/cli/commands/reports.py +0 -43
  170. unrealon_sdk/src/cli/commands/security.py +0 -36
  171. unrealon_sdk/src/cli/commands/server.py +0 -483
  172. unrealon_sdk/src/cli/commands/servers.py +0 -56
  173. unrealon_sdk/src/cli/commands/tests.py +0 -55
  174. unrealon_sdk/src/cli/main.py +0 -126
  175. unrealon_sdk/src/cli/utils/reporter.py +0 -519
  176. unrealon_sdk/src/clients/openapi.yaml +0 -3347
  177. unrealon_sdk/src/clients/python_http/__init__.py +0 -3
  178. unrealon_sdk/src/clients/python_http/api_config.py +0 -228
  179. unrealon_sdk/src/clients/python_http/models/BaseModel.py +0 -12
  180. unrealon_sdk/src/clients/python_http/models/BroadcastDeliveryStats.py +0 -33
  181. unrealon_sdk/src/clients/python_http/models/BroadcastMessage.py +0 -17
  182. unrealon_sdk/src/clients/python_http/models/BroadcastMessageRequest.py +0 -35
  183. unrealon_sdk/src/clients/python_http/models/BroadcastPriority.py +0 -10
  184. unrealon_sdk/src/clients/python_http/models/BroadcastResponse.py +0 -21
  185. unrealon_sdk/src/clients/python_http/models/BroadcastResultResponse.py +0 -33
  186. unrealon_sdk/src/clients/python_http/models/BroadcastTarget.py +0 -11
  187. unrealon_sdk/src/clients/python_http/models/ConnectionStats.py +0 -27
  188. unrealon_sdk/src/clients/python_http/models/ConnectionsResponse.py +0 -21
  189. unrealon_sdk/src/clients/python_http/models/DeveloperMessageResponse.py +0 -23
  190. unrealon_sdk/src/clients/python_http/models/ErrorResponse.py +0 -25
  191. unrealon_sdk/src/clients/python_http/models/HTTPValidationError.py +0 -16
  192. unrealon_sdk/src/clients/python_http/models/HealthResponse.py +0 -23
  193. unrealon_sdk/src/clients/python_http/models/HealthStatus.py +0 -33
  194. unrealon_sdk/src/clients/python_http/models/LogLevel.py +0 -10
  195. unrealon_sdk/src/clients/python_http/models/LoggingRequest.py +0 -27
  196. unrealon_sdk/src/clients/python_http/models/LoggingResponse.py +0 -23
  197. unrealon_sdk/src/clients/python_http/models/MaintenanceMode.py +0 -9
  198. unrealon_sdk/src/clients/python_http/models/MaintenanceModeRequest.py +0 -33
  199. unrealon_sdk/src/clients/python_http/models/MaintenanceStatusResponse.py +0 -39
  200. unrealon_sdk/src/clients/python_http/models/ParserCommandRequest.py +0 -25
  201. unrealon_sdk/src/clients/python_http/models/ParserMessageResponse.py +0 -21
  202. unrealon_sdk/src/clients/python_http/models/ParserRegistrationRequest.py +0 -28
  203. unrealon_sdk/src/clients/python_http/models/ParserRegistrationResponse.py +0 -25
  204. unrealon_sdk/src/clients/python_http/models/ParserType.py +0 -10
  205. unrealon_sdk/src/clients/python_http/models/ProxyBlockRequest.py +0 -19
  206. unrealon_sdk/src/clients/python_http/models/ProxyEndpointResponse.py +0 -20
  207. unrealon_sdk/src/clients/python_http/models/ProxyListResponse.py +0 -19
  208. unrealon_sdk/src/clients/python_http/models/ProxyProvider.py +0 -10
  209. unrealon_sdk/src/clients/python_http/models/ProxyPurchaseRequest.py +0 -25
  210. unrealon_sdk/src/clients/python_http/models/ProxyResponse.py +0 -47
  211. unrealon_sdk/src/clients/python_http/models/ProxyRotationRequest.py +0 -23
  212. unrealon_sdk/src/clients/python_http/models/ProxyStatus.py +0 -10
  213. unrealon_sdk/src/clients/python_http/models/ProxyUsageRequest.py +0 -19
  214. unrealon_sdk/src/clients/python_http/models/ProxyUsageStatsResponse.py +0 -26
  215. unrealon_sdk/src/clients/python_http/models/ServiceRegistrationDto.py +0 -23
  216. unrealon_sdk/src/clients/python_http/models/ServiceStatsResponse.py +0 -31
  217. unrealon_sdk/src/clients/python_http/models/SessionStartRequest.py +0 -23
  218. unrealon_sdk/src/clients/python_http/models/SuccessResponse.py +0 -25
  219. unrealon_sdk/src/clients/python_http/models/SystemNotificationResponse.py +0 -23
  220. unrealon_sdk/src/clients/python_http/models/ValidationError.py +0 -18
  221. unrealon_sdk/src/clients/python_http/models/ValidationErrorResponse.py +0 -21
  222. unrealon_sdk/src/clients/python_http/models/WebSocketMetrics.py +0 -21
  223. unrealon_sdk/src/clients/python_http/models/__init__.py +0 -44
  224. unrealon_sdk/src/clients/python_http/services/None_service.py +0 -35
  225. unrealon_sdk/src/clients/python_http/services/ParserManagement_service.py +0 -190
  226. unrealon_sdk/src/clients/python_http/services/ProxyManagement_service.py +0 -289
  227. unrealon_sdk/src/clients/python_http/services/SocketLogging_service.py +0 -187
  228. unrealon_sdk/src/clients/python_http/services/SystemHealth_service.py +0 -119
  229. unrealon_sdk/src/clients/python_http/services/WebSocketAPI_service.py +0 -198
  230. unrealon_sdk/src/clients/python_http/services/__init__.py +0 -0
  231. unrealon_sdk/src/clients/python_http/services/admin_service.py +0 -125
  232. unrealon_sdk/src/clients/python_http/services/async_None_service.py +0 -35
  233. unrealon_sdk/src/clients/python_http/services/async_ParserManagement_service.py +0 -190
  234. unrealon_sdk/src/clients/python_http/services/async_ProxyManagement_service.py +0 -289
  235. unrealon_sdk/src/clients/python_http/services/async_SocketLogging_service.py +0 -189
  236. unrealon_sdk/src/clients/python_http/services/async_SystemHealth_service.py +0 -123
  237. unrealon_sdk/src/clients/python_http/services/async_WebSocketAPI_service.py +0 -200
  238. unrealon_sdk/src/clients/python_http/services/async_admin_service.py +0 -125
  239. unrealon_sdk/src/clients/python_websocket/__init__.py +0 -28
  240. unrealon_sdk/src/clients/python_websocket/client.py +0 -490
  241. unrealon_sdk/src/clients/python_websocket/events.py +0 -732
  242. unrealon_sdk/src/clients/python_websocket/example.py +0 -136
  243. unrealon_sdk/src/clients/python_websocket/types.py +0 -871
  244. unrealon_sdk/src/core/__init__.py +0 -64
  245. unrealon_sdk/src/core/client.py +0 -556
  246. unrealon_sdk/src/core/config.py +0 -465
  247. unrealon_sdk/src/core/exceptions.py +0 -239
  248. unrealon_sdk/src/core/metadata.py +0 -191
  249. unrealon_sdk/src/core/models.py +0 -142
  250. unrealon_sdk/src/core/types.py +0 -68
  251. unrealon_sdk/src/dto/__init__.py +0 -268
  252. unrealon_sdk/src/dto/authentication.py +0 -108
  253. unrealon_sdk/src/dto/cache.py +0 -208
  254. unrealon_sdk/src/dto/common.py +0 -19
  255. unrealon_sdk/src/dto/concurrency.py +0 -393
  256. unrealon_sdk/src/dto/events.py +0 -108
  257. unrealon_sdk/src/dto/health.py +0 -339
  258. unrealon_sdk/src/dto/load_balancing.py +0 -336
  259. unrealon_sdk/src/dto/logging.py +0 -230
  260. unrealon_sdk/src/dto/performance.py +0 -165
  261. unrealon_sdk/src/dto/rate_limiting.py +0 -295
  262. unrealon_sdk/src/dto/resource_pooling.py +0 -128
  263. unrealon_sdk/src/dto/structured_logging.py +0 -112
  264. unrealon_sdk/src/dto/task_scheduling.py +0 -121
  265. unrealon_sdk/src/dto/websocket.py +0 -55
  266. unrealon_sdk/src/enterprise/__init__.py +0 -59
  267. unrealon_sdk/src/enterprise/authentication.py +0 -401
  268. unrealon_sdk/src/enterprise/cache_manager.py +0 -578
  269. unrealon_sdk/src/enterprise/error_recovery.py +0 -494
  270. unrealon_sdk/src/enterprise/event_system.py +0 -549
  271. unrealon_sdk/src/enterprise/health_monitor.py +0 -747
  272. unrealon_sdk/src/enterprise/load_balancer.py +0 -964
  273. unrealon_sdk/src/enterprise/logging/__init__.py +0 -68
  274. unrealon_sdk/src/enterprise/logging/cleanup.py +0 -156
  275. unrealon_sdk/src/enterprise/logging/development.py +0 -744
  276. unrealon_sdk/src/enterprise/logging/service.py +0 -410
  277. unrealon_sdk/src/enterprise/multithreading_manager.py +0 -853
  278. unrealon_sdk/src/enterprise/performance_monitor.py +0 -539
  279. unrealon_sdk/src/enterprise/proxy_manager.py +0 -696
  280. unrealon_sdk/src/enterprise/rate_limiter.py +0 -652
  281. unrealon_sdk/src/enterprise/resource_pool.py +0 -763
  282. unrealon_sdk/src/enterprise/task_scheduler.py +0 -709
  283. unrealon_sdk/src/internal/__init__.py +0 -10
  284. unrealon_sdk/src/internal/command_router.py +0 -497
  285. unrealon_sdk/src/internal/connection_manager.py +0 -397
  286. unrealon_sdk/src/internal/http_client.py +0 -446
  287. unrealon_sdk/src/internal/websocket_client.py +0 -420
  288. unrealon_sdk/src/provider.py +0 -471
  289. unrealon_sdk/src/utils.py +0 -234
  290. /unrealon_browser/{src/cli → cli}/__init__.py +0 -0
  291. /unrealon_browser/{src/cli → cli}/interactive_mode.py +0 -0
  292. /unrealon_browser/{src/cli → cli}/main.py +0 -0
  293. /unrealon_browser/{src/core → core}/__init__.py +0 -0
  294. /unrealon_browser/{src/dto → dto}/__init__.py +0 -0
  295. /unrealon_browser/{src/dto → dto}/models/config.py +0 -0
  296. /unrealon_browser/{src/dto → dto}/models/core.py +0 -0
  297. /unrealon_browser/{src/dto → dto}/models/dataclasses.py +0 -0
  298. /unrealon_browser/{src/dto → dto}/models/detection.py +0 -0
  299. /unrealon_browser/{src/dto → dto}/models/enums.py +0 -0
  300. /unrealon_browser/{src/dto → dto}/models/statistics.py +0 -0
  301. /unrealon_browser/{src/managers → managers}/__init__.py +0 -0
  302. /unrealon_browser/{src/managers → managers}/stealth.py +0 -0
@@ -0,0 +1,65 @@
1
+ """
2
+ Event logging and heartbeat for Parser Bridge Client.
3
+ """
4
+
5
+ import uuid
6
+ from typing import Optional
7
+ from datetime import datetime
8
+ from unrealon_rpc.logging import get_logger
9
+
10
+ from ..models import ParserEvent, ParserStats
11
+
12
+ logger = get_logger(__name__)
13
+
14
+
15
+ class EventsMixin:
16
+ """Mixin for event logging and heartbeat functionality."""
17
+
18
+ async def log_event(self, event_type: str, message: str, level: str = "info", data: Optional[dict[str, str]] = None, command_id: Optional[str] = None) -> None:
19
+ """
20
+ Log parser event.
21
+
22
+ Args:
23
+ event_type: Type of event
24
+ message: Event message
25
+ level: Log level
26
+ data: Additional event data (string values only)
27
+ command_id: Associated command ID
28
+ """
29
+ if not self.registered:
30
+ return
31
+
32
+ event = ParserEvent(
33
+ event_id=str(uuid.uuid4()),
34
+ parser_id=self.parser_id,
35
+ event_type=event_type,
36
+ level=level,
37
+ message=message,
38
+ data=data or {},
39
+ session_id=self.session_id,
40
+ command_id=command_id
41
+ )
42
+
43
+ # Send event via PubSub
44
+ await self.bridge_client.publish("parser_events", event.model_dump())
45
+
46
+ async def send_heartbeat(self, stats: Optional[ParserStats] = None) -> None:
47
+ """
48
+ Send parser heartbeat with optional stats.
49
+
50
+ Args:
51
+ stats: Parser statistics
52
+ """
53
+ if not self.registered:
54
+ return
55
+
56
+ heartbeat_data = {
57
+ "parser_id": self.parser_id,
58
+ "timestamp": datetime.now().isoformat(),
59
+ "session_id": self.session_id or ""
60
+ }
61
+
62
+ if stats:
63
+ heartbeat_data["stats"] = stats.model_dump()
64
+
65
+ await self.bridge_client.send_heartbeat("alive", heartbeat_data)
@@ -0,0 +1,38 @@
1
+ """
2
+ Health monitoring for Parser Bridge Client.
3
+ """
4
+
5
+ from unrealon_rpc.logging import get_logger
6
+
7
+ from ..models import (
8
+ ParserHealth, ParserHealthRequest, ParserHealthResponse
9
+ )
10
+
11
+ logger = get_logger(__name__)
12
+
13
+
14
+ class HealthMixin:
15
+ """Mixin for health monitoring functionality."""
16
+
17
+ async def get_health(self) -> ParserHealth:
18
+ """
19
+ Get parser health information.
20
+
21
+ Returns:
22
+ Parser health status
23
+ """
24
+ self._ensure_registered()
25
+
26
+ request = ParserHealthRequest(parser_id=self.parser_id)
27
+
28
+ result = await self.bridge_client.call_rpc(
29
+ method="parser.get_health",
30
+ params=request.model_dump()
31
+ )
32
+
33
+ response = ParserHealthResponse.model_validate(result)
34
+
35
+ if response.success and response.health:
36
+ return response.health
37
+ else:
38
+ raise RuntimeError(f"Health check failed: {response.error}")
@@ -0,0 +1,146 @@
1
+ """
2
+ HTML Parser functionality for Parser Bridge Client.
3
+
4
+ Provides methods for sending HTML content to Django for AI-powered parsing.
5
+ """
6
+
7
+ from typing import Optional, Dict
8
+ from unrealon_rpc.logging import get_logger
9
+
10
+ from ..models import HTMLParseResult, HTMLParseRPCResponse, HTMLParseRPCRequest
11
+
12
+ logger = get_logger(__name__)
13
+
14
+
15
+ class HTMLParserMixin:
16
+ """Mixin for HTML parsing functionality."""
17
+
18
+ async def parse_html(
19
+ self,
20
+ html_content: str,
21
+ url: Optional[str] = None,
22
+ parse_type: str = "general",
23
+ instructions: Optional[str] = None,
24
+ timeout: int = 60,
25
+ metadata: Optional[Dict[str, str]] = None
26
+ ) -> HTMLParseResult:
27
+ """
28
+ Parse HTML content using AI/LLM via Django backend.
29
+
30
+ Args:
31
+ html_content: Raw HTML content to parse
32
+ url: Source URL of the HTML (for context)
33
+ parse_type: Type of parsing (product, listing, article, etc.)
34
+ instructions: Additional parsing instructions for the LLM
35
+ timeout: Timeout in seconds (default 60s for LLM processing)
36
+ metadata: Additional metadata
37
+
38
+ Returns:
39
+ HTMLParseResult with parsed data or error information
40
+
41
+ Example:
42
+ ```python
43
+ # Parse product page HTML
44
+ result = await client.parse_html(
45
+ html_content="<html>...</html>",
46
+ url="https://encar.com/car/123456",
47
+ parse_type="car_product",
48
+ instructions="Extract car details, price, and specifications"
49
+ )
50
+
51
+ if result.success:
52
+ print(f"Parsed data: {result.parsed_data}")
53
+ print(f"Instructions: {result.markdown}")
54
+ else:
55
+ print(f"Parse failed: {result.error_message}")
56
+ ```
57
+ """
58
+ if not self.registered:
59
+ logger.warning("Cannot parse HTML - parser not registered")
60
+ return HTMLParseResult(
61
+ success=False,
62
+ error_message="Parser not registered"
63
+ )
64
+
65
+ try:
66
+ logger.info(f"Parsing HTML content: {len(html_content)} chars, type: {parse_type}")
67
+
68
+ request = HTMLParseRPCRequest(
69
+ html_content=html_content,
70
+ parser_id=self.parser_id,
71
+ url=url,
72
+ parse_type=parse_type,
73
+ instructions=instructions,
74
+ timeout=timeout,
75
+ metadata=metadata or {}
76
+ )
77
+
78
+ response = await self.bridge_client.call_rpc(
79
+ method="html_parser.parse",
80
+ params=request.model_dump(),
81
+ timeout=timeout + 5 # Add buffer for network/processing
82
+ )
83
+
84
+ rpc_response = HTMLParseRPCResponse.model_validate(response)
85
+
86
+ if rpc_response.success and rpc_response.result:
87
+ logger.info(f"HTML parsing completed successfully")
88
+ return rpc_response.result
89
+ else:
90
+ error_msg = rpc_response.error or "Unknown parsing error"
91
+ logger.error(f"HTML parsing failed: {error_msg}")
92
+ return HTMLParseResult(
93
+ success=False,
94
+ error_message=error_msg
95
+ )
96
+
97
+ except Exception as e:
98
+ error_msg = f"HTML parsing request failed: {e}"
99
+ logger.error(error_msg)
100
+ return HTMLParseResult(
101
+ success=False,
102
+ error_message=error_msg
103
+ )
104
+
105
+ async def parse_html_with_retry(
106
+ self,
107
+ html_content: str,
108
+ max_retries: int = 3,
109
+ **kwargs
110
+ ) -> HTMLParseResult:
111
+ """
112
+ Parse HTML with automatic retry on failure.
113
+
114
+ Args:
115
+ html_content: Raw HTML content to parse
116
+ max_retries: Maximum number of retry attempts
117
+ **kwargs: Additional arguments passed to parse_html
118
+
119
+ Returns:
120
+ HTMLParseResult with parsed data or error information
121
+ """
122
+ last_error = None
123
+
124
+ for attempt in range(max_retries):
125
+ try:
126
+ result = await self.parse_html(html_content, **kwargs)
127
+
128
+ if result.success:
129
+ if attempt > 0:
130
+ logger.info(f"HTML parsing succeeded on attempt {attempt + 1}")
131
+ return result
132
+ else:
133
+ last_error = result.error_message
134
+ if attempt < max_retries - 1:
135
+ logger.warning(f"HTML parsing failed on attempt {attempt + 1}, retrying...")
136
+
137
+ except Exception as e:
138
+ last_error = str(e)
139
+ if attempt < max_retries - 1:
140
+ logger.warning(f"HTML parsing error on attempt {attempt + 1}, retrying: {e}")
141
+
142
+ logger.error(f"HTML parsing failed after {max_retries} attempts")
143
+ return HTMLParseResult(
144
+ success=False,
145
+ error_message=f"Failed after {max_retries} attempts. Last error: {last_error}"
146
+ )
@@ -0,0 +1,139 @@
1
+ """
2
+ Parser logging functionality for Parser Bridge Client.
3
+
4
+ Provides methods for sending parser logs to Django via WebSocket/Redis.
5
+ """
6
+
7
+ from typing import Optional, Dict
8
+ from datetime import datetime
9
+ from unrealon_rpc.logging import get_logger
10
+
11
+ from ..models import ParserLogEntry, ParserLogResponse
12
+
13
+ logger = get_logger(__name__)
14
+
15
+
16
+ class LoggingMixin:
17
+ """Mixin for parser logging functionality."""
18
+
19
+ async def send_log(
20
+ self,
21
+ level: str,
22
+ message: str,
23
+ session_id: Optional[str] = None,
24
+ command_id: Optional[str] = None,
25
+ url: Optional[str] = None,
26
+ operation: Optional[str] = None,
27
+ data: Optional[Dict[str, str]] = None,
28
+ error_details: Optional[str] = None
29
+ ) -> bool:
30
+ """
31
+ Send log entry to Django via WebSocket/Redis.
32
+
33
+ Args:
34
+ level: Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
35
+ message: Log message
36
+ session_id: Parser session ID (optional)
37
+ command_id: Command ID if related to command (optional)
38
+ url: URL being processed (optional)
39
+ operation: Operation being performed (optional)
40
+ data: Additional log data (optional)
41
+ error_details: Error details if error log (optional)
42
+
43
+ Returns:
44
+ True if log was sent successfully, False otherwise
45
+
46
+ Example:
47
+ ```python
48
+ # Send info log
49
+ await client.send_log("INFO", "Started parsing product page")
50
+
51
+ # Send error log with details
52
+ await client.send_log(
53
+ "ERROR",
54
+ "Failed to parse product price",
55
+ url="https://example.com/product/123",
56
+ operation="price_extraction",
57
+ error_details="Price element not found in DOM"
58
+ )
59
+
60
+ # Send log with session context
61
+ await client.send_log(
62
+ "DEBUG",
63
+ "Processing page 5 of search results",
64
+ session_id=self.session_id,
65
+ operation="pagination"
66
+ )
67
+ ```
68
+ """
69
+ if not self.registered:
70
+ logger.warning("Cannot send log - parser not registered")
71
+ return False
72
+
73
+ try:
74
+ log_entry = ParserLogEntry(
75
+ parser_id=self.parser_id,
76
+ level=level.upper(),
77
+ message=message,
78
+ session_id=session_id,
79
+ command_id=command_id,
80
+ url=url,
81
+ operation=operation,
82
+ data=data or {},
83
+ error_details=error_details
84
+ )
85
+
86
+ response_dict = await self.bridge_client.call_rpc(
87
+ method="parser.log",
88
+ params=log_entry.model_dump()
89
+ )
90
+
91
+ response = ParserLogResponse.model_validate(response_dict)
92
+
93
+ if response.success:
94
+ logger.debug(f"Log sent to Django: {level} - {message}")
95
+ return True
96
+ else:
97
+ logger.error(f"Failed to send log to Django: {response.error}")
98
+ return False
99
+
100
+ except Exception as e:
101
+ logger.error(f"Log sending failed: {e}")
102
+ return False
103
+
104
+ async def log_debug(self, message: str, **kwargs) -> bool:
105
+ """Send DEBUG level log."""
106
+ return await self.send_log("DEBUG", message, **kwargs)
107
+
108
+ async def log_info(self, message: str, **kwargs) -> bool:
109
+ """Send INFO level log."""
110
+ return await self.send_log("INFO", message, **kwargs)
111
+
112
+ async def log_warning(self, message: str, **kwargs) -> bool:
113
+ """Send WARNING level log."""
114
+ return await self.send_log("WARNING", message, **kwargs)
115
+
116
+ async def log_error(self, message: str, **kwargs) -> bool:
117
+ """Send ERROR level log."""
118
+ return await self.send_log("ERROR", message, **kwargs)
119
+
120
+ async def log_critical(self, message: str, **kwargs) -> bool:
121
+ """Send CRITICAL level log."""
122
+ return await self.send_log("CRITICAL", message, **kwargs)
123
+
124
+ async def log_operation_start(self, operation: str, **kwargs) -> bool:
125
+ """Log the start of an operation."""
126
+ return await self.log_info(f"Started {operation}", operation=operation, **kwargs)
127
+
128
+ async def log_operation_end(self, operation: str, **kwargs) -> bool:
129
+ """Log the end of an operation."""
130
+ return await self.log_info(f"Completed {operation}", operation=operation, **kwargs)
131
+
132
+ async def log_operation_error(self, operation: str, error: str, **kwargs) -> bool:
133
+ """Log an operation error."""
134
+ return await self.log_error(
135
+ f"Failed {operation}: {error}",
136
+ operation=operation,
137
+ error_details=error,
138
+ **kwargs
139
+ )
@@ -0,0 +1,70 @@
1
+ """
2
+ Proxy management for Parser Bridge Client.
3
+ """
4
+
5
+ from typing import Optional
6
+ from unrealon_rpc.logging import get_logger
7
+
8
+ from ..models import (
9
+ ProxyInfo, ProxyAllocateRequest, ProxyAllocateResponse,
10
+ ProxyReleaseRequest, ProxyReleaseResponse
11
+ )
12
+
13
+ logger = get_logger(__name__)
14
+
15
+
16
+ class ProxyMixin:
17
+ """Mixin for proxy management functionality."""
18
+
19
+ async def request_proxy(self, proxy_type: str = "http", location: Optional[str] = None) -> ProxyInfo:
20
+ """
21
+ Request proxy allocation.
22
+
23
+ Args:
24
+ proxy_type: Type of proxy needed
25
+ location: Preferred proxy location
26
+
27
+ Returns:
28
+ Allocated proxy information
29
+ """
30
+ self._ensure_registered()
31
+
32
+ request = ProxyAllocateRequest(
33
+ parser_id=self.parser_id,
34
+ proxy_type=proxy_type,
35
+ location=location
36
+ )
37
+
38
+ result = await self.bridge_client.call_rpc(
39
+ method="proxy.allocate",
40
+ params=request.model_dump()
41
+ )
42
+
43
+ response = ProxyAllocateResponse.model_validate(result)
44
+
45
+ if response.success and response.proxy:
46
+ logger.info(f"Proxy allocated: {response.proxy.proxy_id} for {self.parser_id}")
47
+ return response.proxy
48
+ else:
49
+ raise RuntimeError(f"Proxy allocation failed: {response.error}")
50
+
51
+ async def release_proxy(self, proxy_id: str) -> None:
52
+ """
53
+ Release proxy allocation.
54
+
55
+ Args:
56
+ proxy_id: Proxy ID to release
57
+ """
58
+ request = ProxyReleaseRequest(proxy_id=proxy_id)
59
+
60
+ result = await self.bridge_client.call_rpc(
61
+ method="proxy.release",
62
+ params=request.model_dump()
63
+ )
64
+
65
+ response = ProxyReleaseResponse.model_validate(result)
66
+
67
+ if response.success:
68
+ logger.info(f"Proxy released: {proxy_id}")
69
+ else:
70
+ logger.error(f"Proxy release failed: {response.error}")