entari-plugin-hyw 4.0.0rc14__py3-none-any.whl → 4.0.0rc16__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.

Potentially problematic release.


This version of entari-plugin-hyw might be problematic. Click here for more details.

Files changed (31) hide show
  1. entari_plugin_hyw/__init__.py +149 -367
  2. {entari_plugin_hyw-4.0.0rc14.dist-info → entari_plugin_hyw-4.0.0rc16.dist-info}/METADATA +2 -1
  3. {entari_plugin_hyw-4.0.0rc14.dist-info → entari_plugin_hyw-4.0.0rc16.dist-info}/RECORD +11 -31
  4. {entari_plugin_hyw-4.0.0rc14.dist-info → entari_plugin_hyw-4.0.0rc16.dist-info}/WHEEL +1 -1
  5. hyw_core/agent.py +127 -19
  6. hyw_core/browser_control/assets/card-dist/index.html +35 -31
  7. hyw_core/browser_control/service.py +68 -6
  8. hyw_core/definitions.py +62 -14
  9. hyw_core/search.py +4 -6
  10. hyw_core/stages/summary.py +45 -18
  11. entari_plugin_hyw/Untitled-1 +0 -1865
  12. hyw_core/browser_control/assets/index.html +0 -5691
  13. hyw_core/browser_control/assets/logos/anthropic.svg +0 -1
  14. hyw_core/browser_control/assets/logos/cerebras.svg +0 -9
  15. hyw_core/browser_control/assets/logos/deepseek.png +0 -0
  16. hyw_core/browser_control/assets/logos/gemini.svg +0 -1
  17. hyw_core/browser_control/assets/logos/google.svg +0 -1
  18. hyw_core/browser_control/assets/logos/grok.png +0 -0
  19. hyw_core/browser_control/assets/logos/huggingface.png +0 -0
  20. hyw_core/browser_control/assets/logos/microsoft.svg +0 -15
  21. hyw_core/browser_control/assets/logos/minimax.png +0 -0
  22. hyw_core/browser_control/assets/logos/mistral.png +0 -0
  23. hyw_core/browser_control/assets/logos/nvida.png +0 -0
  24. hyw_core/browser_control/assets/logos/openai.svg +0 -1
  25. hyw_core/browser_control/assets/logos/openrouter.png +0 -0
  26. hyw_core/browser_control/assets/logos/perplexity.svg +0 -24
  27. hyw_core/browser_control/assets/logos/qwen.png +0 -0
  28. hyw_core/browser_control/assets/logos/xai.png +0 -0
  29. hyw_core/browser_control/assets/logos/xiaomi.png +0 -0
  30. hyw_core/browser_control/assets/logos/zai.png +0 -0
  31. {entari_plugin_hyw-4.0.0rc14.dist-info → entari_plugin_hyw-4.0.0rc16.dist-info}/top_level.txt +0 -0
@@ -1,24 +1,22 @@
1
- entari_plugin_hyw/Untitled-1,sha256=wbsr5i9iorqBMIYK4aAnpNTek3mXbhvyo2YOYw38pE4,30187
2
- entari_plugin_hyw/__init__.py,sha256=0q-i4F_xm--klgtp__r7cx_xPK7rV164aRzISEmVO7o,39053
1
+ entari_plugin_hyw/__init__.py,sha256=Ro4nryYC5WXfPvC125ds39M00QZ1bsbADCLmZlZk1UU,29868
3
2
  entari_plugin_hyw/filters.py,sha256=sQnLaiqqZ2NkykcH4QgzFImP-JW3uVU7l6iuAAyUsJg,3080
4
3
  entari_plugin_hyw/history.py,sha256=0XJwbfvXH5T1EPt4G1J5wWMJsKi0FfmajY5cvw8CQWE,12065
5
4
  entari_plugin_hyw/misc.py,sha256=5IqF5Z2C_6Ufy5TI89uX5hX5fVYcXOTZIQUIu_tvf54,6855
6
5
  entari_plugin_hyw/search_cache.py,sha256=7MIhTm5_YnZjc0aBaX7AE4AJp0VT8eU6ObR6mTkoerc,4285
7
6
  hyw_core/__init__.py,sha256=Jlr9Ic-BLOPTnff6OctUCdjDMdK4nssTF_vHie4QKTo,1958
8
- hyw_core/agent.py,sha256=lyGwJI0SiRGYdpPPL7mtzHj569UNIgm-s4P_xz1MNGc,33096
7
+ hyw_core/agent.py,sha256=t4xW0xI_Sb29eAO9FPfnmXNZG-sszKvHWXCRVYdP9nQ,37858
9
8
  hyw_core/config.py,sha256=DHxwToUVLm1nT88gG05e3hVzSLxXMk9BjgjAnhGCADk,4918
10
9
  hyw_core/core.py,sha256=_jN4831OeHQ_aM7sIlzcwYb5_Lp82kp2XmqpJD_tsLA,16097
11
- hyw_core/definitions.py,sha256=pH46L-N25pSuPaIiN7l7yfoD6oHK6BLHigE0eYLFmJQ,4270
10
+ hyw_core/definitions.py,sha256=oH7TZO_vEbOlt8DE9mtz3_caq1Pca_6QjBWAgjrjQSk,6936
12
11
  hyw_core/image_cache.py,sha256=t8pr1kgH2ngK9IhrBAhzUqhBWERNztUywMzgCFZEtQk,9899
13
12
  hyw_core/pipeline.py,sha256=ZWwF0DHa29-65lUMU1_Fem3xQmxl7X_vgeni0ErOb8Q,22826
14
- hyw_core/search.py,sha256=VvfNSb9Hf7ZQWlNtnZfYe2eO9qPjYtwJxVlud6OdeCQ,7787
13
+ hyw_core/search.py,sha256=cLx1rPpy8BH6WiOKudH_XcO-DhqEU-CHANRDlyEB3MY,7612
15
14
  hyw_core/browser_control/__init__.py,sha256=IeMErRC6fbq1PJWNK3klSbarSrUwOM4yyd_kJ6uWCPM,1406
16
15
  hyw_core/browser_control/landing.html,sha256=wgqldumdylz69T83pvOkrigT1Mdb9GY0_KU0ceLGwdY,4642
17
16
  hyw_core/browser_control/manager.py,sha256=-dHb0FamRsLfuU3jqX5cKaDo8DOOFV32zY912GuMdXU,6048
18
17
  hyw_core/browser_control/renderer.py,sha256=s-QNIU-NMVQGLd_drLmeERgHsTm6C9XYm78CObt2KXc,17409
19
- hyw_core/browser_control/service.py,sha256=_TcRRQuSei8PCsZs8hYU_DJ4DRMQ6jAFNqWmwca35Tc,43984
20
- hyw_core/browser_control/assets/index.html,sha256=BpbM0vD9OYicE5MBHSVLo3j_y-MpULI82PMqmBKpWT8,2328623
21
- hyw_core/browser_control/assets/card-dist/index.html,sha256=Xw-hQ5ctdQkK-1jV8_gqMdgVGNZDwWZvIAqNrh2eK7g,2210054
18
+ hyw_core/browser_control/service.py,sha256=mo2qkFJgi5DkzURVD8QrIj3xdd_jKwiJSoTVEfFAsY0,46626
19
+ hyw_core/browser_control/assets/card-dist/index.html,sha256=4SA4QA2aaUwHGETtCcdUGEMjjoHaw7wJVACZr4VC70Q,2213449
22
20
  hyw_core/browser_control/assets/card-dist/vite.svg,sha256=SnSK_UQ5GLsWWRyDTEAdrjPoeGGrXbrQgRw6O0qSFPs,1497
23
21
  hyw_core/browser_control/assets/card-dist/logos/anthropic.svg,sha256=ASsy1ypo3osNc3n-B0R81tk_dIFsVgg7qQORrd5T2kA,558
24
22
  hyw_core/browser_control/assets/card-dist/logos/cerebras.svg,sha256=bpmiiYTODwc06knTmPj3GQ7NNtosMog5lkggvB_Z-7M,44166
@@ -38,24 +36,6 @@ hyw_core/browser_control/assets/card-dist/logos/qwen.png,sha256=eqLbnIPbjh2_PsOD
38
36
  hyw_core/browser_control/assets/card-dist/logos/xai.png,sha256=uSulvvDVqoA4RUOW0ZAkdvBVM2rpyGJRZIbn5dEFspw,362
39
37
  hyw_core/browser_control/assets/card-dist/logos/xiaomi.png,sha256=WHxlDFGU5FCjb-ure3ngdGG18-efYZUUfqA3_lqCUN0,4084
40
38
  hyw_core/browser_control/assets/card-dist/logos/zai.png,sha256=K-gnabdsjMLInppHA1Op7Nyt33iegrx1x-yNlvCZ0Tc,2351
41
- hyw_core/browser_control/assets/logos/anthropic.svg,sha256=ASsy1ypo3osNc3n-B0R81tk_dIFsVgg7qQORrd5T2kA,558
42
- hyw_core/browser_control/assets/logos/cerebras.svg,sha256=bpmiiYTODwc06knTmPj3GQ7NNtosMog5lkggvB_Z-7M,44166
43
- hyw_core/browser_control/assets/logos/deepseek.png,sha256=KWWAr9aeYMc6I07U_1qo7zcXO6e7-kfd9S2XjQumnf4,25338
44
- hyw_core/browser_control/assets/logos/gemini.svg,sha256=H74CoVmx5opcCtr3Ay3M09dpqL9cd9Whkx-M6an3t7s,599
45
- hyw_core/browser_control/assets/logos/google.svg,sha256=H74CoVmx5opcCtr3Ay3M09dpqL9cd9Whkx-M6an3t7s,599
46
- hyw_core/browser_control/assets/logos/grok.png,sha256=uSulvvDVqoA4RUOW0ZAkdvBVM2rpyGJRZIbn5dEFspw,362
47
- hyw_core/browser_control/assets/logos/huggingface.png,sha256=8eAudeftUDO11jf0coOscPeRkskCb7l9TNMx78q61mY,24564
48
- hyw_core/browser_control/assets/logos/microsoft.svg,sha256=-am_6N3UEQYSzldDg-xrdGYjTWsagH-3v4Q_eia1ymE,684
49
- hyw_core/browser_control/assets/logos/minimax.png,sha256=tWqVlMdFNPpP8zWWX9tvIsWXI9q76P7O3t3CEZO7NU0,1525
50
- hyw_core/browser_control/assets/logos/mistral.png,sha256=0vv7jPmPKiBRYVYYJxVL_wIH_qa_ZssIdV3NDO5vbmk,869
51
- hyw_core/browser_control/assets/logos/nvida.png,sha256=JMITdcyjR9Lz6Gub0n1_30d0ynvV1ZSCJRcjy23qgrA,1607
52
- hyw_core/browser_control/assets/logos/openai.svg,sha256=LhVwCR4qaXj6qHm31qniQTCkJ-FX932JLSycUis5kao,1692
53
- hyw_core/browser_control/assets/logos/openrouter.png,sha256=exxfjWGDWpYH-Vc8xJDbhNVeXFEVxnu6TMxYIBc1WmY,1665
54
- hyw_core/browser_control/assets/logos/perplexity.svg,sha256=mHWZFoeWmDYXOIDzm9pj6_sRotaI8xNy5Lkeg5Vzu70,555
55
- hyw_core/browser_control/assets/logos/qwen.png,sha256=eqLbnIPbjh2_PsODU_mmqjeD82xXj8fV_kN0fDrNaD0,38419
56
- hyw_core/browser_control/assets/logos/xai.png,sha256=uSulvvDVqoA4RUOW0ZAkdvBVM2rpyGJRZIbn5dEFspw,362
57
- hyw_core/browser_control/assets/logos/xiaomi.png,sha256=WHxlDFGU5FCjb-ure3ngdGG18-efYZUUfqA3_lqCUN0,4084
58
- hyw_core/browser_control/assets/logos/zai.png,sha256=K-gnabdsjMLInppHA1Op7Nyt33iegrx1x-yNlvCZ0Tc,2351
59
39
  hyw_core/browser_control/engines/__init__.py,sha256=01-jOjvtQcqWIwwY56ql3j00oSHGE2XhDHjkIi1Ij3Q,284
60
40
  hyw_core/browser_control/engines/base.py,sha256=q5y4SM1G6xS7-6TQ-nZz9iTWw3XonjJn01fWzoTxr6c,414
61
41
  hyw_core/browser_control/engines/default.py,sha256=BlHCQI4-rN9cEzLLfqvRD4bvhyP2G2KUGlo92J4kFNw,6092
@@ -65,8 +45,8 @@ hyw_core/crawling/completeness.py,sha256=OKdS8XlYYWDU1Vl1k-u7yEFqppukuJv-YQB0Px5
65
45
  hyw_core/crawling/models.py,sha256=pCKe0k9xT3taSAlTlh0PazcLV0xYsm8p3XIkLHGf-LM,2353
66
46
  hyw_core/stages/__init__.py,sha256=W89cWpq-HBLi2FprtJQSjQNLzpbhM8ZCkqPG61D_imE,521
67
47
  hyw_core/stages/base.py,sha256=EfnTkISXbBNxjARykqIhmMrVqw2tqZl7ozJbJEbRnhI,2806
68
- hyw_core/stages/summary.py,sha256=sgHCm_Leq_pkJ4YcgQuf8croiOP1oKz171TnzJwRwVs,7080
69
- entari_plugin_hyw-4.0.0rc14.dist-info/METADATA,sha256=aOkMfm8FTTHNF_2ZkwNRw47sjLPlLNxu_MU8uoAFGX0,3845
70
- entari_plugin_hyw-4.0.0rc14.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
71
- entari_plugin_hyw-4.0.0rc14.dist-info/top_level.txt,sha256=ah76OrufRX0okOl4Fv8MO6PXiT0IaZ1oG0eDrdAPoNo,27
72
- entari_plugin_hyw-4.0.0rc14.dist-info/RECORD,,
48
+ hyw_core/stages/summary.py,sha256=D0XwhqmtoyovSXUWoa-_RxeoKWEkdjqMyoJV-gWQwvQ,8342
49
+ entari_plugin_hyw-4.0.0rc16.dist-info/METADATA,sha256=2cd09y-WU9e9_yBjkQVpTi4RLSSET0Vhp-1TeQmxuQ4,3875
50
+ entari_plugin_hyw-4.0.0rc16.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
51
+ entari_plugin_hyw-4.0.0rc16.dist-info/top_level.txt,sha256=ah76OrufRX0okOl4Fv8MO6PXiT0IaZ1oG0eDrdAPoNo,27
52
+ entari_plugin_hyw-4.0.0rc16.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.10.1)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
hyw_core/agent.py CHANGED
@@ -15,7 +15,7 @@ from typing import Any, Callable, Awaitable, Dict, List, Optional
15
15
  from loguru import logger
16
16
  from openai import AsyncOpenAI
17
17
 
18
- from .definitions import get_web_tool, get_refuse_answer_tool, AGENT_SYSTEM_PROMPT
18
+ from .definitions import get_web_tool, get_refuse_answer_tool, get_js_tool, AGENT_SYSTEM_PROMPT
19
19
  from .stages.base import StageContext, StageResult
20
20
  from .search import SearchService
21
21
 
@@ -209,8 +209,19 @@ class AgentPipeline:
209
209
 
210
210
  session.messages = [
211
211
  {"role": "system", "content": system_prompt},
212
- {"role": "user", "content": user_content}
213
212
  ]
213
+
214
+ # Add conversation history (previous turns) before current user message
215
+ # This enables continuous conversation context
216
+ if conversation_history:
217
+ for msg in conversation_history:
218
+ role = msg.get("role", "")
219
+ content = msg.get("content", "")
220
+ if role in ("user", "assistant") and content:
221
+ session.messages.append({"role": role, "content": content})
222
+
223
+ # Add current user message
224
+ session.messages.append({"role": "user", "content": user_content})
214
225
 
215
226
  # Add image source hint for user images
216
227
  if user_image_count > 0:
@@ -223,8 +234,9 @@ class AgentPipeline:
223
234
  # Tool definitions
224
235
  web_tool = get_web_tool()
225
236
  refuse_tool = get_refuse_answer_tool()
226
- tools = [web_tool, refuse_tool]
227
-
237
+ js_tool = get_js_tool()
238
+ tools = [web_tool, refuse_tool, js_tool]
239
+
228
240
  usage_totals = {"input_tokens": 0, "output_tokens": 0}
229
241
  final_content = ""
230
242
 
@@ -429,7 +441,10 @@ class AgentPipeline:
429
441
  if func_name == "web_tool":
430
442
  tasks_to_run.append(self._execute_web_tool(tool_call_args_list[idx], context))
431
443
  task_indices.append(idx)
432
-
444
+ elif func_name == "js_executor":
445
+ tasks_to_run.append(self._execute_js_tool(tool_call_args_list[idx], context))
446
+ task_indices.append(idx)
447
+
433
448
  # Run all web_tool calls in parallel
434
449
  if tasks_to_run:
435
450
  results = await asyncio.gather(*tasks_to_run, return_exceptions=True)
@@ -465,7 +480,18 @@ class AgentPipeline:
465
480
  notifications.append(f"🔍 {result['summary']}")
466
481
 
467
482
  # Add tool result to messages
468
- result_content = f"搜索完成: {result['summary']}\n\n找到 {len(result.get('results', []))} 个结果"
483
+ formatted_results = ""
484
+ if result.get("results"):
485
+ formatted_results = "\n\n详细结果:\n"
486
+ for i, r in enumerate(result["results"]):
487
+ title = r.get("title", "无标题")
488
+ url = r.get("url", "")
489
+ snippet = r.get("snippet", "") or r.get("content", "") or ""
490
+ # Limit snippet length
491
+ snippet = snippet[:300] + "..." if len(snippet) > 300 else snippet
492
+ formatted_results += f"{i+1}. [{title}]({url})\n 摘要: {snippet}\n\n"
493
+
494
+ result_content = f"搜索完成: {result['summary']}\n\n找到 {len(result.get('results', []))} 个结果{formatted_results}"
469
495
  session.messages.append({
470
496
  "role": "tool",
471
497
  "tool_call_id": tc_id,
@@ -647,6 +673,59 @@ class AgentPipeline:
647
673
  "screenshot_count": 0
648
674
  }
649
675
 
676
+ async def _execute_js_tool(self, args: Dict, context: StageContext) -> Dict[str, Any]:
677
+ """执行 JS 代码工具"""
678
+ script = args.get("script", "")
679
+ if not script:
680
+ return {"summary": "JS执行失败: 代码为空", "results": []}
681
+
682
+ if self.send_func:
683
+ try:
684
+ await self.send_func("💻 正在执行JavaScript代码...")
685
+ except: pass
686
+
687
+ logger.info(f"AgentPipeline: Executing JS script: {script[:50]}...")
688
+ result = await self.search_service.execute_script(script)
689
+
690
+ # 格式化结果
691
+ success = result.get("success", False)
692
+ output = result.get("result", None)
693
+ error = result.get("error", None)
694
+ url = result.get("url", "")
695
+ title = result.get("title", "")
696
+
697
+ # Add to context
698
+ context.web_results.append({
699
+ "_id": context.next_id(),
700
+ "_type": "js_result",
701
+ "url": url,
702
+ "title": title or "JS Execution",
703
+ "script": script,
704
+ "output": str(output) if success else str(error),
705
+ "success": success,
706
+ "content": f"Script: {script}\n\nOutput: {output}" if success else f"Error: {error}"
707
+ })
708
+
709
+ if success:
710
+ summary = f"JS执行成功 (返回: {str(output)[:50]}...)"
711
+ return {
712
+ "summary": summary,
713
+ "results": [{"_type": "js_result", "url": url}],
714
+ "screenshot_count": 0,
715
+ "full_output": str(output), # Return full output for LLM
716
+ "success": True
717
+ }
718
+ else:
719
+ return {
720
+ "summary": f"JS执行失败: {str(error)[:50]}",
721
+ "results": [],
722
+ "screenshot_count": 0,
723
+ "full_output": f"JS Execution Failed: {error}",
724
+ "success": False,
725
+ "error": str(error)
726
+ }
727
+
728
+
650
729
  def _collect_filter_urls(self, filters: List, visible: List[Dict]) -> List[str]:
651
730
  """Collect URLs based on filter specifications."""
652
731
  urls = []
@@ -729,22 +808,51 @@ class AgentPipeline:
729
808
  "cost": instruct_cost,
730
809
  })
731
810
 
732
- # 2. Search Stage (搜索)
811
+ # 2. Search Stage (搜索) / Browser JS Stage
733
812
  if session.tool_calls:
734
- # Collect all search descriptions
813
+ # Collect all search descriptions and check for JS executor calls
735
814
  search_descriptions = []
815
+ js_calls = []
816
+
736
817
  for tc, result in zip(session.tool_calls, session.tool_results):
737
- desc = result.get("summary", "")
738
- if desc:
739
- search_descriptions.append(desc)
740
-
741
- stages.append({
742
- "name": "Search",
743
- "model": "",
744
- "provider": "Web",
745
- "description": " → ".join(search_descriptions) if search_descriptions else "Web Search",
746
- "time": session.search_time,
747
- })
818
+ if tc.get("name") == "js_executor":
819
+ # Collect JS execution info
820
+ js_calls.append({
821
+ "script": tc.get("args", {}).get("script", ""),
822
+ "output": result.get("full_output", result.get("summary", "")),
823
+ "url": result.get("results", [{}])[0].get("url", "") if result.get("results") else "",
824
+ "success": result.get("success", True), # Default to True if not present
825
+ "error": result.get("error", "")
826
+ })
827
+ else:
828
+ desc = result.get("summary", "")
829
+ if desc:
830
+ search_descriptions.append(desc)
831
+
832
+ # Add Search stage if there are search calls
833
+ if search_descriptions:
834
+ stages.append({
835
+ "name": "Search",
836
+ "model": "",
837
+ "provider": "Web",
838
+ "description": " → ".join(search_descriptions),
839
+ "time": session.search_time,
840
+ })
841
+
842
+ # Add Browser JS stage for each JS call
843
+ for js_call in js_calls:
844
+ stages.append({
845
+ "name": "browser_js",
846
+ "model": "",
847
+ "provider": "Browser",
848
+ "description": "JavaScript Execution",
849
+ "script": js_call["script"],
850
+ "output": js_call["output"],
851
+ "url": js_call["url"],
852
+ "success": js_call.get("success"),
853
+ "error": js_call.get("error"),
854
+ "time": 0, # JS execution time is included in search_time
855
+ })
748
856
 
749
857
  # 3. Summary Stage (总结)
750
858
  # Calculate remaining tokens after instruct