symbolicai 1.5.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/mixin/__init__.py +4 -0
- symai/backend/mixin/openrouter.py +2 -0
- symai/components.py +203 -13
- symai/extended/interfaces/nanobanana.py +23 -0
- symai/interfaces.py +2 -0
- symai/ops/primitives.py +0 -18
- symai/shellsv.py +2 -7
- {symbolicai-1.5.0.dist-info → symbolicai-1.6.0.dist-info}/METADATA +2 -9
- {symbolicai-1.5.0.dist-info → symbolicai-1.6.0.dist-info}/RECORD +20 -43
- {symbolicai-1.5.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.5.0.dist-info → symbolicai-1.6.0.dist-info}/entry_points.txt +0 -0
- {symbolicai-1.5.0.dist-info → symbolicai-1.6.0.dist-info}/licenses/LICENSE +0 -0
- {symbolicai-1.5.0.dist-info → symbolicai-1.6.0.dist-info}/top_level.txt +0 -0
|
@@ -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"
|
|
@@ -425,15 +421,12 @@ Example of a configuration file with all engines enabled:
|
|
|
425
421
|
"VISION_ENGINE_MODEL": "openai/clip-vit-base-patch32",
|
|
426
422
|
"OCR_ENGINE_API_KEY": "<APILAYER_API_KEY>",
|
|
427
423
|
"SPEECH_TO_TEXT_ENGINE_MODEL": "turbo",
|
|
428
|
-
"SPEECH_TO_TEXT_API_KEY": ""
|
|
429
|
-
"SUPPORT_COMMUNITY": true
|
|
424
|
+
"SPEECH_TO_TEXT_API_KEY": ""
|
|
430
425
|
}
|
|
431
426
|
```
|
|
432
427
|
|
|
433
428
|
With these steps completed, you should be ready to start using SymbolicAI in your projects.
|
|
434
429
|
|
|
435
|
-
> ❗️**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.
|
|
436
|
-
|
|
437
430
|
> ❗️**NOTE**❗️By default, the user warnings are enabled. To disable them, export `SYMAI_WARNINGS=0` in your environment variables.
|
|
438
431
|
|
|
439
432
|
### Running tests
|
|
@@ -1,7 +1,7 @@
|
|
|
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
|
|
@@ -9,34 +9,28 @@ symai/core_ext.py,sha256=lS_BZNeUGmNhhXR-F3dFLF26_nZHq3NVaAwa4vAbkTQ,8937
|
|
|
9
9
|
symai/exceptions.py,sha256=BxpxI8q3-7Uh_Kg9Xi2PhF6RR6CofxV1h8R07j4v47U,165
|
|
10
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,19 +38,19 @@ 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
56
|
symai/backend/engines/scrape/engine_requests.py,sha256=uXQ8PGeRN2OyM0_ioEI61rkv5PqSBE0wayAJNS7s8ZA,15819
|
|
@@ -71,17 +65,14 @@ symai/backend/engines/symbolic/engine_wolframalpha.py,sha256=mTH0N4rA0gMffSBLjf2
|
|
|
71
65
|
symai/backend/engines/text_to_speech/engine_openai.py,sha256=AtY0mDvIM_yZQ6AgYNXuyinZr_OaMK7XiPLQ6fe6RBo,2013
|
|
72
66
|
symai/backend/engines/text_vision/engine_clip.py,sha256=hU9vsHtKPpQYEoESyjuGXOzMhUNhvspYMCNkCAqn2x8,3648
|
|
73
67
|
symai/backend/engines/userinput/engine_console.py,sha256=fDO6PRQI3NYZ_nHVXDFIsS9cFDRv3aTOfv8h5a360jc,743
|
|
74
|
-
symai/backend/mixin/__init__.py,sha256=
|
|
68
|
+
symai/backend/mixin/__init__.py,sha256=LMeNSxy0Uwn3CSSImgGcRal7JpZqIxP9I1lw0C4sLJ0,1539
|
|
75
69
|
symai/backend/mixin/anthropic.py,sha256=GdHimGqiJcA21Jo797ZEeFzotRpCOJdBJQIChl_6NJI,2403
|
|
76
70
|
symai/backend/mixin/cerebras.py,sha256=MEc9vQ6G4KWWrt0NFjdt2y0rojhtBidwa_n4M8Z5EKI,215
|
|
77
71
|
symai/backend/mixin/deepseek.py,sha256=7TnyqXQb2t6r6-hzOClPzxfO2d7TShYC989Lmn_YTzM,414
|
|
78
72
|
symai/backend/mixin/google.py,sha256=N1xxrrTcQkcKJtdPbRorev6dfJ1F65I5XavrGR06GN4,494
|
|
79
73
|
symai/backend/mixin/groq.py,sha256=at6yFLa35Js8o7D8p_-Y4NjOPJI-lH8yx6tsCDrEy6M,227
|
|
80
74
|
symai/backend/mixin/openai.py,sha256=7uFu-cRYvWPWGK0fxLh-wzW0FwNTvfWUde68yngXPtw,5810
|
|
81
|
-
symai/
|
|
82
|
-
symai/collect/dynamic.py,sha256=72oEdshjue3t_Zs_3D08bhHPKN5mKAw0HEucWAFlqVI,3833
|
|
83
|
-
symai/collect/pipeline.py,sha256=eyxqqNpa1P5xEL50WgUZT6Z-MRocuLRBqexkVIqWqv8,5360
|
|
84
|
-
symai/collect/stats.py,sha256=iqawGMul_ltSKvE9oAMafy1cC2ZxwiP3THEmzpmo7JU,15040
|
|
75
|
+
symai/backend/mixin/openrouter.py,sha256=LOnY6OwueynvLPbtWekvbTDxFElmljTzuDX3ZHppXOA,92
|
|
85
76
|
symai/endpoints/__init__py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
86
77
|
symai/endpoints/api.py,sha256=jW_gcYcSoEUNy-Qbpt4OEL0PxWMInvdirYW9DSyPoAY,19826
|
|
87
78
|
symai/extended/.DS_Store,sha256=0W9Q0cbPawSN2y5DkK995aaAclHC732Z53ARDbUN21k,6148
|
|
@@ -90,7 +81,6 @@ symai/extended/api_builder.py,sha256=0meiKYt3IBbPsRxiDDwXETG-wL0W9IAIBOydJ-XkO5g
|
|
|
90
81
|
symai/extended/arxiv_pdf_parser.py,sha256=w_EWssS75g9hHYGwP3P1QVu-osPEq5KLSjPtk2Wwx8I,2297
|
|
91
82
|
symai/extended/bibtex_parser.py,sha256=j3HNe3-wPMUCtV8_1DXnRswEnvG9elWqozxqTMRaBIg,3749
|
|
92
83
|
symai/extended/conversation.py,sha256=OXE8j27Qg0wQ181ZkqQcWurS0CQzi9r_xZbeoDd1HrY,14100
|
|
93
|
-
symai/extended/crawler.py,sha256=DcnXbCmCjh-TPdc6NxOw9f-SMEaE5HkekiciIxuM5fo,734
|
|
94
84
|
symai/extended/document.py,sha256=RoPCqPq2ETaaLlG7S0Lj8-GpQLWb3HFklmJAtrc3yTU,3571
|
|
95
85
|
symai/extended/file_merger.py,sha256=Sb0Y0rbLTyxH3n2-tqVZbkSyGe6A20_QqGcelHg58l4,3736
|
|
96
86
|
symai/extended/graph.py,sha256=mKR-aJWWqUZBi-X8AIn1CMpOWZXymmKrXFJC4E2SPdQ,3666
|
|
@@ -116,17 +106,16 @@ symai/extended/interfaces/llava.py,sha256=yCItfGYSk35RazhEfHR4R324h-R6W5DjZYeJBo
|
|
|
116
106
|
symai/extended/interfaces/local_search.py,sha256=AHHRsYCUm4VttGSl_HAk5kpH34e0x_uzvgy1OXSubSs,2408
|
|
117
107
|
symai/extended/interfaces/naive_scrape.py,sha256=KPjTSBXSCr5zwHwIPgF-VwLSTD2OjVcL4xALNX4l9-4,682
|
|
118
108
|
symai/extended/interfaces/naive_vectordb.py,sha256=fm7DBMYYnSx7Ma7eNnCmuOVyQwNGnkiDR31oV-qNrJA,1348
|
|
109
|
+
symai/extended/interfaces/nanobanana.py,sha256=nqMCuYG5Cw1xbhSTQTPqvJ6moexsR9Au0LKWYJgae6g,614
|
|
119
110
|
symai/extended/interfaces/ocr.py,sha256=MMxgp8ZKoM44doJPZzzrBVh2VxChs6faFu2uFYnbzfU,563
|
|
120
111
|
symai/extended/interfaces/openai_search.py,sha256=UvnSihdfIwybrLDz2A-yt92aklHEHIvh0pt0hp1Dpis,528
|
|
121
112
|
symai/extended/interfaces/parallel.py,sha256=kWRcrs_vTPvZDDhKjl1Hp94ltZeiYH7K8l9zOy5jd-I,947
|
|
122
113
|
symai/extended/interfaces/perplexity.py,sha256=vSUl8CfBsFhFrzxws9Lf8WgfhsoPatJf7eYRfihKRG4,529
|
|
123
114
|
symai/extended/interfaces/pinecone.py,sha256=NA2t1pNQf-G-HSeewEO8jqGnitD3huBV5bucIM9vgi4,1075
|
|
124
115
|
symai/extended/interfaces/python.py,sha256=EcxXQwrlhjGOS5SkRoa_cVt069vu_INDD9DIfbnUses,418
|
|
125
|
-
symai/extended/interfaces/selenium.py,sha256=nAhIZZjhmz2fsFIXytk9WNfGLy1OqlVytA-ipHZj3JM,660
|
|
126
116
|
symai/extended/interfaces/serpapi.py,sha256=wbUisiYof-y5660dMU5DDTmbiUSd3rvDaYEvMkPTgwM,523
|
|
127
117
|
symai/extended/interfaces/terminal.py,sha256=U-uXJc320wGEMWwsByVAyIzB3Puioeshcr9oKhtTV6Q,378
|
|
128
118
|
symai/extended/interfaces/tts.py,sha256=uVTMXzkpOEdxSknXCihhfXvBnvadrMwIubeBB2_VVck,475
|
|
129
|
-
symai/extended/interfaces/vectordb.py,sha256=Lou8XPScqDWPXEpxhIOzdRqonGVAJ2kriedVjSNSbo8,1022
|
|
130
119
|
symai/extended/interfaces/whisper.py,sha256=sk2D6gAYREOe6nRMp7ArcnO-ENOp4GV97AsyZrm65mI,546
|
|
131
120
|
symai/extended/interfaces/wolframalpha.py,sha256=6Q9X8OGokHeMphhZf3ZT0RuSFivx5fwwLxU9bH0xe00,488
|
|
132
121
|
symai/extended/metrics/__init__.py,sha256=HuHm0ZSF7SidYgZTAu8ZbZ05i5BgspoiCeELtapP-Ig,296
|
|
@@ -135,18 +124,6 @@ symai/extended/packages/__init__.py,sha256=_SzkRPEiIxP3kAW-I5mve7o7UMJsIFavLTKQm
|
|
|
135
124
|
symai/extended/packages/symdev.py,sha256=aVcqRLOZRf9awAClBlg_0cPVjAqTnWhmSPGWGCeQO1g,3826
|
|
136
125
|
symai/extended/packages/sympkg.py,sha256=EFNrpvNJwYun0ridPcqK_LXHZOdsugKu5P6cJUBDvbk,3951
|
|
137
126
|
symai/extended/packages/symrun.py,sha256=39QEDCJJWaeBT7NGf_qre-ij2BVRmjy06o1PCDhqyQU,6338
|
|
138
|
-
symai/extended/personas/__init__.py,sha256=XoP39SRSxXiyiAI3frj6hFb3wzc9Vu5gRcIJBqzIlEo,95
|
|
139
|
-
symai/extended/personas/builder.py,sha256=VvTPB4ar93ESRSbhOtfODMuQOAed7pvdLeX1HOJlGUs,3248
|
|
140
|
-
symai/extended/personas/dialogue.py,sha256=zci4X6ksGHSc49KPUCaoLeLJYyhG8ibacsGOwnZpcJA,6404
|
|
141
|
-
symai/extended/personas/persona.py,sha256=uy0B0R6OsvG9LTOe-vL06OfiDxZgN01tnvJiIMU_rHk,6612
|
|
142
|
-
symai/extended/personas/research/__init__.py,sha256=3slSnilDyPcyXfSEoyYEatGnkjt4AkRgyUvSjaNNhO4,33
|
|
143
|
-
symai/extended/personas/research/yann_lecun.py,sha256=lhhOX8MOX3DqU-1o2YDYo5GYaz9A_r_rI9gfw1Z3uuA,3876
|
|
144
|
-
symai/extended/personas/sales/__init__.py,sha256=g2G5ove8tntwhBxoGQaE4J1C69thTBS5lbrqj-z3Wfc,33
|
|
145
|
-
symai/extended/personas/sales/erik_james.py,sha256=n0D-bKZF1QxeS2XXQ7bOlRv_P60tIK8D6zBr8TsvYMg,5273
|
|
146
|
-
symai/extended/personas/student/__init__.py,sha256=vn9SviFVdrNqLpln1lu5QUeQf-oE7LDwuTKaPsBkIJU,33
|
|
147
|
-
symai/extended/personas/student/max_tenner.py,sha256=rp10Ijim6upo5s_DHj9tzsSfZWgDUaf2HgsgUeCRkT4,3422
|
|
148
|
-
symai/extended/strategies/__init__.py,sha256=L_FSTzP4jCDjh8lvUBMk9fhc14W7_HwiOLRIQM7Gjzk,31
|
|
149
|
-
symai/extended/strategies/cot.py,sha256=sOf3KrmG3M2IL1kpmS1FislbmnWWwyh9GzgHrkmYWgw,1800
|
|
150
127
|
symai/formatter/__init__.py,sha256=CKr_aAmIwqaKPi4kvS9MCF3ghe68QMeGBVvOyB1qlD4,269
|
|
151
128
|
symai/formatter/emoji.pytxt,sha256=D7FMnAar7UMBZnVoPIa_drnv8thIM8r0KNq_BkQ0k8k,13498
|
|
152
129
|
symai/formatter/formatter.py,sha256=f0JDbxctzvSwWi8gYUrMj7Buo93x2cV4k1T-4PHuEIQ,8451
|
|
@@ -161,14 +138,14 @@ symai/models/base.py,sha256=NZ9fjkoQlMA1fN9YroSwImm7RqpH0mQ7zTaJAsPYzgE,44741
|
|
|
161
138
|
symai/models/errors.py,sha256=nEbViXJ7RoVgs6nU3nbfz6Esy_pd4IB5MaggcLLOcdI,910
|
|
162
139
|
symai/ops/__init__.py,sha256=bQneuCvcJkRF_VoM-uJXHeSbmGS2ewfNJP6zRO49e2s,1155
|
|
163
140
|
symai/ops/measures.py,sha256=HAr5rMCKCcKErmwaPa751vM35L_KJ3fL86Pn6x47GmY,3651
|
|
164
|
-
symai/ops/primitives.py,sha256=
|
|
141
|
+
symai/ops/primitives.py,sha256=1G3tvY9t0T6OIkwh9kU9N7veYWugFZCIrNxHLbz9_tY,115584
|
|
165
142
|
symai/server/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
166
143
|
symai/server/huggingface_server.py,sha256=wSAVqFiKQsCu5UB2YYVpxJBhJ7GgQBBfePxNi265yP8,9039
|
|
167
144
|
symai/server/llama_cpp_server.py,sha256=-WPTNB2cbnwtnpES4AtPM__MCasDKl83jr94JGS9tmI,2144
|
|
168
145
|
symai/server/qdrant_server.py,sha256=l4r4rz29c7cO1dapXO0LQ4sHW4WF44keuz7j8v5azMc,9854
|
|
169
|
-
symbolicai-1.
|
|
170
|
-
symbolicai-1.
|
|
171
|
-
symbolicai-1.
|
|
172
|
-
symbolicai-1.
|
|
173
|
-
symbolicai-1.
|
|
174
|
-
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)
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
from typing import Callable
|
|
2
|
-
from bs4 import BeautifulSoup
|
|
3
|
-
|
|
4
|
-
from ...base import Engine
|
|
5
|
-
from ...driver.webclient import connect_browsers, dump_page_source, page_loaded
|
|
6
|
-
from ....symbol import Result
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class SeleniumResult(Result):
|
|
10
|
-
def __init__(self, value, **kwargs) -> None:
|
|
11
|
-
super().__init__(value, **kwargs)
|
|
12
|
-
if value is not None:
|
|
13
|
-
self.raw = value
|
|
14
|
-
self._value = self.extract()
|
|
15
|
-
|
|
16
|
-
def extract(self):
|
|
17
|
-
tmp = self.value if isinstance(self.value, list) else [self.value]
|
|
18
|
-
res = []
|
|
19
|
-
for r in tmp:
|
|
20
|
-
if r is None:
|
|
21
|
-
continue
|
|
22
|
-
soup = BeautifulSoup(r, 'html.parser')
|
|
23
|
-
text = soup.getText()
|
|
24
|
-
res.append(text)
|
|
25
|
-
res = None if len(res) == 0 else '\n'.join(res)
|
|
26
|
-
return res
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class SeleniumEngine(Engine):
|
|
30
|
-
def __init__(self, debug: bool = False):
|
|
31
|
-
super().__init__()
|
|
32
|
-
self.debug = debug
|
|
33
|
-
self.driver_handler = None
|
|
34
|
-
self.name = self.__class__.__name__
|
|
35
|
-
|
|
36
|
-
def _init_crawler_engine(self):
|
|
37
|
-
self.driver_handler = connect_browsers(debug=False, proxy=None)
|
|
38
|
-
|
|
39
|
-
def get_page_source(self, url: str, pattern: str, script: Callable = None) -> str:
|
|
40
|
-
# deprecated
|
|
41
|
-
driver = self.driver_handler()
|
|
42
|
-
try:
|
|
43
|
-
driver.get(url)
|
|
44
|
-
with page_loaded(driver, pattern, debug=self.debug):
|
|
45
|
-
if script: driver.execute_script(script)
|
|
46
|
-
return driver.page_source
|
|
47
|
-
except Exception as ex:
|
|
48
|
-
if self.debug: dump_page_source(driver)
|
|
49
|
-
if self.debug: print(ex)
|
|
50
|
-
return f"Sorry, I cannot find the page you are looking for: {ex}"
|
|
51
|
-
|
|
52
|
-
def id(self) -> str:
|
|
53
|
-
return 'crawler'
|
|
54
|
-
|
|
55
|
-
def forward(self, argument):
|
|
56
|
-
urls, patterns = argument.prop.prepared_input
|
|
57
|
-
urls = urls if isinstance(urls, list) else [urls]
|
|
58
|
-
|
|
59
|
-
patterns = patterns if isinstance(patterns, list) else [patterns]
|
|
60
|
-
assert len(urls) == len(patterns)
|
|
61
|
-
rsp = []
|
|
62
|
-
|
|
63
|
-
self._init_crawler_engine()
|
|
64
|
-
|
|
65
|
-
for url, p in zip(urls, patterns):
|
|
66
|
-
page = self.get_page_source(url=url, pattern=p)
|
|
67
|
-
rsp.append(page)
|
|
68
|
-
|
|
69
|
-
metadata = {}
|
|
70
|
-
rsp = SeleniumResult(rsp)
|
|
71
|
-
return [rsp], metadata
|
|
72
|
-
|
|
73
|
-
def prepare(self, argument):
|
|
74
|
-
assert not argument.prop.processed_input, "CrawlerEngine does not support processed_input."
|
|
75
|
-
assert argument.prop.urls, "CrawlerEngine requires urls."
|
|
76
|
-
|
|
77
|
-
argument.prop.urls = [str(argument.prop.url)]
|
|
78
|
-
argument.prop.patterns = [str(argument.prop.pattern)]
|
|
79
|
-
|
|
80
|
-
# be tolerant to kwarg or arg and assign values of urls and patterns
|
|
81
|
-
# assign urls
|
|
82
|
-
if len(argument.args) >= 1:
|
|
83
|
-
argument.prop.urls = argument.args[0]
|
|
84
|
-
elif len(argument.kwargs) >= 1:
|
|
85
|
-
keys = list(argument.kwargs.keys())
|
|
86
|
-
argument.prop.urls = argument.kwargs[keys[0]]
|
|
87
|
-
# assign patterns
|
|
88
|
-
if len(argument.args) >= 2:
|
|
89
|
-
argument.prop.patterns = argument.args[1]
|
|
90
|
-
elif len(argument.kwargs) >= 2:
|
|
91
|
-
keys = list(argument.kwargs.keys())
|
|
92
|
-
argument.prop.patterns = argument.kwargs[keys[1]]
|
|
93
|
-
|
|
94
|
-
argument.prop.prepared_input = (argument.prop.urls, argument.prop.patterns)
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import openai
|
|
3
|
-
import requests
|
|
4
|
-
import tempfile
|
|
5
|
-
|
|
6
|
-
from typing import Optional
|
|
7
|
-
|
|
8
|
-
from ...base import Engine
|
|
9
|
-
from ...settings import SYMAI_CONFIG
|
|
10
|
-
from ....symbol import Result
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
logging.getLogger("openai").setLevel(logging.ERROR)
|
|
14
|
-
logging.getLogger("requests").setLevel(logging.ERROR)
|
|
15
|
-
logging.getLogger("urllib").setLevel(logging.ERROR)
|
|
16
|
-
logging.getLogger("httpx").setLevel(logging.ERROR)
|
|
17
|
-
logging.getLogger("httpcore").setLevel(logging.ERROR)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class DalleResult(Result):
|
|
21
|
-
def __init__(self, value, **kwargs) -> None:
|
|
22
|
-
super().__init__(value, **kwargs)
|
|
23
|
-
# unpack the result
|
|
24
|
-
if hasattr(value, 'data') and len(value.data) > 0:
|
|
25
|
-
self._value = value.data[0].url
|
|
26
|
-
|
|
27
|
-
# use tempfile to download the image
|
|
28
|
-
def download_images(self):
|
|
29
|
-
if not hasattr(self.value, 'data') or len(self.value.data) <= 0:
|
|
30
|
-
return None
|
|
31
|
-
files = []
|
|
32
|
-
# download the images
|
|
33
|
-
for url in enumerate(self.value.data):
|
|
34
|
-
path = tempfile.NamedTemporaryFile(suffix='.png').name
|
|
35
|
-
r = requests.get(url, allow_redirects=True)
|
|
36
|
-
with open(path, 'wb') as f:
|
|
37
|
-
f.write(r.content)
|
|
38
|
-
files.append(path)
|
|
39
|
-
return files
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
class DrawingEngine(Engine):
|
|
43
|
-
def __init__(self, size: int = 1024, api_key: Optional[str] = None, model: Optional[str] = None):
|
|
44
|
-
super().__init__()
|
|
45
|
-
self.config = SYMAI_CONFIG
|
|
46
|
-
openai.api_key = self.config['DRAWING_ENGINE_API_KEY'] if api_key is None else api_key
|
|
47
|
-
self.model = self.config['DRAWING_ENGINE_MODEL'] if model is None else model
|
|
48
|
-
logger = logging.getLogger('openai')
|
|
49
|
-
logger.setLevel(logging.WARNING)
|
|
50
|
-
self.size = size # defaults to 1024 instead of 512 because dall-e-3 requires 1024
|
|
51
|
-
|
|
52
|
-
def id(self) -> str:
|
|
53
|
-
if self.config['DRAWING_ENGINE_API_KEY'] and self.config['DRAWING_ENGINE_MODEL'].startswith("dall-e"):
|
|
54
|
-
return 'drawing'
|
|
55
|
-
return super().id() # default to unregistered
|
|
56
|
-
|
|
57
|
-
def command(self, *args, **kwargs):
|
|
58
|
-
super().command(*args, **kwargs)
|
|
59
|
-
if 'DRAWING_ENGINE_API_KEY' in kwargs:
|
|
60
|
-
openai.api_key = kwargs['DRAWING_ENGINE_API_KEY']
|
|
61
|
-
if 'DRAWING_ENGINE_MODEL' in kwargs:
|
|
62
|
-
self.model = kwargs['DRAWING_ENGINE_MODEL']
|
|
63
|
-
|
|
64
|
-
def forward(self, argument):
|
|
65
|
-
prompt = argument.prop.prepared_input
|
|
66
|
-
kwargs = argument.kwargs
|
|
67
|
-
model = kwargs.get('model', self.model)
|
|
68
|
-
size = f"{kwargs['image_size']}x{kwargs['image_size']}" if 'image_size' in kwargs else f"{self.size}x{self.size}"
|
|
69
|
-
n = kwargs.get('n', 1)
|
|
70
|
-
quality = kwargs.get('quality', 'standard')
|
|
71
|
-
response_format = kwargs.get('response_format', 'url')
|
|
72
|
-
style = kwargs.get('style', 'vivid')
|
|
73
|
-
except_remedy = kwargs['except_remedy'] if 'except_remedy' in kwargs else None
|
|
74
|
-
|
|
75
|
-
callback = None
|
|
76
|
-
try:
|
|
77
|
-
if kwargs['operation'] == 'create':
|
|
78
|
-
|
|
79
|
-
callback = openai.images.generate
|
|
80
|
-
res = openai.images.generate(
|
|
81
|
-
model=model,
|
|
82
|
-
prompt=prompt,
|
|
83
|
-
n=n,
|
|
84
|
-
size=size,
|
|
85
|
-
quality=quality,
|
|
86
|
-
response_format=response_format,
|
|
87
|
-
style=style,
|
|
88
|
-
)
|
|
89
|
-
elif kwargs['operation'] == 'variation':
|
|
90
|
-
assert 'image_path' in kwargs
|
|
91
|
-
image_path = kwargs['image_path']
|
|
92
|
-
|
|
93
|
-
callback = openai.images.create_variation
|
|
94
|
-
res = openai.images.create_variation(
|
|
95
|
-
model=model,
|
|
96
|
-
image=open(image_path, "rb"),
|
|
97
|
-
n=n,
|
|
98
|
-
size=size,
|
|
99
|
-
response_format=response_format,
|
|
100
|
-
)
|
|
101
|
-
elif kwargs['operation'] == 'edit':
|
|
102
|
-
assert 'mask_path' in kwargs
|
|
103
|
-
assert 'image_path' in kwargs
|
|
104
|
-
mask_path = kwargs['mask_path']
|
|
105
|
-
image_path = kwargs['image_path']
|
|
106
|
-
|
|
107
|
-
callback = openai.images.edit
|
|
108
|
-
res = openai.images.edit(
|
|
109
|
-
model=model,
|
|
110
|
-
image=open(image_path, "rb"),
|
|
111
|
-
mask=open(mask_path, "rb"),
|
|
112
|
-
prompt=prompt,
|
|
113
|
-
n=n,
|
|
114
|
-
size=size,
|
|
115
|
-
response_format=response_format,
|
|
116
|
-
)
|
|
117
|
-
else:
|
|
118
|
-
raise Exception(f"Unknown operation: {kwargs['operation']}")
|
|
119
|
-
|
|
120
|
-
except Exception as e:
|
|
121
|
-
if except_remedy is None:
|
|
122
|
-
raise e
|
|
123
|
-
res = except_remedy(self, e, callback, argument)
|
|
124
|
-
|
|
125
|
-
metadata = {}
|
|
126
|
-
|
|
127
|
-
rsp = DalleResult(res)
|
|
128
|
-
return [rsp], metadata
|
|
129
|
-
|
|
130
|
-
def prepare(self, argument):
|
|
131
|
-
argument.prop.prepared_input = str(argument.prop.processed_input)
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
from ...base import Engine
|
|
2
|
-
from ...settings import SYMAI_CONFIG
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class PluginEmbeddingEngine(Engine):
|
|
6
|
-
def id(self) -> str:
|
|
7
|
-
if not SYMAI_CONFIG['EMBEDDING_ENGINE_API_KEY'] and not SYMAI_CONFIG['EMBEDDING_ENGINE_MODEL'].startswith("llama"):
|
|
8
|
-
from ....functional import EngineRepository
|
|
9
|
-
|
|
10
|
-
# Register the embedding engine from the plugin
|
|
11
|
-
EngineRepository.register_from_plugin('embedding', plugin='ExtensityAI/embeddings', kwargs={'model': 'all-mpnet-base-v2'}, allow_engine_override=True)
|
|
12
|
-
return super().id() # do not register this engine as we want the plugin to be used
|