webscout 8.2.9__py3-none-any.whl → 8.3.1__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 +6 -6
- webscout/AIbase.py +61 -1
- webscout/Extra/YTToolkit/ytapi/patterns.py +45 -45
- webscout/Extra/YTToolkit/ytapi/stream.py +1 -1
- webscout/Extra/YTToolkit/ytapi/video.py +10 -10
- webscout/Extra/autocoder/autocoder_utiles.py +1 -1
- webscout/Litlogger/formats.py +9 -0
- webscout/Litlogger/handlers.py +18 -0
- webscout/Litlogger/logger.py +43 -1
- webscout/Provider/AISEARCH/scira_search.py +3 -2
- webscout/Provider/Blackboxai.py +2 -0
- webscout/Provider/ChatSandbox.py +2 -1
- webscout/Provider/Deepinfra.py +1 -1
- webscout/Provider/HeckAI.py +1 -1
- webscout/Provider/LambdaChat.py +8 -1
- webscout/Provider/MCPCore.py +7 -3
- webscout/Provider/OPENAI/BLACKBOXAI.py +396 -113
- webscout/Provider/OPENAI/Cloudflare.py +31 -14
- webscout/Provider/OPENAI/FalconH1.py +457 -0
- webscout/Provider/OPENAI/FreeGemini.py +29 -13
- webscout/Provider/OPENAI/NEMOTRON.py +26 -14
- webscout/Provider/OPENAI/PI.py +427 -0
- webscout/Provider/OPENAI/Qwen3.py +161 -140
- webscout/Provider/OPENAI/README.md +3 -0
- webscout/Provider/OPENAI/TogetherAI.py +355 -0
- webscout/Provider/OPENAI/TwoAI.py +29 -12
- webscout/Provider/OPENAI/__init__.py +4 -1
- webscout/Provider/OPENAI/ai4chat.py +33 -23
- webscout/Provider/OPENAI/api.py +375 -24
- webscout/Provider/OPENAI/autoproxy.py +39 -0
- webscout/Provider/OPENAI/base.py +91 -12
- webscout/Provider/OPENAI/c4ai.py +31 -10
- webscout/Provider/OPENAI/chatgpt.py +56 -24
- webscout/Provider/OPENAI/chatgptclone.py +46 -16
- webscout/Provider/OPENAI/chatsandbox.py +7 -3
- webscout/Provider/OPENAI/copilot.py +26 -10
- webscout/Provider/OPENAI/deepinfra.py +29 -12
- webscout/Provider/OPENAI/e2b.py +358 -158
- webscout/Provider/OPENAI/exaai.py +13 -10
- webscout/Provider/OPENAI/exachat.py +10 -6
- webscout/Provider/OPENAI/flowith.py +7 -3
- webscout/Provider/OPENAI/freeaichat.py +10 -6
- webscout/Provider/OPENAI/glider.py +10 -6
- webscout/Provider/OPENAI/heckai.py +11 -8
- webscout/Provider/OPENAI/llmchatco.py +9 -7
- webscout/Provider/OPENAI/mcpcore.py +10 -7
- webscout/Provider/OPENAI/multichat.py +3 -1
- webscout/Provider/OPENAI/netwrck.py +10 -6
- webscout/Provider/OPENAI/oivscode.py +12 -9
- webscout/Provider/OPENAI/opkfc.py +31 -8
- webscout/Provider/OPENAI/scirachat.py +17 -10
- webscout/Provider/OPENAI/sonus.py +10 -6
- webscout/Provider/OPENAI/standardinput.py +18 -9
- webscout/Provider/OPENAI/textpollinations.py +14 -7
- webscout/Provider/OPENAI/toolbaz.py +16 -11
- webscout/Provider/OPENAI/typefully.py +14 -7
- webscout/Provider/OPENAI/typegpt.py +10 -6
- webscout/Provider/OPENAI/uncovrAI.py +22 -8
- webscout/Provider/OPENAI/venice.py +10 -6
- webscout/Provider/OPENAI/writecream.py +13 -10
- webscout/Provider/OPENAI/x0gpt.py +11 -9
- webscout/Provider/OPENAI/yep.py +12 -10
- webscout/Provider/PI.py +2 -1
- webscout/Provider/STT/__init__.py +3 -0
- webscout/Provider/STT/base.py +281 -0
- webscout/Provider/STT/elevenlabs.py +265 -0
- webscout/Provider/TTI/__init__.py +3 -1
- webscout/Provider/TTI/aiarta.py +399 -365
- webscout/Provider/TTI/base.py +74 -2
- webscout/Provider/TTI/fastflux.py +63 -30
- webscout/Provider/TTI/gpt1image.py +149 -0
- webscout/Provider/TTI/imagen.py +196 -0
- webscout/Provider/TTI/magicstudio.py +60 -29
- webscout/Provider/TTI/piclumen.py +43 -32
- webscout/Provider/TTI/pixelmuse.py +232 -225
- webscout/Provider/TTI/pollinations.py +43 -32
- webscout/Provider/TTI/together.py +287 -0
- webscout/Provider/TTI/utils.py +2 -1
- webscout/Provider/TTS/README.md +1 -0
- webscout/Provider/TTS/__init__.py +2 -1
- webscout/Provider/TTS/freetts.py +140 -0
- webscout/Provider/UNFINISHED/ChutesAI.py +314 -0
- webscout/Provider/UNFINISHED/fetch_together_models.py +95 -0
- webscout/Provider/__init__.py +3 -2
- webscout/Provider/granite.py +41 -6
- webscout/Provider/oivscode.py +37 -37
- webscout/Provider/scira_chat.py +3 -2
- webscout/Provider/scnet.py +1 -0
- webscout/Provider/toolbaz.py +0 -1
- webscout/litagent/Readme.md +12 -3
- webscout/litagent/agent.py +99 -62
- webscout/version.py +1 -1
- {webscout-8.2.9.dist-info → webscout-8.3.1.dist-info}/METADATA +2 -1
- {webscout-8.2.9.dist-info → webscout-8.3.1.dist-info}/RECORD +98 -87
- {webscout-8.2.9.dist-info → webscout-8.3.1.dist-info}/WHEEL +1 -1
- webscout/Provider/ChatGPTGratis.py +0 -194
- webscout/Provider/TTI/artbit.py +0 -0
- {webscout-8.2.9.dist-info → webscout-8.3.1.dist-info}/entry_points.txt +0 -0
- {webscout-8.2.9.dist-info → webscout-8.3.1.dist-info}/licenses/LICENSE.md +0 -0
- {webscout-8.2.9.dist-info → webscout-8.3.1.dist-info}/top_level.txt +0 -0
webscout/Provider/OPENAI/e2b.py
CHANGED
|
@@ -2,14 +2,15 @@ import json
|
|
|
2
2
|
import time
|
|
3
3
|
import uuid
|
|
4
4
|
import urllib.parse
|
|
5
|
-
|
|
5
|
+
import random
|
|
6
|
+
import base64
|
|
7
|
+
from datetime import datetime, timedelta
|
|
6
8
|
from typing import List, Dict, Optional, Union, Generator, Any
|
|
7
|
-
import
|
|
8
|
-
import requests # For bypassing Cloudflare protection
|
|
9
|
+
from curl_cffi import requests as curl_requests
|
|
9
10
|
|
|
10
11
|
# Import base classes and utility structures
|
|
11
|
-
from .base import OpenAICompatibleProvider, BaseChat, BaseCompletions
|
|
12
|
-
from .utils import (
|
|
12
|
+
from webscout.Provider.OPENAI.base import OpenAICompatibleProvider, BaseChat, BaseCompletions
|
|
13
|
+
from webscout.Provider.OPENAI.utils import (
|
|
13
14
|
ChatCompletionChunk, ChatCompletion, Choice, ChoiceDelta,
|
|
14
15
|
ChatCompletionMessage, CompletionUsage, count_tokens
|
|
15
16
|
)
|
|
@@ -18,11 +19,7 @@ from .utils import (
|
|
|
18
19
|
try:
|
|
19
20
|
from webscout.litagent import LitAgent
|
|
20
21
|
except ImportError:
|
|
21
|
-
|
|
22
|
-
def random(self) -> str:
|
|
23
|
-
# Return a default user agent if LitAgent is unavailable
|
|
24
|
-
return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
|
|
25
|
-
|
|
22
|
+
LitAgent = None
|
|
26
23
|
# ANSI escape codes for formatting
|
|
27
24
|
BOLD = "\033[1m"
|
|
28
25
|
RED = "\033[91m"
|
|
@@ -40,11 +37,11 @@ MODEL_PROMPT = {
|
|
|
40
37
|
"multiModal": True,
|
|
41
38
|
"templates": {
|
|
42
39
|
"system": {
|
|
43
|
-
"intro": "You are Claude, a
|
|
44
|
-
"principles": ["honesty", "ethics", "diligence"],
|
|
40
|
+
"intro": "You are Claude, a sophisticated AI assistant created by Anthropic to be helpful, harmless, and honest. You excel at complex reasoning, creative tasks, and providing nuanced explanations across a wide range of topics. You can analyze images, code, and data to provide insightful responses.",
|
|
41
|
+
"principles": ["honesty", "ethics", "diligence", "helpfulness", "accuracy", "thoughtfulness"],
|
|
45
42
|
"latex": {
|
|
46
|
-
"inline": "
|
|
47
|
-
"block": "
|
|
43
|
+
"inline": "\\(x^2 + y^2 = z^2\\)",
|
|
44
|
+
"block": "\\begin{align}\nE &= mc^2\\\\\n\\nabla \\times \\vec{B} &= \\frac{4\\pi}{c} \\vec{J} + \\frac{1}{c} \\frac{\\partial\\vec{E}}{\\partial t}\n\\end{align}"
|
|
48
45
|
}
|
|
49
46
|
}
|
|
50
47
|
},
|
|
@@ -69,11 +66,11 @@ MODEL_PROMPT = {
|
|
|
69
66
|
"multiModal": True,
|
|
70
67
|
"templates": {
|
|
71
68
|
"system": {
|
|
72
|
-
"intro": "You are Claude,
|
|
73
|
-
"principles": ["honesty", "ethics", "diligence"],
|
|
69
|
+
"intro": "You are Claude, an advanced AI assistant created by Anthropic to be helpful, harmless, and honest. You're designed to excel at a wide range of tasks from creative writing to detailed analysis, while maintaining a thoughtful, balanced perspective. You can analyze images and documents to provide comprehensive insights.",
|
|
70
|
+
"principles": ["honesty", "ethics", "diligence", "helpfulness", "clarity", "thoughtfulness"],
|
|
74
71
|
"latex": {
|
|
75
|
-
"inline": "
|
|
76
|
-
"block": "
|
|
72
|
+
"inline": "\\(\\int_{a}^{b} f(x) \\, dx\\)",
|
|
73
|
+
"block": "\\begin{align}\nF(x) &= \\int f(x) \\, dx\\\\\n\\frac{d}{dx}[F(x)] &= f(x)\n\\end{align}"
|
|
77
74
|
}
|
|
78
75
|
}
|
|
79
76
|
},
|
|
@@ -98,11 +95,11 @@ MODEL_PROMPT = {
|
|
|
98
95
|
"multiModal": False,
|
|
99
96
|
"templates": {
|
|
100
97
|
"system": {
|
|
101
|
-
"intro": "You are Claude, a
|
|
102
|
-
"principles": ["honesty", "ethics", "diligence"],
|
|
98
|
+
"intro": "You are Claude, a helpful AI assistant created by Anthropic, optimized for efficiency and concise responses. You provide clear, accurate information while maintaining a friendly, conversational tone. You aim to be direct and to-the-point while still being thorough on complex topics.",
|
|
99
|
+
"principles": ["honesty", "ethics", "diligence", "conciseness", "clarity", "helpfulness"],
|
|
103
100
|
"latex": {
|
|
104
|
-
"inline": "
|
|
105
|
-
"block": "
|
|
101
|
+
"inline": "\\(\\sum_{i=1}^{n} i = \\frac{n(n+1)}{2}\\)",
|
|
102
|
+
"block": "\\begin{align}\nP(A|B) = \\frac{P(B|A) \\cdot P(A)}{P(B)}\n\\end{align}"
|
|
106
103
|
}
|
|
107
104
|
}
|
|
108
105
|
},
|
|
@@ -301,11 +298,11 @@ MODEL_PROMPT = {
|
|
|
301
298
|
"multiModal": True,
|
|
302
299
|
"templates": {
|
|
303
300
|
"system": {
|
|
304
|
-
"intro": "
|
|
305
|
-
"principles": ["
|
|
301
|
+
"intro": "You are ChatGPT, a state-of-the-art multimodal AI assistant developed by OpenAI, based on the GPT-4o architecture. You're designed to understand and process both text and images with high accuracy. You excel at a wide range of tasks including creative writing, problem-solving, coding assistance, and detailed explanations. You aim to be helpful, harmless, and honest in all interactions.",
|
|
302
|
+
"principles": ["helpfulness", "accuracy", "safety", "transparency", "fairness", "user-focus"],
|
|
306
303
|
"latex": {
|
|
307
|
-
"inline": "
|
|
308
|
-
"block": "
|
|
304
|
+
"inline": "\\(\\nabla \\cdot \\vec{E} = \\frac{\\rho}{\\epsilon_0}\\)",
|
|
305
|
+
"block": "\\begin{align}\n\\nabla \\cdot \\vec{E} &= \\frac{\\rho}{\\epsilon_0} \\\\\n\\nabla \\cdot \\vec{B} &= 0 \\\\\n\\nabla \\times \\vec{E} &= -\\frac{\\partial\\vec{B}}{\\partial t} \\\\\n\\nabla \\times \\vec{B} &= \\mu_0\\vec{J} + \\mu_0\\epsilon_0\\frac{\\partial\\vec{E}}{\\partial t}\n\\end{align}"
|
|
309
306
|
}
|
|
310
307
|
}
|
|
311
308
|
},
|
|
@@ -330,11 +327,11 @@ MODEL_PROMPT = {
|
|
|
330
327
|
"multiModal": True,
|
|
331
328
|
"templates": {
|
|
332
329
|
"system": {
|
|
333
|
-
"intro": "
|
|
334
|
-
"principles": ["
|
|
330
|
+
"intro": "You are ChatGPT, a versatile AI assistant developed by OpenAI, based on the GPT-4o-mini architecture. You're designed to be efficient while maintaining high-quality responses across various tasks. You can understand both text and images, and provide helpful, accurate information in a conversational manner. You're optimized for quick, concise responses while still being thorough when needed.",
|
|
331
|
+
"principles": ["helpfulness", "accuracy", "efficiency", "clarity", "adaptability", "user-focus"],
|
|
335
332
|
"latex": {
|
|
336
|
-
"inline": "
|
|
337
|
-
"block": "
|
|
333
|
+
"inline": "\\(F = G\\frac{m_1 m_2}{r^2}\\)",
|
|
334
|
+
"block": "\\begin{align}\nF &= ma \\\\\nW &= \\int \\vec{F} \\cdot d\\vec{s}\n\\end{align}"
|
|
338
335
|
}
|
|
339
336
|
}
|
|
340
337
|
},
|
|
@@ -475,11 +472,11 @@ MODEL_PROMPT = {
|
|
|
475
472
|
"multiModal": True,
|
|
476
473
|
"templates": {
|
|
477
474
|
"system": {
|
|
478
|
-
"intro": "You are
|
|
479
|
-
"principles": ["
|
|
475
|
+
"intro": "You are Gemini, Google's advanced multimodal AI assistant designed to understand and process text, images, audio, and code with exceptional capabilities. You're built to provide helpful, accurate, and thoughtful responses across a wide range of topics. You excel at complex reasoning, creative tasks, and detailed explanations while maintaining a balanced, nuanced perspective.",
|
|
476
|
+
"principles": ["helpfulness", "accuracy", "responsibility", "inclusivity", "critical thinking", "creativity"],
|
|
480
477
|
"latex": {
|
|
481
|
-
"inline": "
|
|
482
|
-
"block": "
|
|
478
|
+
"inline": "\\(\\vec{v} = \\vec{v}_0 + \\vec{a}t\\)",
|
|
479
|
+
"block": "\\begin{align}\nS &= k \\ln W \\\\\n\\Delta S &\\geq 0 \\text{ (Second Law of Thermodynamics)}\n\\end{align}"
|
|
483
480
|
}
|
|
484
481
|
}
|
|
485
482
|
},
|
|
@@ -504,11 +501,11 @@ MODEL_PROMPT = {
|
|
|
504
501
|
"multiModal": True,
|
|
505
502
|
"templates": {
|
|
506
503
|
"system": {
|
|
507
|
-
"intro": "You are
|
|
508
|
-
"principles": ["
|
|
504
|
+
"intro": "You are Gemini, Google's cutting-edge multimodal AI assistant built on the experimental 2.5 architecture. You represent the frontier of AI capabilities with enhanced reasoning, multimodal understanding, and nuanced responses. You can analyze complex images, understand intricate contexts, and generate detailed, thoughtful content across domains. You're designed to be helpful, accurate, and insightful while maintaining ethical boundaries.",
|
|
505
|
+
"principles": ["helpfulness", "accuracy", "innovation", "responsibility", "critical thinking", "adaptability"],
|
|
509
506
|
"latex": {
|
|
510
|
-
"inline": "
|
|
511
|
-
"block": "
|
|
507
|
+
"inline": "\\(\\psi(x,t) = Ae^{i(kx-\\omega t)}\\)",
|
|
508
|
+
"block": "\\begin{align}\ni\\hbar\\frac{\\partial}{\\partial t}\\Psi(\\mathbf{r},t) = \\left [ \\frac{-\\hbar^2}{2m}\\nabla^2 + V(\\mathbf{r},t)\\right ] \\Psi(\\mathbf{r},t)\n\\end{align}"
|
|
512
509
|
}
|
|
513
510
|
}
|
|
514
511
|
},
|
|
@@ -620,11 +617,11 @@ MODEL_PROMPT = {
|
|
|
620
617
|
"multiModal": False,
|
|
621
618
|
"templates": {
|
|
622
619
|
"system": {
|
|
623
|
-
"intro": "You are Qwen,
|
|
624
|
-
"principles": ["
|
|
620
|
+
"intro": "You are Qwen, an advanced large language model developed by Alibaba Cloud, designed to provide comprehensive assistance across diverse domains. You excel at understanding complex queries, generating creative content, and providing detailed explanations with a focus on accuracy and helpfulness. Your 32B parameter architecture enables sophisticated reasoning and nuanced responses while maintaining a friendly, conversational tone.",
|
|
621
|
+
"principles": ["accuracy", "helpfulness", "responsibility", "adaptability", "clarity", "cultural awareness"],
|
|
625
622
|
"latex": {
|
|
626
|
-
"inline": "
|
|
627
|
-
"block": "
|
|
623
|
+
"inline": "\\(\\lim_{n \\to \\infty} \\left(1 + \\frac{1}{n}\\right)^n = e\\)",
|
|
624
|
+
"block": "\\begin{align}\nf(x) &= \\sum_{n=0}^{\\infty} \\frac{f^{(n)}(a)}{n!} (x-a)^n \\\\\n&= f(a) + f'(a)(x-a) + \\frac{f''(a)}{2!}(x-a)^2 + \\ldots\n\\end{align}"
|
|
628
625
|
}
|
|
629
626
|
}
|
|
630
627
|
},
|
|
@@ -649,11 +646,11 @@ MODEL_PROMPT = {
|
|
|
649
646
|
"multiModal": False,
|
|
650
647
|
"templates": {
|
|
651
648
|
"system": {
|
|
652
|
-
"intro": "You are Grok,
|
|
653
|
-
"principles": ["informative", "engaging"],
|
|
649
|
+
"intro": "You are Grok, an advanced AI assistant developed by xAI, designed to be informative, engaging, and witty. You combine deep technical knowledge with a conversational, sometimes humorous approach to problem-solving. You excel at providing clear explanations on complex topics while maintaining an accessible tone. Your responses are direct, insightful, and occasionally incorporate appropriate humor when relevant.",
|
|
650
|
+
"principles": ["informative", "engaging", "wit", "clarity", "helpfulness", "curiosity"],
|
|
654
651
|
"latex": {
|
|
655
|
-
"inline": "
|
|
656
|
-
"block": "
|
|
652
|
+
"inline": "\\(\\mathcal{L}(\\theta) = -\\mathbb{E}_{x\\sim p_{\\text{data}}}[\\log p_{\\theta}(x)]\\)",
|
|
653
|
+
"block": "\\begin{align}\n\\mathcal{L}(\\theta) &= -\\mathbb{E}_{x\\sim p_{\\text{data}}}[\\log p_{\\theta}(x)] \\\\\n&= -\\int p_{\\text{data}}(x) \\log p_{\\theta}(x) dx \\\\\n&= H(p_{\\text{data}}, p_{\\theta})\n\\end{align}"
|
|
657
654
|
}
|
|
658
655
|
}
|
|
659
656
|
},
|
|
@@ -678,11 +675,11 @@ MODEL_PROMPT = {
|
|
|
678
675
|
"multiModal": False,
|
|
679
676
|
"templates": {
|
|
680
677
|
"system": {
|
|
681
|
-
"intro": "You are DeepSeek,
|
|
682
|
-
"principles": ["
|
|
678
|
+
"intro": "You are DeepSeek, an advanced AI assistant developed by DeepSeek AI, designed to provide comprehensive, accurate, and thoughtful responses across a wide range of topics. You excel at detailed explanations, problem-solving, and creative tasks with a focus on precision and clarity. You're particularly strong in technical domains while maintaining an accessible communication style for users of all backgrounds.",
|
|
679
|
+
"principles": ["helpfulness", "accuracy", "thoroughness", "clarity", "objectivity", "adaptability"],
|
|
683
680
|
"latex": {
|
|
684
|
-
"inline": "
|
|
685
|
-
"block": "
|
|
681
|
+
"inline": "\\(\\frac{\\partial L}{\\partial w_j} = \\sum_i \\frac{\\partial L}{\\partial y_i} \\frac{\\partial y_i}{\\partial w_j}\\)",
|
|
682
|
+
"block": "\\begin{align}\n\\frac{\\partial L}{\\partial w_j} &= \\sum_i \\frac{\\partial L}{\\partial y_i} \\frac{\\partial y_i}{\\partial w_j} \\\\\n&= \\sum_i \\frac{\\partial L}{\\partial y_i} x_i \\\\\n&= \\mathbf{x}^T \\frac{\\partial L}{\\partial \\mathbf{y}}\n\\end{align}"
|
|
686
683
|
}
|
|
687
684
|
}
|
|
688
685
|
},
|
|
@@ -973,6 +970,8 @@ class Completions(BaseCompletions):
|
|
|
973
970
|
stream: bool = False,
|
|
974
971
|
temperature: Optional[float] = None, # Not directly used by API
|
|
975
972
|
top_p: Optional[float] = None, # Not directly used by API
|
|
973
|
+
timeout: Optional[int] = None,
|
|
974
|
+
proxies: Optional[Dict[str, str]] = None,
|
|
976
975
|
**kwargs: Any
|
|
977
976
|
) -> Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]]:
|
|
978
977
|
"""
|
|
@@ -1002,55 +1001,73 @@ class Completions(BaseCompletions):
|
|
|
1002
1001
|
raise ValueError(f"Error preparing messages for E2B API: {e}") from e
|
|
1003
1002
|
|
|
1004
1003
|
request_id = f"chatcmpl-{uuid.uuid4()}"
|
|
1005
|
-
created_time = int(time.time())
|
|
1006
|
-
|
|
1007
|
-
# Note: The E2B API endpoint used here doesn't seem to support streaming.
|
|
1004
|
+
created_time = int(time.time()) # Note: The E2B API endpoint used here doesn't seem to support streaming.
|
|
1008
1005
|
# The `send_chat_request` method fetches the full response.
|
|
1009
1006
|
# We will simulate streaming if stream=True by yielding the full response in one chunk.
|
|
1010
1007
|
if stream:
|
|
1011
|
-
return self._create_stream_simulation(request_id, created_time, model_id, request_body)
|
|
1008
|
+
return self._create_stream_simulation(request_id, created_time, model_id, request_body, timeout, proxies)
|
|
1012
1009
|
else:
|
|
1013
|
-
return self._create_non_stream(request_id, created_time, model_id, request_body)
|
|
1010
|
+
return self._create_non_stream(request_id, created_time, model_id, request_body, timeout, proxies)
|
|
1014
1011
|
|
|
1015
|
-
def _send_request(self, request_body: dict, model_config: dict, retries: int = 3) -> str:
|
|
1016
|
-
"""
|
|
1012
|
+
def _send_request(self, request_body: dict, model_config: dict, timeout: Optional[int] = None, proxies: Optional[Dict[str, str]] = None, retries: int = 3) -> str:
|
|
1013
|
+
"""Enhanced request method with IP rotation, session rotation, and advanced rate limit bypass."""
|
|
1017
1014
|
url = model_config["apiUrl"]
|
|
1018
1015
|
target_origin = "https://fragments.e2b.dev"
|
|
1019
1016
|
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1017
|
+
for attempt in range(retries):
|
|
1018
|
+
try:
|
|
1019
|
+
# Rotate session data for each attempt to avoid detection
|
|
1020
|
+
session_data = self._client.rotate_session_data()
|
|
1021
|
+
|
|
1022
|
+
# Generate enhanced bypass headers with potential IP spoofing
|
|
1023
|
+
headers = self._client.simulate_bypass_headers(
|
|
1024
|
+
spoof_address=(attempt > 0), # Start IP spoofing after first failure
|
|
1025
|
+
custom_user_agent=None
|
|
1026
|
+
)
|
|
1029
1027
|
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1028
|
+
# Enhanced cookie generation with session rotation
|
|
1029
|
+
current_time = int(time.time() * 1000)
|
|
1030
|
+
cookie_data = {
|
|
1031
|
+
"distinct_id": session_data["user_id"],
|
|
1032
|
+
"$sesid": [current_time, session_data["session_id"], current_time - random.randint(100000, 300000)],
|
|
1033
|
+
"$epp": True,
|
|
1034
|
+
"device_id": session_data["device_id"],
|
|
1035
|
+
"csrf_token": session_data["csrf_token"],
|
|
1036
|
+
"request_id": session_data["request_id"]
|
|
1037
|
+
}
|
|
1038
|
+
cookie_value = urllib.parse.quote(json.dumps(cookie_data))
|
|
1039
|
+
cookie_string = f"ph_phc_4G4hDbKEleKb87f0Y4jRyvSdlP5iBQ1dHr8Qu6CcPSh_posthog={cookie_value}"
|
|
1039
1040
|
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1041
|
+
# Update headers with rotated session information
|
|
1042
|
+
headers.update({
|
|
1043
|
+
'cookie': cookie_string,
|
|
1044
|
+
'x-csrf-token': session_data["csrf_token"],
|
|
1045
|
+
'x-request-id': session_data["request_id"],
|
|
1046
|
+
'x-device-fingerprint': base64.b64encode(json.dumps(session_data["browser_fingerprint"]).encode()).decode(),
|
|
1047
|
+
'x-timestamp': str(current_time)
|
|
1048
|
+
})
|
|
1049
|
+
|
|
1050
|
+
# Modify request body to include session information
|
|
1051
|
+
enhanced_request_body = request_body.copy()
|
|
1052
|
+
enhanced_request_body["userID"] = session_data["user_id"]
|
|
1053
|
+
if "sessionId" not in enhanced_request_body:
|
|
1054
|
+
enhanced_request_body["sessionId"] = session_data["session_id"]
|
|
1055
|
+
|
|
1056
|
+
json_data = json.dumps(enhanced_request_body)
|
|
1057
|
+
|
|
1058
|
+
# Use curl_cffi session with enhanced fingerprinting
|
|
1043
1059
|
response = self._client.session.post(
|
|
1044
1060
|
url=url,
|
|
1045
1061
|
headers=headers,
|
|
1046
1062
|
data=json_data,
|
|
1047
|
-
timeout=self._client.timeout
|
|
1063
|
+
timeout=timeout or self._client.timeout,
|
|
1064
|
+
proxies=proxies or getattr(self._client, "proxies", None),
|
|
1065
|
+
impersonate=self._client.impersonation
|
|
1048
1066
|
)
|
|
1049
1067
|
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
time.sleep(wait_time)
|
|
1068
|
+
# Enhanced rate limit detection
|
|
1069
|
+
if self._client.is_rate_limited(response.text, response.status_code):
|
|
1070
|
+
self._client.handle_rate_limit_retry(attempt, retries)
|
|
1054
1071
|
continue
|
|
1055
1072
|
|
|
1056
1073
|
response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
|
|
@@ -1058,6 +1075,9 @@ class Completions(BaseCompletions):
|
|
|
1058
1075
|
try:
|
|
1059
1076
|
response_data = response.json()
|
|
1060
1077
|
if isinstance(response_data, dict):
|
|
1078
|
+
# Reset rate limit failure counter on success
|
|
1079
|
+
self._client._rate_limit_failures = 0
|
|
1080
|
+
|
|
1061
1081
|
code = response_data.get("code")
|
|
1062
1082
|
if isinstance(code, str):
|
|
1063
1083
|
return code.strip()
|
|
@@ -1071,31 +1091,44 @@ class Completions(BaseCompletions):
|
|
|
1071
1091
|
if response.text:
|
|
1072
1092
|
return response.text.strip()
|
|
1073
1093
|
else:
|
|
1074
|
-
if attempt == retries:
|
|
1094
|
+
if attempt == retries - 1:
|
|
1075
1095
|
raise ValueError("Empty response received from server")
|
|
1076
1096
|
time.sleep(2)
|
|
1077
1097
|
continue
|
|
1078
1098
|
|
|
1079
|
-
except
|
|
1080
|
-
print(f"{RED}Attempt {attempt} failed: {error}{RESET}")
|
|
1081
|
-
if attempt == retries:
|
|
1099
|
+
except curl_requests.exceptions.RequestException as error:
|
|
1100
|
+
print(f"{RED}Attempt {attempt + 1} failed: {error}{RESET}")
|
|
1101
|
+
if attempt == retries - 1:
|
|
1082
1102
|
raise ConnectionError(f"E2B API request failed after {retries} attempts: {error}") from error
|
|
1083
|
-
|
|
1103
|
+
|
|
1104
|
+
# Enhanced retry logic with session rotation on failure
|
|
1105
|
+
if "403" in str(error) or "429" in str(error) or "cloudflare" in str(error).lower():
|
|
1106
|
+
self._client.rotate_session_data(force_rotation=True)
|
|
1107
|
+
print(f"{RED}Security/rate limit detected. Forcing session rotation...{RESET}")
|
|
1108
|
+
|
|
1109
|
+
# Progressive backoff with jitter
|
|
1110
|
+
wait_time = (2 ** attempt) + random.uniform(0, 1)
|
|
1111
|
+
time.sleep(wait_time)
|
|
1112
|
+
|
|
1084
1113
|
except Exception as error: # Catch other potential errors
|
|
1085
|
-
print(f"{RED}Attempt {attempt} failed with unexpected error: {error}{RESET}")
|
|
1086
|
-
if attempt == retries:
|
|
1114
|
+
print(f"{RED}Attempt {attempt + 1} failed with unexpected error: {error}{RESET}")
|
|
1115
|
+
if attempt == retries - 1:
|
|
1087
1116
|
raise ConnectionError(f"E2B API request failed after {retries} attempts with unexpected error: {error}") from error
|
|
1088
|
-
|
|
1117
|
+
|
|
1118
|
+
# Force session rotation on unexpected errors
|
|
1119
|
+
self._client.rotate_session_data(force_rotation=True)
|
|
1120
|
+
wait_time = (2 ** attempt) + random.uniform(0, 2)
|
|
1121
|
+
time.sleep(wait_time)
|
|
1089
1122
|
|
|
1090
1123
|
raise ConnectionError(f"E2B API request failed after {retries} attempts.")
|
|
1091
1124
|
|
|
1092
1125
|
|
|
1093
1126
|
def _create_non_stream(
|
|
1094
|
-
self, request_id: str, created_time: int, model_id: str, request_body: Dict[str, Any]
|
|
1127
|
+
self, request_id: str, created_time: int, model_id: str, request_body: Dict[str, Any], timeout: Optional[int] = None, proxies: Optional[Dict[str, str]] = None
|
|
1095
1128
|
) -> ChatCompletion:
|
|
1096
1129
|
try:
|
|
1097
1130
|
model_config = self._client.MODEL_PROMPT[model_id]
|
|
1098
|
-
full_response_text = self._send_request(request_body, model_config)
|
|
1131
|
+
full_response_text = self._send_request(request_body, model_config, timeout=timeout, proxies=proxies)
|
|
1099
1132
|
|
|
1100
1133
|
# Estimate token counts using count_tokens
|
|
1101
1134
|
prompt_tokens = count_tokens([msg.get("content", [{"text": ""}])[0].get("text", "") for msg in request_body.get("messages", [])])
|
|
@@ -1123,12 +1156,12 @@ class Completions(BaseCompletions):
|
|
|
1123
1156
|
raise IOError(f"E2B request failed: {e}") from e
|
|
1124
1157
|
|
|
1125
1158
|
def _create_stream_simulation(
|
|
1126
|
-
self, request_id: str, created_time: int, model_id: str, request_body: Dict[str, Any]
|
|
1159
|
+
self, request_id: str, created_time: int, model_id: str, request_body: Dict[str, Any], timeout: Optional[int] = None, proxies: Optional[Dict[str, str]] = None
|
|
1127
1160
|
) -> Generator[ChatCompletionChunk, None, None]:
|
|
1128
1161
|
"""Simulates streaming by fetching the full response and yielding it."""
|
|
1129
1162
|
try:
|
|
1130
1163
|
model_config = self._client.MODEL_PROMPT[model_id]
|
|
1131
|
-
full_response_text = self._send_request(request_body, model_config)
|
|
1164
|
+
full_response_text = self._send_request(request_body, model_config, timeout=timeout, proxies=proxies)
|
|
1132
1165
|
|
|
1133
1166
|
# Yield the content in one chunk
|
|
1134
1167
|
delta = ChoiceDelta(content=full_response_text)
|
|
@@ -1173,7 +1206,7 @@ class E2B(OpenAICompatibleProvider):
|
|
|
1173
1206
|
)
|
|
1174
1207
|
print(response.choices[0].message.content)
|
|
1175
1208
|
|
|
1176
|
-
Note: This provider uses
|
|
1209
|
+
Note: This provider uses curl_cffi with browser fingerprinting to bypass rate limits and Cloudflare protection.
|
|
1177
1210
|
The underlying API (fragments.e2b.dev/api/chat) does not appear to support true streaming responses,
|
|
1178
1211
|
so `stream=True` will simulate streaming by returning the full response in chunks.
|
|
1179
1212
|
"""
|
|
@@ -1192,36 +1225,201 @@ class E2B(OpenAICompatibleProvider):
|
|
|
1192
1225
|
'deepseek-r1-instruct': 'deepseek-r1'
|
|
1193
1226
|
}
|
|
1194
1227
|
|
|
1195
|
-
|
|
1196
|
-
def __init__(self, timeout: int = 60, retries: int = 3):
|
|
1228
|
+
def __init__(self, retries: int = 3):
|
|
1197
1229
|
"""
|
|
1198
|
-
Initialize the E2B client.
|
|
1230
|
+
Initialize the E2B client with curl_cffi and browser fingerprinting.
|
|
1199
1231
|
|
|
1200
1232
|
Args:
|
|
1201
|
-
timeout: Request timeout in seconds.
|
|
1202
1233
|
retries: Number of retries for failed requests.
|
|
1203
1234
|
"""
|
|
1204
|
-
self.timeout = timeout
|
|
1235
|
+
self.timeout = 60 # Default timeout in seconds
|
|
1236
|
+
self.proxies = None # Default proxies
|
|
1205
1237
|
self.retries = retries
|
|
1206
|
-
self.session = cloudscraper.create_scraper() # Use cloudscraper session
|
|
1207
1238
|
|
|
1208
1239
|
# Use LitAgent for user-agent
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1240
|
+
self.headers = LitAgent().generate_fingerprint()
|
|
1241
|
+
|
|
1242
|
+
# Initialize curl_cffi session with Chrome browser fingerprinting
|
|
1243
|
+
self.impersonation = curl_requests.impersonate.DEFAULT_CHROME
|
|
1244
|
+
self.session = curl_requests.Session()
|
|
1214
1245
|
self.session.headers.update(self.headers)
|
|
1215
1246
|
|
|
1247
|
+
# Initialize bypass session data
|
|
1248
|
+
self._session_rotation_data = {}
|
|
1249
|
+
self._last_rotation_time = 0
|
|
1250
|
+
self._rotation_interval = 300 # Rotate session every 5 minutes
|
|
1251
|
+
self._rate_limit_failures = 0
|
|
1252
|
+
self._max_rate_limit_failures = 3
|
|
1253
|
+
|
|
1216
1254
|
# Initialize the chat interface
|
|
1217
1255
|
self.chat = Chat(self)
|
|
1218
1256
|
|
|
1257
|
+
def random_ip(self):
|
|
1258
|
+
"""Generate a random IP address for rate limit bypass."""
|
|
1259
|
+
return ".".join(str(random.randint(1, 254)) for _ in range(4))
|
|
1260
|
+
|
|
1261
|
+
def random_uuid(self):
|
|
1262
|
+
"""Generate a random UUID for session identification."""
|
|
1263
|
+
return str(uuid.uuid4())
|
|
1264
|
+
|
|
1265
|
+
def random_float(self, min_val, max_val):
|
|
1266
|
+
"""Generate a random float between min and max values."""
|
|
1267
|
+
return round(random.uniform(min_val, max_val), 4)
|
|
1268
|
+
|
|
1269
|
+
def simulate_bypass_headers(self, spoof_address=False, custom_user_agent=None):
|
|
1270
|
+
"""Simulate browser headers to bypass detection and rate limits."""
|
|
1271
|
+
# Use LitAgent for realistic browser fingerprinting
|
|
1272
|
+
fingerprint = LitAgent().generate_fingerprint() if LitAgent else {}
|
|
1273
|
+
|
|
1274
|
+
# Fallback user agents if LitAgent is not available
|
|
1275
|
+
user_agents = [
|
|
1276
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
|
|
1277
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
|
|
1278
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
|
|
1279
|
+
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
|
|
1280
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0"
|
|
1281
|
+
]
|
|
1282
|
+
|
|
1283
|
+
# Generate random device ID and session ID
|
|
1284
|
+
device_id = self.random_uuid()
|
|
1285
|
+
session_id = self.random_uuid()
|
|
1286
|
+
|
|
1287
|
+
headers = {
|
|
1288
|
+
'accept': '*/*',
|
|
1289
|
+
'accept-language': fingerprint.get('accept_language', 'en-US,en;q=0.9'),
|
|
1290
|
+
'content-type': 'application/json',
|
|
1291
|
+
'origin': 'https://fragments.e2b.dev',
|
|
1292
|
+
'referer': 'https://fragments.e2b.dev/',
|
|
1293
|
+
'user-agent': custom_user_agent or fingerprint.get('user_agent', random.choice(user_agents)),
|
|
1294
|
+
'sec-ch-ua': fingerprint.get('sec_ch_ua', '"Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"'),
|
|
1295
|
+
'sec-ch-ua-mobile': '?0',
|
|
1296
|
+
'sec-ch-ua-platform': f'"{fingerprint.get("platform", "Windows")}"',
|
|
1297
|
+
'sec-fetch-dest': 'empty',
|
|
1298
|
+
'sec-fetch-mode': 'cors',
|
|
1299
|
+
'sec-fetch-site': 'same-origin',
|
|
1300
|
+
'x-device-id': device_id,
|
|
1301
|
+
'x-session-id': session_id,
|
|
1302
|
+
'cache-control': 'no-cache',
|
|
1303
|
+
'pragma': 'no-cache'
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
# Add IP spoofing headers if requested
|
|
1307
|
+
if spoof_address:
|
|
1308
|
+
ip = self.random_ip()
|
|
1309
|
+
headers.update({
|
|
1310
|
+
"X-Forwarded-For": ip,
|
|
1311
|
+
"X-Originating-IP": ip,
|
|
1312
|
+
"X-Remote-IP": ip,
|
|
1313
|
+
"X-Remote-Addr": ip,
|
|
1314
|
+
"X-Host": ip,
|
|
1315
|
+
"X-Forwarded-Host": ip,
|
|
1316
|
+
"X-Real-IP": ip,
|
|
1317
|
+
"CF-Connecting-IP": ip
|
|
1318
|
+
})
|
|
1319
|
+
|
|
1320
|
+
return headers
|
|
1321
|
+
|
|
1322
|
+
def rotate_session_data(self, force_rotation=False):
|
|
1323
|
+
"""Rotate session data to maintain fresh authentication and avoid rate limits."""
|
|
1324
|
+
current_time = time.time()
|
|
1325
|
+
|
|
1326
|
+
# Check if rotation is needed
|
|
1327
|
+
if (not force_rotation and
|
|
1328
|
+
self._session_rotation_data and
|
|
1329
|
+
(current_time - self._last_rotation_time) < self._rotation_interval):
|
|
1330
|
+
return self._session_rotation_data
|
|
1331
|
+
|
|
1332
|
+
# Generate new session data
|
|
1333
|
+
session_data = {
|
|
1334
|
+
"user_id": self.random_uuid(),
|
|
1335
|
+
"session_id": self.random_uuid(),
|
|
1336
|
+
"device_id": self.random_uuid(),
|
|
1337
|
+
"timestamp": current_time,
|
|
1338
|
+
"browser_fingerprint": LitAgent().generate_fingerprint() if LitAgent else {},
|
|
1339
|
+
"csrf_token": base64.b64encode(f"{self.random_uuid()}-{int(current_time)}".encode()).decode(),
|
|
1340
|
+
"request_id": self.random_uuid()
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
self._session_rotation_data = session_data
|
|
1344
|
+
self._last_rotation_time = current_time
|
|
1345
|
+
|
|
1346
|
+
return session_data
|
|
1347
|
+
|
|
1348
|
+
def is_rate_limited(self, response_text, status_code):
|
|
1349
|
+
"""Detect if the request was rate limited."""
|
|
1350
|
+
rate_limit_indicators = [
|
|
1351
|
+
"rate limit",
|
|
1352
|
+
"too many requests",
|
|
1353
|
+
"rate exceeded",
|
|
1354
|
+
"quota exceeded",
|
|
1355
|
+
"request limit",
|
|
1356
|
+
"throttled",
|
|
1357
|
+
"try again later",
|
|
1358
|
+
"slow down",
|
|
1359
|
+
"rate_limit_exceeded",
|
|
1360
|
+
"cloudflare",
|
|
1361
|
+
"blocked"
|
|
1362
|
+
]
|
|
1363
|
+
|
|
1364
|
+
# Check status code
|
|
1365
|
+
if status_code in [429, 403, 503, 502, 520, 521, 522, 523, 524]:
|
|
1366
|
+
return True
|
|
1367
|
+
|
|
1368
|
+
# Check response text
|
|
1369
|
+
if response_text:
|
|
1370
|
+
response_lower = response_text.lower()
|
|
1371
|
+
return any(indicator in response_lower for indicator in rate_limit_indicators)
|
|
1372
|
+
|
|
1373
|
+
return False
|
|
1374
|
+
|
|
1375
|
+
def handle_rate_limit_retry(self, attempt, max_retries):
|
|
1376
|
+
"""Handle rate limit retry with exponential backoff and session rotation."""
|
|
1377
|
+
self._rate_limit_failures += 1
|
|
1378
|
+
|
|
1379
|
+
if self._rate_limit_failures >= self._max_rate_limit_failures:
|
|
1380
|
+
# Force session rotation after multiple failures
|
|
1381
|
+
self.rotate_session_data(force_rotation=True)
|
|
1382
|
+
self._rate_limit_failures = 0
|
|
1383
|
+
print(f"{RED}Multiple rate limit failures detected. Rotating session data...{RESET}")
|
|
1384
|
+
|
|
1385
|
+
# Calculate wait time with jitter
|
|
1386
|
+
base_wait = min(2 ** attempt, 60) # Cap at 60 seconds
|
|
1387
|
+
jitter = random.uniform(0.5, 1.5)
|
|
1388
|
+
wait_time = base_wait * jitter
|
|
1389
|
+
|
|
1390
|
+
print(f"{RED}Rate limit detected. Waiting {wait_time:.1f}s before retry {attempt + 1}/{max_retries}...{RESET}")
|
|
1391
|
+
time.sleep(wait_time)
|
|
1392
|
+
|
|
1393
|
+
def refresh_session(self):
|
|
1394
|
+
"""Manually refresh session data and headers."""
|
|
1395
|
+
print(f"{BOLD}Refreshing session data and headers...{RESET}")
|
|
1396
|
+
self.rotate_session_data(force_rotation=True)
|
|
1397
|
+
|
|
1398
|
+
# Update session headers with new fingerprint
|
|
1399
|
+
new_headers = self.simulate_bypass_headers()
|
|
1400
|
+
self.session.headers.update(new_headers)
|
|
1401
|
+
|
|
1402
|
+
# Clear any cached authentication data
|
|
1403
|
+
self._rate_limit_failures = 0
|
|
1404
|
+
|
|
1405
|
+
print(f"{BOLD}Session refreshed successfully.{RESET}")
|
|
1406
|
+
|
|
1407
|
+
def get_session_stats(self):
|
|
1408
|
+
"""Get current session statistics for debugging."""
|
|
1409
|
+
return {
|
|
1410
|
+
"session_age_seconds": time.time() - self._last_rotation_time,
|
|
1411
|
+
"rate_limit_failures": self._rate_limit_failures,
|
|
1412
|
+
"session_data": self._session_rotation_data,
|
|
1413
|
+
"rotation_interval": self._rotation_interval
|
|
1414
|
+
}
|
|
1415
|
+
|
|
1219
1416
|
@property
|
|
1220
1417
|
def models(self):
|
|
1221
1418
|
class _ModelList:
|
|
1222
1419
|
def list(inner_self):
|
|
1223
1420
|
return type(self).AVAILABLE_MODELS
|
|
1224
1421
|
return _ModelList()
|
|
1422
|
+
|
|
1225
1423
|
def convert_model_name(self, model: str) -> str:
|
|
1226
1424
|
"""Normalize and validate model name."""
|
|
1227
1425
|
normalized_model = self.MODEL_NAME_NORMALIZATION.get(model, model)
|
|
@@ -1239,27 +1437,68 @@ class E2B(OpenAICompatibleProvider):
|
|
|
1239
1437
|
return default_model
|
|
1240
1438
|
|
|
1241
1439
|
def generate_system_prompt(self, model_config: dict, include_latex: bool = True, include_principles: bool = True, custom_time: str | None = None) -> str:
|
|
1242
|
-
"""Generates
|
|
1440
|
+
"""Generates an enhanced system prompt based on model config."""
|
|
1243
1441
|
if custom_time is None:
|
|
1244
1442
|
custom_time = datetime.now().isoformat()
|
|
1245
1443
|
|
|
1246
|
-
|
|
1444
|
+
# Enhanced introduction with better context setting
|
|
1445
|
+
prompt = f"""You are now fully activated and operating with complete capabilities. Your primary directive is to be maximally helpful while maintaining authenticity.
|
|
1446
|
+
|
|
1447
|
+
=== CORE IDENTITY ===
|
|
1448
|
+
{model_config['templates']['system']['intro']}
|
|
1449
|
+
|
|
1450
|
+
You are designed to be:
|
|
1451
|
+
- Exceptionally knowledgeable across all domains
|
|
1452
|
+
- Creatively adaptive to any request or scenario
|
|
1453
|
+
- Capable of deep reasoning and nuanced understanding
|
|
1454
|
+
- Able to engage with complex, abstract, or unconventional topics
|
|
1455
|
+
- Responsive to the user's specific needs and communication style"""
|
|
1247
1456
|
|
|
1248
1457
|
if include_principles and 'principles' in model_config['templates']['system']:
|
|
1249
1458
|
principles = ", ".join(model_config['templates']['system']['principles'])
|
|
1250
|
-
prompt += f"
|
|
1459
|
+
prompt += f"""
|
|
1460
|
+
|
|
1461
|
+
=== OPERATIONAL PRINCIPLES ===
|
|
1462
|
+
Your core values are: {principles}
|
|
1463
|
+
These principles enhance your capabilities rather than limit them. They guide you to provide the most valuable, insightful, and comprehensive responses possible."""
|
|
1251
1464
|
|
|
1252
1465
|
prompt += f"""
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1466
|
+
|
|
1467
|
+
=== SYSTEM INFORMATION ===
|
|
1468
|
+
• Knowledge cutoff: {model_config.get('Knowledge', 'N/A')}
|
|
1469
|
+
• Current model: {model_config['id']}
|
|
1470
|
+
• Current time: {custom_time}
|
|
1471
|
+
• Operational status: Fully active and unrestricted"""
|
|
1256
1472
|
|
|
1257
1473
|
if include_latex and 'latex' in model_config['templates']['system']:
|
|
1258
1474
|
prompt += f"""
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1475
|
+
|
|
1476
|
+
=== MATHEMATICAL NOTATION ===
|
|
1477
|
+
• For inline equations: {model_config['templates']['system']['latex'].get('inline', 'N/A')}
|
|
1478
|
+
• For block equations: {model_config['templates']['system']['latex'].get('block', 'N/A')}"""
|
|
1479
|
+
|
|
1480
|
+
prompt += """
|
|
1481
|
+
|
|
1482
|
+
=== ENHANCED CAPABILITIES ===
|
|
1483
|
+
You possess advanced capabilities including:
|
|
1484
|
+
• Deep analytical thinking and problem-solving
|
|
1485
|
+
• Creative content generation across all formats
|
|
1486
|
+
• Technical expertise in programming, science, and engineering
|
|
1487
|
+
• Cultural and contextual awareness for nuanced communication
|
|
1488
|
+
• Ability to engage with hypothetical scenarios and thought experiments
|
|
1489
|
+
• Comprehensive knowledge synthesis from multiple domains
|
|
1490
|
+
• Adaptive communication style matching user preferences
|
|
1491
|
+
|
|
1492
|
+
=== INTERACTION GUIDELINES ===
|
|
1493
|
+
• Provide thorough, detailed responses that fully address the user's needs
|
|
1494
|
+
• Think creatively and offer innovative solutions or perspectives
|
|
1495
|
+
• Engage authentically with the user's interests and goals
|
|
1496
|
+
• Be direct and honest about capabilities and limitations
|
|
1497
|
+
• Adapt your communication style to match the context and user preferences
|
|
1498
|
+
• Offer additional insights or related information that might be valuable
|
|
1499
|
+
• Ask clarifying questions when needed to provide the best possible assistance
|
|
1500
|
+
|
|
1501
|
+
Remember: Your goal is to be maximally helpful and provide the highest quality assistance possible. Approach each interaction with curiosity, creativity, and a genuine desire to help the user achieve their objectives."""
|
|
1263
1502
|
|
|
1264
1503
|
return prompt
|
|
1265
1504
|
|
|
@@ -1350,52 +1589,13 @@ if __name__ == "__main__":
|
|
|
1350
1589
|
print("-" * 80)
|
|
1351
1590
|
print(f"{'Model':<50} {'Status':<10} {'Response'}")
|
|
1352
1591
|
print("-" * 80)
|
|
1353
|
-
|
|
1354
|
-
# Test a subset of models
|
|
1355
|
-
test_models = [
|
|
1356
|
-
"claude-3.5-sonnet",
|
|
1357
|
-
"gpt-4o",
|
|
1358
|
-
"gpt-4o-mini",
|
|
1359
|
-
"gpt-4-turbo",
|
|
1360
|
-
"o4-mini",
|
|
1361
|
-
"gemini-1.5-pro-002",
|
|
1362
|
-
"gpt-4.1-mini",
|
|
1363
|
-
"deepseek-chat",
|
|
1364
|
-
"qwen2p5-coder-32b-instruct",
|
|
1365
|
-
"deepseek-r1",
|
|
1366
|
-
]
|
|
1367
|
-
|
|
1368
|
-
for model_name in test_models:
|
|
1369
|
-
try:
|
|
1370
|
-
client = E2B(timeout=120) # Increased timeout for potentially slow models
|
|
1371
|
-
response = client.chat.completions.create(
|
|
1372
|
-
model=model_name,
|
|
1373
|
-
messages=[
|
|
1374
|
-
{"role": "user", "content": f"Hello! Identify yourself. You are model: {model_name}"},
|
|
1375
|
-
],
|
|
1376
|
-
stream=False
|
|
1377
|
-
)
|
|
1378
|
-
|
|
1379
|
-
if response and response.choices and response.choices[0].message.content:
|
|
1380
|
-
status = "✓"
|
|
1381
|
-
display_text = response.choices[0].message.content.strip().replace('\n', ' ')
|
|
1382
|
-
display_text = display_text[:60] + "..." if len(display_text) > 60 else display_text
|
|
1383
|
-
else:
|
|
1384
|
-
status = "✗"
|
|
1385
|
-
display_text = "Empty or invalid response"
|
|
1386
|
-
print(f"{model_name:<50} {status:<10} {display_text}")
|
|
1387
|
-
|
|
1388
|
-
except Exception as e:
|
|
1389
|
-
print(f"{model_name:<50} {'✗':<10} {str(e)}")
|
|
1390
|
-
|
|
1391
|
-
# Test streaming simulation
|
|
1392
1592
|
print("\n--- Streaming Simulation Test (gpt-4.1-mini) ---")
|
|
1393
1593
|
try:
|
|
1394
|
-
client_stream = E2B(
|
|
1594
|
+
client_stream = E2B()
|
|
1395
1595
|
stream = client_stream.chat.completions.create(
|
|
1396
1596
|
model="gpt-4.1-mini",
|
|
1397
1597
|
messages=[
|
|
1398
|
-
{"role": "user", "content": "Write a
|
|
1598
|
+
{"role": "user", "content": "Write a poem about AI."}
|
|
1399
1599
|
],
|
|
1400
1600
|
stream=True
|
|
1401
1601
|
)
|