edsl 0.1.38.dev2__py3-none-any.whl → 0.1.38.dev3__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.
- edsl/Base.py +303 -303
- edsl/BaseDiff.py +260 -260
- edsl/TemplateLoader.py +24 -24
- edsl/__init__.py +49 -49
- edsl/__version__.py +1 -1
- edsl/agents/Agent.py +858 -858
- edsl/agents/AgentList.py +362 -362
- edsl/agents/Invigilator.py +222 -222
- edsl/agents/InvigilatorBase.py +284 -284
- edsl/agents/PromptConstructor.py +353 -353
- edsl/agents/__init__.py +3 -3
- edsl/agents/descriptors.py +99 -99
- edsl/agents/prompt_helpers.py +129 -129
- edsl/auto/AutoStudy.py +117 -117
- edsl/auto/StageBase.py +230 -230
- edsl/auto/StageGenerateSurvey.py +178 -178
- edsl/auto/StageLabelQuestions.py +125 -125
- edsl/auto/StagePersona.py +61 -61
- edsl/auto/StagePersonaDimensionValueRanges.py +88 -88
- edsl/auto/StagePersonaDimensionValues.py +74 -74
- edsl/auto/StagePersonaDimensions.py +69 -69
- edsl/auto/StageQuestions.py +73 -73
- edsl/auto/SurveyCreatorPipeline.py +21 -21
- edsl/auto/utilities.py +224 -224
- edsl/base/Base.py +279 -279
- edsl/config.py +149 -149
- edsl/conversation/Conversation.py +290 -290
- edsl/conversation/car_buying.py +58 -58
- edsl/conversation/chips.py +95 -95
- edsl/conversation/mug_negotiation.py +81 -81
- edsl/conversation/next_speaker_utilities.py +93 -93
- edsl/coop/PriceFetcher.py +54 -54
- edsl/coop/__init__.py +2 -2
- edsl/coop/coop.py +961 -961
- edsl/coop/utils.py +131 -131
- edsl/data/Cache.py +530 -530
- edsl/data/CacheEntry.py +228 -228
- edsl/data/CacheHandler.py +149 -149
- edsl/data/RemoteCacheSync.py +97 -97
- edsl/data/SQLiteDict.py +292 -292
- edsl/data/__init__.py +4 -4
- edsl/data/orm.py +10 -10
- edsl/data_transfer_models.py +73 -73
- edsl/enums.py +173 -173
- edsl/exceptions/BaseException.py +21 -21
- edsl/exceptions/__init__.py +54 -54
- edsl/exceptions/agents.py +42 -42
- edsl/exceptions/cache.py +5 -5
- edsl/exceptions/configuration.py +16 -16
- edsl/exceptions/coop.py +10 -10
- edsl/exceptions/data.py +14 -14
- edsl/exceptions/general.py +34 -34
- edsl/exceptions/jobs.py +33 -33
- edsl/exceptions/language_models.py +63 -63
- edsl/exceptions/prompts.py +15 -15
- edsl/exceptions/questions.py +91 -91
- edsl/exceptions/results.py +29 -29
- edsl/exceptions/scenarios.py +22 -22
- edsl/exceptions/surveys.py +37 -37
- edsl/inference_services/AnthropicService.py +87 -87
- edsl/inference_services/AwsBedrock.py +120 -120
- edsl/inference_services/AzureAI.py +217 -217
- edsl/inference_services/DeepInfraService.py +18 -18
- edsl/inference_services/GoogleService.py +156 -156
- edsl/inference_services/GroqService.py +20 -20
- edsl/inference_services/InferenceServiceABC.py +147 -147
- edsl/inference_services/InferenceServicesCollection.py +97 -97
- edsl/inference_services/MistralAIService.py +123 -123
- edsl/inference_services/OllamaService.py +18 -18
- edsl/inference_services/OpenAIService.py +224 -224
- edsl/inference_services/TestService.py +89 -89
- edsl/inference_services/TogetherAIService.py +170 -170
- edsl/inference_services/models_available_cache.py +118 -118
- edsl/inference_services/rate_limits_cache.py +25 -25
- edsl/inference_services/registry.py +39 -39
- edsl/inference_services/write_available.py +10 -10
- edsl/jobs/Answers.py +56 -56
- edsl/jobs/Jobs.py +1358 -1358
- edsl/jobs/__init__.py +1 -1
- edsl/jobs/buckets/BucketCollection.py +63 -63
- edsl/jobs/buckets/ModelBuckets.py +65 -65
- edsl/jobs/buckets/TokenBucket.py +251 -251
- edsl/jobs/interviews/Interview.py +661 -661
- edsl/jobs/interviews/InterviewExceptionCollection.py +99 -99
- edsl/jobs/interviews/InterviewExceptionEntry.py +186 -186
- edsl/jobs/interviews/InterviewStatistic.py +63 -63
- edsl/jobs/interviews/InterviewStatisticsCollection.py +25 -25
- edsl/jobs/interviews/InterviewStatusDictionary.py +78 -78
- edsl/jobs/interviews/InterviewStatusLog.py +92 -92
- edsl/jobs/interviews/ReportErrors.py +66 -66
- edsl/jobs/interviews/interview_status_enum.py +9 -9
- edsl/jobs/runners/JobsRunnerAsyncio.py +361 -361
- edsl/jobs/runners/JobsRunnerStatus.py +332 -332
- edsl/jobs/tasks/QuestionTaskCreator.py +242 -242
- edsl/jobs/tasks/TaskCreators.py +64 -64
- edsl/jobs/tasks/TaskHistory.py +451 -451
- edsl/jobs/tasks/TaskStatusLog.py +23 -23
- edsl/jobs/tasks/task_status_enum.py +163 -163
- edsl/jobs/tokens/InterviewTokenUsage.py +27 -27
- edsl/jobs/tokens/TokenUsage.py +34 -34
- edsl/language_models/KeyLookup.py +30 -30
- edsl/language_models/LanguageModel.py +708 -708
- edsl/language_models/ModelList.py +109 -109
- edsl/language_models/RegisterLanguageModelsMeta.py +184 -184
- edsl/language_models/__init__.py +3 -3
- edsl/language_models/fake_openai_call.py +15 -15
- edsl/language_models/fake_openai_service.py +61 -61
- edsl/language_models/registry.py +137 -137
- edsl/language_models/repair.py +156 -156
- edsl/language_models/unused/ReplicateBase.py +83 -83
- edsl/language_models/utilities.py +64 -64
- edsl/notebooks/Notebook.py +258 -258
- edsl/notebooks/__init__.py +1 -1
- edsl/prompts/Prompt.py +357 -357
- edsl/prompts/__init__.py +2 -2
- edsl/questions/AnswerValidatorMixin.py +289 -289
- edsl/questions/QuestionBase.py +660 -660
- edsl/questions/QuestionBaseGenMixin.py +161 -161
- edsl/questions/QuestionBasePromptsMixin.py +217 -217
- edsl/questions/QuestionBudget.py +227 -227
- edsl/questions/QuestionCheckBox.py +359 -359
- edsl/questions/QuestionExtract.py +183 -183
- edsl/questions/QuestionFreeText.py +114 -114
- edsl/questions/QuestionFunctional.py +166 -166
- edsl/questions/QuestionList.py +231 -231
- edsl/questions/QuestionMultipleChoice.py +286 -286
- edsl/questions/QuestionNumerical.py +153 -153
- edsl/questions/QuestionRank.py +324 -324
- edsl/questions/Quick.py +41 -41
- edsl/questions/RegisterQuestionsMeta.py +71 -71
- edsl/questions/ResponseValidatorABC.py +174 -174
- edsl/questions/SimpleAskMixin.py +73 -73
- edsl/questions/__init__.py +26 -26
- edsl/questions/compose_questions.py +98 -98
- edsl/questions/decorators.py +21 -21
- edsl/questions/derived/QuestionLikertFive.py +76 -76
- edsl/questions/derived/QuestionLinearScale.py +87 -87
- edsl/questions/derived/QuestionTopK.py +93 -93
- edsl/questions/derived/QuestionYesNo.py +82 -82
- edsl/questions/descriptors.py +413 -413
- edsl/questions/prompt_templates/question_budget.jinja +13 -13
- edsl/questions/prompt_templates/question_checkbox.jinja +32 -32
- edsl/questions/prompt_templates/question_extract.jinja +11 -11
- edsl/questions/prompt_templates/question_free_text.jinja +3 -3
- edsl/questions/prompt_templates/question_linear_scale.jinja +11 -11
- edsl/questions/prompt_templates/question_list.jinja +17 -17
- edsl/questions/prompt_templates/question_multiple_choice.jinja +33 -33
- edsl/questions/prompt_templates/question_numerical.jinja +36 -36
- edsl/questions/question_registry.py +147 -147
- edsl/questions/settings.py +12 -12
- edsl/questions/templates/budget/answering_instructions.jinja +7 -7
- edsl/questions/templates/budget/question_presentation.jinja +7 -7
- edsl/questions/templates/checkbox/answering_instructions.jinja +10 -10
- edsl/questions/templates/checkbox/question_presentation.jinja +22 -22
- edsl/questions/templates/extract/answering_instructions.jinja +7 -7
- edsl/questions/templates/likert_five/answering_instructions.jinja +10 -10
- edsl/questions/templates/likert_five/question_presentation.jinja +11 -11
- edsl/questions/templates/linear_scale/answering_instructions.jinja +5 -5
- edsl/questions/templates/linear_scale/question_presentation.jinja +5 -5
- edsl/questions/templates/list/answering_instructions.jinja +3 -3
- edsl/questions/templates/list/question_presentation.jinja +5 -5
- edsl/questions/templates/multiple_choice/answering_instructions.jinja +9 -9
- edsl/questions/templates/multiple_choice/question_presentation.jinja +11 -11
- edsl/questions/templates/numerical/answering_instructions.jinja +6 -6
- edsl/questions/templates/numerical/question_presentation.jinja +6 -6
- edsl/questions/templates/rank/answering_instructions.jinja +11 -11
- edsl/questions/templates/rank/question_presentation.jinja +15 -15
- edsl/questions/templates/top_k/answering_instructions.jinja +8 -8
- edsl/questions/templates/top_k/question_presentation.jinja +22 -22
- edsl/questions/templates/yes_no/answering_instructions.jinja +6 -6
- edsl/questions/templates/yes_no/question_presentation.jinja +11 -11
- edsl/results/Dataset.py +293 -293
- edsl/results/DatasetExportMixin.py +717 -717
- edsl/results/DatasetTree.py +145 -145
- edsl/results/Result.py +456 -456
- edsl/results/Results.py +1071 -1071
- edsl/results/ResultsDBMixin.py +238 -238
- edsl/results/ResultsExportMixin.py +43 -43
- edsl/results/ResultsFetchMixin.py +33 -33
- edsl/results/ResultsGGMixin.py +121 -121
- edsl/results/ResultsToolsMixin.py +98 -98
- edsl/results/Selector.py +135 -135
- edsl/results/__init__.py +2 -2
- edsl/results/tree_explore.py +115 -115
- edsl/scenarios/FileStore.py +458 -458
- edsl/scenarios/Scenario.py +544 -544
- edsl/scenarios/ScenarioHtmlMixin.py +64 -64
- edsl/scenarios/ScenarioList.py +1112 -1112
- edsl/scenarios/ScenarioListExportMixin.py +52 -52
- edsl/scenarios/ScenarioListPdfMixin.py +261 -261
- edsl/scenarios/__init__.py +4 -4
- edsl/shared.py +1 -1
- edsl/study/ObjectEntry.py +173 -173
- edsl/study/ProofOfWork.py +113 -113
- edsl/study/SnapShot.py +80 -80
- edsl/study/Study.py +528 -528
- edsl/study/__init__.py +4 -4
- edsl/surveys/DAG.py +148 -148
- edsl/surveys/Memory.py +31 -31
- edsl/surveys/MemoryPlan.py +244 -244
- edsl/surveys/Rule.py +326 -326
- edsl/surveys/RuleCollection.py +387 -387
- edsl/surveys/Survey.py +1787 -1787
- edsl/surveys/SurveyCSS.py +261 -261
- edsl/surveys/SurveyExportMixin.py +259 -259
- edsl/surveys/SurveyFlowVisualizationMixin.py +121 -121
- edsl/surveys/SurveyQualtricsImport.py +284 -284
- edsl/surveys/__init__.py +3 -3
- edsl/surveys/base.py +53 -53
- edsl/surveys/descriptors.py +56 -56
- edsl/surveys/instructions/ChangeInstruction.py +49 -49
- edsl/surveys/instructions/Instruction.py +53 -53
- edsl/surveys/instructions/InstructionCollection.py +77 -77
- edsl/templates/error_reporting/base.html +23 -23
- edsl/templates/error_reporting/exceptions_by_model.html +34 -34
- edsl/templates/error_reporting/exceptions_by_question_name.html +16 -16
- edsl/templates/error_reporting/exceptions_by_type.html +16 -16
- edsl/templates/error_reporting/interview_details.html +115 -115
- edsl/templates/error_reporting/interviews.html +9 -9
- edsl/templates/error_reporting/overview.html +4 -4
- edsl/templates/error_reporting/performance_plot.html +1 -1
- edsl/templates/error_reporting/report.css +73 -73
- edsl/templates/error_reporting/report.html +117 -117
- edsl/templates/error_reporting/report.js +25 -25
- edsl/tools/__init__.py +1 -1
- edsl/tools/clusters.py +192 -192
- edsl/tools/embeddings.py +27 -27
- edsl/tools/embeddings_plotting.py +118 -118
- edsl/tools/plotting.py +112 -112
- edsl/tools/summarize.py +18 -18
- edsl/utilities/SystemInfo.py +28 -28
- edsl/utilities/__init__.py +22 -22
- edsl/utilities/ast_utilities.py +25 -25
- edsl/utilities/data/Registry.py +6 -6
- edsl/utilities/data/__init__.py +1 -1
- edsl/utilities/data/scooter_results.json +1 -1
- edsl/utilities/decorators.py +77 -77
- edsl/utilities/gcp_bucket/cloud_storage.py +96 -96
- edsl/utilities/interface.py +627 -627
- edsl/utilities/naming_utilities.py +263 -263
- edsl/utilities/repair_functions.py +28 -28
- edsl/utilities/restricted_python.py +70 -70
- edsl/utilities/utilities.py +409 -409
- {edsl-0.1.38.dev2.dist-info → edsl-0.1.38.dev3.dist-info}/LICENSE +21 -21
- {edsl-0.1.38.dev2.dist-info → edsl-0.1.38.dev3.dist-info}/METADATA +1 -1
- edsl-0.1.38.dev3.dist-info/RECORD +269 -0
- edsl-0.1.38.dev2.dist-info/RECORD +0 -269
- {edsl-0.1.38.dev2.dist-info → edsl-0.1.38.dev3.dist-info}/WHEEL +0 -0
edsl/jobs/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
from edsl.jobs.Jobs import Jobs
|
1
|
+
from edsl.jobs.Jobs import Jobs
|
@@ -1,63 +1,63 @@
|
|
1
|
-
from collections import UserDict
|
2
|
-
from edsl.jobs.buckets.TokenBucket import TokenBucket
|
3
|
-
from edsl.jobs.buckets.ModelBuckets import ModelBuckets
|
4
|
-
|
5
|
-
|
6
|
-
class BucketCollection(UserDict):
|
7
|
-
"""A Jobs object will have a whole collection of model buckets, as multiple models could be used.
|
8
|
-
|
9
|
-
The keys here are the models, and the values are the ModelBuckets objects.
|
10
|
-
Models themselves are hashable, so this works.
|
11
|
-
"""
|
12
|
-
|
13
|
-
def __init__(self, infinity_buckets=False):
|
14
|
-
super().__init__()
|
15
|
-
self.infinity_buckets = infinity_buckets
|
16
|
-
self.models_to_services = {}
|
17
|
-
self.services_to_buckets = {}
|
18
|
-
|
19
|
-
def __repr__(self):
|
20
|
-
return f"BucketCollection({self.data})"
|
21
|
-
|
22
|
-
def add_model(self, model: "LanguageModel") -> None:
|
23
|
-
"""Adds a model to the bucket collection.
|
24
|
-
|
25
|
-
This will create the token and request buckets for the model."""
|
26
|
-
|
27
|
-
# compute the TPS and RPS from the model
|
28
|
-
if not self.infinity_buckets:
|
29
|
-
TPS = model.TPM / 60.0
|
30
|
-
RPS = model.RPM / 60.0
|
31
|
-
else:
|
32
|
-
TPS = float("inf")
|
33
|
-
RPS = float("inf")
|
34
|
-
|
35
|
-
if model.model not in self.models_to_services:
|
36
|
-
service = model._inference_service_
|
37
|
-
if service not in self.services_to_buckets:
|
38
|
-
requests_bucket = TokenBucket(
|
39
|
-
bucket_name=service,
|
40
|
-
bucket_type="requests",
|
41
|
-
capacity=RPS,
|
42
|
-
refill_rate=RPS,
|
43
|
-
)
|
44
|
-
tokens_bucket = TokenBucket(
|
45
|
-
bucket_name=service,
|
46
|
-
bucket_type="tokens",
|
47
|
-
capacity=TPS,
|
48
|
-
refill_rate=TPS,
|
49
|
-
)
|
50
|
-
self.services_to_buckets[service] = ModelBuckets(
|
51
|
-
requests_bucket, tokens_bucket
|
52
|
-
)
|
53
|
-
self.models_to_services[model.model] = service
|
54
|
-
self[model] = self.services_to_buckets[service]
|
55
|
-
else:
|
56
|
-
self[model] = self.services_to_buckets[self.models_to_services[model.model]]
|
57
|
-
|
58
|
-
def visualize(self) -> dict:
|
59
|
-
"""Visualize the token and request buckets for each model."""
|
60
|
-
plots = {}
|
61
|
-
for model in self:
|
62
|
-
plots[model] = self[model].visualize()
|
63
|
-
return plots
|
1
|
+
from collections import UserDict
|
2
|
+
from edsl.jobs.buckets.TokenBucket import TokenBucket
|
3
|
+
from edsl.jobs.buckets.ModelBuckets import ModelBuckets
|
4
|
+
|
5
|
+
|
6
|
+
class BucketCollection(UserDict):
|
7
|
+
"""A Jobs object will have a whole collection of model buckets, as multiple models could be used.
|
8
|
+
|
9
|
+
The keys here are the models, and the values are the ModelBuckets objects.
|
10
|
+
Models themselves are hashable, so this works.
|
11
|
+
"""
|
12
|
+
|
13
|
+
def __init__(self, infinity_buckets=False):
|
14
|
+
super().__init__()
|
15
|
+
self.infinity_buckets = infinity_buckets
|
16
|
+
self.models_to_services = {}
|
17
|
+
self.services_to_buckets = {}
|
18
|
+
|
19
|
+
def __repr__(self):
|
20
|
+
return f"BucketCollection({self.data})"
|
21
|
+
|
22
|
+
def add_model(self, model: "LanguageModel") -> None:
|
23
|
+
"""Adds a model to the bucket collection.
|
24
|
+
|
25
|
+
This will create the token and request buckets for the model."""
|
26
|
+
|
27
|
+
# compute the TPS and RPS from the model
|
28
|
+
if not self.infinity_buckets:
|
29
|
+
TPS = model.TPM / 60.0
|
30
|
+
RPS = model.RPM / 60.0
|
31
|
+
else:
|
32
|
+
TPS = float("inf")
|
33
|
+
RPS = float("inf")
|
34
|
+
|
35
|
+
if model.model not in self.models_to_services:
|
36
|
+
service = model._inference_service_
|
37
|
+
if service not in self.services_to_buckets:
|
38
|
+
requests_bucket = TokenBucket(
|
39
|
+
bucket_name=service,
|
40
|
+
bucket_type="requests",
|
41
|
+
capacity=RPS,
|
42
|
+
refill_rate=RPS,
|
43
|
+
)
|
44
|
+
tokens_bucket = TokenBucket(
|
45
|
+
bucket_name=service,
|
46
|
+
bucket_type="tokens",
|
47
|
+
capacity=TPS,
|
48
|
+
refill_rate=TPS,
|
49
|
+
)
|
50
|
+
self.services_to_buckets[service] = ModelBuckets(
|
51
|
+
requests_bucket, tokens_bucket
|
52
|
+
)
|
53
|
+
self.models_to_services[model.model] = service
|
54
|
+
self[model] = self.services_to_buckets[service]
|
55
|
+
else:
|
56
|
+
self[model] = self.services_to_buckets[self.models_to_services[model.model]]
|
57
|
+
|
58
|
+
def visualize(self) -> dict:
|
59
|
+
"""Visualize the token and request buckets for each model."""
|
60
|
+
plots = {}
|
61
|
+
for model in self:
|
62
|
+
plots[model] = self[model].visualize()
|
63
|
+
return plots
|
@@ -1,65 +1,65 @@
|
|
1
|
-
# from edsl.jobs.buckets.TokenBucket import TokenBucket
|
2
|
-
|
3
|
-
|
4
|
-
class ModelBuckets:
|
5
|
-
"""A class to represent the token and request buckets for a model.
|
6
|
-
|
7
|
-
Most LLM model services have limits both on requests-per-minute (RPM) and tokens-per-minute (TPM).
|
8
|
-
A request is one call to the service. The number of tokens required for a request depends on parameters.
|
9
|
-
"""
|
10
|
-
|
11
|
-
def __init__(self, requests_bucket: "TokenBucket", tokens_bucket: "TokenBucket"):
|
12
|
-
"""Initialize the model buckets.
|
13
|
-
|
14
|
-
The requests bucket captures requests per unit of time.
|
15
|
-
The tokens bucket captures the number of language model tokens.
|
16
|
-
|
17
|
-
"""
|
18
|
-
self.requests_bucket = requests_bucket
|
19
|
-
self.tokens_bucket = tokens_bucket
|
20
|
-
|
21
|
-
def __add__(self, other: "ModelBuckets"):
|
22
|
-
"""Combine two model buckets."""
|
23
|
-
return ModelBuckets(
|
24
|
-
requests_bucket=self.requests_bucket + other.requests_bucket,
|
25
|
-
tokens_bucket=self.tokens_bucket + other.tokens_bucket,
|
26
|
-
)
|
27
|
-
|
28
|
-
def turbo_mode_on(self):
|
29
|
-
"""Set the refill rate to infinity for both buckets."""
|
30
|
-
self.requests_bucket.turbo_mode_on()
|
31
|
-
self.tokens_bucket.turbo_mode_on()
|
32
|
-
|
33
|
-
def turbo_mode_off(self):
|
34
|
-
"""Restore the refill rate to its original value for both buckets."""
|
35
|
-
self.requests_bucket.turbo_mode_off()
|
36
|
-
self.tokens_bucket.turbo_mode_off()
|
37
|
-
|
38
|
-
@classmethod
|
39
|
-
def infinity_bucket(cls, model_name: str = "not_specified") -> "ModelBuckets":
|
40
|
-
"""Create a bucket with infinite capacity and refill rate."""
|
41
|
-
from edsl.jobs.buckets.TokenBucket import TokenBucket
|
42
|
-
|
43
|
-
return cls(
|
44
|
-
requests_bucket=TokenBucket(
|
45
|
-
bucket_name=model_name,
|
46
|
-
bucket_type="requests",
|
47
|
-
capacity=float("inf"),
|
48
|
-
refill_rate=float("inf"),
|
49
|
-
),
|
50
|
-
tokens_bucket=TokenBucket(
|
51
|
-
bucket_name=model_name,
|
52
|
-
bucket_type="tokens",
|
53
|
-
capacity=float("inf"),
|
54
|
-
refill_rate=float("inf"),
|
55
|
-
),
|
56
|
-
)
|
57
|
-
|
58
|
-
def visualize(self):
|
59
|
-
"""Visualize the token and request buckets."""
|
60
|
-
plot1 = self.requests_bucket.visualize()
|
61
|
-
plot2 = self.tokens_bucket.visualize()
|
62
|
-
return plot1, plot2
|
63
|
-
|
64
|
-
def __repr__(self):
|
65
|
-
return f"ModelBuckets(requests_bucket={self.requests_bucket}, tokens_bucket={self.tokens_bucket})"
|
1
|
+
# from edsl.jobs.buckets.TokenBucket import TokenBucket
|
2
|
+
|
3
|
+
|
4
|
+
class ModelBuckets:
|
5
|
+
"""A class to represent the token and request buckets for a model.
|
6
|
+
|
7
|
+
Most LLM model services have limits both on requests-per-minute (RPM) and tokens-per-minute (TPM).
|
8
|
+
A request is one call to the service. The number of tokens required for a request depends on parameters.
|
9
|
+
"""
|
10
|
+
|
11
|
+
def __init__(self, requests_bucket: "TokenBucket", tokens_bucket: "TokenBucket"):
|
12
|
+
"""Initialize the model buckets.
|
13
|
+
|
14
|
+
The requests bucket captures requests per unit of time.
|
15
|
+
The tokens bucket captures the number of language model tokens.
|
16
|
+
|
17
|
+
"""
|
18
|
+
self.requests_bucket = requests_bucket
|
19
|
+
self.tokens_bucket = tokens_bucket
|
20
|
+
|
21
|
+
def __add__(self, other: "ModelBuckets"):
|
22
|
+
"""Combine two model buckets."""
|
23
|
+
return ModelBuckets(
|
24
|
+
requests_bucket=self.requests_bucket + other.requests_bucket,
|
25
|
+
tokens_bucket=self.tokens_bucket + other.tokens_bucket,
|
26
|
+
)
|
27
|
+
|
28
|
+
def turbo_mode_on(self):
|
29
|
+
"""Set the refill rate to infinity for both buckets."""
|
30
|
+
self.requests_bucket.turbo_mode_on()
|
31
|
+
self.tokens_bucket.turbo_mode_on()
|
32
|
+
|
33
|
+
def turbo_mode_off(self):
|
34
|
+
"""Restore the refill rate to its original value for both buckets."""
|
35
|
+
self.requests_bucket.turbo_mode_off()
|
36
|
+
self.tokens_bucket.turbo_mode_off()
|
37
|
+
|
38
|
+
@classmethod
|
39
|
+
def infinity_bucket(cls, model_name: str = "not_specified") -> "ModelBuckets":
|
40
|
+
"""Create a bucket with infinite capacity and refill rate."""
|
41
|
+
from edsl.jobs.buckets.TokenBucket import TokenBucket
|
42
|
+
|
43
|
+
return cls(
|
44
|
+
requests_bucket=TokenBucket(
|
45
|
+
bucket_name=model_name,
|
46
|
+
bucket_type="requests",
|
47
|
+
capacity=float("inf"),
|
48
|
+
refill_rate=float("inf"),
|
49
|
+
),
|
50
|
+
tokens_bucket=TokenBucket(
|
51
|
+
bucket_name=model_name,
|
52
|
+
bucket_type="tokens",
|
53
|
+
capacity=float("inf"),
|
54
|
+
refill_rate=float("inf"),
|
55
|
+
),
|
56
|
+
)
|
57
|
+
|
58
|
+
def visualize(self):
|
59
|
+
"""Visualize the token and request buckets."""
|
60
|
+
plot1 = self.requests_bucket.visualize()
|
61
|
+
plot2 = self.tokens_bucket.visualize()
|
62
|
+
return plot1, plot2
|
63
|
+
|
64
|
+
def __repr__(self):
|
65
|
+
return f"ModelBuckets(requests_bucket={self.requests_bucket}, tokens_bucket={self.tokens_bucket})"
|