webscout 6.2b0__tar.gz → 6.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of webscout might be problematic. Click here for more details.
- webscout-6.3/LICENSE.md +211 -0
- {webscout-6.2b0/webscout.egg-info → webscout-6.3}/PKG-INFO +11 -13
- {webscout-6.2b0 → webscout-6.3}/README.md +8 -8
- {webscout-6.2b0 → webscout-6.3}/setup.py +3 -4
- webscout-6.3/webscout/AIbase.py +310 -0
- webscout-6.3/webscout/Agents/functioncall.py +248 -0
- webscout-6.3/webscout/DWEBS.py +323 -0
- webscout-6.3/webscout/Extra/gguf.py +416 -0
- webscout-6.3/webscout/Extra/weather.py +172 -0
- webscout-6.3/webscout/LLM.py +279 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Local/formats.py +4 -2
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Amigo.py +19 -10
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Andi.py +0 -33
- webscout-6.3/webscout/Provider/Blackboxai.py +230 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Llama3.py +1 -1
- webscout-6.3/webscout/Provider/Marcus.py +137 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TTI/__init__.py +2 -1
- webscout-6.3/webscout/Provider/TTI/talkai.py +116 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/__init__.py +10 -3
- webscout-6.3/webscout/Provider/askmyai.py +158 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/cerebras.py +71 -58
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/geminiapi.py +208 -198
- webscout-6.3/webscout/Provider/llama3mitril.py +181 -0
- webscout-6.3/webscout/Provider/llmchat.py +203 -0
- webscout-6.3/webscout/Provider/talkai.py +196 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/twitterclone.py +7 -6
- {webscout-6.2b0 → webscout-6.3}/webscout/cli.py +354 -346
- webscout-6.3/webscout/version.py +2 -0
- {webscout-6.2b0 → webscout-6.3/webscout.egg-info}/PKG-INFO +11 -13
- {webscout-6.2b0 → webscout-6.3}/webscout.egg-info/SOURCES.txt +7 -1
- {webscout-6.2b0 → webscout-6.3}/webscout.egg-info/requires.txt +0 -1
- webscout-6.2b0/LICENSE.md +0 -50
- webscout-6.2b0/webscout/AIbase.py +0 -240
- webscout-6.2b0/webscout/Agents/functioncall.py +0 -198
- webscout-6.2b0/webscout/DWEBS.py +0 -179
- webscout-6.2b0/webscout/Extra/gguf.py +0 -226
- webscout-6.2b0/webscout/Extra/weather.py +0 -67
- webscout-6.2b0/webscout/LLM.py +0 -100
- webscout-6.2b0/webscout/Provider/Blackboxai.py +0 -430
- webscout-6.2b0/webscout/version.py +0 -2
- {webscout-6.2b0 → webscout-6.3}/setup.cfg +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/AIauto.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/AIutel.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Agents/Onlinesearcher.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Agents/__init__.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Bard.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Bing_search.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Extra/__init__.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Extra/autollama.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Extra/weather_ascii.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Local/__init__.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Local/_version.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Local/model.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Local/samplers.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Local/thread.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Local/ui.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Local/utils.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/AI21.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Bing.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/ChatGPTES.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Chatify.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Cloudflare.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Cohere.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/DARKAI.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Deepinfra.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Deepseek.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/DiscordRocks.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/EDITEE.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Farfalle.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Free2GPT.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/GPTWeb.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Gemini.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Groq.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Koboldai.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Llama.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/NinjaChat.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/OLLAMA.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Openai.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/PI.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Perplexity.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Phind.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/PizzaGPT.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/RUBIKSAI.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Reka.py +0 -0
- /webscout-6.2b0/webscout/Provider/TTI/AIuncensored.py → /webscout-6.3/webscout/Provider/TTI/AIuncensoredimage.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TTI/Nexra.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TTI/PollinationsAI.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TTI/WebSimAI.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TTI/aiforce.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TTI/artbit.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TTI/blackboximage.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TTI/deepinfra.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TTI/huggingface.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TTI/imgninza.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TTS/__init__.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TTS/parler.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TTS/streamElements.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TTS/voicepod.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/TeachAnything.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/Youchat.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/ai4chat.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/aimathgpt.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/bagoodex.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/cleeai.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/elmo.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/felo_search.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/gaurish.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/geminiprorealtime.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/genspark.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/julius.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/koala.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/learnfastai.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/lepton.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/llamatutor.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/meta.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/prefind.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/promptrefine.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/turboseek.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/tutorai.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/upstage.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/x0gpt.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/Provider/yep.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/YTdownloader.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/__init__.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/__main__.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/exceptions.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/g4f.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/models.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/requestsHTMLfix.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/tempid.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/transcriber.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/utils.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/webai.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/webscout_search.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout/webscout_search_async.py +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout.egg-info/dependency_links.txt +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout.egg-info/entry_points.txt +0 -0
- {webscout-6.2b0 → webscout-6.3}/webscout.egg-info/top_level.txt +0 -0
webscout-6.3/LICENSE.md
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# HelpingAI License
|
|
2
|
+
Version 3.0
|
|
3
|
+
Copyright (c) 2024 HelpingAI
|
|
4
|
+
All Rights Reserved.
|
|
5
|
+
|
|
6
|
+
## PREAMBLE
|
|
7
|
+
The HelpingAI License (the "License") is designed to govern the use, modification, and distribution of HelpingAI's proprietary assets, including but not limited to artificial intelligence models, software, algorithms, weights, documentation, datasets, and associated materials (collectively, the "Content"). This License aims to balance open innovation with the protection of HelpingAI's intellectual property rights while ensuring responsible and ethical use of AI technology.
|
|
8
|
+
|
|
9
|
+
## 1. DEFINITIONS
|
|
10
|
+
1.1. "Model" means any machine learning model, artificial intelligence system, neural network architecture, or AI-powered solution developed by HelpingAI.
|
|
11
|
+
|
|
12
|
+
1.2. "Weights" refers to the trained parameters, embeddings, model checkpoints, and other numerical values that define the behavior and capabilities of the Model.
|
|
13
|
+
|
|
14
|
+
1.3. "Source Code" means the human-readable form of software, documentation, configuration files, and associated resources.
|
|
15
|
+
|
|
16
|
+
1.4. "Derivative Work" means any work that is based upon or derived from the Content, including but not limited to:
|
|
17
|
+
a) Fine-tuned or adapted versions of the Model
|
|
18
|
+
b) Modified or enhanced versions of the Source Code
|
|
19
|
+
c) Products, services, or applications that incorporate the Content
|
|
20
|
+
d) Adaptations, transformations, or improvements of the Content
|
|
21
|
+
e) Any output generated using the Model or Content
|
|
22
|
+
|
|
23
|
+
1.5. "Commercial Use" means any use of the Content intended for or directed toward:
|
|
24
|
+
a) Commercial advantage or monetary compensation
|
|
25
|
+
b) Revenue generation, either directly or indirectly
|
|
26
|
+
c) Business operations or commercial services
|
|
27
|
+
d) Integration into commercial products or offerings
|
|
28
|
+
|
|
29
|
+
1.6. "End User" means any individual or entity that uses the Content or Derivative Works.
|
|
30
|
+
|
|
31
|
+
## 2. GRANT OF RIGHTS
|
|
32
|
+
Subject to the terms and conditions of this License, HelpingAI hereby grants you a limited, non-exclusive, non-transferable, revocable license to:
|
|
33
|
+
|
|
34
|
+
2.1. Access and use the Content for:
|
|
35
|
+
a) Research and evaluation purposes
|
|
36
|
+
b) Educational and academic use
|
|
37
|
+
c) Personal, non-commercial projects
|
|
38
|
+
d) Open-source contributions (subject to Section 3)
|
|
39
|
+
|
|
40
|
+
2.2. Create and use Derivative Works for non-commercial purposes, provided that:
|
|
41
|
+
a) You comply with all restrictions in Section 3
|
|
42
|
+
b) You maintain appropriate attribution
|
|
43
|
+
c) You ensure responsible and ethical use
|
|
44
|
+
|
|
45
|
+
2.3. Distribute the Content or Derivative Works to third parties, provided that:
|
|
46
|
+
a) You maintain all copyright notices and attributions
|
|
47
|
+
b) You include a complete, unmodified copy of this License
|
|
48
|
+
c) You clearly document any modifications made
|
|
49
|
+
d) You comply with all restrictions in Section 3
|
|
50
|
+
e) You ensure recipients agree to this License
|
|
51
|
+
|
|
52
|
+
## 3. RESTRICTIONS AND LIMITATIONS
|
|
53
|
+
3.1. **Commercial Use Restrictions**
|
|
54
|
+
You may not use the Content or any Derivative Works for Commercial Use without:
|
|
55
|
+
a) Obtaining a separate commercial license from HelpingAI
|
|
56
|
+
b) Paying applicable fees and royalties
|
|
57
|
+
c) Receiving written authorization
|
|
58
|
+
|
|
59
|
+
3.2. **Model Usage Restrictions**
|
|
60
|
+
You may not:
|
|
61
|
+
a) Use the Model to train or develop competing AI models or services
|
|
62
|
+
b) Extract, reverse engineer, or decompile the Model's architecture or weights
|
|
63
|
+
c) Remove, disable, or circumvent any access controls or security measures
|
|
64
|
+
d) Use the Model for military purposes, weapons development, or harmful applications
|
|
65
|
+
e) Use the Model to generate harmful, discriminatory, or illegal content
|
|
66
|
+
f) Use the Model in safety-critical applications without explicit written permission
|
|
67
|
+
g) Use the Model in ways that violate privacy or data protection laws
|
|
68
|
+
h) Create autonomous systems that could cause harm to individuals or society
|
|
69
|
+
|
|
70
|
+
3.3. **Distribution Restrictions**
|
|
71
|
+
You may not:
|
|
72
|
+
a) Redistribute the Model's weights or checkpoints without explicit permission
|
|
73
|
+
b) Create hosted APIs or services that provide direct access to the Model
|
|
74
|
+
c) Bundle or integrate the Content with commercial products or services
|
|
75
|
+
d) Sublicense or transfer rights to the Content to third parties
|
|
76
|
+
e) Distribute the Content in ways that could harm HelpingAI's interests
|
|
77
|
+
|
|
78
|
+
3.4. **Branding and Attribution**
|
|
79
|
+
You must:
|
|
80
|
+
a) Maintain all HelpingAI branding, logos, notices, and watermarks
|
|
81
|
+
b) Include the following attribution in all Derivative Works:
|
|
82
|
+
"Powered by HelpingAI technology, licensed under the HelpingAI License v3.0"
|
|
83
|
+
c) Not use HelpingAI's name, logos, or trademarks to endorse or promote products
|
|
84
|
+
d) Not suggest any official association with HelpingAI without permission
|
|
85
|
+
|
|
86
|
+
## 4. INTELLECTUAL PROPERTY
|
|
87
|
+
4.1. HelpingAI retains all rights, title, and interest in and to the Content, including:
|
|
88
|
+
a) All intellectual property rights
|
|
89
|
+
b) Patents, trademarks, and trade secrets
|
|
90
|
+
c) Proprietary methods and algorithms
|
|
91
|
+
d) Future improvements and modifications
|
|
92
|
+
|
|
93
|
+
4.2. This License does not grant you any rights to HelpingAI's:
|
|
94
|
+
a) Patents or patent applications
|
|
95
|
+
b) Trademarks or service marks
|
|
96
|
+
c) Trade secrets or proprietary information
|
|
97
|
+
d) Other intellectual property except as expressly stated
|
|
98
|
+
|
|
99
|
+
4.3. Derivative Works:
|
|
100
|
+
a) You retain ownership of original portions of Derivative Works you create
|
|
101
|
+
b) HelpingAI retains all rights to the underlying Content
|
|
102
|
+
c) You grant HelpingAI a perpetual license to any improvements or feedback
|
|
103
|
+
|
|
104
|
+
## 5. DATA COLLECTION AND PRIVACY
|
|
105
|
+
5.1. Data Collection:
|
|
106
|
+
a) HelpingAI may collect usage data and performance metrics
|
|
107
|
+
b) Analytics may be used to improve the Content
|
|
108
|
+
c) Collection will comply with applicable privacy laws
|
|
109
|
+
|
|
110
|
+
5.2. Privacy Requirements:
|
|
111
|
+
a) You must comply with all applicable privacy laws and regulations
|
|
112
|
+
b) You must provide appropriate privacy notices to End Users
|
|
113
|
+
c) You must obtain necessary consents for data collection
|
|
114
|
+
d) You must implement appropriate data security measures
|
|
115
|
+
|
|
116
|
+
## 6. WARRANTY DISCLAIMER
|
|
117
|
+
THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO:
|
|
118
|
+
a) WARRANTIES OF MERCHANTABILITY
|
|
119
|
+
b) FITNESS FOR A PARTICULAR PURPOSE
|
|
120
|
+
c) NON-INFRINGEMENT
|
|
121
|
+
d) ACCURACY OR COMPLETENESS
|
|
122
|
+
e) ABSENCE OF ERRORS OR DEFECTS
|
|
123
|
+
f) COMPATIBILITY WITH OTHER SOFTWARE
|
|
124
|
+
g) SECURITY OR PERFORMANCE
|
|
125
|
+
|
|
126
|
+
## 7. LIMITATION OF LIABILITY
|
|
127
|
+
7.1. IN NO EVENT SHALL HELPINGAI BE LIABLE FOR ANY:
|
|
128
|
+
a) DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
|
|
129
|
+
b) LOSS OF PROFITS OR BUSINESS OPPORTUNITIES
|
|
130
|
+
c) BUSINESS INTERRUPTION OR LOST DATA
|
|
131
|
+
d) PERSONAL INJURY OR PROPERTY DAMAGE
|
|
132
|
+
e) ANY OTHER DAMAGES OR LOSSES
|
|
133
|
+
|
|
134
|
+
7.2. THIS LIMITATION APPLIES TO:
|
|
135
|
+
a) CONTRACT OR TORT CLAIMS
|
|
136
|
+
b) BREACH OF WARRANTY
|
|
137
|
+
c) ANY OTHER LEGAL THEORY
|
|
138
|
+
d) ALL USES OF THE CONTENT
|
|
139
|
+
|
|
140
|
+
## 8. TERMINATION
|
|
141
|
+
8.1. Automatic Termination:
|
|
142
|
+
a) This License terminates automatically upon any breach
|
|
143
|
+
b) No notice is required for termination
|
|
144
|
+
c) All rights granted immediately cease
|
|
145
|
+
|
|
146
|
+
8.2. Upon Termination:
|
|
147
|
+
a) Cease all use of the Content
|
|
148
|
+
b) Destroy all copies and installations
|
|
149
|
+
c) Stop distribution of Derivative Works
|
|
150
|
+
d) Certify compliance with termination terms
|
|
151
|
+
|
|
152
|
+
8.3. Survival:
|
|
153
|
+
a) Sections 4, 6, 7, 9, and 10 survive termination
|
|
154
|
+
b) Obligations to protect intellectual property continue
|
|
155
|
+
c) Liability limitations remain in effect
|
|
156
|
+
|
|
157
|
+
## 9. GOVERNING LAW AND JURISDICTION
|
|
158
|
+
9.1. This License shall be governed by and construed in accordance with:
|
|
159
|
+
a) The laws of the United States of America
|
|
160
|
+
b) The State of California
|
|
161
|
+
c) Without regard to conflicts of law principles
|
|
162
|
+
|
|
163
|
+
9.2. Dispute Resolution:
|
|
164
|
+
a) Exclusive jurisdiction in Santa Clara County, California
|
|
165
|
+
b) Agreement to personal jurisdiction
|
|
166
|
+
c) Waiver of jury trial
|
|
167
|
+
d) Prevailing party entitled to attorney fees
|
|
168
|
+
|
|
169
|
+
## 10. EXPORT COMPLIANCE
|
|
170
|
+
10.1. You must comply with all applicable:
|
|
171
|
+
a) Export control laws and regulations
|
|
172
|
+
b) Trade sanctions and embargoes
|
|
173
|
+
c) International trade restrictions
|
|
174
|
+
d) Anti-boycott regulations
|
|
175
|
+
|
|
176
|
+
10.2. You may not export the Content to:
|
|
177
|
+
a) Prohibited countries or regions
|
|
178
|
+
b) Restricted end users
|
|
179
|
+
c) Prohibited end uses
|
|
180
|
+
|
|
181
|
+
## 11. MODIFICATIONS TO LICENSE
|
|
182
|
+
11.1. License Updates:
|
|
183
|
+
a) HelpingAI may modify this License at any time
|
|
184
|
+
b) Changes effective upon posting
|
|
185
|
+
c) Continued use constitutes acceptance
|
|
186
|
+
|
|
187
|
+
11.2. Notification:
|
|
188
|
+
a) Material changes will be announced
|
|
189
|
+
b) Users should regularly review terms
|
|
190
|
+
c) Opt-out requires discontinuing use
|
|
191
|
+
|
|
192
|
+
## 12. SUPPORT AND UPDATES
|
|
193
|
+
12.1. No Obligation:
|
|
194
|
+
a) HelpingAI has no obligation to provide support
|
|
195
|
+
b) Updates and maintenance are discretionary
|
|
196
|
+
c) Services may be modified or discontinued
|
|
197
|
+
|
|
198
|
+
12.2. Available Support:
|
|
199
|
+
a) Documentation and resources provided "as is"
|
|
200
|
+
b) Community forums may be available
|
|
201
|
+
c) Commercial support requires separate agreement
|
|
202
|
+
|
|
203
|
+
<!-- ## 13. CONTACT INFORMATION
|
|
204
|
+
For licensing inquiries, permissions, or compliance:
|
|
205
|
+
- Website: https://helpingai.co
|
|
206
|
+
- Email: license@helpingai.co
|
|
207
|
+
- Address: [Company Address] -->
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
Last Updated: NOVEMBER 2024
|
|
211
|
+
END OF LICENSE
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: webscout
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.3
|
|
4
4
|
Summary: Search for anything using Google, DuckDuckGo, phind.com, Contains AI models, can transcribe yt videos, temporary email and phone number generation, has TTS support, webai (terminal gpt and open interpreter) and offline LLMs and more
|
|
5
5
|
Author: OEvortex
|
|
6
6
|
Author-email: helpingai5@gmail.com
|
|
7
7
|
License: HelpingAI
|
|
8
|
-
Project-URL:
|
|
9
|
-
Project-URL:
|
|
10
|
-
Project-URL: Tracker, https://github.com/OE-LUCIFER/Webscout/issues
|
|
8
|
+
Project-URL: Source, https://github.com/HelpingAI/Webscout
|
|
9
|
+
Project-URL: Tracker, https://github.com/HelpingAI/Webscout/issues
|
|
11
10
|
Project-URL: YouTube, https://youtube.com/@OEvortex
|
|
12
11
|
Classifier: Development Status :: 5 - Production/Stable
|
|
13
12
|
Classifier: Intended Audience :: Developers
|
|
@@ -25,7 +24,6 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
25
24
|
Requires-Python: >=3.7
|
|
26
25
|
Description-Content-Type: text/markdown
|
|
27
26
|
License-File: LICENSE.md
|
|
28
|
-
Requires-Dist: docstring_inheritance
|
|
29
27
|
Requires-Dist: click
|
|
30
28
|
Requires-Dist: curl_cffi
|
|
31
29
|
Requires-Dist: nest-asyncio
|
|
@@ -74,9 +72,9 @@ Requires-Dist: unicorn; extra == "local"
|
|
|
74
72
|
|
|
75
73
|
<div align="center">
|
|
76
74
|
<!-- Replace `#` with your actual links -->
|
|
77
|
-
<a href="https://t.me/
|
|
78
|
-
<a href="https://www.instagram.com/
|
|
79
|
-
<a href="https://www.linkedin.com/in/
|
|
75
|
+
<a href="https://t.me/official_helpingai"><img alt="Telegram" src="https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white"></a>
|
|
76
|
+
<a href="https://www.instagram.com/oevortex/"><img alt="Instagram" src="https://img.shields.io/badge/Instagram-E4405F?style=for-the-badge&logo=instagram&logoColor=white"></a>
|
|
77
|
+
<a href="https://www.linkedin.com/in/oe-vortex-29a407265/"><img alt="LinkedIn" src="https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white"></a>
|
|
80
78
|
<a href="https://buymeacoffee.com/oevortex"><img alt="Buy Me A Coffee" src="https://img.shields.io/badge/Buy%20Me%20A%20Coffee-FFDD00?style=for-the-badge&logo=buymeacoffee&logoColor=black"></a>
|
|
81
79
|
</div>
|
|
82
80
|
|
|
@@ -819,7 +817,7 @@ with WEBS() as WEBS:
|
|
|
819
817
|
___
|
|
820
818
|
</details>
|
|
821
819
|
|
|
822
|
-
### 🖼️ Text to Images - DeepInfraImager, PollinationsAI, BlackboxAIImager, AiForceimager, NexraImager, HFimager, ArtbitImager, NinjaImager, WebSimAI, AIUncensoredImager
|
|
820
|
+
### 🖼️ Text to Images - DeepInfraImager, PollinationsAI, BlackboxAIImager, AiForceimager, NexraImager, HFimager, ArtbitImager, NinjaImager, WebSimAI, AIUncensoredImager, TalkaiImager
|
|
823
821
|
|
|
824
822
|
**Every TTI provider has the same usage code, you just need to change the import.**
|
|
825
823
|
|
|
@@ -1357,7 +1355,7 @@ if __name__ == "__main__":
|
|
|
1357
1355
|
main()
|
|
1358
1356
|
```
|
|
1359
1357
|
|
|
1360
|
-
### LLAMA3, pizzagpt, RUBIKSAI, Koala, Darkai, AI4Chat, Farfalle, PIAI, Felo, Julius, YouChat, YEPCHAT, Cloudflare, TurboSeek, Editee, AI21, Chatify, Cerebras, X0GPT, Lepton, GEMINIAPI, Cleeai, Elmo, Genspark, Upstage, Free2GPT, Bing, DiscordRocks, GPTWeb, LlamaTutor, PromptRefine, AIUncensored, TutorAI, ChatGPTES, Bagoodex, ChatHub, AmigoChat, AIMathGPT, GaurishCerebras, NinjaChat, GeminiPro
|
|
1358
|
+
### LLAMA3, pizzagpt, RUBIKSAI, Koala, Darkai, AI4Chat, Farfalle, PIAI, Felo, Julius, YouChat, YEPCHAT, Cloudflare, TurboSeek, Editee, AI21, Chatify, Cerebras, X0GPT, Lepton, GEMINIAPI, Cleeai, Elmo, Genspark, Upstage, Free2GPT, Bing, DiscordRocks, GPTWeb, LlamaTutor, PromptRefine, AIUncensored, TutorAI, ChatGPTES, Bagoodex, ChatHub, AmigoChat, AIMathGPT, GaurishCerebras, NinjaChat, GeminiPro, Talkai, LLMChat, AskMyAI, Llama3Mitril, Marcus
|
|
1361
1359
|
|
|
1362
1360
|
Code is similar to other providers.
|
|
1363
1361
|
|
|
@@ -1563,9 +1561,9 @@ python -m webscout.webai webai --provider "phind" --rawdog
|
|
|
1563
1561
|
|
|
1564
1562
|
<div align="center">
|
|
1565
1563
|
<!-- Replace `#` with your actual links -->
|
|
1566
|
-
<a href="https://t.me/
|
|
1567
|
-
<a href="https://www.instagram.com/
|
|
1568
|
-
<a href="https://www.linkedin.com/in/
|
|
1564
|
+
<a href="https://t.me/official_helpingai"><img alt="Telegram" src="https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white"></a>
|
|
1565
|
+
<a href="https://www.instagram.com/oevortex/"><img alt="Instagram" src="https://img.shields.io/badge/Instagram-E4405F?style=for-the-badge&logo=instagram&logoColor=white"></a>
|
|
1566
|
+
<a href="https://www.linkedin.com/in/oe-vortex-29a407265/"><img alt="LinkedIn" src="https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white"></a>
|
|
1569
1567
|
<a href="https://buymeacoffee.com/oevortex"><img alt="Buy Me A Coffee" src="https://img.shields.io/badge/Buy%20Me%20A%20Coffee-FFDD00?style=for-the-badge&logo=buymeacoffee&logoColor=black"></a>
|
|
1570
1568
|
</div>
|
|
1571
1569
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<!-- Replace `#` with your actual links -->
|
|
3
|
-
<a href="https://t.me/
|
|
4
|
-
<a href="https://www.instagram.com/
|
|
5
|
-
<a href="https://www.linkedin.com/in/
|
|
3
|
+
<a href="https://t.me/official_helpingai"><img alt="Telegram" src="https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white"></a>
|
|
4
|
+
<a href="https://www.instagram.com/oevortex/"><img alt="Instagram" src="https://img.shields.io/badge/Instagram-E4405F?style=for-the-badge&logo=instagram&logoColor=white"></a>
|
|
5
|
+
<a href="https://www.linkedin.com/in/oe-vortex-29a407265/"><img alt="LinkedIn" src="https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white"></a>
|
|
6
6
|
<a href="https://buymeacoffee.com/oevortex"><img alt="Buy Me A Coffee" src="https://img.shields.io/badge/Buy%20Me%20A%20Coffee-FFDD00?style=for-the-badge&logo=buymeacoffee&logoColor=black"></a>
|
|
7
7
|
</div>
|
|
8
8
|
|
|
@@ -745,7 +745,7 @@ with WEBS() as WEBS:
|
|
|
745
745
|
___
|
|
746
746
|
</details>
|
|
747
747
|
|
|
748
|
-
### 🖼️ Text to Images - DeepInfraImager, PollinationsAI, BlackboxAIImager, AiForceimager, NexraImager, HFimager, ArtbitImager, NinjaImager, WebSimAI, AIUncensoredImager
|
|
748
|
+
### 🖼️ Text to Images - DeepInfraImager, PollinationsAI, BlackboxAIImager, AiForceimager, NexraImager, HFimager, ArtbitImager, NinjaImager, WebSimAI, AIUncensoredImager, TalkaiImager
|
|
749
749
|
|
|
750
750
|
**Every TTI provider has the same usage code, you just need to change the import.**
|
|
751
751
|
|
|
@@ -1283,7 +1283,7 @@ if __name__ == "__main__":
|
|
|
1283
1283
|
main()
|
|
1284
1284
|
```
|
|
1285
1285
|
|
|
1286
|
-
### LLAMA3, pizzagpt, RUBIKSAI, Koala, Darkai, AI4Chat, Farfalle, PIAI, Felo, Julius, YouChat, YEPCHAT, Cloudflare, TurboSeek, Editee, AI21, Chatify, Cerebras, X0GPT, Lepton, GEMINIAPI, Cleeai, Elmo, Genspark, Upstage, Free2GPT, Bing, DiscordRocks, GPTWeb, LlamaTutor, PromptRefine, AIUncensored, TutorAI, ChatGPTES, Bagoodex, ChatHub, AmigoChat, AIMathGPT, GaurishCerebras, NinjaChat, GeminiPro
|
|
1286
|
+
### LLAMA3, pizzagpt, RUBIKSAI, Koala, Darkai, AI4Chat, Farfalle, PIAI, Felo, Julius, YouChat, YEPCHAT, Cloudflare, TurboSeek, Editee, AI21, Chatify, Cerebras, X0GPT, Lepton, GEMINIAPI, Cleeai, Elmo, Genspark, Upstage, Free2GPT, Bing, DiscordRocks, GPTWeb, LlamaTutor, PromptRefine, AIUncensored, TutorAI, ChatGPTES, Bagoodex, ChatHub, AmigoChat, AIMathGPT, GaurishCerebras, NinjaChat, GeminiPro, Talkai, LLMChat, AskMyAI, Llama3Mitril, Marcus
|
|
1287
1287
|
|
|
1288
1288
|
Code is similar to other providers.
|
|
1289
1289
|
|
|
@@ -1489,9 +1489,9 @@ python -m webscout.webai webai --provider "phind" --rawdog
|
|
|
1489
1489
|
|
|
1490
1490
|
<div align="center">
|
|
1491
1491
|
<!-- Replace `#` with your actual links -->
|
|
1492
|
-
<a href="https://t.me/
|
|
1493
|
-
<a href="https://www.instagram.com/
|
|
1494
|
-
<a href="https://www.linkedin.com/in/
|
|
1492
|
+
<a href="https://t.me/official_helpingai"><img alt="Telegram" src="https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white"></a>
|
|
1493
|
+
<a href="https://www.instagram.com/oevortex/"><img alt="Instagram" src="https://img.shields.io/badge/Instagram-E4405F?style=for-the-badge&logo=instagram&logoColor=white"></a>
|
|
1494
|
+
<a href="https://www.linkedin.com/in/oe-vortex-29a407265/"><img alt="LinkedIn" src="https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white"></a>
|
|
1495
1495
|
<a href="https://buymeacoffee.com/oevortex"><img alt="Buy Me A Coffee" src="https://img.shields.io/badge/Buy%20Me%20A%20Coffee-FFDD00?style=for-the-badge&logo=buymeacoffee&logoColor=black"></a>
|
|
1496
1496
|
</div>
|
|
1497
1497
|
|
|
@@ -30,7 +30,6 @@ setup(
|
|
|
30
30
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
31
31
|
],
|
|
32
32
|
install_requires=[
|
|
33
|
-
"docstring_inheritance",
|
|
34
33
|
"click",
|
|
35
34
|
"curl_cffi",
|
|
36
35
|
"nest-asyncio",
|
|
@@ -67,6 +66,7 @@ setup(
|
|
|
67
66
|
"colorlog",
|
|
68
67
|
"yaspin",
|
|
69
68
|
"cerebras-cloud-sdk",
|
|
69
|
+
|
|
70
70
|
],
|
|
71
71
|
entry_points={
|
|
72
72
|
"console_scripts": [
|
|
@@ -89,9 +89,8 @@ setup(
|
|
|
89
89
|
},
|
|
90
90
|
license="HelpingAI",
|
|
91
91
|
project_urls={
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"Tracker": "https://github.com/OE-LUCIFER/Webscout/issues",
|
|
92
|
+
"Source": "https://github.com/HelpingAI/Webscout",
|
|
93
|
+
"Tracker": "https://github.com/HelpingAI/Webscout/issues",
|
|
95
94
|
"YouTube": "https://youtube.com/@OEvortex",
|
|
96
95
|
},
|
|
97
96
|
)
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
from abc import ABC
|
|
2
|
+
from abc import abstractmethod
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import AsyncGenerator, List, Union, Generator, Optional
|
|
5
|
+
from typing_extensions import TypeAlias
|
|
6
|
+
|
|
7
|
+
# Type aliases for better readability
|
|
8
|
+
Response: TypeAlias = dict[str, Union[str, bool, None]]
|
|
9
|
+
ImageData: TypeAlias = Union[bytes, str, Generator[bytes, None, None]]
|
|
10
|
+
AsyncImageData: TypeAlias = Union[bytes, str, AsyncGenerator[bytes, None]]
|
|
11
|
+
|
|
12
|
+
class AIProviderError(Exception):
|
|
13
|
+
"""Base exception for AI provider errors"""
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
class Provider(ABC):
|
|
17
|
+
"""Base class for text-based AI providers.
|
|
18
|
+
|
|
19
|
+
This class defines the interface for synchronous AI text generation providers.
|
|
20
|
+
All text-based AI providers should inherit from this class and implement
|
|
21
|
+
its abstract methods.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
@abstractmethod
|
|
25
|
+
def ask(
|
|
26
|
+
self,
|
|
27
|
+
prompt: str,
|
|
28
|
+
stream: bool = False,
|
|
29
|
+
raw: bool = False,
|
|
30
|
+
optimizer: Optional[str] = None,
|
|
31
|
+
conversationally: bool = False,
|
|
32
|
+
) -> Response:
|
|
33
|
+
"""Chat with AI and get detailed response.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
prompt: The input text to send to the AI
|
|
37
|
+
stream: Whether to stream the response. Defaults to False
|
|
38
|
+
raw: Whether to return raw response as received. Defaults to False
|
|
39
|
+
optimizer: Optional prompt optimizer - choices: ['code', 'shell_command']
|
|
40
|
+
conversationally: Whether to maintain conversation context. Defaults to False
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
A dictionary containing response details:
|
|
44
|
+
{
|
|
45
|
+
"completion": str, # The AI's response
|
|
46
|
+
"stop_reason": str|None, # Reason for response termination
|
|
47
|
+
"truncated": bool, # Whether response was truncated
|
|
48
|
+
"stop": str|None, # Stop token if any
|
|
49
|
+
"model": str, # Model used for generation
|
|
50
|
+
"log_id": str, # Unique log identifier
|
|
51
|
+
"exception": str|None # Error message if any
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
Raises:
|
|
55
|
+
AIProviderError: If there's an error communicating with the AI provider
|
|
56
|
+
"""
|
|
57
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
58
|
+
|
|
59
|
+
@abstractmethod
|
|
60
|
+
def chat(
|
|
61
|
+
self,
|
|
62
|
+
prompt: str,
|
|
63
|
+
stream: bool = False,
|
|
64
|
+
optimizer: Optional[str] = None,
|
|
65
|
+
conversationally: bool = False,
|
|
66
|
+
) -> str:
|
|
67
|
+
"""Generate a simple text response from the AI.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
prompt: The input text to send to the AI
|
|
71
|
+
stream: Whether to stream the response. Defaults to False
|
|
72
|
+
optimizer: Optional prompt optimizer - choices: ['code', 'shell_command']
|
|
73
|
+
conversationally: Whether to maintain conversation context. Defaults to False
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
The AI's text response
|
|
77
|
+
|
|
78
|
+
Raises:
|
|
79
|
+
AIProviderError: If there's an error communicating with the AI provider
|
|
80
|
+
"""
|
|
81
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
82
|
+
|
|
83
|
+
@abstractmethod
|
|
84
|
+
def get_message(self, response: Response) -> str:
|
|
85
|
+
"""Extract the message content from a response dictionary.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
response: Response dictionary from ask() method
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
The extracted message text
|
|
92
|
+
|
|
93
|
+
Raises:
|
|
94
|
+
AIProviderError: If message cannot be extracted from response
|
|
95
|
+
"""
|
|
96
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
97
|
+
|
|
98
|
+
class AsyncProvider(ABC):
|
|
99
|
+
"""Asynchronous base class for text-based AI providers"""
|
|
100
|
+
|
|
101
|
+
@abstractmethod
|
|
102
|
+
async def ask(
|
|
103
|
+
self,
|
|
104
|
+
prompt: str,
|
|
105
|
+
stream: bool = False,
|
|
106
|
+
raw: bool = False,
|
|
107
|
+
optimizer: Optional[str] = None,
|
|
108
|
+
conversationally: bool = False,
|
|
109
|
+
) -> Response:
|
|
110
|
+
"""Asynchronously chat with AI and get detailed response.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
prompt: The input text to send to the AI
|
|
114
|
+
stream: Whether to stream the response. Defaults to False
|
|
115
|
+
raw: Whether to return raw response as received. Defaults to False
|
|
116
|
+
optimizer: Optional prompt optimizer - choices: ['code', 'shell_command']
|
|
117
|
+
conversationally: Whether to maintain conversation context. Defaults to False
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
A dictionary containing response details:
|
|
121
|
+
{
|
|
122
|
+
"completion": str, # The AI's response
|
|
123
|
+
"stop_reason": str|None, # Reason for response termination
|
|
124
|
+
"truncated": bool, # Whether response was truncated
|
|
125
|
+
"stop": str|None, # Stop token if any
|
|
126
|
+
"model": str, # Model used for generation
|
|
127
|
+
"log_id": str, # Unique log identifier
|
|
128
|
+
"exception": str|None # Error message if any
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
Raises:
|
|
132
|
+
AIProviderError: If there's an error communicating with the AI provider
|
|
133
|
+
"""
|
|
134
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
135
|
+
|
|
136
|
+
@abstractmethod
|
|
137
|
+
async def chat(
|
|
138
|
+
self,
|
|
139
|
+
prompt: str,
|
|
140
|
+
stream: bool = False,
|
|
141
|
+
optimizer: Optional[str] = None,
|
|
142
|
+
conversationally: bool = False,
|
|
143
|
+
) -> str:
|
|
144
|
+
"""Asynchronously generate a simple text response from the AI.
|
|
145
|
+
|
|
146
|
+
Args:
|
|
147
|
+
prompt: The input text to send to the AI
|
|
148
|
+
stream: Whether to stream the response. Defaults to False
|
|
149
|
+
optimizer: Optional prompt optimizer - choices: ['code', 'shell_command']
|
|
150
|
+
conversationally: Whether to maintain conversation context. Defaults to False
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
The AI's text response
|
|
154
|
+
|
|
155
|
+
Raises:
|
|
156
|
+
AIProviderError: If there's an error communicating with the AI provider
|
|
157
|
+
"""
|
|
158
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
159
|
+
|
|
160
|
+
@abstractmethod
|
|
161
|
+
async def get_message(self, response: Response) -> str:
|
|
162
|
+
"""Asynchronously extract the message content from a response dictionary.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
response: Response dictionary from ask() method
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
The extracted message text
|
|
169
|
+
|
|
170
|
+
Raises:
|
|
171
|
+
AIProviderError: If message cannot be extracted from response
|
|
172
|
+
"""
|
|
173
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
174
|
+
|
|
175
|
+
class TTSProvider(ABC):
|
|
176
|
+
"""Base class for text-to-speech providers.
|
|
177
|
+
|
|
178
|
+
This class defines the interface for synchronous text-to-speech providers.
|
|
179
|
+
"""
|
|
180
|
+
|
|
181
|
+
@abstractmethod
|
|
182
|
+
def tts(self, text: str) -> ImageData:
|
|
183
|
+
"""Convert text to speech.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
text: The text to convert to speech
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
One of:
|
|
190
|
+
- Raw audio bytes
|
|
191
|
+
- Path to saved audio file
|
|
192
|
+
- Generator yielding audio chunks
|
|
193
|
+
|
|
194
|
+
Raises:
|
|
195
|
+
AIProviderError: If text-to-speech conversion fails
|
|
196
|
+
"""
|
|
197
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
198
|
+
|
|
199
|
+
class AsyncTTSProvider(ABC):
|
|
200
|
+
"""Base class for asynchronous text-to-speech providers."""
|
|
201
|
+
|
|
202
|
+
@abstractmethod
|
|
203
|
+
async def tts(self, text: str) -> AsyncImageData:
|
|
204
|
+
"""Asynchronously convert text to speech.
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
text: The text to convert to speech
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
One of:
|
|
211
|
+
- Raw audio bytes
|
|
212
|
+
- Path to saved audio file
|
|
213
|
+
- AsyncGenerator yielding audio chunks
|
|
214
|
+
|
|
215
|
+
Raises:
|
|
216
|
+
AIProviderError: If text-to-speech conversion fails
|
|
217
|
+
"""
|
|
218
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
219
|
+
|
|
220
|
+
class ImageProvider(ABC):
|
|
221
|
+
"""Base class for text-to-image generation providers."""
|
|
222
|
+
|
|
223
|
+
@abstractmethod
|
|
224
|
+
def generate(self, prompt: str, amount: int = 1) -> List[bytes]:
|
|
225
|
+
"""Generate images from a text description.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
prompt: Text description of desired image
|
|
229
|
+
amount: Number of images to generate (default: 1)
|
|
230
|
+
|
|
231
|
+
Returns:
|
|
232
|
+
List of generated images as bytes
|
|
233
|
+
|
|
234
|
+
Raises:
|
|
235
|
+
AIProviderError: If image generation fails
|
|
236
|
+
ValueError: If amount is less than 1
|
|
237
|
+
"""
|
|
238
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
239
|
+
|
|
240
|
+
@abstractmethod
|
|
241
|
+
def save(
|
|
242
|
+
self,
|
|
243
|
+
response: List[bytes],
|
|
244
|
+
name: Optional[str] = None,
|
|
245
|
+
dir: Optional[Union[str, Path]] = None
|
|
246
|
+
) -> List[str]:
|
|
247
|
+
"""Save generated images to disk.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
response: List of image data in bytes
|
|
251
|
+
name: Base filename for saved images (default: auto-generated)
|
|
252
|
+
dir: Directory to save images (default: current directory)
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
List of paths to saved image files
|
|
256
|
+
|
|
257
|
+
Raises:
|
|
258
|
+
AIProviderError: If saving images fails
|
|
259
|
+
ValueError: If response is empty
|
|
260
|
+
"""
|
|
261
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
262
|
+
|
|
263
|
+
class AsyncImageProvider(ABC):
|
|
264
|
+
"""Base class for asynchronous text-to-image generation providers."""
|
|
265
|
+
|
|
266
|
+
@abstractmethod
|
|
267
|
+
async def generate(
|
|
268
|
+
self,
|
|
269
|
+
prompt: str,
|
|
270
|
+
amount: int = 1
|
|
271
|
+
) -> Union[AsyncGenerator[bytes, None], List[bytes]]:
|
|
272
|
+
"""Asynchronously generate images from text.
|
|
273
|
+
|
|
274
|
+
Args:
|
|
275
|
+
prompt: Text description of desired image
|
|
276
|
+
amount: Number of images to generate (default: 1)
|
|
277
|
+
|
|
278
|
+
Returns:
|
|
279
|
+
Either:
|
|
280
|
+
- AsyncGenerator yielding image bytes for streaming
|
|
281
|
+
- List of image bytes if not streaming
|
|
282
|
+
|
|
283
|
+
Raises:
|
|
284
|
+
AIProviderError: If image generation fails
|
|
285
|
+
ValueError: If amount is less than 1
|
|
286
|
+
"""
|
|
287
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
288
|
+
|
|
289
|
+
@abstractmethod
|
|
290
|
+
async def save(
|
|
291
|
+
self,
|
|
292
|
+
response: Union[AsyncGenerator[bytes, None], List[bytes]],
|
|
293
|
+
name: Optional[str] = None,
|
|
294
|
+
dir: Optional[Union[str, Path]] = None
|
|
295
|
+
) -> List[str]:
|
|
296
|
+
"""Asynchronously save generated images.
|
|
297
|
+
|
|
298
|
+
Args:
|
|
299
|
+
response: Either AsyncGenerator yielding images or List of image bytes
|
|
300
|
+
name: Base filename for saved images (default: auto-generated)
|
|
301
|
+
dir: Directory to save images (default: current directory)
|
|
302
|
+
|
|
303
|
+
Returns:
|
|
304
|
+
List of paths to saved image files
|
|
305
|
+
|
|
306
|
+
Raises:
|
|
307
|
+
AIProviderError: If saving images fails
|
|
308
|
+
ValueError: If response is empty
|
|
309
|
+
"""
|
|
310
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|