symbolicai 1.4.0__py3-none-any.whl → 1.6.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.
- symai/__init__.py +21 -71
- symai/backend/base.py +0 -26
- symai/backend/engines/drawing/engine_gemini_image.py +101 -0
- symai/backend/engines/embedding/engine_openai.py +11 -8
- symai/backend/engines/neurosymbolic/__init__.py +8 -0
- symai/backend/engines/neurosymbolic/engine_google_geminiX_reasoning.py +14 -1
- symai/backend/engines/neurosymbolic/engine_openrouter.py +294 -0
- symai/backend/engines/scrape/engine_requests.py +39 -10
- symai/backend/engines/search/__init__.py +13 -0
- symai/backend/engines/search/engine_firecrawl.py +333 -0
- symai/backend/engines/search/engine_parallel.py +5 -5
- symai/backend/mixin/__init__.py +4 -0
- symai/backend/mixin/openrouter.py +2 -0
- symai/components.py +212 -16
- symai/extended/interfaces/firecrawl.py +30 -0
- symai/extended/interfaces/nanobanana.py +23 -0
- symai/extended/interfaces/parallel.py +5 -5
- symai/functional.py +3 -4
- symai/interfaces.py +2 -0
- symai/ops/primitives.py +0 -18
- symai/shellsv.py +2 -7
- {symbolicai-1.4.0.dist-info → symbolicai-1.6.0.dist-info}/METADATA +3 -9
- {symbolicai-1.4.0.dist-info → symbolicai-1.6.0.dist-info}/RECORD +27 -47
- {symbolicai-1.4.0.dist-info → symbolicai-1.6.0.dist-info}/WHEEL +1 -1
- symai/backend/driver/webclient.py +0 -217
- symai/backend/engines/crawler/engine_selenium.py +0 -94
- symai/backend/engines/drawing/engine_dall_e.py +0 -131
- symai/backend/engines/embedding/engine_plugin_embeddings.py +0 -12
- symai/backend/engines/experiments/engine_bard_wrapper.py +0 -131
- symai/backend/engines/experiments/engine_gptfinetuner.py +0 -32
- symai/backend/engines/experiments/engine_llamacpp_completion.py +0 -142
- symai/backend/engines/neurosymbolic/engine_openai_gptX_completion.py +0 -277
- symai/collect/__init__.py +0 -8
- symai/collect/dynamic.py +0 -117
- symai/collect/pipeline.py +0 -156
- symai/collect/stats.py +0 -434
- symai/extended/crawler.py +0 -21
- symai/extended/interfaces/selenium.py +0 -18
- symai/extended/interfaces/vectordb.py +0 -21
- symai/extended/personas/__init__.py +0 -3
- symai/extended/personas/builder.py +0 -105
- symai/extended/personas/dialogue.py +0 -126
- symai/extended/personas/persona.py +0 -154
- symai/extended/personas/research/__init__.py +0 -1
- symai/extended/personas/research/yann_lecun.py +0 -62
- symai/extended/personas/sales/__init__.py +0 -1
- symai/extended/personas/sales/erik_james.py +0 -62
- symai/extended/personas/student/__init__.py +0 -1
- symai/extended/personas/student/max_tenner.py +0 -51
- symai/extended/strategies/__init__.py +0 -1
- symai/extended/strategies/cot.py +0 -40
- {symbolicai-1.4.0.dist-info → symbolicai-1.6.0.dist-info}/entry_points.txt +0 -0
- {symbolicai-1.4.0.dist-info → symbolicai-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {symbolicai-1.4.0.dist-info → symbolicai-1.6.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from ... import core
|
|
2
|
+
from ...backend.engines.search.engine_firecrawl import FirecrawlExtractResult, FirecrawlSearchResult
|
|
3
|
+
from ...symbol import Expression, Symbol
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class firecrawl(Expression):
|
|
7
|
+
def __init__(self, *args, **kwargs):
|
|
8
|
+
super().__init__(*args, **kwargs)
|
|
9
|
+
self.name = self.__class__.__name__
|
|
10
|
+
|
|
11
|
+
def search(self, query: Symbol, **kwargs) -> FirecrawlSearchResult:
|
|
12
|
+
query = self._to_symbol(query)
|
|
13
|
+
|
|
14
|
+
@core.search(query=query.value, **kwargs)
|
|
15
|
+
def _func(_) -> FirecrawlSearchResult:
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
return _func(self)
|
|
19
|
+
|
|
20
|
+
def scrape(self, url: str, **kwargs) -> FirecrawlExtractResult:
|
|
21
|
+
symbol = self._to_symbol(url)
|
|
22
|
+
options = dict(kwargs)
|
|
23
|
+
options.pop("query", None)
|
|
24
|
+
options["url"] = symbol.value
|
|
25
|
+
|
|
26
|
+
@core.search(query="", **options)
|
|
27
|
+
def _func(_, *_args, **_inner_kwargs) -> FirecrawlExtractResult:
|
|
28
|
+
return None
|
|
29
|
+
|
|
30
|
+
return _func(self)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from ... import core
|
|
2
|
+
from ...backend.engines.drawing.engine_gemini_image import GeminiImageResult
|
|
3
|
+
from ...symbol import Expression
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class nanobanana(Expression):
|
|
7
|
+
def __init__(self, *args, **kwargs):
|
|
8
|
+
super().__init__(*args, **kwargs)
|
|
9
|
+
self.name = self.__class__.__name__
|
|
10
|
+
|
|
11
|
+
def __call__(
|
|
12
|
+
self,
|
|
13
|
+
prompt: str | None = None,
|
|
14
|
+
operation: str = "create",
|
|
15
|
+
**kwargs,
|
|
16
|
+
) -> list:
|
|
17
|
+
prompt = self._to_symbol(prompt)
|
|
18
|
+
|
|
19
|
+
@core.draw(operation=operation, **kwargs)
|
|
20
|
+
def _func(_) -> GeminiImageResult:
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
return _func(prompt).value
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from ... import core
|
|
2
|
-
from ...backend.engines.search.engine_parallel import
|
|
2
|
+
from ...backend.engines.search.engine_parallel import ParallelExtractResult, ParallelSearchResult
|
|
3
3
|
from ...symbol import Expression, Symbol
|
|
4
4
|
|
|
5
5
|
|
|
@@ -8,23 +8,23 @@ class parallel(Expression):
|
|
|
8
8
|
super().__init__(*args, **kwargs)
|
|
9
9
|
self.name = self.__class__.__name__
|
|
10
10
|
|
|
11
|
-
def search(self, query: Symbol, **kwargs) ->
|
|
11
|
+
def search(self, query: Symbol, **kwargs) -> ParallelSearchResult:
|
|
12
12
|
query = self._to_symbol(query)
|
|
13
13
|
|
|
14
14
|
@core.search(query=query.value, **kwargs)
|
|
15
|
-
def _func(_) ->
|
|
15
|
+
def _func(_) -> ParallelSearchResult:
|
|
16
16
|
pass
|
|
17
17
|
|
|
18
18
|
return _func(self)
|
|
19
19
|
|
|
20
|
-
def scrape(self, url: str, **kwargs) ->
|
|
20
|
+
def scrape(self, url: str, **kwargs) -> ParallelExtractResult:
|
|
21
21
|
symbol = self._to_symbol(url)
|
|
22
22
|
options = dict(kwargs)
|
|
23
23
|
options.pop("query", None)
|
|
24
24
|
options["url"] = symbol.value
|
|
25
25
|
|
|
26
26
|
@core.search(query="", **options)
|
|
27
|
-
def _func(_, *_args, **_inner_kwargs) ->
|
|
27
|
+
def _func(_, *_args, **_inner_kwargs) -> ParallelExtractResult:
|
|
28
28
|
return None
|
|
29
29
|
|
|
30
30
|
return _func(self)
|
symai/functional.py
CHANGED
|
@@ -498,10 +498,9 @@ class EngineRepository:
|
|
|
498
498
|
def get(engine_name: str, *_args, **_kwargs):
|
|
499
499
|
self = EngineRepository()
|
|
500
500
|
# First check if we're in the context manager that dynamically changes models
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
return engine
|
|
501
|
+
dynamic_engine = self.get_dynamic_engine_instance()
|
|
502
|
+
if dynamic_engine is not None and engine_name in ("neurosymbolic", "search"):
|
|
503
|
+
return dynamic_engine
|
|
505
504
|
|
|
506
505
|
# Otherwise, fallback to normal lookup:
|
|
507
506
|
if engine_name not in self._engines:
|
symai/interfaces.py
CHANGED
|
@@ -42,6 +42,8 @@ def _add_symbolic_interface(mapping):
|
|
|
42
42
|
def _resolve_drawing_interface_name(drawing_engine_model):
|
|
43
43
|
if drawing_engine_model.startswith("flux"):
|
|
44
44
|
return "flux"
|
|
45
|
+
if drawing_engine_model.startswith(("gemini-2.5-flash-image", "gemini-3-pro-image-preview")):
|
|
46
|
+
return "nanobanana"
|
|
45
47
|
if drawing_engine_model.startswith("dall-e-"):
|
|
46
48
|
return "dall_e"
|
|
47
49
|
if drawing_engine_model.startswith("gpt-image-"):
|
symai/ops/primitives.py
CHANGED
|
@@ -745,12 +745,6 @@ class OperatorPrimitives(Primitive):
|
|
|
745
745
|
Returns:
|
|
746
746
|
Symbol: A new symbol with the result of the OR operation.
|
|
747
747
|
"""
|
|
748
|
-
# Exclude the evaluation for the Aggregator class; keep import local to avoid ops.primitives <-> collect.stats cycle.
|
|
749
|
-
from ..collect.stats import Aggregator # noqa
|
|
750
|
-
|
|
751
|
-
if isinstance(other, Aggregator):
|
|
752
|
-
return NotImplemented
|
|
753
|
-
|
|
754
748
|
result = self.__try_type_specific_func(
|
|
755
749
|
other, lambda self, other: self.value | other.value, op="|"
|
|
756
750
|
)
|
|
@@ -777,12 +771,6 @@ class OperatorPrimitives(Primitive):
|
|
|
777
771
|
Returns:
|
|
778
772
|
Symbol: A new Symbol object with the concatenated value.
|
|
779
773
|
"""
|
|
780
|
-
# Exclude the evaluation for the Aggregator class; keep import local to avoid ops.primitives <-> collect.stats cycle.
|
|
781
|
-
from ..collect.stats import Aggregator # noqa
|
|
782
|
-
|
|
783
|
-
if isinstance(other, Aggregator):
|
|
784
|
-
return NotImplemented
|
|
785
|
-
|
|
786
774
|
result = self.__try_type_specific_func(
|
|
787
775
|
other, lambda self, other: self.value | other.value, op="|"
|
|
788
776
|
)
|
|
@@ -811,12 +799,6 @@ class OperatorPrimitives(Primitive):
|
|
|
811
799
|
Returns:
|
|
812
800
|
Symbol: A new Symbol object with the concatenated value.
|
|
813
801
|
"""
|
|
814
|
-
# Exclude the evaluation for the Aggregator class; keep import local to avoid ops.primitives <-> collect.stats cycle.
|
|
815
|
-
from ..collect.stats import Aggregator # noqa
|
|
816
|
-
|
|
817
|
-
if isinstance(other, Aggregator):
|
|
818
|
-
return NotImplemented
|
|
819
|
-
|
|
820
802
|
result = self.__try_type_specific_func(
|
|
821
803
|
other, lambda self, other: self.value | other.value, op="|="
|
|
822
804
|
)
|
symai/shellsv.py
CHANGED
|
@@ -1070,14 +1070,9 @@ def run(auto_query_on_error=False, conversation_style=None, verbose=False):
|
|
|
1070
1070
|
) = styles_
|
|
1071
1071
|
state.use_styles = True
|
|
1072
1072
|
|
|
1073
|
-
if SYMSH_CONFIG
|
|
1073
|
+
if SYMSH_CONFIG.get("show-splash-screen", True):
|
|
1074
1074
|
show_intro_menu()
|
|
1075
|
-
|
|
1076
|
-
SYMSH_CONFIG["show-splash-screen"] = False
|
|
1077
|
-
# save config
|
|
1078
|
-
_config_path = HOME_PATH / "symsh.config.json"
|
|
1079
|
-
with _config_path.open("w") as f:
|
|
1080
|
-
json.dump(SYMSH_CONFIG, f, indent=4)
|
|
1075
|
+
|
|
1081
1076
|
if "plugin_prefix" not in SYMSH_CONFIG:
|
|
1082
1077
|
SYMSH_CONFIG["plugin_prefix"] = None
|
|
1083
1078
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: symbolicai
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.6.0
|
|
4
4
|
Summary: A Neurosymbolic Perspective on Large Language Models
|
|
5
5
|
Author-email: Marius-Constantin Dinu <marius@extensity.ai>, Leoveanu-Condrei Claudiu <leo@extensity.ai>
|
|
6
6
|
License: BSD 3-Clause License
|
|
@@ -88,10 +88,6 @@ Requires-Dist: llvmlite>=0.45.1
|
|
|
88
88
|
Requires-Dist: cerebras-cloud-sdk>=1.59.0
|
|
89
89
|
Provides-Extra: bitsandbytes
|
|
90
90
|
Requires-Dist: bitsandbytes>=0.43.1; extra == "bitsandbytes"
|
|
91
|
-
Provides-Extra: blip2
|
|
92
|
-
Requires-Dist: decord>=0.6.0; extra == "blip2"
|
|
93
|
-
Requires-Dist: salesforce-lavis>=1.0.0; extra == "blip2"
|
|
94
|
-
Requires-Dist: opencv-python-headless>=4.5.5.64; extra == "blip2"
|
|
95
91
|
Provides-Extra: hf
|
|
96
92
|
Requires-Dist: transformers>=4.45.2; extra == "hf"
|
|
97
93
|
Requires-Dist: accelerate>=0.33.0; extra == "hf"
|
|
@@ -113,6 +109,7 @@ Requires-Dist: openai-whisper>=20240930; extra == "whisper"
|
|
|
113
109
|
Requires-Dist: numba>=0.62.1; extra == "whisper"
|
|
114
110
|
Requires-Dist: llvmlite>=0.45.1; extra == "whisper"
|
|
115
111
|
Provides-Extra: search
|
|
112
|
+
Requires-Dist: firecrawl-py>=4.12.0; extra == "search"
|
|
116
113
|
Requires-Dist: parallel-web>=0.3.3; extra == "search"
|
|
117
114
|
Provides-Extra: serpapi
|
|
118
115
|
Requires-Dist: google_search_results>=2.4.2; extra == "serpapi"
|
|
@@ -424,15 +421,12 @@ Example of a configuration file with all engines enabled:
|
|
|
424
421
|
"VISION_ENGINE_MODEL": "openai/clip-vit-base-patch32",
|
|
425
422
|
"OCR_ENGINE_API_KEY": "<APILAYER_API_KEY>",
|
|
426
423
|
"SPEECH_TO_TEXT_ENGINE_MODEL": "turbo",
|
|
427
|
-
"SPEECH_TO_TEXT_API_KEY": ""
|
|
428
|
-
"SUPPORT_COMMUNITY": true
|
|
424
|
+
"SPEECH_TO_TEXT_API_KEY": ""
|
|
429
425
|
}
|
|
430
426
|
```
|
|
431
427
|
|
|
432
428
|
With these steps completed, you should be ready to start using SymbolicAI in your projects.
|
|
433
429
|
|
|
434
|
-
> ❗️**NOTE**❗️Our framework allows you to support us train models for local usage by enabling the data collection feature. On application startup we show the terms of services and you can activate or disable this community feature. We do not share or sell your data to 3rd parties and only use the data for research purposes and to improve your user experience. To change this setting open the `symai.config.json` and turn it on/off by setting the `SUPPORT_COMMUNITY` property to `True/False` via the config file or the respective environment variable.
|
|
435
|
-
|
|
436
430
|
> ❗️**NOTE**❗️By default, the user warnings are enabled. To disable them, export `SYMAI_WARNINGS=0` in your environment variables.
|
|
437
431
|
|
|
438
432
|
### Running tests
|
|
@@ -1,42 +1,36 @@
|
|
|
1
1
|
symai/TERMS_OF_SERVICE.md,sha256=HN42UXVI_wAVDHjMShzy_k7xAsbjXaATNeMKcIte_eg,91409
|
|
2
|
-
symai/__init__.py,sha256=
|
|
2
|
+
symai/__init__.py,sha256=P9fADfIIeSF_rI1YQUhBHQIMieDgvLt-QM4KvOKtvt4,15612
|
|
3
3
|
symai/chat.py,sha256=DCEbmZ96wv-eitAVt6-oF6PT3JM3cT59Iy3r2Hucd_M,14100
|
|
4
|
-
symai/components.py,sha256=
|
|
4
|
+
symai/components.py,sha256=SsGl8Cs-AQcPZjFyTv4IB3ATz8evRiVwTBH7k2umVSo,75391
|
|
5
5
|
symai/constraints.py,sha256=ljjB9p0qK4DrDl_u5G_Y-Y6WAH5ZHANIqLLxRtwcORs,1980
|
|
6
6
|
symai/context.py,sha256=4M69MJOeWSdPTr2Y9teoNTs-nEvpzcAcr7900UgORXA,189
|
|
7
7
|
symai/core.py,sha256=gI9qvTT0Skq2D0izdhAoN3RdwBtWei59KO52mKN1Sos,70420
|
|
8
8
|
symai/core_ext.py,sha256=lS_BZNeUGmNhhXR-F3dFLF26_nZHq3NVaAwa4vAbkTQ,8937
|
|
9
9
|
symai/exceptions.py,sha256=BxpxI8q3-7Uh_Kg9Xi2PhF6RR6CofxV1h8R07j4v47U,165
|
|
10
|
-
symai/functional.py,sha256=
|
|
10
|
+
symai/functional.py,sha256=GqBs5FZPVZ3iVJ-MlO0Zvkf7cNSDgVhkt3tsL82kFrM,21457
|
|
11
11
|
symai/imports.py,sha256=P5WsamkfKxsK3fs8vlrFpC6CIv5WVpMIMNue9DKJGnE,16126
|
|
12
|
-
symai/interfaces.py,sha256=
|
|
12
|
+
symai/interfaces.py,sha256=M84QPVXABh0Pt7WlG3hxB6Rw8lSceuABKdUqbR_98Ok,3584
|
|
13
13
|
symai/memory.py,sha256=Cd60UyeJk7SHNBWEYOLrmUXQy54GzQsu3Mjh0lfNQOY,3716
|
|
14
14
|
symai/post_processors.py,sha256=_GK53qpc2SyjecmEO5bWr162mWZcK_jUDPOcPvlwrHY,7818
|
|
15
15
|
symai/pre_processors.py,sha256=9YwhNajIUux7B5usl0To9Az3J2teuDLxPsMsTBShqwI,16763
|
|
16
16
|
symai/processor.py,sha256=FsR7rIjm6NlestgX3dVOLtvQJcGNpJaogtPyi3I1PR4,1648
|
|
17
17
|
symai/prompts.py,sha256=cF3FauHfl0ZiBW-6DEE50wx_elNN7PBTbbmlVCr7nzQ,93743
|
|
18
18
|
symai/shell.py,sha256=iEQ-dGGPSm7ZDaaC3I7RwnzgA8X9yHBzPD0TouBk3AU,6487
|
|
19
|
-
symai/shellsv.py,sha256=
|
|
19
|
+
symai/shellsv.py,sha256=rdKwBRqTT0k81LgMi0qshD4z8ucYL5iDCN4MOCgvEa8,39581
|
|
20
20
|
symai/strategy.py,sha256=BQTXRnBv57fYO47A--WA6KK1oqGmf9Aijm0p4a_vvqY,45004
|
|
21
21
|
symai/symbol.py,sha256=s5CYwP5SGcRUzZ7TlakZFpKBX_Q0mwPQKRbv4pC3sxM,40443
|
|
22
22
|
symai/symsh.md,sha256=QwY_-fX0Ge7Aazul0xde2DuF2FZLw_elxrkXR3kuKDQ,1245
|
|
23
23
|
symai/utils.py,sha256=m4iQzxclkPAUSDderTO_OK2fKznJ69pLfbBcTYq4p70,10824
|
|
24
24
|
symai/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
|
-
symai/backend/base.py,sha256=
|
|
25
|
+
symai/backend/base.py,sha256=z60M_4Hmg_0afCv8l6iQJ1bOTO_HCPbJze16GPNDpJo,6420
|
|
26
26
|
symai/backend/settings.py,sha256=T5iUAV8aGLnQy9iRTvUDJq49LGobiSHPGV1HqBHjkEg,6181
|
|
27
|
-
symai/backend/driver/webclient.py,sha256=VDFb0KACENTyZuZTLkPMYHUSlpyDeqzJS2ydV7l4_9A,7854
|
|
28
27
|
symai/backend/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
29
|
-
symai/backend/engines/crawler/engine_selenium.py,sha256=daCEXYh7WSlwbJypM-51rrOmjm4tjOYz2trmSL9iJ28,3267
|
|
30
28
|
symai/backend/engines/drawing/engine_bfl.py,sha256=7ccDpnjld5G3qIA8k6OafSm6c_WHrcCW1RfNsKbKKXs,4419
|
|
31
|
-
symai/backend/engines/drawing/
|
|
29
|
+
symai/backend/engines/drawing/engine_gemini_image.py,sha256=GE4dSE0zmhLOrs5HBhwaS6wbYVL_xLrJ4475oasxEVw,3840
|
|
32
30
|
symai/backend/engines/drawing/engine_gpt_image.py,sha256=aXaHQrug-_SuQ9A2CqOS8WVm9r6CifnxnMaXTAJl9g8,8049
|
|
33
31
|
symai/backend/engines/embedding/engine_llama_cpp.py,sha256=wKWe1hEpNKFiKaDo8-p5mAq1JbFQXpE8iDAWHGimHEk,5438
|
|
34
|
-
symai/backend/engines/embedding/engine_openai.py,sha256=
|
|
35
|
-
symai/backend/engines/embedding/engine_plugin_embeddings.py,sha256=TLOaYAw_1AWMwqcHydP41aWIYSGhguOJgI0rMu1Fl00,623
|
|
32
|
+
symai/backend/engines/embedding/engine_openai.py,sha256=BwKpwmsE7xUvuutRInxZ1anBk7W8jltIMNC6qBbtH5g,3543
|
|
36
33
|
symai/backend/engines/execute/engine_python.py,sha256=WaB4rx9CMnqd88FfZUTRDLOju9IB9hKxnQ88lBwq_2s,3576
|
|
37
|
-
symai/backend/engines/experiments/engine_bard_wrapper.py,sha256=RTRLg5kAq1yKMkgNC8xj9kzOtkeoOANrXzHejKp2haM,5276
|
|
38
|
-
symai/backend/engines/experiments/engine_gptfinetuner.py,sha256=POQwYj_NKjOBLc83FM1S_WBqHudZyYlDENjNFak6ocY,804
|
|
39
|
-
symai/backend/engines/experiments/engine_llamacpp_completion.py,sha256=Wgq56wH9ZoV-FwdWfok90Yv48Zu4kXHMNDdzFe4mmjc,5268
|
|
40
34
|
symai/backend/engines/files/engine_io.py,sha256=4eYBz44rQYWD7VO6Pn7hVF_cOnqNuolo4O0SYHR1NzI,7424
|
|
41
35
|
symai/backend/engines/imagecaptioning/engine_blip2.py,sha256=8lTzc8sQpuNY4AUb_ZweRKr95v-sFtTykT5ennVf6g0,2915
|
|
42
36
|
symai/backend/engines/imagecaptioning/engine_llavacpp_client.py,sha256=jBsLZv0Laa4tuPyX0VQ7uwyldyO3aYIbbj73WjTbceM,6793
|
|
@@ -44,24 +38,26 @@ symai/backend/engines/index/engine_pinecone.py,sha256=fxCew1ldUdjd9UtqnMuWFDiVz5
|
|
|
44
38
|
symai/backend/engines/index/engine_qdrant.py,sha256=U9p0kzYvHE4DjFgxnvnG_8xfEoP_W4dpaBGY5gTFMF4,50994
|
|
45
39
|
symai/backend/engines/index/engine_vectordb.py,sha256=xXU8QaC2BX9O4dDjDCVYgWO4PxQMpmNlhtal6UVtV0o,8541
|
|
46
40
|
symai/backend/engines/lean/engine_lean4.py,sha256=ln5nbQn5szq8nRulbREPLCPQ5bwjM_A5XAGMkfzPdT8,10102
|
|
47
|
-
symai/backend/engines/neurosymbolic/__init__.py,sha256=
|
|
41
|
+
symai/backend/engines/neurosymbolic/__init__.py,sha256=zEjkuxtzBQdxx-b1aXzooCatA43Rrlo9jAyZZfRYNzM,2608
|
|
48
42
|
symai/backend/engines/neurosymbolic/engine_anthropic_claudeX_chat.py,sha256=WyuskobMjf9ynxRWUnXk55DUMUN7qv7jT1nbZP3Bx9o,21054
|
|
49
43
|
symai/backend/engines/neurosymbolic/engine_anthropic_claudeX_reasoning.py,sha256=thEPDh8H-5XrsADF0mVTWB6m_dJgKeTT49HvyCGJcQM,21291
|
|
50
44
|
symai/backend/engines/neurosymbolic/engine_cerebras.py,sha256=ki84Qh7hdxaKn--UgMMUvAEoqJos7VeKtkka6XpHI3g,13336
|
|
51
45
|
symai/backend/engines/neurosymbolic/engine_deepseekX_reasoning.py,sha256=_k0hy5dUxkbNP9vgF4R780A6THtjfcCJ_xUnkPvPRNw,9299
|
|
52
|
-
symai/backend/engines/neurosymbolic/engine_google_geminiX_reasoning.py,sha256=
|
|
46
|
+
symai/backend/engines/neurosymbolic/engine_google_geminiX_reasoning.py,sha256=pvsUNtWYwvFXt8EEy5ed0V4xE4EE0IZ4f7Uw5jV3OF0,28333
|
|
53
47
|
symai/backend/engines/neurosymbolic/engine_groq.py,sha256=pliezi4X1LP-XdnJirjlI2nCXC8S2pex8fZalNlkKWw,13122
|
|
54
48
|
symai/backend/engines/neurosymbolic/engine_huggingface.py,sha256=dLKFPoNpnFgS_uQJJ2bXPEBtnMR_sLcYYtqgILzbLcg,8208
|
|
55
49
|
symai/backend/engines/neurosymbolic/engine_llama_cpp.py,sha256=CWy1aqqV-NFey0b9sr_uKDEYt16pSuP831IFuN4PhrU,14144
|
|
56
50
|
symai/backend/engines/neurosymbolic/engine_openai_gptX_chat.py,sha256=FfNkesV64d3gf7MWKf2PoK5nUjetS2MndTbWhE1KieE,28267
|
|
57
|
-
symai/backend/engines/neurosymbolic/engine_openai_gptX_completion.py,sha256=YgxRoitmDz2de_W7rkhVXYEkDqTJQlgxK4f8tWlt88Q,13840
|
|
58
51
|
symai/backend/engines/neurosymbolic/engine_openai_gptX_reasoning.py,sha256=yWiCT_jHHQGs2_YqRhSRvVFxQFXGb1TwvXf2zZWoStU,27171
|
|
59
52
|
symai/backend/engines/neurosymbolic/engine_openai_responses.py,sha256=J3P7WcQhxWSPK99uZuLClpIDlLRqLJFWYwDJHrBKox4,17830
|
|
53
|
+
symai/backend/engines/neurosymbolic/engine_openrouter.py,sha256=Kmmx_9ifE-uP_Pua2saegcCQs3gkU4J7er12qiWxKjI,11991
|
|
60
54
|
symai/backend/engines/ocr/engine_apilayer.py,sha256=UpC3oHBdSM6wlPVqxwMkemBd-Y0ReVwc270O_EVbRD0,2267
|
|
61
55
|
symai/backend/engines/output/engine_stdout.py,sha256=BWNXACl5U-WYIJnT1pZNwZsTRMzP1XzA0A7o693mmyQ,899
|
|
62
|
-
symai/backend/engines/scrape/engine_requests.py,sha256=
|
|
56
|
+
symai/backend/engines/scrape/engine_requests.py,sha256=uXQ8PGeRN2OyM0_ioEI61rkv5PqSBE0wayAJNS7s8ZA,15819
|
|
57
|
+
symai/backend/engines/search/__init__.py,sha256=iW6kEBOZ-gUiPYfcIWupNgewiqLrFOBGJ643kqwQFoM,274
|
|
58
|
+
symai/backend/engines/search/engine_firecrawl.py,sha256=M_nxXBtvudNqRR4gTC5dXoJzf_9ofrMScYXzaGVTmaM,11990
|
|
63
59
|
symai/backend/engines/search/engine_openai.py,sha256=hAEu3vPZzLTvgmNc4BSZDTcNb4ek4xYeOf8xgti2zRs,14248
|
|
64
|
-
symai/backend/engines/search/engine_parallel.py,sha256=
|
|
60
|
+
symai/backend/engines/search/engine_parallel.py,sha256=voMmeJZ5bf1x3pt7uxMJu84z6VLLG0-ZfgFUWvhM-vI,27048
|
|
65
61
|
symai/backend/engines/search/engine_perplexity.py,sha256=rXnZjMCSiIRuJcNSchE58-f9zWJmYpkKMHONF_XwGnk,4100
|
|
66
62
|
symai/backend/engines/search/engine_serpapi.py,sha256=ZJJBnEDoLjkpxWt_o4vFZanwqojH8ZFBWmWNnEaIbww,3618
|
|
67
63
|
symai/backend/engines/speech_to_text/engine_local_whisper.py,sha256=EOUh2GCeEhZ2Av72i_AZ4NSj9e46Pl7Ft6sIErFy6FI,8387
|
|
@@ -69,17 +65,14 @@ symai/backend/engines/symbolic/engine_wolframalpha.py,sha256=mTH0N4rA0gMffSBLjf2
|
|
|
69
65
|
symai/backend/engines/text_to_speech/engine_openai.py,sha256=AtY0mDvIM_yZQ6AgYNXuyinZr_OaMK7XiPLQ6fe6RBo,2013
|
|
70
66
|
symai/backend/engines/text_vision/engine_clip.py,sha256=hU9vsHtKPpQYEoESyjuGXOzMhUNhvspYMCNkCAqn2x8,3648
|
|
71
67
|
symai/backend/engines/userinput/engine_console.py,sha256=fDO6PRQI3NYZ_nHVXDFIsS9cFDRv3aTOfv8h5a360jc,743
|
|
72
|
-
symai/backend/mixin/__init__.py,sha256=
|
|
68
|
+
symai/backend/mixin/__init__.py,sha256=LMeNSxy0Uwn3CSSImgGcRal7JpZqIxP9I1lw0C4sLJ0,1539
|
|
73
69
|
symai/backend/mixin/anthropic.py,sha256=GdHimGqiJcA21Jo797ZEeFzotRpCOJdBJQIChl_6NJI,2403
|
|
74
70
|
symai/backend/mixin/cerebras.py,sha256=MEc9vQ6G4KWWrt0NFjdt2y0rojhtBidwa_n4M8Z5EKI,215
|
|
75
71
|
symai/backend/mixin/deepseek.py,sha256=7TnyqXQb2t6r6-hzOClPzxfO2d7TShYC989Lmn_YTzM,414
|
|
76
72
|
symai/backend/mixin/google.py,sha256=N1xxrrTcQkcKJtdPbRorev6dfJ1F65I5XavrGR06GN4,494
|
|
77
73
|
symai/backend/mixin/groq.py,sha256=at6yFLa35Js8o7D8p_-Y4NjOPJI-lH8yx6tsCDrEy6M,227
|
|
78
74
|
symai/backend/mixin/openai.py,sha256=7uFu-cRYvWPWGK0fxLh-wzW0FwNTvfWUde68yngXPtw,5810
|
|
79
|
-
symai/
|
|
80
|
-
symai/collect/dynamic.py,sha256=72oEdshjue3t_Zs_3D08bhHPKN5mKAw0HEucWAFlqVI,3833
|
|
81
|
-
symai/collect/pipeline.py,sha256=eyxqqNpa1P5xEL50WgUZT6Z-MRocuLRBqexkVIqWqv8,5360
|
|
82
|
-
symai/collect/stats.py,sha256=iqawGMul_ltSKvE9oAMafy1cC2ZxwiP3THEmzpmo7JU,15040
|
|
75
|
+
symai/backend/mixin/openrouter.py,sha256=LOnY6OwueynvLPbtWekvbTDxFElmljTzuDX3ZHppXOA,92
|
|
83
76
|
symai/endpoints/__init__py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
84
77
|
symai/endpoints/api.py,sha256=jW_gcYcSoEUNy-Qbpt4OEL0PxWMInvdirYW9DSyPoAY,19826
|
|
85
78
|
symai/extended/.DS_Store,sha256=0W9Q0cbPawSN2y5DkK995aaAclHC732Z53ARDbUN21k,6148
|
|
@@ -88,7 +81,6 @@ symai/extended/api_builder.py,sha256=0meiKYt3IBbPsRxiDDwXETG-wL0W9IAIBOydJ-XkO5g
|
|
|
88
81
|
symai/extended/arxiv_pdf_parser.py,sha256=w_EWssS75g9hHYGwP3P1QVu-osPEq5KLSjPtk2Wwx8I,2297
|
|
89
82
|
symai/extended/bibtex_parser.py,sha256=j3HNe3-wPMUCtV8_1DXnRswEnvG9elWqozxqTMRaBIg,3749
|
|
90
83
|
symai/extended/conversation.py,sha256=OXE8j27Qg0wQ181ZkqQcWurS0CQzi9r_xZbeoDd1HrY,14100
|
|
91
|
-
symai/extended/crawler.py,sha256=DcnXbCmCjh-TPdc6NxOw9f-SMEaE5HkekiciIxuM5fo,734
|
|
92
84
|
symai/extended/document.py,sha256=RoPCqPq2ETaaLlG7S0Lj8-GpQLWb3HFklmJAtrc3yTU,3571
|
|
93
85
|
symai/extended/file_merger.py,sha256=Sb0Y0rbLTyxH3n2-tqVZbkSyGe6A20_QqGcelHg58l4,3736
|
|
94
86
|
symai/extended/graph.py,sha256=mKR-aJWWqUZBi-X8AIn1CMpOWZXymmKrXFJC4E2SPdQ,3666
|
|
@@ -106,6 +98,7 @@ symai/extended/interfaces/clip.py,sha256=l6vjEq3cF-wDX9cRPulyiKpDFQB8QI2609GcGtv
|
|
|
106
98
|
symai/extended/interfaces/console.py,sha256=qeAnG80f95ArADjfpk57AaDA1cHUQSkaUrau2zGNSKs,637
|
|
107
99
|
symai/extended/interfaces/dall_e.py,sha256=SSF1K17SzA-lpdHVtsfHbwRCP6XJxWqsNdXoWwcBYjw,551
|
|
108
100
|
symai/extended/interfaces/file.py,sha256=1_BXHKsHm78MmBeRolA_fFWFTLuA6on7Le-ZF4S_1ds,457
|
|
101
|
+
symai/extended/interfaces/firecrawl.py,sha256=hGA5WxiW6EN5LNsfBSlsYzASgvz9e515TWrHGHcE21s,955
|
|
109
102
|
symai/extended/interfaces/flux.py,sha256=LTY_I9UtIxnh3Nc4cBPQhQ6upB6CVZIhc1uOnFpxEIo,532
|
|
110
103
|
symai/extended/interfaces/gpt_image.py,sha256=Jk5-9og440eZeRAhKmjdyhwP22wX58q0NcFuVhIFWZQ,718
|
|
111
104
|
symai/extended/interfaces/input.py,sha256=CFMLf2j_a-rZ1ApaEwfgqZmWVS7_1yj_u6iiqtiOGPs,456
|
|
@@ -113,17 +106,16 @@ symai/extended/interfaces/llava.py,sha256=yCItfGYSk35RazhEfHR4R324h-R6W5DjZYeJBo
|
|
|
113
106
|
symai/extended/interfaces/local_search.py,sha256=AHHRsYCUm4VttGSl_HAk5kpH34e0x_uzvgy1OXSubSs,2408
|
|
114
107
|
symai/extended/interfaces/naive_scrape.py,sha256=KPjTSBXSCr5zwHwIPgF-VwLSTD2OjVcL4xALNX4l9-4,682
|
|
115
108
|
symai/extended/interfaces/naive_vectordb.py,sha256=fm7DBMYYnSx7Ma7eNnCmuOVyQwNGnkiDR31oV-qNrJA,1348
|
|
109
|
+
symai/extended/interfaces/nanobanana.py,sha256=nqMCuYG5Cw1xbhSTQTPqvJ6moexsR9Au0LKWYJgae6g,614
|
|
116
110
|
symai/extended/interfaces/ocr.py,sha256=MMxgp8ZKoM44doJPZzzrBVh2VxChs6faFu2uFYnbzfU,563
|
|
117
111
|
symai/extended/interfaces/openai_search.py,sha256=UvnSihdfIwybrLDz2A-yt92aklHEHIvh0pt0hp1Dpis,528
|
|
118
|
-
symai/extended/interfaces/parallel.py,sha256=
|
|
112
|
+
symai/extended/interfaces/parallel.py,sha256=kWRcrs_vTPvZDDhKjl1Hp94ltZeiYH7K8l9zOy5jd-I,947
|
|
119
113
|
symai/extended/interfaces/perplexity.py,sha256=vSUl8CfBsFhFrzxws9Lf8WgfhsoPatJf7eYRfihKRG4,529
|
|
120
114
|
symai/extended/interfaces/pinecone.py,sha256=NA2t1pNQf-G-HSeewEO8jqGnitD3huBV5bucIM9vgi4,1075
|
|
121
115
|
symai/extended/interfaces/python.py,sha256=EcxXQwrlhjGOS5SkRoa_cVt069vu_INDD9DIfbnUses,418
|
|
122
|
-
symai/extended/interfaces/selenium.py,sha256=nAhIZZjhmz2fsFIXytk9WNfGLy1OqlVytA-ipHZj3JM,660
|
|
123
116
|
symai/extended/interfaces/serpapi.py,sha256=wbUisiYof-y5660dMU5DDTmbiUSd3rvDaYEvMkPTgwM,523
|
|
124
117
|
symai/extended/interfaces/terminal.py,sha256=U-uXJc320wGEMWwsByVAyIzB3Puioeshcr9oKhtTV6Q,378
|
|
125
118
|
symai/extended/interfaces/tts.py,sha256=uVTMXzkpOEdxSknXCihhfXvBnvadrMwIubeBB2_VVck,475
|
|
126
|
-
symai/extended/interfaces/vectordb.py,sha256=Lou8XPScqDWPXEpxhIOzdRqonGVAJ2kriedVjSNSbo8,1022
|
|
127
119
|
symai/extended/interfaces/whisper.py,sha256=sk2D6gAYREOe6nRMp7ArcnO-ENOp4GV97AsyZrm65mI,546
|
|
128
120
|
symai/extended/interfaces/wolframalpha.py,sha256=6Q9X8OGokHeMphhZf3ZT0RuSFivx5fwwLxU9bH0xe00,488
|
|
129
121
|
symai/extended/metrics/__init__.py,sha256=HuHm0ZSF7SidYgZTAu8ZbZ05i5BgspoiCeELtapP-Ig,296
|
|
@@ -132,18 +124,6 @@ symai/extended/packages/__init__.py,sha256=_SzkRPEiIxP3kAW-I5mve7o7UMJsIFavLTKQm
|
|
|
132
124
|
symai/extended/packages/symdev.py,sha256=aVcqRLOZRf9awAClBlg_0cPVjAqTnWhmSPGWGCeQO1g,3826
|
|
133
125
|
symai/extended/packages/sympkg.py,sha256=EFNrpvNJwYun0ridPcqK_LXHZOdsugKu5P6cJUBDvbk,3951
|
|
134
126
|
symai/extended/packages/symrun.py,sha256=39QEDCJJWaeBT7NGf_qre-ij2BVRmjy06o1PCDhqyQU,6338
|
|
135
|
-
symai/extended/personas/__init__.py,sha256=XoP39SRSxXiyiAI3frj6hFb3wzc9Vu5gRcIJBqzIlEo,95
|
|
136
|
-
symai/extended/personas/builder.py,sha256=VvTPB4ar93ESRSbhOtfODMuQOAed7pvdLeX1HOJlGUs,3248
|
|
137
|
-
symai/extended/personas/dialogue.py,sha256=zci4X6ksGHSc49KPUCaoLeLJYyhG8ibacsGOwnZpcJA,6404
|
|
138
|
-
symai/extended/personas/persona.py,sha256=uy0B0R6OsvG9LTOe-vL06OfiDxZgN01tnvJiIMU_rHk,6612
|
|
139
|
-
symai/extended/personas/research/__init__.py,sha256=3slSnilDyPcyXfSEoyYEatGnkjt4AkRgyUvSjaNNhO4,33
|
|
140
|
-
symai/extended/personas/research/yann_lecun.py,sha256=lhhOX8MOX3DqU-1o2YDYo5GYaz9A_r_rI9gfw1Z3uuA,3876
|
|
141
|
-
symai/extended/personas/sales/__init__.py,sha256=g2G5ove8tntwhBxoGQaE4J1C69thTBS5lbrqj-z3Wfc,33
|
|
142
|
-
symai/extended/personas/sales/erik_james.py,sha256=n0D-bKZF1QxeS2XXQ7bOlRv_P60tIK8D6zBr8TsvYMg,5273
|
|
143
|
-
symai/extended/personas/student/__init__.py,sha256=vn9SviFVdrNqLpln1lu5QUeQf-oE7LDwuTKaPsBkIJU,33
|
|
144
|
-
symai/extended/personas/student/max_tenner.py,sha256=rp10Ijim6upo5s_DHj9tzsSfZWgDUaf2HgsgUeCRkT4,3422
|
|
145
|
-
symai/extended/strategies/__init__.py,sha256=L_FSTzP4jCDjh8lvUBMk9fhc14W7_HwiOLRIQM7Gjzk,31
|
|
146
|
-
symai/extended/strategies/cot.py,sha256=sOf3KrmG3M2IL1kpmS1FislbmnWWwyh9GzgHrkmYWgw,1800
|
|
147
127
|
symai/formatter/__init__.py,sha256=CKr_aAmIwqaKPi4kvS9MCF3ghe68QMeGBVvOyB1qlD4,269
|
|
148
128
|
symai/formatter/emoji.pytxt,sha256=D7FMnAar7UMBZnVoPIa_drnv8thIM8r0KNq_BkQ0k8k,13498
|
|
149
129
|
symai/formatter/formatter.py,sha256=f0JDbxctzvSwWi8gYUrMj7Buo93x2cV4k1T-4PHuEIQ,8451
|
|
@@ -158,14 +138,14 @@ symai/models/base.py,sha256=NZ9fjkoQlMA1fN9YroSwImm7RqpH0mQ7zTaJAsPYzgE,44741
|
|
|
158
138
|
symai/models/errors.py,sha256=nEbViXJ7RoVgs6nU3nbfz6Esy_pd4IB5MaggcLLOcdI,910
|
|
159
139
|
symai/ops/__init__.py,sha256=bQneuCvcJkRF_VoM-uJXHeSbmGS2ewfNJP6zRO49e2s,1155
|
|
160
140
|
symai/ops/measures.py,sha256=HAr5rMCKCcKErmwaPa751vM35L_KJ3fL86Pn6x47GmY,3651
|
|
161
|
-
symai/ops/primitives.py,sha256=
|
|
141
|
+
symai/ops/primitives.py,sha256=1G3tvY9t0T6OIkwh9kU9N7veYWugFZCIrNxHLbz9_tY,115584
|
|
162
142
|
symai/server/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
163
143
|
symai/server/huggingface_server.py,sha256=wSAVqFiKQsCu5UB2YYVpxJBhJ7GgQBBfePxNi265yP8,9039
|
|
164
144
|
symai/server/llama_cpp_server.py,sha256=-WPTNB2cbnwtnpES4AtPM__MCasDKl83jr94JGS9tmI,2144
|
|
165
145
|
symai/server/qdrant_server.py,sha256=l4r4rz29c7cO1dapXO0LQ4sHW4WF44keuz7j8v5azMc,9854
|
|
166
|
-
symbolicai-1.
|
|
167
|
-
symbolicai-1.
|
|
168
|
-
symbolicai-1.
|
|
169
|
-
symbolicai-1.
|
|
170
|
-
symbolicai-1.
|
|
171
|
-
symbolicai-1.
|
|
146
|
+
symbolicai-1.6.0.dist-info/licenses/LICENSE,sha256=9vRFudlJ1ghVfra5lcCUIYQCqnZSYcBLjLHbGRsrQCs,1505
|
|
147
|
+
symbolicai-1.6.0.dist-info/METADATA,sha256=efGH2KBd8r1A30XkrgOgIHHF3tg8KwgPFG_TtgOtOCc,22946
|
|
148
|
+
symbolicai-1.6.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
149
|
+
symbolicai-1.6.0.dist-info/entry_points.txt,sha256=JV5sdydIfUZdDF6QBEQHiZHod6XNPjCjpWQrXh7gTAw,261
|
|
150
|
+
symbolicai-1.6.0.dist-info/top_level.txt,sha256=bOoIDfpDIvCQtQgXcwVKJvxAKwsxpxo2IL4z92rNJjw,6
|
|
151
|
+
symbolicai-1.6.0.dist-info/RECORD,,
|
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
|
|
3
|
-
os.environ['WDM_LOG'] = 'false' # disable webdriver-manager logging
|
|
4
|
-
|
|
5
|
-
import logging
|
|
6
|
-
|
|
7
|
-
logging.getLogger('WDM').setLevel(logging.NOTSET)
|
|
8
|
-
|
|
9
|
-
import random
|
|
10
|
-
import re
|
|
11
|
-
import sys
|
|
12
|
-
import time
|
|
13
|
-
import urllib.request
|
|
14
|
-
import warnings
|
|
15
|
-
|
|
16
|
-
from random import choice
|
|
17
|
-
|
|
18
|
-
try:
|
|
19
|
-
warnings.filterwarnings('ignore', module='chromedriver')
|
|
20
|
-
warnings.filterwarnings('ignore', module='selenium')
|
|
21
|
-
from selenium import webdriver
|
|
22
|
-
from selenium.webdriver.remote.remote_connection import LOGGER
|
|
23
|
-
from webdriver_manager.firefox import GeckoDriverManager
|
|
24
|
-
from selenium.webdriver.firefox.options import Options as FirefoxOptions
|
|
25
|
-
from selenium.webdriver.firefox.service import Service as FirefoxService
|
|
26
|
-
from webdriver_manager.chrome import ChromeDriverManager
|
|
27
|
-
from selenium.webdriver.chrome.options import Options as ChromeOptions
|
|
28
|
-
from selenium.webdriver.chrome.service import Service as ChromeService
|
|
29
|
-
from webdriver_manager.microsoft import EdgeChromiumDriverManager
|
|
30
|
-
from selenium.webdriver.edge.options import Options as EdgeOptions
|
|
31
|
-
from selenium.webdriver.edge.service import Service as EdgeService
|
|
32
|
-
from selenium.common.exceptions import WebDriverException
|
|
33
|
-
|
|
34
|
-
LOGGER.setLevel(logging.ERROR)
|
|
35
|
-
|
|
36
|
-
except Exception as e:
|
|
37
|
-
webdriver = None
|
|
38
|
-
if "No module named 'selenium'" in str(e):
|
|
39
|
-
print(f"ERROR: {e}")
|
|
40
|
-
print(f"ERROR: Please install selenium with `pip install selenium`")
|
|
41
|
-
else:
|
|
42
|
-
print(f"ERROR: {e}")
|
|
43
|
-
|
|
44
|
-
from ... import __root_dir__
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class Proxy(object):
|
|
48
|
-
def __init__(self, host, port):
|
|
49
|
-
self.host = host
|
|
50
|
-
self.port = port
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
class add_path():
|
|
54
|
-
def __init__(self, path):
|
|
55
|
-
self.path = path
|
|
56
|
-
|
|
57
|
-
def __enter__(self):
|
|
58
|
-
sys.path.insert(0, self.path)
|
|
59
|
-
|
|
60
|
-
def __exit__(self, exc_type, exc_value, traceback):
|
|
61
|
-
try:
|
|
62
|
-
sys.path.remove(self.path)
|
|
63
|
-
except ValueError:
|
|
64
|
-
pass
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
def wait_for(condition_function, timeout):
|
|
68
|
-
start_time = time.time()
|
|
69
|
-
while time.time() < start_time + timeout:
|
|
70
|
-
if condition_function():
|
|
71
|
-
return True
|
|
72
|
-
else:
|
|
73
|
-
time.sleep(0.1)
|
|
74
|
-
raise Exception(f'Server does not respond to request with appropriate content. Check link or script.')
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
class page_loaded(object):
|
|
78
|
-
def __init__(self, driver, check_pattern, timeout=3, debug=False):
|
|
79
|
-
self.check_pattern = check_pattern
|
|
80
|
-
self.driver = driver
|
|
81
|
-
self.timeout = timeout
|
|
82
|
-
self.debug = debug
|
|
83
|
-
|
|
84
|
-
def __enter__(self):
|
|
85
|
-
pass
|
|
86
|
-
|
|
87
|
-
def page_has_loaded(self):
|
|
88
|
-
if self.debug: print(self.driver.page_source)
|
|
89
|
-
return re.search(self.check_pattern, self.driver.page_source)
|
|
90
|
-
|
|
91
|
-
def __exit__(self, *_):
|
|
92
|
-
wait_for(self.page_has_loaded, timeout=self.timeout)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
def add_options(options, proxy):
|
|
96
|
-
if proxy: options.add_argument(f"--proxy-server=socks5://{proxy.host}:{proxy.port}")
|
|
97
|
-
options.add_argument('--ignore-certificate-errors')
|
|
98
|
-
options.add_argument('--incognito')
|
|
99
|
-
options.add_argument("--headless")
|
|
100
|
-
options.add_argument("--log-level=3")
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
def _connect_brower(debug, proxy=None):
|
|
104
|
-
assert webdriver is not None, "selenium is not installed"
|
|
105
|
-
|
|
106
|
-
try:
|
|
107
|
-
options = ChromeOptions()
|
|
108
|
-
add_options(options, proxy)
|
|
109
|
-
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=options)
|
|
110
|
-
except Exception as e1:
|
|
111
|
-
try:
|
|
112
|
-
print(f"ERROR REMEDY: Trying to use Chrome as an alternative.")
|
|
113
|
-
options = FirefoxOptions()
|
|
114
|
-
add_options(options, proxy)
|
|
115
|
-
driver = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()), options=options)
|
|
116
|
-
except Exception as e2:
|
|
117
|
-
print(f"Issue with finding an appropriate driver version. Your current browser might be newer than the driver. Please either downgrade Chrome or try to install a proper chromedriver manually.\nOriginal error: {e1}; Remedy attempt error: {e2}")
|
|
118
|
-
try:
|
|
119
|
-
print(f"ERROR REMEDY: Trying to use Edge as an alternative.")
|
|
120
|
-
options = EdgeOptions()
|
|
121
|
-
if proxy: options.add_argument(f"--proxy-server=socks5://{proxy.host}:{proxy.port}")
|
|
122
|
-
add_options(options, proxy)
|
|
123
|
-
driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()), options=options)
|
|
124
|
-
except Exception as e3:
|
|
125
|
-
print(f"Issue with finding an appropriate driver version. Your current browser might be newer than the driver. Please either downgrade Chrome or try to install a proper chromedriver manually.\nOriginal error: {e1}; Remedy attempt error: {e2}; Second remedy attempt error: {e3}")
|
|
126
|
-
raise e3 from e2
|
|
127
|
-
if debug: print("Chrome Headless Browser Invoked")
|
|
128
|
-
|
|
129
|
-
return driver
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
def connect_browsers(debug, proxy):
|
|
133
|
-
assert webdriver is not None, "selenium is not installed"
|
|
134
|
-
class BrowserHandler(object):
|
|
135
|
-
def __init__(self, debug):
|
|
136
|
-
self.browsers = [_connect_brower(debug, proxy=proxy)]
|
|
137
|
-
def __call__(self):
|
|
138
|
-
return choice(self.browsers)
|
|
139
|
-
return BrowserHandler(debug)
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
def dump_page_source(driver, file_path="dump.log"):
|
|
143
|
-
with open(file_path, "wb") as err_file:
|
|
144
|
-
err_file.write(driver.page_source.encode("utf-8"))
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
def contains_text(check_pattern, search_pattern, link, driver_handler, script=None, debug=False, args=None):
|
|
149
|
-
driver = driver_handler()
|
|
150
|
-
try:
|
|
151
|
-
driver.get(link)
|
|
152
|
-
except WebDriverException as e:
|
|
153
|
-
print(f"ERROR: {e}")
|
|
154
|
-
print(f"ERROR: Please install a proper driver for your browser. You can find the appropriate driver here: https://selenium-python.readthedocs.io/installation.html#drivers")
|
|
155
|
-
return False
|
|
156
|
-
with page_loaded(driver, check_pattern, debug=debug):
|
|
157
|
-
if script is not None: script(driver, args)
|
|
158
|
-
rsp = re.search(search_pattern, driver.page_source)
|
|
159
|
-
return True if rsp else False
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
def download_images(driver, args):
|
|
163
|
-
src = driver.find_element_by_xpath("//div[@class='bRMDJf islir']/descendant-or-self::*[img]").get_attribute("src")
|
|
164
|
-
imgs = driver.find_elements_by_tag_name('img')
|
|
165
|
-
p = args[0]
|
|
166
|
-
uri = []
|
|
167
|
-
for i in imgs:
|
|
168
|
-
data = i.get_attribute("src")
|
|
169
|
-
if data and data.startswith('data'):
|
|
170
|
-
response = urllib.request.urlopen(data)
|
|
171
|
-
n = i.get_attribute("data-iml")
|
|
172
|
-
if n:
|
|
173
|
-
if not os.path.exists(f'data/{p}'):
|
|
174
|
-
os.makedirs(f'data/{p}')
|
|
175
|
-
with open(f'data/{p}/{n}.jpg', 'wb') as f:
|
|
176
|
-
f.write(response.file.read())
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
def run_selenium_test(debug=False):
|
|
180
|
-
proxy = Proxy(host="localhost", port=9050)
|
|
181
|
-
driver_handler = connect_browsers(debug, proxy)
|
|
182
|
-
|
|
183
|
-
max_cnt = 5
|
|
184
|
-
cnt = 0
|
|
185
|
-
now = time.time()
|
|
186
|
-
|
|
187
|
-
with open('data/text_demo.txt', 'r') as f:
|
|
188
|
-
text = f.read().replace('\n', '')\
|
|
189
|
-
.replace('.', '')\
|
|
190
|
-
.replace(',', '')
|
|
191
|
-
|
|
192
|
-
print(text)
|
|
193
|
-
#text = "women sitting in the park" #names.get_full_name()
|
|
194
|
-
|
|
195
|
-
# input String
|
|
196
|
-
lst = text.split(' ')
|
|
197
|
-
|
|
198
|
-
while cnt < max_cnt:
|
|
199
|
-
start_pos = random.randint(0, len(lst)-1)
|
|
200
|
-
len_ = random.randint(1, 6)
|
|
201
|
-
seq = lst[start_pos:start_pos+len_]
|
|
202
|
-
pattern = " ".join(seq)
|
|
203
|
-
result = contains_text(check_pattern="Images",
|
|
204
|
-
search_pattern=pattern,
|
|
205
|
-
link=f"https://www.google.com/search?tbm=isch&as_q={pattern}&tbs=isz:lt,islt:4mp,sur:fmc",
|
|
206
|
-
driver_handler=driver_handler,
|
|
207
|
-
debug=True,
|
|
208
|
-
script=download_images,
|
|
209
|
-
args=[pattern])
|
|
210
|
-
timestamp = time.time() - now
|
|
211
|
-
now = time.time()
|
|
212
|
-
print(f"{result} - time: {timestamp}")
|
|
213
|
-
cnt += 1
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
if __name__ == "__main__":
|
|
217
|
-
run_selenium_test(debug=True)
|