webscout 8.2.8__py3-none-any.whl → 8.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of webscout might be problematic. Click here for more details.
- webscout/AIauto.py +34 -16
- webscout/AIbase.py +96 -37
- webscout/AIutel.py +491 -87
- webscout/Bard.py +441 -323
- webscout/Extra/GitToolkit/__init__.py +10 -10
- webscout/Extra/YTToolkit/ytapi/video.py +232 -232
- webscout/Litlogger/README.md +10 -0
- webscout/Litlogger/__init__.py +7 -59
- webscout/Litlogger/formats.py +4 -0
- webscout/Litlogger/handlers.py +103 -0
- webscout/Litlogger/levels.py +13 -0
- webscout/Litlogger/logger.py +92 -0
- webscout/Provider/AISEARCH/Perplexity.py +332 -358
- webscout/Provider/AISEARCH/felo_search.py +9 -35
- webscout/Provider/AISEARCH/genspark_search.py +30 -56
- webscout/Provider/AISEARCH/hika_search.py +4 -16
- webscout/Provider/AISEARCH/iask_search.py +410 -436
- webscout/Provider/AISEARCH/monica_search.py +4 -30
- webscout/Provider/AISEARCH/scira_search.py +6 -32
- webscout/Provider/AISEARCH/webpilotai_search.py +38 -64
- webscout/Provider/Blackboxai.py +155 -35
- webscout/Provider/ChatSandbox.py +2 -1
- webscout/Provider/Deepinfra.py +339 -339
- webscout/Provider/ExaChat.py +358 -358
- webscout/Provider/Gemini.py +169 -169
- webscout/Provider/GithubChat.py +1 -2
- webscout/Provider/Glider.py +3 -3
- webscout/Provider/HeckAI.py +172 -82
- webscout/Provider/LambdaChat.py +1 -0
- webscout/Provider/MCPCore.py +7 -3
- webscout/Provider/OPENAI/BLACKBOXAI.py +421 -139
- webscout/Provider/OPENAI/Cloudflare.py +38 -21
- webscout/Provider/OPENAI/FalconH1.py +457 -0
- webscout/Provider/OPENAI/FreeGemini.py +35 -18
- webscout/Provider/OPENAI/NEMOTRON.py +34 -34
- webscout/Provider/OPENAI/PI.py +427 -0
- webscout/Provider/OPENAI/Qwen3.py +304 -0
- webscout/Provider/OPENAI/README.md +952 -1253
- webscout/Provider/OPENAI/TwoAI.py +374 -0
- webscout/Provider/OPENAI/__init__.py +7 -1
- webscout/Provider/OPENAI/ai4chat.py +73 -63
- webscout/Provider/OPENAI/api.py +869 -644
- webscout/Provider/OPENAI/base.py +2 -0
- webscout/Provider/OPENAI/c4ai.py +34 -13
- webscout/Provider/OPENAI/chatgpt.py +575 -556
- webscout/Provider/OPENAI/chatgptclone.py +512 -487
- webscout/Provider/OPENAI/chatsandbox.py +11 -6
- webscout/Provider/OPENAI/copilot.py +258 -0
- webscout/Provider/OPENAI/deepinfra.py +327 -318
- webscout/Provider/OPENAI/e2b.py +140 -104
- webscout/Provider/OPENAI/exaai.py +420 -411
- webscout/Provider/OPENAI/exachat.py +448 -443
- webscout/Provider/OPENAI/flowith.py +7 -3
- webscout/Provider/OPENAI/freeaichat.py +12 -8
- webscout/Provider/OPENAI/glider.py +15 -8
- webscout/Provider/OPENAI/groq.py +5 -2
- webscout/Provider/OPENAI/heckai.py +311 -307
- webscout/Provider/OPENAI/llmchatco.py +9 -7
- webscout/Provider/OPENAI/mcpcore.py +18 -9
- webscout/Provider/OPENAI/multichat.py +7 -5
- webscout/Provider/OPENAI/netwrck.py +16 -11
- webscout/Provider/OPENAI/oivscode.py +290 -0
- webscout/Provider/OPENAI/opkfc.py +507 -496
- webscout/Provider/OPENAI/pydantic_imports.py +172 -0
- webscout/Provider/OPENAI/scirachat.py +29 -17
- webscout/Provider/OPENAI/sonus.py +308 -303
- webscout/Provider/OPENAI/standardinput.py +442 -433
- webscout/Provider/OPENAI/textpollinations.py +18 -11
- webscout/Provider/OPENAI/toolbaz.py +419 -413
- webscout/Provider/OPENAI/typefully.py +17 -10
- webscout/Provider/OPENAI/typegpt.py +21 -11
- webscout/Provider/OPENAI/uncovrAI.py +477 -462
- webscout/Provider/OPENAI/utils.py +90 -79
- webscout/Provider/OPENAI/venice.py +435 -425
- webscout/Provider/OPENAI/wisecat.py +387 -381
- webscout/Provider/OPENAI/writecream.py +166 -163
- webscout/Provider/OPENAI/x0gpt.py +26 -37
- webscout/Provider/OPENAI/yep.py +384 -356
- webscout/Provider/PI.py +2 -1
- webscout/Provider/TTI/README.md +55 -101
- webscout/Provider/TTI/__init__.py +4 -9
- webscout/Provider/TTI/aiarta.py +365 -0
- webscout/Provider/TTI/artbit.py +0 -0
- webscout/Provider/TTI/base.py +64 -0
- webscout/Provider/TTI/fastflux.py +200 -0
- webscout/Provider/TTI/magicstudio.py +201 -0
- webscout/Provider/TTI/piclumen.py +203 -0
- webscout/Provider/TTI/pixelmuse.py +225 -0
- webscout/Provider/TTI/pollinations.py +221 -0
- webscout/Provider/TTI/utils.py +11 -0
- webscout/Provider/TTS/__init__.py +2 -1
- webscout/Provider/TTS/base.py +159 -159
- webscout/Provider/TTS/openai_fm.py +129 -0
- webscout/Provider/TextPollinationsAI.py +308 -308
- webscout/Provider/TwoAI.py +239 -44
- webscout/Provider/UNFINISHED/Youchat.py +330 -330
- webscout/Provider/UNFINISHED/puterjs.py +635 -0
- webscout/Provider/UNFINISHED/test_lmarena.py +119 -119
- webscout/Provider/Writecream.py +246 -246
- webscout/Provider/__init__.py +2 -2
- webscout/Provider/ai4chat.py +33 -8
- webscout/Provider/granite.py +41 -6
- webscout/Provider/koala.py +169 -169
- webscout/Provider/oivscode.py +309 -0
- webscout/Provider/samurai.py +3 -2
- webscout/Provider/scnet.py +1 -0
- webscout/Provider/typegpt.py +3 -3
- webscout/Provider/uncovr.py +368 -368
- webscout/client.py +70 -0
- webscout/litprinter/__init__.py +58 -58
- webscout/optimizers.py +419 -419
- webscout/scout/README.md +3 -1
- webscout/scout/core/crawler.py +134 -64
- webscout/scout/core/scout.py +148 -109
- webscout/scout/element.py +106 -88
- webscout/swiftcli/Readme.md +323 -323
- webscout/swiftcli/plugins/manager.py +9 -2
- webscout/version.py +1 -1
- webscout/zeroart/__init__.py +134 -134
- webscout/zeroart/effects.py +100 -100
- webscout/zeroart/fonts.py +1238 -1238
- {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/METADATA +160 -35
- webscout-8.3.dist-info/RECORD +290 -0
- {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/WHEEL +1 -1
- {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/entry_points.txt +1 -0
- webscout/Litlogger/Readme.md +0 -175
- webscout/Litlogger/core/__init__.py +0 -6
- webscout/Litlogger/core/level.py +0 -23
- webscout/Litlogger/core/logger.py +0 -165
- webscout/Litlogger/handlers/__init__.py +0 -12
- webscout/Litlogger/handlers/console.py +0 -33
- webscout/Litlogger/handlers/file.py +0 -143
- webscout/Litlogger/handlers/network.py +0 -173
- webscout/Litlogger/styles/__init__.py +0 -7
- webscout/Litlogger/styles/colors.py +0 -249
- webscout/Litlogger/styles/formats.py +0 -458
- webscout/Litlogger/styles/text.py +0 -87
- webscout/Litlogger/utils/__init__.py +0 -6
- webscout/Litlogger/utils/detectors.py +0 -153
- webscout/Litlogger/utils/formatters.py +0 -200
- webscout/Provider/ChatGPTGratis.py +0 -194
- webscout/Provider/TTI/AiForce/README.md +0 -159
- webscout/Provider/TTI/AiForce/__init__.py +0 -22
- webscout/Provider/TTI/AiForce/async_aiforce.py +0 -224
- webscout/Provider/TTI/AiForce/sync_aiforce.py +0 -245
- webscout/Provider/TTI/FreeAIPlayground/README.md +0 -99
- webscout/Provider/TTI/FreeAIPlayground/__init__.py +0 -9
- webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +0 -181
- webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +0 -180
- webscout/Provider/TTI/ImgSys/README.md +0 -174
- webscout/Provider/TTI/ImgSys/__init__.py +0 -23
- webscout/Provider/TTI/ImgSys/async_imgsys.py +0 -202
- webscout/Provider/TTI/ImgSys/sync_imgsys.py +0 -195
- webscout/Provider/TTI/MagicStudio/README.md +0 -101
- webscout/Provider/TTI/MagicStudio/__init__.py +0 -2
- webscout/Provider/TTI/MagicStudio/async_magicstudio.py +0 -111
- webscout/Provider/TTI/MagicStudio/sync_magicstudio.py +0 -109
- webscout/Provider/TTI/Nexra/README.md +0 -155
- webscout/Provider/TTI/Nexra/__init__.py +0 -22
- webscout/Provider/TTI/Nexra/async_nexra.py +0 -286
- webscout/Provider/TTI/Nexra/sync_nexra.py +0 -258
- webscout/Provider/TTI/PollinationsAI/README.md +0 -146
- webscout/Provider/TTI/PollinationsAI/__init__.py +0 -23
- webscout/Provider/TTI/PollinationsAI/async_pollinations.py +0 -311
- webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +0 -265
- webscout/Provider/TTI/aiarta/README.md +0 -134
- webscout/Provider/TTI/aiarta/__init__.py +0 -2
- webscout/Provider/TTI/aiarta/async_aiarta.py +0 -482
- webscout/Provider/TTI/aiarta/sync_aiarta.py +0 -440
- webscout/Provider/TTI/artbit/README.md +0 -100
- webscout/Provider/TTI/artbit/__init__.py +0 -22
- webscout/Provider/TTI/artbit/async_artbit.py +0 -155
- webscout/Provider/TTI/artbit/sync_artbit.py +0 -148
- webscout/Provider/TTI/fastflux/README.md +0 -129
- webscout/Provider/TTI/fastflux/__init__.py +0 -22
- webscout/Provider/TTI/fastflux/async_fastflux.py +0 -261
- webscout/Provider/TTI/fastflux/sync_fastflux.py +0 -252
- webscout/Provider/TTI/huggingface/README.md +0 -114
- webscout/Provider/TTI/huggingface/__init__.py +0 -22
- webscout/Provider/TTI/huggingface/async_huggingface.py +0 -199
- webscout/Provider/TTI/huggingface/sync_huggingface.py +0 -195
- webscout/Provider/TTI/piclumen/README.md +0 -161
- webscout/Provider/TTI/piclumen/__init__.py +0 -23
- webscout/Provider/TTI/piclumen/async_piclumen.py +0 -268
- webscout/Provider/TTI/piclumen/sync_piclumen.py +0 -233
- webscout/Provider/TTI/pixelmuse/README.md +0 -79
- webscout/Provider/TTI/pixelmuse/__init__.py +0 -4
- webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +0 -249
- webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +0 -182
- webscout/Provider/TTI/talkai/README.md +0 -139
- webscout/Provider/TTI/talkai/__init__.py +0 -4
- webscout/Provider/TTI/talkai/async_talkai.py +0 -229
- webscout/Provider/TTI/talkai/sync_talkai.py +0 -207
- webscout/Provider/UNFINISHED/oivscode.py +0 -351
- webscout-8.2.8.dist-info/RECORD +0 -334
- {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/licenses/LICENSE.md +0 -0
- {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/top_level.txt +0 -0
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
import re
|
|
3
|
-
import traceback
|
|
4
|
-
from datetime import datetime
|
|
5
|
-
from typing import Any, Dict, Optional, Union
|
|
6
|
-
|
|
7
|
-
class MessageFormatter:
|
|
8
|
-
"""Utility class for formatting log messages."""
|
|
9
|
-
|
|
10
|
-
@staticmethod
|
|
11
|
-
def format_exception(exc_info: tuple) -> str:
|
|
12
|
-
"""
|
|
13
|
-
Format exception information into a readable string.
|
|
14
|
-
|
|
15
|
-
Args:
|
|
16
|
-
exc_info: Tuple of (type, value, traceback)
|
|
17
|
-
|
|
18
|
-
Returns:
|
|
19
|
-
Formatted exception string
|
|
20
|
-
"""
|
|
21
|
-
return "".join(traceback.format_exception(*exc_info))
|
|
22
|
-
|
|
23
|
-
@staticmethod
|
|
24
|
-
def format_dict(data: Dict[str, Any], indent: int = 2) -> str:
|
|
25
|
-
"""
|
|
26
|
-
Format dictionary into pretty-printed string.
|
|
27
|
-
|
|
28
|
-
Args:
|
|
29
|
-
data: Dictionary to format
|
|
30
|
-
indent: Number of spaces for indentation
|
|
31
|
-
|
|
32
|
-
Returns:
|
|
33
|
-
Formatted string representation
|
|
34
|
-
"""
|
|
35
|
-
return json.dumps(data, indent=indent, default=str, ensure_ascii=False)
|
|
36
|
-
|
|
37
|
-
@staticmethod
|
|
38
|
-
def format_object(obj: Any) -> str:
|
|
39
|
-
"""
|
|
40
|
-
Format any object into a string representation.
|
|
41
|
-
|
|
42
|
-
Args:
|
|
43
|
-
obj: Object to format
|
|
44
|
-
|
|
45
|
-
Returns:
|
|
46
|
-
String representation of object
|
|
47
|
-
"""
|
|
48
|
-
if hasattr(obj, "to_dict"):
|
|
49
|
-
return MessageFormatter.format_dict(obj.to_dict())
|
|
50
|
-
if hasattr(obj, "__dict__"):
|
|
51
|
-
return MessageFormatter.format_dict(obj.__dict__)
|
|
52
|
-
return str(obj)
|
|
53
|
-
|
|
54
|
-
@staticmethod
|
|
55
|
-
def truncate(message: str, max_length: int = 1000, suffix: str = "...") -> str:
|
|
56
|
-
"""
|
|
57
|
-
Truncate message to maximum length.
|
|
58
|
-
|
|
59
|
-
Args:
|
|
60
|
-
message: Message to truncate
|
|
61
|
-
max_length: Maximum length
|
|
62
|
-
suffix: String to append when truncated
|
|
63
|
-
|
|
64
|
-
Returns:
|
|
65
|
-
Truncated message
|
|
66
|
-
"""
|
|
67
|
-
if len(message) <= max_length:
|
|
68
|
-
return message
|
|
69
|
-
return message[:max_length - len(suffix)] + suffix
|
|
70
|
-
|
|
71
|
-
@staticmethod
|
|
72
|
-
def mask_sensitive(message: str, patterns: Dict[str, str]) -> str:
|
|
73
|
-
"""
|
|
74
|
-
Mask sensitive information in message.
|
|
75
|
-
|
|
76
|
-
Args:
|
|
77
|
-
message: Message to process
|
|
78
|
-
patterns: Dictionary of {pattern: mask}
|
|
79
|
-
|
|
80
|
-
Returns:
|
|
81
|
-
Message with sensitive info masked
|
|
82
|
-
"""
|
|
83
|
-
result = message
|
|
84
|
-
for pattern, mask in patterns.items():
|
|
85
|
-
result = re.sub(pattern, mask, result)
|
|
86
|
-
return result
|
|
87
|
-
|
|
88
|
-
@staticmethod
|
|
89
|
-
def format_context(context: Dict[str, Any]) -> str:
|
|
90
|
-
"""
|
|
91
|
-
Format context dictionary into readable string.
|
|
92
|
-
|
|
93
|
-
Args:
|
|
94
|
-
context: Context dictionary
|
|
95
|
-
|
|
96
|
-
Returns:
|
|
97
|
-
Formatted context string
|
|
98
|
-
"""
|
|
99
|
-
parts = []
|
|
100
|
-
for key, value in sorted(context.items()):
|
|
101
|
-
formatted_value = (
|
|
102
|
-
MessageFormatter.format_object(value)
|
|
103
|
-
if isinstance(value, (dict, list, tuple))
|
|
104
|
-
else str(value)
|
|
105
|
-
)
|
|
106
|
-
parts.append(f"{key}={formatted_value}")
|
|
107
|
-
return " ".join(parts)
|
|
108
|
-
|
|
109
|
-
@staticmethod
|
|
110
|
-
def format_metrics(metrics: Dict[str, Union[int, float]]) -> str:
|
|
111
|
-
"""
|
|
112
|
-
Format performance metrics into readable string.
|
|
113
|
-
|
|
114
|
-
Args:
|
|
115
|
-
metrics: Dictionary of metric names and values
|
|
116
|
-
|
|
117
|
-
Returns:
|
|
118
|
-
Formatted metrics string
|
|
119
|
-
"""
|
|
120
|
-
parts = []
|
|
121
|
-
for key, value in sorted(metrics.items()):
|
|
122
|
-
if isinstance(value, float):
|
|
123
|
-
formatted = f"{value:.3f}"
|
|
124
|
-
else:
|
|
125
|
-
formatted = str(value)
|
|
126
|
-
parts.append(f"{key}={formatted}")
|
|
127
|
-
return " ".join(parts)
|
|
128
|
-
|
|
129
|
-
@staticmethod
|
|
130
|
-
def format_timestamp(
|
|
131
|
-
timestamp: Optional[datetime] = None,
|
|
132
|
-
format: str = "%Y-%m-%d %H:%M:%S.%f"
|
|
133
|
-
) -> str:
|
|
134
|
-
"""
|
|
135
|
-
Format timestamp into string.
|
|
136
|
-
|
|
137
|
-
Args:
|
|
138
|
-
timestamp: Datetime object (uses current time if None)
|
|
139
|
-
format: strftime format string
|
|
140
|
-
|
|
141
|
-
Returns:
|
|
142
|
-
Formatted timestamp string
|
|
143
|
-
"""
|
|
144
|
-
if timestamp is None:
|
|
145
|
-
timestamp = datetime.now()
|
|
146
|
-
return timestamp.strftime(format)
|
|
147
|
-
|
|
148
|
-
@classmethod
|
|
149
|
-
def format_message(
|
|
150
|
-
cls,
|
|
151
|
-
message: str,
|
|
152
|
-
context: Optional[Dict[str, Any]] = None,
|
|
153
|
-
metrics: Optional[Dict[str, Union[int, float]]] = None,
|
|
154
|
-
max_length: Optional[int] = None,
|
|
155
|
-
mask_patterns: Optional[Dict[str, str]] = None,
|
|
156
|
-
timestamp_format: Optional[str] = None
|
|
157
|
-
) -> str:
|
|
158
|
-
"""
|
|
159
|
-
Format complete log message with all options.
|
|
160
|
-
|
|
161
|
-
Args:
|
|
162
|
-
message: Base message
|
|
163
|
-
context: Optional context dictionary
|
|
164
|
-
metrics: Optional performance metrics
|
|
165
|
-
max_length: Optional maximum length
|
|
166
|
-
mask_patterns: Optional sensitive data patterns
|
|
167
|
-
timestamp_format: Optional timestamp format
|
|
168
|
-
|
|
169
|
-
Returns:
|
|
170
|
-
Formatted complete message
|
|
171
|
-
"""
|
|
172
|
-
parts = []
|
|
173
|
-
|
|
174
|
-
# Add timestamp
|
|
175
|
-
if timestamp_format:
|
|
176
|
-
parts.append(cls.format_timestamp(format=timestamp_format))
|
|
177
|
-
|
|
178
|
-
# Add main message
|
|
179
|
-
parts.append(message)
|
|
180
|
-
|
|
181
|
-
# Add context if present
|
|
182
|
-
if context:
|
|
183
|
-
parts.append(cls.format_context(context))
|
|
184
|
-
|
|
185
|
-
# Add metrics if present
|
|
186
|
-
if metrics:
|
|
187
|
-
parts.append(cls.format_metrics(metrics))
|
|
188
|
-
|
|
189
|
-
# Join all parts
|
|
190
|
-
result = " ".join(parts)
|
|
191
|
-
|
|
192
|
-
# Apply masking if needed
|
|
193
|
-
if mask_patterns:
|
|
194
|
-
result = cls.mask_sensitive(result, mask_patterns)
|
|
195
|
-
|
|
196
|
-
# Apply length limit if needed
|
|
197
|
-
if max_length:
|
|
198
|
-
result = cls.truncate(result, max_length)
|
|
199
|
-
|
|
200
|
-
return result
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
from typing import Union, Any, Dict, Generator, Optional
|
|
2
|
-
import requests
|
|
3
|
-
import json
|
|
4
|
-
|
|
5
|
-
from webscout.AIutel import Optimizers, Conversation, AwesomePrompts
|
|
6
|
-
from webscout.AIbase import Provider
|
|
7
|
-
from webscout import exceptions
|
|
8
|
-
from webscout.litagent import LitAgent as Lit
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class ChatGPTGratis(Provider):
|
|
12
|
-
"""
|
|
13
|
-
A class to interact with the chatgptgratis.eu backend API with real-time streaming.
|
|
14
|
-
"""
|
|
15
|
-
AVAILABLE_MODELS = [
|
|
16
|
-
"Meta-Llama-3.2-1B-Instruct",
|
|
17
|
-
"Meta-Llama-3.2-3B-Instruct",
|
|
18
|
-
"Meta-Llama-3.1-8B-Instruct",
|
|
19
|
-
"Meta-Llama-3.1-70B-Instruct",
|
|
20
|
-
"Meta-Llama-3.1-405B-Instruct",
|
|
21
|
-
"gpt4o"
|
|
22
|
-
]
|
|
23
|
-
|
|
24
|
-
def __init__(
|
|
25
|
-
self,
|
|
26
|
-
model: str = "Meta-Llama-3.2-1B-Instruct",
|
|
27
|
-
timeout: int = 30,
|
|
28
|
-
proxies: Optional[Dict[str, str]] = None,
|
|
29
|
-
intro: Optional[str] = None,
|
|
30
|
-
filepath: Optional[str] = None,
|
|
31
|
-
update_file: bool = True,
|
|
32
|
-
history_offset: int = 10250,
|
|
33
|
-
act: Optional[str] = None,
|
|
34
|
-
) -> None:
|
|
35
|
-
"""
|
|
36
|
-
Initializes the ChatGPTGratis.
|
|
37
|
-
"""
|
|
38
|
-
if model not in self.AVAILABLE_MODELS:
|
|
39
|
-
raise ValueError(f"Invalid model: {model}. Choose from: {self.AVAILABLE_MODELS}")
|
|
40
|
-
|
|
41
|
-
self.session = requests.Session()
|
|
42
|
-
self.timeout = timeout
|
|
43
|
-
self.api_endpoint = "https://chatgptgratis.eu/backend/chat.php"
|
|
44
|
-
self.model = model
|
|
45
|
-
|
|
46
|
-
# Set up headers similar to a browser request with dynamic User-Agent
|
|
47
|
-
self.headers = {
|
|
48
|
-
"Accept": "*/*",
|
|
49
|
-
"Content-Type": "application/json",
|
|
50
|
-
"Origin": "https://chatgptgratis.eu",
|
|
51
|
-
"Referer": "https://chatgptgratis.eu/chat.html",
|
|
52
|
-
"User-Agent": Lit().random(),
|
|
53
|
-
}
|
|
54
|
-
self.session.headers.update(self.headers)
|
|
55
|
-
self.session.proxies = proxies or {}
|
|
56
|
-
|
|
57
|
-
# Set up conversation history and prompts
|
|
58
|
-
Conversation.intro = (
|
|
59
|
-
AwesomePrompts().get_act(
|
|
60
|
-
act, raise_not_found=True, default=None, case_insensitive=True
|
|
61
|
-
)
|
|
62
|
-
if act
|
|
63
|
-
else intro or Conversation.intro
|
|
64
|
-
)
|
|
65
|
-
self.conversation = Conversation(
|
|
66
|
-
True, 8096, filepath, update_file
|
|
67
|
-
)
|
|
68
|
-
self.conversation.history_offset = history_offset
|
|
69
|
-
|
|
70
|
-
def ask(
|
|
71
|
-
self,
|
|
72
|
-
prompt: str,
|
|
73
|
-
stream: bool = False,
|
|
74
|
-
raw: bool = False,
|
|
75
|
-
optimizer: Optional[str] = None,
|
|
76
|
-
conversationally: bool = False,
|
|
77
|
-
) -> Union[Dict[str, Any], Generator[Any, None, None]]:
|
|
78
|
-
"""
|
|
79
|
-
Sends a request to the API and returns the response.
|
|
80
|
-
If stream is True, yields response chunks as they are received.
|
|
81
|
-
"""
|
|
82
|
-
conversation_prompt = self.conversation.gen_complete_prompt(prompt)
|
|
83
|
-
if optimizer:
|
|
84
|
-
available_opts = (
|
|
85
|
-
method for method in dir(Optimizers)
|
|
86
|
-
if callable(getattr(Optimizers, method)) and not method.startswith("__")
|
|
87
|
-
)
|
|
88
|
-
if optimizer in available_opts:
|
|
89
|
-
conversation_prompt = getattr(Optimizers, optimizer)(
|
|
90
|
-
conversation_prompt if conversationally else prompt
|
|
91
|
-
)
|
|
92
|
-
else:
|
|
93
|
-
raise Exception(f"Optimizer is not one of {list(available_opts)}")
|
|
94
|
-
|
|
95
|
-
payload = {
|
|
96
|
-
"message": conversation_prompt,
|
|
97
|
-
"model": self.model,
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
def for_stream() -> Generator[Dict[str, Any], None, None]:
|
|
101
|
-
response = self.session.post(
|
|
102
|
-
self.api_endpoint,
|
|
103
|
-
json=payload,
|
|
104
|
-
stream=True,
|
|
105
|
-
timeout=self.timeout
|
|
106
|
-
)
|
|
107
|
-
if not response.ok:
|
|
108
|
-
raise exceptions.FailedToGenerateResponseError(
|
|
109
|
-
f"Failed to generate response - ({response.status_code}, {response.reason}) - {response.text}"
|
|
110
|
-
)
|
|
111
|
-
|
|
112
|
-
full_response = ""
|
|
113
|
-
for line in response.iter_lines():
|
|
114
|
-
if line:
|
|
115
|
-
line_decoded = line.decode('utf-8').strip()
|
|
116
|
-
if line_decoded == "data: [DONE]":
|
|
117
|
-
break
|
|
118
|
-
if line_decoded.startswith("data: "):
|
|
119
|
-
try:
|
|
120
|
-
json_data = json.loads(line_decoded[6:])
|
|
121
|
-
choices = json_data.get("choices", [])
|
|
122
|
-
if choices and "delta" in choices[0]:
|
|
123
|
-
content = choices[0]["delta"].get("content", "")
|
|
124
|
-
else:
|
|
125
|
-
content = ""
|
|
126
|
-
full_response += content
|
|
127
|
-
yield content if raw else {"text": content}
|
|
128
|
-
except json.JSONDecodeError:
|
|
129
|
-
continue
|
|
130
|
-
# Update last response and conversation history.
|
|
131
|
-
self.conversation.update_chat_history(prompt, self.get_message({"text": full_response}))
|
|
132
|
-
|
|
133
|
-
def for_non_stream() -> Dict[str, Any]:
|
|
134
|
-
collected = ""
|
|
135
|
-
for chunk in for_stream():
|
|
136
|
-
collected += chunk["text"] if isinstance(chunk, dict) else chunk
|
|
137
|
-
return {"text": collected}
|
|
138
|
-
|
|
139
|
-
return for_stream() if stream else for_non_stream()
|
|
140
|
-
|
|
141
|
-
def chat(
|
|
142
|
-
self,
|
|
143
|
-
prompt: str,
|
|
144
|
-
stream: bool = False,
|
|
145
|
-
optimizer: Optional[str] = None,
|
|
146
|
-
conversationally: bool = False,
|
|
147
|
-
) -> Union[str, Generator[str, None, None]]:
|
|
148
|
-
"""
|
|
149
|
-
Returns the response as a string.
|
|
150
|
-
For streaming requests, yields each response chunk as a string.
|
|
151
|
-
"""
|
|
152
|
-
def stream_response() -> Generator[str, None, None]:
|
|
153
|
-
for response in self.ask(
|
|
154
|
-
prompt, stream=True, optimizer=optimizer, conversationally=conversationally
|
|
155
|
-
):
|
|
156
|
-
yield self.get_message(response)
|
|
157
|
-
|
|
158
|
-
def non_stream_response() -> str:
|
|
159
|
-
return self.get_message(self.ask(
|
|
160
|
-
prompt, stream=False, optimizer=optimizer, conversationally=conversationally
|
|
161
|
-
))
|
|
162
|
-
|
|
163
|
-
return stream_response() if stream else non_stream_response()
|
|
164
|
-
|
|
165
|
-
def get_message(self, response: dict) -> str:
|
|
166
|
-
"""
|
|
167
|
-
Extracts and returns the text message from the response dictionary.
|
|
168
|
-
"""
|
|
169
|
-
assert isinstance(response, dict), "Response must be a dictionary."
|
|
170
|
-
return response.get("text", "")
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
if __name__ == "__main__":
|
|
174
|
-
print("-" * 80)
|
|
175
|
-
print(f"{'Model':<50} {'Status':<10} {'Response'}")
|
|
176
|
-
print("-" * 80)
|
|
177
|
-
|
|
178
|
-
for model in ChatGPTGratis.AVAILABLE_MODELS:
|
|
179
|
-
try:
|
|
180
|
-
test_ai = ChatGPTGratis(model=model, timeout=60)
|
|
181
|
-
response = test_ai.chat("Say 'Hello' in one word")
|
|
182
|
-
response_text = response
|
|
183
|
-
|
|
184
|
-
if response_text and len(response_text.strip()) > 0:
|
|
185
|
-
status = "✓"
|
|
186
|
-
# Clean and truncate response
|
|
187
|
-
clean_text = response_text.strip().encode('utf-8', errors='ignore').decode('utf-8')
|
|
188
|
-
display_text = clean_text[:50] + "..." if len(clean_text) > 50 else clean_text
|
|
189
|
-
else:
|
|
190
|
-
status = "✗"
|
|
191
|
-
display_text = "Empty or invalid response"
|
|
192
|
-
print(f"{model:<50} {status:<10} {display_text}")
|
|
193
|
-
except Exception as e:
|
|
194
|
-
print(f"{model:<50} {'✗':<10} {str(e)}")
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
# AiForce Provider 🔥
|
|
2
|
-
|
|
3
|
-
Yo fam! This is the AiForce provider for generating some fire images! Part of the HelpingAI squad! 👑
|
|
4
|
-
|
|
5
|
-
## Features 💪
|
|
6
|
-
|
|
7
|
-
- Both sync and async support ⚡
|
|
8
|
-
- 12 fire models to choose from 🎨
|
|
9
|
-
- Smart retry mechanism 🔄
|
|
10
|
-
- Custom image sizes 📐
|
|
11
|
-
- Save with custom names 💾
|
|
12
|
-
- Fire logging with cyberpunk theme 🌟
|
|
13
|
-
- Proxy support for stealth mode 🕵️♂️
|
|
14
|
-
|
|
15
|
-
## Quick Start 🚀
|
|
16
|
-
|
|
17
|
-
### Installation 📦
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
pip install webscout
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
### Basic Usage 💫
|
|
24
|
-
|
|
25
|
-
```python
|
|
26
|
-
# Sync way
|
|
27
|
-
from webscout import AiForceimager
|
|
28
|
-
|
|
29
|
-
provider = AiForceimager()
|
|
30
|
-
images = provider.generate("Epic dragon")
|
|
31
|
-
paths = provider.save(images)
|
|
32
|
-
|
|
33
|
-
# Async way
|
|
34
|
-
from webscout import AsyncAiForceimager
|
|
35
|
-
import asyncio
|
|
36
|
-
|
|
37
|
-
async def generate():
|
|
38
|
-
provider = AsyncAiForceimager()
|
|
39
|
-
images = await provider.generate("Cool art")
|
|
40
|
-
paths = await provider.save(images)
|
|
41
|
-
|
|
42
|
-
asyncio.run(generate())
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Available Models 🎭
|
|
46
|
-
|
|
47
|
-
| Model | Description | Best For |
|
|
48
|
-
|-------|-------------|----------|
|
|
49
|
-
| `Flux-1.1-Pro` | Latest pro model (Default) | High quality general purpose |
|
|
50
|
-
| `stable-diffusion-xl-lightning` | Fast SDXL model | Quick generations |
|
|
51
|
-
| `stable-diffusion-xl-base` | Base SDXL model | High quality base |
|
|
52
|
-
| `ideogram` | Artistic model | Creative artwork |
|
|
53
|
-
| `flux` | Standard model | General purpose |
|
|
54
|
-
| `flux-realism` | Photorealistic model | Realistic images |
|
|
55
|
-
| `flux-anime` | Anime style | Anime/manga art |
|
|
56
|
-
| `flux-3d` | 3D rendering | 3D objects/scenes |
|
|
57
|
-
| `flux-disney` | Disney style | Disney-like art |
|
|
58
|
-
| `flux-pixel` | Pixel art | Retro/game art |
|
|
59
|
-
| `flux-4o` | 4k output | High resolution |
|
|
60
|
-
| `any-dark` | Dark theme | Gothic/dark art |
|
|
61
|
-
|
|
62
|
-
## Advanced Examples 🔥
|
|
63
|
-
|
|
64
|
-
### Custom Settings 🛠️
|
|
65
|
-
|
|
66
|
-
```python
|
|
67
|
-
provider = AiForceimager(
|
|
68
|
-
timeout=120, # Longer timeout
|
|
69
|
-
proxies={
|
|
70
|
-
'http': 'http://proxy.example.com:8080'
|
|
71
|
-
}
|
|
72
|
-
)
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### Multiple Images with Custom Size 📸
|
|
76
|
-
|
|
77
|
-
```python
|
|
78
|
-
images = provider.generate(
|
|
79
|
-
prompt="A shiny red sports car",
|
|
80
|
-
amount=3, # Generate 3 images
|
|
81
|
-
model="flux-realism", # Use realistic model
|
|
82
|
-
width=1024, # Custom width
|
|
83
|
-
height=768, # Custom height
|
|
84
|
-
seed=42 # For reproducible results
|
|
85
|
-
)
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
### Custom Save Options 💾
|
|
89
|
-
|
|
90
|
-
```python
|
|
91
|
-
paths = provider.save(
|
|
92
|
-
images,
|
|
93
|
-
name="sports_car", # Custom name
|
|
94
|
-
dir="my_images", # Custom directory
|
|
95
|
-
filenames_prefix="v1_" # Add prefix
|
|
96
|
-
)
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### Async with Error Handling ⚡
|
|
100
|
-
|
|
101
|
-
```python
|
|
102
|
-
async def generate_safely():
|
|
103
|
-
provider = AsyncAiForceimager()
|
|
104
|
-
try:
|
|
105
|
-
images = await provider.generate(
|
|
106
|
-
prompt="Epic dragon",
|
|
107
|
-
model="flux-3d",
|
|
108
|
-
amount=2
|
|
109
|
-
)
|
|
110
|
-
paths = await provider.save(images, dir="dragons")
|
|
111
|
-
print(f"Saved to: {paths}")
|
|
112
|
-
except Exception as e:
|
|
113
|
-
print(f"Oops! Something went wrong: {e}")
|
|
114
|
-
|
|
115
|
-
asyncio.run(generate_safely())
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
## Tips & Tricks 💡
|
|
119
|
-
|
|
120
|
-
1. Use `flux-realism` for photorealistic images
|
|
121
|
-
2. Use `flux-3d` for product renders
|
|
122
|
-
3. Use `flux-anime` for anime style art
|
|
123
|
-
4. Set custom timeouts for large images
|
|
124
|
-
5. Use proxies for better reliability
|
|
125
|
-
6. Add seed for reproducible results
|
|
126
|
-
|
|
127
|
-
## Error Handling 🛡️
|
|
128
|
-
|
|
129
|
-
The provider handles common errors:
|
|
130
|
-
|
|
131
|
-
- Network issues
|
|
132
|
-
- API timeouts
|
|
133
|
-
- Invalid inputs
|
|
134
|
-
- File saving errors
|
|
135
|
-
|
|
136
|
-
Example with retry:
|
|
137
|
-
|
|
138
|
-
```python
|
|
139
|
-
provider = AiForceimager()
|
|
140
|
-
try:
|
|
141
|
-
images = provider.generate(
|
|
142
|
-
"Epic scene",
|
|
143
|
-
max_retries=5, # More retries
|
|
144
|
-
retry_delay=10 # Longer delay
|
|
145
|
-
)
|
|
146
|
-
except Exception as e:
|
|
147
|
-
print(f"Generation failed: {e}")
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
## Contributing 🤝
|
|
151
|
-
|
|
152
|
-
Pull up to the squad! We're always looking for improvements:
|
|
153
|
-
|
|
154
|
-
1. Fork it
|
|
155
|
-
2. Create your feature branch
|
|
156
|
-
3. Push your changes
|
|
157
|
-
4. Hit us with that pull request
|
|
158
|
-
|
|
159
|
-
Made with 💖 by the HelpingAI Team
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
AiForce - Your go-to provider for generating fire images! 🔥
|
|
3
|
-
|
|
4
|
-
Examples:
|
|
5
|
-
>>> # Sync Usage
|
|
6
|
-
>>> from webscout import AiForceimager
|
|
7
|
-
>>> provider = AiForceimager()
|
|
8
|
-
>>> images = provider.generate("Cool art")
|
|
9
|
-
>>> paths = provider.save(images)
|
|
10
|
-
>>>
|
|
11
|
-
>>> # Async Usage
|
|
12
|
-
>>> from webscout import AsyncAiForceimager
|
|
13
|
-
>>> async def example():
|
|
14
|
-
... provider = AsyncAiForceimager()
|
|
15
|
-
... images = await provider.generate("Epic dragon")
|
|
16
|
-
... paths = await provider.save(images)
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
from .sync_aiforce import AiForceimager
|
|
20
|
-
from .async_aiforce import AsyncAiForceimager
|
|
21
|
-
|
|
22
|
-
__all__ = ["AiForceimager", "AsyncAiForceimager"]
|