entari-plugin-hyw 4.0.0rc8__tar.gz → 4.0.0rc10__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 entari-plugin-hyw might be problematic. Click here for more details.

Files changed (78) hide show
  1. {entari_plugin_hyw-4.0.0rc8/src/entari_plugin_hyw.egg-info → entari_plugin_hyw-4.0.0rc10}/PKG-INFO +1 -1
  2. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/pyproject.toml +1 -1
  3. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/entari_plugin_hyw/__init__.py +62 -34
  4. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10/src/entari_plugin_hyw.egg-info}/PKG-INFO +1 -1
  5. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/entari_plugin_hyw.egg-info/SOURCES.txt +3 -1
  6. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/__init__.py +1 -3
  7. entari_plugin_hyw-4.0.0rc10/src/hyw_core/browser_control/assets/card-dist/index.html +425 -0
  8. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/engines/__init__.py +0 -2
  9. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/manager.py +18 -5
  10. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/renderer.py +36 -6
  11. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/service.py +119 -52
  12. entari_plugin_hyw-4.0.0rc10/src/hyw_core/crawling/__init__.py +18 -0
  13. entari_plugin_hyw-4.0.0rc10/src/hyw_core/crawling/completeness.py +348 -0
  14. entari_plugin_hyw-4.0.0rc10/src/hyw_core/crawling/models.py +88 -0
  15. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/search.py +4 -6
  16. entari_plugin_hyw-4.0.0rc8/src/hyw_core/browser_control/assets/card-dist/index.html +0 -409
  17. entari_plugin_hyw-4.0.0rc8/src/hyw_core/browser_control/engines/google.py +0 -155
  18. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/MANIFEST.in +0 -0
  19. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/README.md +0 -0
  20. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/setup.cfg +0 -0
  21. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/entari_plugin_hyw/Untitled-1 +0 -0
  22. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/entari_plugin_hyw/history.py +0 -0
  23. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/entari_plugin_hyw/misc.py +0 -0
  24. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/entari_plugin_hyw/search_cache.py +0 -0
  25. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/entari_plugin_hyw.egg-info/dependency_links.txt +0 -0
  26. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/entari_plugin_hyw.egg-info/requires.txt +0 -0
  27. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/entari_plugin_hyw.egg-info/top_level.txt +0 -0
  28. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/__init__.py +0 -0
  29. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/anthropic.svg +0 -0
  30. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/cerebras.svg +0 -0
  31. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/deepseek.png +0 -0
  32. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/gemini.svg +0 -0
  33. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/google.svg +0 -0
  34. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/grok.png +0 -0
  35. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/huggingface.png +0 -0
  36. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/microsoft.svg +0 -0
  37. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/minimax.png +0 -0
  38. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/mistral.png +0 -0
  39. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/nvida.png +0 -0
  40. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/openai.svg +0 -0
  41. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/openrouter.png +0 -0
  42. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/perplexity.svg +0 -0
  43. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/qwen.png +0 -0
  44. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/xai.png +0 -0
  45. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/xiaomi.png +0 -0
  46. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/logos/zai.png +0 -0
  47. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/card-dist/vite.svg +0 -0
  48. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/index.html +0 -0
  49. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/anthropic.svg +0 -0
  50. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/cerebras.svg +0 -0
  51. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/deepseek.png +0 -0
  52. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/gemini.svg +0 -0
  53. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/google.svg +0 -0
  54. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/grok.png +0 -0
  55. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/huggingface.png +0 -0
  56. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/microsoft.svg +0 -0
  57. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/minimax.png +0 -0
  58. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/mistral.png +0 -0
  59. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/nvida.png +0 -0
  60. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/openai.svg +0 -0
  61. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/openrouter.png +0 -0
  62. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/perplexity.svg +0 -0
  63. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/qwen.png +0 -0
  64. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/xai.png +0 -0
  65. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/xiaomi.png +0 -0
  66. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/assets/logos/zai.png +0 -0
  67. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/engines/base.py +0 -0
  68. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/engines/default.py +0 -0
  69. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/engines/duckduckgo.py +0 -0
  70. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/browser_control/landing.html +0 -0
  71. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/config.py +0 -0
  72. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/core.py +0 -0
  73. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/definitions.py +0 -0
  74. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/image_cache.py +0 -0
  75. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/pipeline.py +0 -0
  76. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/stages/__init__.py +0 -0
  77. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/stages/base.py +0 -0
  78. {entari_plugin_hyw-4.0.0rc8 → entari_plugin_hyw-4.0.0rc10}/src/hyw_core/stages/summary.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: entari_plugin_hyw
3
- Version: 4.0.0rc8
3
+ Version: 4.0.0rc10
4
4
  Summary: Use large language models to interpret chat messages
5
5
  Author-email: kumoSleeping <zjr2992@outlook.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "entari_plugin_hyw"
7
- version = "4.0.0-rc8"
7
+ version = "4.0.0-rc10"
8
8
  description = "Use large language models to interpret chat messages"
9
9
  authors = [{name = "kumoSleeping", email = "zjr2992@outlook.com"}]
10
10
  dependencies = [
@@ -162,6 +162,7 @@ class HywConfig(BasicConfModel):
162
162
  admins: List[str] = field(default_factory=list)
163
163
  models: List[Dict[str, Any]] = field(default_factory=list)
164
164
  question_command: str = "/q"
165
+ web_command: str = "/w"
165
166
  language: str = "Simplified Chinese"
166
167
  temperature: float = 0.4
167
168
 
@@ -169,7 +170,7 @@ class HywConfig(BasicConfModel):
169
170
  api_key: Optional[str] = None
170
171
  base_url: str = "https://openrouter.ai/api/v1"
171
172
 
172
- search_engine: str = "google"
173
+ search_engine: str = "duckduckgo"
173
174
 
174
175
  headless: bool = False
175
176
  save_conversation: bool = False
@@ -177,19 +178,14 @@ class HywConfig(BasicConfModel):
177
178
  quote: bool = False
178
179
  theme_color: str = "#ff0000"
179
180
 
180
- # Nested configurations
181
+ # Main model configuration (used for summary/main LLM calls)
181
182
  main: Optional[Dict[str, Any]] = None
182
- instruct: Optional[Dict[str, Any]] = None
183
- vision: Optional[Dict[str, Any]] = None
184
- deepsearch_instruct: Optional[Dict[str, Any]] = None
185
- deepsearch_agent: Optional[Dict[str, Any]] = None
186
183
 
187
184
  def __post_init__(self):
188
185
  self.theme_color = parse_color(self.theme_color)
189
186
 
190
187
  def to_hyw_core_config(self) -> HywCoreConfig:
191
188
  main_cfg = self.main or {}
192
- instruct_cfg = self.instruct or {}
193
189
 
194
190
  return HywCoreConfig.from_dict({
195
191
  "models": self.models,
@@ -207,20 +203,7 @@ class HywConfig(BasicConfModel):
207
203
  "summary_api_key": main_cfg.get("api_key"),
208
204
  "summary_base_url": main_cfg.get("base_url"),
209
205
  "summary_extra_body": main_cfg.get("extra_body"),
210
-
211
- # Map nested 'instruct' config to instruct stage
212
- "instruct_model": instruct_cfg.get("model_name"),
213
- "instruct_api_key": instruct_cfg.get("api_key"),
214
- "instruct_base_url": instruct_cfg.get("base_url"),
215
- "instruct_extra_body": instruct_cfg.get("extra_body"),
216
206
  })
217
-
218
- def get_model_config(self, stage: str) -> Dict[str, Any]:
219
- return {
220
- "model_name": self.model_name,
221
- "api_key": self.api_key,
222
- "base_url": self.base_url,
223
- }
224
207
 
225
208
 
226
209
  conf = plugin_config(HywConfig)
@@ -690,7 +673,7 @@ async def handle_question_command(session: Session[MessageCreatedEvent], result:
690
673
 
691
674
 
692
675
  # Search/Web Command (/w)
693
- alc_search = Alconna("/w", Args["query;?", AllParam])
676
+ alc_search = Alconna(conf.web_command, Args["query;?", AllParam])
694
677
 
695
678
  @command.on(alc_search)
696
679
  async def handle_web_command(session: Session[MessageCreatedEvent], result: Arparma):
@@ -756,6 +739,17 @@ async def handle_web_command(session: Session[MessageCreatedEvent], result: Arpa
756
739
 
757
740
  search_cache.cleanup()
758
741
  return
742
+ else:
743
+ # Reply to a non-cached message: append reply content to query
744
+ try:
745
+ # session.reply.origin.message is a list, wrap it in MessageChain
746
+ reply_msg = MessageChain(session.reply.origin.message)
747
+ reply_content = str(reply_msg.get(Text)).strip()
748
+ if reply_content:
749
+ query = f"{query} {reply_content}".strip() if query else reply_content
750
+ logger.info(f"/w appended reply content, new query: '{query}'")
751
+ except Exception as e:
752
+ logger.warning(f"/w failed to extract reply content: {e}")
759
753
 
760
754
  # No query and no cache context - nothing to do
761
755
  if not query:
@@ -805,8 +799,10 @@ async def handle_web_command(session: Session[MessageCreatedEvent], result: Arpa
805
799
  await session.send(filter_error)
806
800
  return
807
801
 
808
- # Search first
802
+ # Start search and tab pre-warming in parallel
803
+ local_renderer = await get_content_renderer()
809
804
  search_task = asyncio.create_task(core.search([search_query]))
805
+ tab_task = asyncio.create_task(local_renderer.prepare_tab())
810
806
 
811
807
  if conf.reaction:
812
808
  asyncio.create_task(react(session, "🔍"))
@@ -815,17 +811,25 @@ async def handle_web_command(session: Session[MessageCreatedEvent], result: Arpa
815
811
  flat_results = results[0] if results else []
816
812
 
817
813
  if not flat_results:
814
+ try: await tab_task
815
+ except: pass
818
816
  await session.send("Search returned no results.")
819
817
  return
820
818
 
821
819
  visible = [r for r in flat_results if not r.get("_hidden", False)]
822
820
 
823
821
  if not visible:
822
+ try: await tab_task
823
+ except: pass
824
824
  await session.send("Search returned no visible results.")
825
825
  return
826
826
 
827
827
  # === Filter Mode: Screenshot matching links ===
828
828
  if filters:
829
+ # No need for tab in filter/screenshot mode, cancel it
830
+ try: await tab_task
831
+ except: pass
832
+
829
833
  urls_to_screenshot = []
830
834
 
831
835
  for filter_type, filter_value, count in filters:
@@ -881,20 +885,42 @@ async def handle_web_command(session: Session[MessageCreatedEvent], result: Arpa
881
885
  await session.send("截图失败")
882
886
  return
883
887
 
884
- # === Normal Search Mode: Screenshot search results page ===
885
- search_service = core._search_service
886
- search_url = search_service._build_search_url(search_query)
888
+ # === Normal Search Mode: Render search results as Sources card ===
889
+
890
+ # Build references from search results for Sources card
891
+ references = []
892
+ for i, res in enumerate(visible[:10]):
893
+ references.append({
894
+ "title": res.get("title", f"Result {i+1}"),
895
+ "url": res.get("url", ""),
896
+ "snippet": res.get("content", "") or res.get("snippet", ""),
897
+ "original_idx": i + 1,
898
+ })
887
899
 
888
- # Handle address bar search marker
889
- if search_url.startswith("__ADDRESS_BAR_SEARCH__:"):
890
- import urllib.parse
891
- encoded_query = urllib.parse.quote_plus(search_query)
892
- search_url = f"https://www.google.com/search?q={encoded_query}"
900
+ try:
901
+ tab_id = await tab_task
902
+ except Exception:
903
+ tab_id = None
904
+
905
+ with tempfile.NamedTemporaryFile(suffix=".jpg", delete=False) as tf:
906
+ output_path = tf.name
893
907
 
894
- b64_img = await core.screenshot(search_url)
908
+ # Render Sources card with search results (no markdown content, just references)
909
+ render_ok = await core.render(
910
+ markdown_content=f"# 搜索结果: {search_query}",
911
+ output_path=output_path,
912
+ stats={"total_time": 0},
913
+ references=references,
914
+ page_references=[],
915
+ stages_used=[{"name": "search", "description": f"搜索 \"{search_query}\"", "time": 0}],
916
+ tab_id=tab_id
917
+ )
895
918
 
896
- if b64_img:
897
- msg_chain = MessageChain(Image(src=f'data:image/jpeg;base64,{b64_img}'))
919
+ if render_ok and os.path.exists(output_path):
920
+ with open(output_path, "rb") as f:
921
+ img_data = base64.b64encode(f.read()).decode()
922
+
923
+ msg_chain = MessageChain(Image(src=f'data:image/png;base64,{img_data}'))
898
924
  if conf.quote:
899
925
  msg_chain = MessageChain(Quote(session.event.message.id)) + msg_chain
900
926
 
@@ -909,8 +935,10 @@ async def handle_web_command(session: Session[MessageCreatedEvent], result: Arpa
909
935
  mid = str(session.event.message.id) if getattr(session.event, "message", None) else str(session.event.id)
910
936
  context_id = f"guild_{session.guild.id}" if session.guild else "user"
911
937
  history_manager.remember(mid, [{"role": "user", "content": f"/w {query}"}], [], {}, context_id=context_id)
938
+
939
+ os.remove(output_path)
912
940
  else:
913
- await session.send(f"截图搜索页面失败: {search_url}")
941
+ await session.send("渲染搜索结果失败")
914
942
 
915
943
  search_cache.cleanup() # Lazy cleanup
916
944
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: entari_plugin_hyw
3
- Version: 4.0.0rc8
3
+ Version: 4.0.0rc10
4
4
  Summary: Use large language models to interpret chat messages
5
5
  Author-email: kumoSleeping <zjr2992@outlook.com>
6
6
  License: MIT
@@ -66,7 +66,9 @@ src/hyw_core/browser_control/engines/__init__.py
66
66
  src/hyw_core/browser_control/engines/base.py
67
67
  src/hyw_core/browser_control/engines/default.py
68
68
  src/hyw_core/browser_control/engines/duckduckgo.py
69
- src/hyw_core/browser_control/engines/google.py
69
+ src/hyw_core/crawling/__init__.py
70
+ src/hyw_core/crawling/completeness.py
71
+ src/hyw_core/crawling/models.py
70
72
  src/hyw_core/stages/__init__.py
71
73
  src/hyw_core/stages/base.py
72
74
  src/hyw_core/stages/summary.py
@@ -5,7 +5,7 @@ This subpackage provides:
5
5
  - BrowserManager: Shared browser instance management
6
6
  - PageService: Page fetching and screenshot capabilities
7
7
  - RenderService: Vue-based card rendering
8
- - Search engines: Bing, Google, DuckDuckGo adapters
8
+ - Search engines: DuckDuckGo adapter
9
9
  """
10
10
 
11
11
  from .manager import (
@@ -28,7 +28,6 @@ from .renderer import (
28
28
  )
29
29
 
30
30
  from .engines.base import SearchEngine
31
- from .engines.google import GoogleEngine
32
31
  from .engines.duckduckgo import DuckDuckGoEngine
33
32
  from .engines.default import DefaultEngine
34
33
 
@@ -59,7 +58,6 @@ __all__ = [
59
58
 
60
59
  # Search Engines
61
60
  "SearchEngine",
62
- "GoogleEngine",
63
61
  "DuckDuckGoEngine",
64
62
  "DefaultEngine",
65
63
  ]