Really-amin commited on
Commit
0e1c8a0
·
verified ·
1 Parent(s): ad40865

Upload 32 files

Browse files
backend/services/auto_discovery_service.py CHANGED
@@ -16,6 +16,7 @@ import re
16
  from dataclasses import dataclass
17
  from datetime import datetime
18
  from typing import Any, Dict, List, Optional
 
19
 
20
  try:
21
  from duckduckgo_search import AsyncDDGS # type: ignore
@@ -180,64 +181,77 @@ class AutoDiscoveryService:
180
  else:
181
  query_list = self.DEFAULT_QUERIES
182
 
183
- async with AsyncDDGS() as ddgs:
184
- for query in query_list:
185
- try:
186
- text_method = getattr(ddgs, "atext", None)
187
- if callable(text_method):
188
- async for entry in text_method(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
189
  query,
190
  max_results=self.max_candidates_per_query,
191
- ):
192
- results.append(
193
- {
194
- "query": query,
195
- "title": entry.get("title", ""),
196
- "url": entry.get("href") or entry.get("url") or "",
197
- "snippet": entry.get("body", ""),
198
- }
199
- )
200
- continue
201
-
202
- text_method = getattr(ddgs, "text", None)
203
- if not callable(text_method):
204
- raise AttributeError("AsyncDDGS has no 'atext' or 'text' method")
205
-
206
- search_result = text_method(
207
- query,
208
- max_results=self.max_candidates_per_query,
209
- )
210
-
211
- if inspect.isawaitable(search_result):
212
- search_result = await search_result
213
-
214
- if hasattr(search_result, "__aiter__"):
215
- async for entry in search_result:
216
- results.append(
217
- {
218
- "query": query,
219
- "title": entry.get("title", ""),
220
- "url": entry.get("href") or entry.get("url") or "",
221
- "snippet": entry.get("body", ""),
222
- }
223
- )
224
- else:
225
- iterable = (
226
- search_result
227
- if isinstance(search_result, list)
228
- else list(search_result or [])
229
  )
230
- for entry in iterable:
231
- results.append(
232
- {
233
- "query": query,
234
- "title": entry.get("title", ""),
235
- "url": entry.get("href") or entry.get("url") or "",
236
- "snippet": entry.get("body", ""),
237
- }
 
 
 
 
 
 
 
 
 
 
 
238
  )
239
- except Exception as exc: # pragma: no cover - وابسته به اینترنت
240
- logger.warning("Failed to fetch results for query '%s': %s", query, exc)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
241
 
242
  return results
243
 
 
16
  from dataclasses import dataclass
17
  from datetime import datetime
18
  from typing import Any, Dict, List, Optional
19
+ from contextlib import AsyncExitStack
20
 
21
  try:
22
  from duckduckgo_search import AsyncDDGS # type: ignore
 
181
  else:
182
  query_list = self.DEFAULT_QUERIES
183
 
184
+ try:
185
+ async with AsyncExitStack() as stack:
186
+ ddgs = await stack.enter_async_context(AsyncDDGS())
187
+
188
+ for query in query_list:
189
+ try:
190
+ text_method = getattr(ddgs, "atext", None)
191
+ if callable(text_method):
192
+ async for entry in text_method(
193
+ query,
194
+ max_results=self.max_candidates_per_query,
195
+ ):
196
+ results.append(
197
+ {
198
+ "query": query,
199
+ "title": entry.get("title", ""),
200
+ "url": entry.get("href") or entry.get("url") or "",
201
+ "snippet": entry.get("body", ""),
202
+ }
203
+ )
204
+ continue
205
+
206
+ text_method = getattr(ddgs, "text", None)
207
+ if not callable(text_method):
208
+ raise AttributeError("AsyncDDGS has no 'atext' or 'text' method")
209
+
210
+ search_result = text_method(
211
  query,
212
  max_results=self.max_candidates_per_query,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
213
  )
214
+
215
+ if inspect.isawaitable(search_result):
216
+ search_result = await search_result
217
+
218
+ if hasattr(search_result, "__aiter__"):
219
+ async for entry in search_result:
220
+ results.append(
221
+ {
222
+ "query": query,
223
+ "title": entry.get("title", ""),
224
+ "url": entry.get("href") or entry.get("url") or "",
225
+ "snippet": entry.get("body", ""),
226
+ }
227
+ )
228
+ else:
229
+ iterable = (
230
+ search_result
231
+ if isinstance(search_result, list)
232
+ else list(search_result or [])
233
  )
234
+ for entry in iterable:
235
+ results.append(
236
+ {
237
+ "query": query,
238
+ "title": entry.get("title", ""),
239
+ "url": entry.get("href") or entry.get("url") or "",
240
+ "snippet": entry.get("body", ""),
241
+ }
242
+ )
243
+ except Exception as exc: # pragma: no cover - وابسته به اینترنت
244
+ logger.warning(
245
+ "Failed to fetch results for query '%s': %s. Skipping remaining queries this cycle.",
246
+ query,
247
+ exc,
248
+ )
249
+ break
250
+ except Exception as exc:
251
+ logger.warning(
252
+ "DuckDuckGo auto discovery unavailable (%s). Skipping discovery cycle.",
253
+ exc,
254
+ )
255
 
256
  return results
257