edsl 0.1.39.dev3__py3-none-any.whl → 0.1.39.dev4__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 +413 -332
- edsl/BaseDiff.py +260 -260
- edsl/TemplateLoader.py +24 -24
- edsl/__init__.py +57 -49
- edsl/__version__.py +1 -1
- edsl/agents/Agent.py +1071 -867
- edsl/agents/AgentList.py +551 -413
- edsl/agents/Invigilator.py +284 -233
- edsl/agents/InvigilatorBase.py +257 -270
- edsl/agents/PromptConstructor.py +272 -354
- edsl/agents/QuestionInstructionPromptBuilder.py +128 -0
- edsl/agents/QuestionTemplateReplacementsBuilder.py +137 -0
- edsl/agents/__init__.py +2 -3
- edsl/agents/descriptors.py +99 -99
- edsl/agents/prompt_helpers.py +129 -129
- edsl/agents/question_option_processor.py +172 -0
- edsl/auto/AutoStudy.py +130 -117
- edsl/auto/StageBase.py +243 -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 +74 -73
- edsl/auto/SurveyCreatorPipeline.py +21 -21
- edsl/auto/utilities.py +218 -224
- edsl/base/Base.py +279 -279
- edsl/config.py +177 -157
- edsl/conversation/Conversation.py +290 -290
- edsl/conversation/car_buying.py +59 -58
- edsl/conversation/chips.py +95 -95
- edsl/conversation/mug_negotiation.py +81 -81
- edsl/conversation/next_speaker_utilities.py +93 -93
- edsl/coop/CoopFunctionsMixin.py +15 -0
- edsl/coop/ExpectedParrotKeyHandler.py +125 -0
- edsl/coop/PriceFetcher.py +54 -54
- edsl/coop/__init__.py +2 -2
- edsl/coop/coop.py +1106 -1028
- edsl/coop/utils.py +131 -131
- edsl/data/Cache.py +573 -555
- edsl/data/CacheEntry.py +230 -233
- edsl/data/CacheHandler.py +168 -149
- edsl/data/RemoteCacheSync.py +186 -78
- edsl/data/SQLiteDict.py +292 -292
- edsl/data/__init__.py +5 -4
- edsl/data/hack.py +10 -0
- edsl/data/orm.py +10 -10
- edsl/data_transfer_models.py +74 -73
- edsl/enums.py +202 -175
- edsl/exceptions/BaseException.py +21 -21
- edsl/exceptions/__init__.py +54 -54
- edsl/exceptions/agents.py +54 -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/inference_services.py +5 -0
- edsl/exceptions/jobs.py +33 -33
- edsl/exceptions/language_models.py +63 -63
- edsl/exceptions/prompts.py +15 -15
- edsl/exceptions/questions.py +109 -91
- edsl/exceptions/results.py +29 -29
- edsl/exceptions/scenarios.py +29 -22
- edsl/exceptions/surveys.py +37 -37
- edsl/inference_services/AnthropicService.py +106 -87
- edsl/inference_services/AvailableModelCacheHandler.py +184 -0
- edsl/inference_services/AvailableModelFetcher.py +215 -0
- edsl/inference_services/AwsBedrock.py +118 -120
- edsl/inference_services/AzureAI.py +215 -217
- edsl/inference_services/DeepInfraService.py +18 -18
- edsl/inference_services/GoogleService.py +143 -148
- edsl/inference_services/GroqService.py +20 -20
- edsl/inference_services/InferenceServiceABC.py +80 -147
- edsl/inference_services/InferenceServicesCollection.py +138 -97
- edsl/inference_services/MistralAIService.py +120 -123
- edsl/inference_services/OllamaService.py +18 -18
- edsl/inference_services/OpenAIService.py +236 -224
- edsl/inference_services/PerplexityService.py +160 -163
- edsl/inference_services/ServiceAvailability.py +135 -0
- edsl/inference_services/TestService.py +90 -89
- edsl/inference_services/TogetherAIService.py +172 -170
- edsl/inference_services/data_structures.py +134 -0
- edsl/inference_services/models_available_cache.py +118 -118
- edsl/inference_services/rate_limits_cache.py +25 -25
- edsl/inference_services/registry.py +41 -41
- edsl/inference_services/write_available.py +10 -10
- edsl/jobs/AnswerQuestionFunctionConstructor.py +223 -0
- edsl/jobs/Answers.py +43 -56
- edsl/jobs/FetchInvigilator.py +47 -0
- edsl/jobs/InterviewTaskManager.py +98 -0
- edsl/jobs/InterviewsConstructor.py +50 -0
- edsl/jobs/Jobs.py +823 -898
- edsl/jobs/JobsChecks.py +172 -147
- edsl/jobs/JobsComponentConstructor.py +189 -0
- edsl/jobs/JobsPrompts.py +270 -268
- edsl/jobs/JobsRemoteInferenceHandler.py +311 -239
- edsl/jobs/JobsRemoteInferenceLogger.py +239 -0
- edsl/jobs/RequestTokenEstimator.py +30 -0
- edsl/jobs/__init__.py +1 -1
- edsl/jobs/async_interview_runner.py +138 -0
- edsl/jobs/buckets/BucketCollection.py +104 -63
- edsl/jobs/buckets/ModelBuckets.py +65 -65
- edsl/jobs/buckets/TokenBucket.py +283 -251
- edsl/jobs/buckets/TokenBucketAPI.py +211 -0
- edsl/jobs/buckets/TokenBucketClient.py +191 -0
- edsl/jobs/check_survey_scenario_compatibility.py +85 -0
- edsl/jobs/data_structures.py +120 -0
- edsl/jobs/decorators.py +35 -0
- edsl/jobs/interviews/Interview.py +396 -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/jobs_status_enums.py +9 -0
- edsl/jobs/loggers/HTMLTableJobLogger.py +304 -0
- edsl/jobs/results_exceptions_handler.py +98 -0
- edsl/jobs/runners/JobsRunnerAsyncio.py +151 -466
- edsl/jobs/runners/JobsRunnerStatus.py +297 -330
- edsl/jobs/tasks/QuestionTaskCreator.py +244 -242
- edsl/jobs/tasks/TaskCreators.py +64 -64
- edsl/jobs/tasks/TaskHistory.py +470 -450
- edsl/jobs/tasks/TaskStatusLog.py +23 -23
- edsl/jobs/tasks/task_status_enum.py +161 -163
- edsl/jobs/tokens/InterviewTokenUsage.py +27 -27
- edsl/jobs/tokens/TokenUsage.py +34 -34
- edsl/language_models/ComputeCost.py +63 -0
- edsl/language_models/LanguageModel.py +626 -668
- edsl/language_models/ModelList.py +164 -155
- edsl/language_models/PriceManager.py +127 -0
- edsl/language_models/RawResponseHandler.py +106 -0
- edsl/language_models/RegisterLanguageModelsMeta.py +184 -184
- edsl/language_models/ServiceDataSources.py +0 -0
- edsl/language_models/__init__.py +2 -3
- edsl/language_models/fake_openai_call.py +15 -15
- edsl/language_models/fake_openai_service.py +61 -61
- edsl/language_models/key_management/KeyLookup.py +63 -0
- edsl/language_models/key_management/KeyLookupBuilder.py +273 -0
- edsl/language_models/key_management/KeyLookupCollection.py +38 -0
- edsl/language_models/key_management/__init__.py +0 -0
- edsl/language_models/key_management/models.py +131 -0
- edsl/language_models/model.py +256 -0
- edsl/language_models/repair.py +156 -156
- edsl/language_models/utilities.py +65 -64
- edsl/notebooks/Notebook.py +263 -258
- edsl/notebooks/NotebookToLaTeX.py +142 -0
- edsl/notebooks/__init__.py +1 -1
- edsl/prompts/Prompt.py +352 -362
- edsl/prompts/__init__.py +2 -2
- edsl/questions/ExceptionExplainer.py +77 -0
- edsl/questions/HTMLQuestion.py +103 -0
- edsl/questions/QuestionBase.py +518 -664
- edsl/questions/QuestionBasePromptsMixin.py +221 -217
- edsl/questions/QuestionBudget.py +227 -227
- edsl/questions/QuestionCheckBox.py +359 -359
- edsl/questions/QuestionExtract.py +180 -182
- edsl/questions/QuestionFreeText.py +113 -114
- edsl/questions/QuestionFunctional.py +166 -166
- edsl/questions/QuestionList.py +223 -231
- edsl/questions/QuestionMatrix.py +265 -0
- edsl/questions/QuestionMultipleChoice.py +330 -286
- edsl/questions/QuestionNumerical.py +151 -153
- edsl/questions/QuestionRank.py +314 -324
- edsl/questions/Quick.py +41 -41
- edsl/questions/SimpleAskMixin.py +74 -73
- edsl/questions/__init__.py +27 -26
- edsl/questions/{AnswerValidatorMixin.py → answer_validator_mixin.py} +334 -289
- edsl/questions/compose_questions.py +98 -98
- edsl/questions/data_structures.py +20 -0
- edsl/questions/decorators.py +21 -21
- edsl/questions/derived/QuestionLikertFive.py +76 -76
- edsl/questions/derived/QuestionLinearScale.py +90 -87
- edsl/questions/derived/QuestionTopK.py +93 -93
- edsl/questions/derived/QuestionYesNo.py +82 -82
- edsl/questions/descriptors.py +427 -413
- edsl/questions/loop_processor.py +149 -0
- 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/{QuestionBaseGenMixin.py → question_base_gen_mixin.py} +168 -161
- edsl/questions/question_registry.py +177 -177
- edsl/questions/{RegisterQuestionsMeta.py → register_questions_meta.py} +71 -71
- edsl/questions/{ResponseValidatorABC.py → response_validator_abc.py} +188 -174
- edsl/questions/response_validator_factory.py +34 -0
- 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/matrix/__init__.py +1 -0
- edsl/questions/templates/matrix/answering_instructions.jinja +5 -0
- edsl/questions/templates/matrix/question_presentation.jinja +20 -0
- 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/CSSParameterizer.py +108 -108
- edsl/results/Dataset.py +587 -424
- edsl/results/DatasetExportMixin.py +594 -731
- edsl/results/DatasetTree.py +295 -275
- edsl/results/MarkdownToDocx.py +122 -0
- edsl/results/MarkdownToPDF.py +111 -0
- edsl/results/Result.py +557 -465
- edsl/results/Results.py +1183 -1165
- edsl/results/ResultsExportMixin.py +45 -43
- edsl/results/ResultsGGMixin.py +121 -121
- edsl/results/TableDisplay.py +125 -198
- edsl/results/TextEditor.py +50 -0
- edsl/results/__init__.py +2 -2
- edsl/results/file_exports.py +252 -0
- edsl/results/{ResultsFetchMixin.py → results_fetch_mixin.py} +33 -33
- edsl/results/{Selector.py → results_selector.py} +145 -135
- edsl/results/{ResultsToolsMixin.py → results_tools_mixin.py} +98 -98
- edsl/results/smart_objects.py +96 -0
- edsl/results/table_data_class.py +12 -0
- edsl/results/table_display.css +77 -77
- edsl/results/table_renderers.py +118 -0
- edsl/results/tree_explore.py +115 -115
- edsl/scenarios/ConstructDownloadLink.py +109 -0
- edsl/scenarios/DocumentChunker.py +102 -0
- edsl/scenarios/DocxScenario.py +16 -0
- edsl/scenarios/FileStore.py +511 -632
- edsl/scenarios/PdfExtractor.py +40 -0
- edsl/scenarios/Scenario.py +498 -601
- edsl/scenarios/ScenarioHtmlMixin.py +65 -64
- edsl/scenarios/ScenarioList.py +1458 -1287
- edsl/scenarios/ScenarioListExportMixin.py +45 -52
- edsl/scenarios/ScenarioListPdfMixin.py +239 -261
- edsl/scenarios/__init__.py +3 -4
- edsl/scenarios/directory_scanner.py +96 -0
- edsl/scenarios/file_methods.py +85 -0
- edsl/scenarios/handlers/__init__.py +13 -0
- edsl/scenarios/handlers/csv.py +38 -0
- edsl/scenarios/handlers/docx.py +76 -0
- edsl/scenarios/handlers/html.py +37 -0
- edsl/scenarios/handlers/json.py +111 -0
- edsl/scenarios/handlers/latex.py +5 -0
- edsl/scenarios/handlers/md.py +51 -0
- edsl/scenarios/handlers/pdf.py +68 -0
- edsl/scenarios/handlers/png.py +39 -0
- edsl/scenarios/handlers/pptx.py +105 -0
- edsl/scenarios/handlers/py.py +294 -0
- edsl/scenarios/handlers/sql.py +313 -0
- edsl/scenarios/handlers/sqlite.py +149 -0
- edsl/scenarios/handlers/txt.py +33 -0
- edsl/scenarios/{ScenarioJoin.py → scenario_join.py} +131 -127
- edsl/scenarios/scenario_selector.py +156 -0
- 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 +521 -528
- edsl/study/__init__.py +4 -4
- edsl/surveys/ConstructDAG.py +92 -0
- edsl/surveys/DAG.py +148 -148
- edsl/surveys/EditSurvey.py +221 -0
- edsl/surveys/InstructionHandler.py +100 -0
- edsl/surveys/Memory.py +31 -31
- edsl/surveys/MemoryManagement.py +72 -0
- edsl/surveys/MemoryPlan.py +244 -244
- edsl/surveys/Rule.py +327 -326
- edsl/surveys/RuleCollection.py +385 -387
- edsl/surveys/RuleManager.py +172 -0
- edsl/surveys/Simulator.py +75 -0
- edsl/surveys/Survey.py +1280 -1801
- edsl/surveys/SurveyCSS.py +273 -261
- edsl/surveys/SurveyExportMixin.py +259 -259
- edsl/surveys/{SurveyFlowVisualizationMixin.py → SurveyFlowVisualization.py} +181 -179
- edsl/surveys/SurveyQualtricsImport.py +284 -284
- edsl/surveys/SurveyToApp.py +141 -0
- edsl/surveys/__init__.py +5 -3
- edsl/surveys/base.py +53 -53
- edsl/surveys/descriptors.py +60 -56
- edsl/surveys/instructions/ChangeInstruction.py +48 -49
- edsl/surveys/instructions/Instruction.py +56 -65
- edsl/surveys/instructions/InstructionCollection.py +82 -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 +19 -19
- 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/test_h +1 -0
- 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/PrettyList.py +56 -0
- 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/gcp_bucket/example.py +50 -0
- edsl/utilities/interface.py +627 -627
- edsl/utilities/is_notebook.py +18 -0
- edsl/utilities/is_valid_variable_name.py +11 -0
- edsl/utilities/naming_utilities.py +263 -263
- edsl/utilities/remove_edsl_version.py +24 -0
- edsl/utilities/repair_functions.py +28 -28
- edsl/utilities/restricted_python.py +70 -70
- edsl/utilities/utilities.py +436 -424
- {edsl-0.1.39.dev3.dist-info → edsl-0.1.39.dev4.dist-info}/LICENSE +21 -21
- {edsl-0.1.39.dev3.dist-info → edsl-0.1.39.dev4.dist-info}/METADATA +13 -11
- edsl-0.1.39.dev4.dist-info/RECORD +361 -0
- edsl/language_models/KeyLookup.py +0 -30
- edsl/language_models/registry.py +0 -190
- edsl/language_models/unused/ReplicateBase.py +0 -83
- edsl/results/ResultsDBMixin.py +0 -238
- edsl-0.1.39.dev3.dist-info/RECORD +0 -277
- {edsl-0.1.39.dev3.dist-info → edsl-0.1.39.dev4.dist-info}/WHEEL +0 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
class CoopFunctionsMixin:
|
2
|
+
def better_names(self, existing_names):
|
3
|
+
from edsl import QuestionList, Scenario
|
4
|
+
|
5
|
+
s = Scenario({"existing_names": existing_names})
|
6
|
+
q = QuestionList(
|
7
|
+
question_text="""The following colum names are already in use: {{ existing_names }}
|
8
|
+
Please provide new names for the columns.
|
9
|
+
They should be short, one or two words, and unique. They should be valid Python idenifiers.
|
10
|
+
No spaces - use underscores instead.
|
11
|
+
""",
|
12
|
+
question_name="better_names",
|
13
|
+
)
|
14
|
+
results = q.by(s).run(verbose=False)
|
15
|
+
return results.select("answer.better_names").first()
|
@@ -0,0 +1,125 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
import os
|
3
|
+
import platformdirs
|
4
|
+
|
5
|
+
|
6
|
+
import sys
|
7
|
+
import select
|
8
|
+
|
9
|
+
|
10
|
+
def get_input_with_timeout(prompt, timeout=5, default="y"):
|
11
|
+
print(prompt, end="", flush=True)
|
12
|
+
ready, _, _ = select.select([sys.stdin], [], [], timeout)
|
13
|
+
if ready:
|
14
|
+
return sys.stdin.readline().strip()
|
15
|
+
print(f"\nNo input received within {timeout} seconds. Using default: {default}")
|
16
|
+
return default
|
17
|
+
|
18
|
+
|
19
|
+
class ExpectedParrotKeyHandler:
|
20
|
+
asked_to_store_file_name = "asked_to_store.txt"
|
21
|
+
ep_key_file_name = "ep_api_key.txt"
|
22
|
+
application_name = "edsl"
|
23
|
+
|
24
|
+
@property
|
25
|
+
def config_dir(self):
|
26
|
+
return platformdirs.user_config_dir(self.application_name)
|
27
|
+
|
28
|
+
def _ep_key_file_exists(self) -> bool:
|
29
|
+
"""Check if the Expected Parrot key file exists."""
|
30
|
+
return Path(self.config_dir).joinpath(self.ep_key_file_name).exists()
|
31
|
+
|
32
|
+
def ok_to_ask_to_store(self):
|
33
|
+
"""Check if it's okay to ask the user to store the key."""
|
34
|
+
from edsl.config import CONFIG
|
35
|
+
|
36
|
+
if CONFIG.get("EDSL_RUN_MODE") != "production":
|
37
|
+
return False
|
38
|
+
|
39
|
+
return (
|
40
|
+
not Path(self.config_dir).joinpath(self.asked_to_store_file_name).exists()
|
41
|
+
)
|
42
|
+
|
43
|
+
def reset_asked_to_store(self):
|
44
|
+
"""Reset the flag that indicates whether the user has been asked to store the key."""
|
45
|
+
asked_to_store_path = Path(self.config_dir).joinpath(
|
46
|
+
self.asked_to_store_file_name
|
47
|
+
)
|
48
|
+
if asked_to_store_path.exists():
|
49
|
+
os.remove(asked_to_store_path)
|
50
|
+
print(
|
51
|
+
"Deleted the file that indicates whether the user has been asked to store the key."
|
52
|
+
)
|
53
|
+
|
54
|
+
def ask_to_store(self, api_key) -> bool:
|
55
|
+
"""Ask the user if they want to store the Expected Parrot key. If they say "yes", store it."""
|
56
|
+
if self.ok_to_ask_to_store():
|
57
|
+
# can_we_store = get_input_with_timeout(
|
58
|
+
# "Would you like to store your Expected Parrot key for future use? (y/n): ",
|
59
|
+
# timeout=5,
|
60
|
+
# default="y",
|
61
|
+
# )
|
62
|
+
can_we_store = "y"
|
63
|
+
if can_we_store.lower() == "y":
|
64
|
+
Path(self.config_dir).mkdir(parents=True, exist_ok=True)
|
65
|
+
self.store_ep_api_key(api_key)
|
66
|
+
# print("Stored Expected Parrot API key at ", self.config_dir)
|
67
|
+
return True
|
68
|
+
else:
|
69
|
+
Path(self.config_dir).mkdir(parents=True, exist_ok=True)
|
70
|
+
with open(
|
71
|
+
Path(self.config_dir).joinpath(self.asked_to_store_file_name), "w"
|
72
|
+
) as f:
|
73
|
+
f.write("Yes")
|
74
|
+
return False
|
75
|
+
|
76
|
+
def get_ep_api_key(self):
|
77
|
+
# check if the key is stored in the config_dir
|
78
|
+
api_key = None
|
79
|
+
api_key_from_cache = None
|
80
|
+
api_key_from_os = None
|
81
|
+
|
82
|
+
if self._ep_key_file_exists():
|
83
|
+
with open(Path(self.config_dir).joinpath(self.ep_key_file_name), "r") as f:
|
84
|
+
api_key_from_cache = f.read().strip()
|
85
|
+
|
86
|
+
api_key_from_os = os.getenv("EXPECTED_PARROT_API_KEY")
|
87
|
+
|
88
|
+
if api_key_from_os and api_key_from_cache:
|
89
|
+
if api_key_from_os != api_key_from_cache:
|
90
|
+
import warnings
|
91
|
+
|
92
|
+
warnings.warn(
|
93
|
+
"WARNING: The Expected Parrot API key from the environment variable "
|
94
|
+
"differs from the one stored in the config directory. Using the one "
|
95
|
+
"from the environment variable."
|
96
|
+
)
|
97
|
+
api_key = api_key_from_os
|
98
|
+
|
99
|
+
if api_key_from_os and not api_key_from_cache:
|
100
|
+
api_key = api_key_from_os
|
101
|
+
|
102
|
+
if not api_key_from_os and api_key_from_cache:
|
103
|
+
api_key = api_key_from_cache
|
104
|
+
|
105
|
+
if api_key is not None:
|
106
|
+
_ = self.ask_to_store(api_key)
|
107
|
+
return api_key
|
108
|
+
|
109
|
+
def delete_ep_api_key(self):
|
110
|
+
key_path = Path(self.config_dir) / self.ep_key_file_name
|
111
|
+
if key_path.exists():
|
112
|
+
os.remove(key_path)
|
113
|
+
print("Deleted Expected Parrot API key at ", key_path)
|
114
|
+
|
115
|
+
def store_ep_api_key(self, api_key):
|
116
|
+
# Create the directory if it doesn't exist
|
117
|
+
os.makedirs(self.config_dir, exist_ok=True)
|
118
|
+
|
119
|
+
# Create the path for the key file
|
120
|
+
key_path = Path(self.config_dir) / self.ep_key_file_name
|
121
|
+
|
122
|
+
# Save the key
|
123
|
+
with open(key_path, "w") as f:
|
124
|
+
f.write(api_key)
|
125
|
+
# print("Stored Expected Parrot API key at ", key_path)
|
edsl/coop/PriceFetcher.py
CHANGED
@@ -1,54 +1,54 @@
|
|
1
|
-
import requests
|
2
|
-
import csv
|
3
|
-
from io import StringIO
|
4
|
-
|
5
|
-
|
6
|
-
class PriceFetcher:
|
7
|
-
_instance = None
|
8
|
-
|
9
|
-
def __new__(cls):
|
10
|
-
if cls._instance is None:
|
11
|
-
cls._instance = super(PriceFetcher, cls).__new__(cls)
|
12
|
-
cls._instance._cached_prices = None
|
13
|
-
return cls._instance
|
14
|
-
|
15
|
-
def fetch_prices(self):
|
16
|
-
if self._cached_prices is not None:
|
17
|
-
return self._cached_prices
|
18
|
-
|
19
|
-
import os
|
20
|
-
import requests
|
21
|
-
from edsl import CONFIG
|
22
|
-
|
23
|
-
try:
|
24
|
-
# Fetch the pricing data
|
25
|
-
url = f"{CONFIG.EXPECTED_PARROT_URL}/api/v0/prices"
|
26
|
-
api_key = os.getenv("EXPECTED_PARROT_API_KEY")
|
27
|
-
headers = {}
|
28
|
-
if api_key:
|
29
|
-
headers["Authorization"] = f"Bearer {api_key}"
|
30
|
-
else:
|
31
|
-
headers["Authorization"] = f"Bearer None"
|
32
|
-
|
33
|
-
response = requests.get(url, headers=headers, timeout=20)
|
34
|
-
response.raise_for_status() # Raise an exception for bad responses
|
35
|
-
|
36
|
-
# Parse the data
|
37
|
-
data = response.json()
|
38
|
-
|
39
|
-
price_lookup = {}
|
40
|
-
for entry in data:
|
41
|
-
service = entry.get("service", None)
|
42
|
-
model = entry.get("model", None)
|
43
|
-
if service and model:
|
44
|
-
token_type = entry.get("token_type", None)
|
45
|
-
if (service, model) in price_lookup:
|
46
|
-
price_lookup[(service, model)].update({token_type: entry})
|
47
|
-
else:
|
48
|
-
price_lookup[(service, model)] = {token_type: entry}
|
49
|
-
self._cached_prices = price_lookup
|
50
|
-
return self._cached_prices
|
51
|
-
|
52
|
-
except requests.RequestException as e:
|
53
|
-
# print(f"An error occurred: {e}")
|
54
|
-
return {}
|
1
|
+
import requests
|
2
|
+
import csv
|
3
|
+
from io import StringIO
|
4
|
+
|
5
|
+
|
6
|
+
class PriceFetcher:
|
7
|
+
_instance = None
|
8
|
+
|
9
|
+
def __new__(cls):
|
10
|
+
if cls._instance is None:
|
11
|
+
cls._instance = super(PriceFetcher, cls).__new__(cls)
|
12
|
+
cls._instance._cached_prices = None
|
13
|
+
return cls._instance
|
14
|
+
|
15
|
+
def fetch_prices(self):
|
16
|
+
if self._cached_prices is not None:
|
17
|
+
return self._cached_prices
|
18
|
+
|
19
|
+
import os
|
20
|
+
import requests
|
21
|
+
from edsl.config import CONFIG
|
22
|
+
|
23
|
+
try:
|
24
|
+
# Fetch the pricing data
|
25
|
+
url = f"{CONFIG.EXPECTED_PARROT_URL}/api/v0/prices"
|
26
|
+
api_key = os.getenv("EXPECTED_PARROT_API_KEY")
|
27
|
+
headers = {}
|
28
|
+
if api_key:
|
29
|
+
headers["Authorization"] = f"Bearer {api_key}"
|
30
|
+
else:
|
31
|
+
headers["Authorization"] = f"Bearer None"
|
32
|
+
|
33
|
+
response = requests.get(url, headers=headers, timeout=20)
|
34
|
+
response.raise_for_status() # Raise an exception for bad responses
|
35
|
+
|
36
|
+
# Parse the data
|
37
|
+
data = response.json()
|
38
|
+
|
39
|
+
price_lookup = {}
|
40
|
+
for entry in data:
|
41
|
+
service = entry.get("service", None)
|
42
|
+
model = entry.get("model", None)
|
43
|
+
if service and model:
|
44
|
+
token_type = entry.get("token_type", None)
|
45
|
+
if (service, model) in price_lookup:
|
46
|
+
price_lookup[(service, model)].update({token_type: entry})
|
47
|
+
else:
|
48
|
+
price_lookup[(service, model)] = {token_type: entry}
|
49
|
+
self._cached_prices = price_lookup
|
50
|
+
return self._cached_prices
|
51
|
+
|
52
|
+
except requests.RequestException as e:
|
53
|
+
# print(f"An error occurred: {e}")
|
54
|
+
return {}
|
edsl/coop/__init__.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
from edsl.coop.utils import EDSLObject, ObjectType, VisibilityType, ObjectRegistry
|
2
|
-
from edsl.coop.coop import Coop
|
1
|
+
from edsl.coop.utils import EDSLObject, ObjectType, VisibilityType, ObjectRegistry
|
2
|
+
from edsl.coop.coop import Coop
|