edsl 0.1.47__py3-none-any.whl → 0.1.48__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/__init__.py +44 -39
- edsl/__version__.py +1 -1
- edsl/agents/__init__.py +4 -2
- edsl/agents/{Agent.py → agent.py} +442 -152
- edsl/agents/{AgentList.py → agent_list.py} +220 -162
- edsl/agents/descriptors.py +46 -7
- edsl/{exceptions/agents.py → agents/exceptions.py} +3 -12
- edsl/base/__init__.py +75 -0
- edsl/base/base_class.py +1303 -0
- edsl/base/data_transfer_models.py +114 -0
- edsl/base/enums.py +215 -0
- edsl/base.py +8 -0
- edsl/buckets/__init__.py +25 -0
- edsl/buckets/bucket_collection.py +324 -0
- edsl/buckets/model_buckets.py +206 -0
- edsl/buckets/token_bucket.py +502 -0
- edsl/{jobs/buckets/TokenBucketAPI.py → buckets/token_bucket_api.py} +1 -1
- edsl/buckets/token_bucket_client.py +509 -0
- edsl/caching/__init__.py +20 -0
- edsl/caching/cache.py +814 -0
- edsl/caching/cache_entry.py +427 -0
- edsl/{data/CacheHandler.py → caching/cache_handler.py} +14 -15
- edsl/caching/exceptions.py +24 -0
- edsl/caching/orm.py +30 -0
- edsl/{data/RemoteCacheSync.py → caching/remote_cache_sync.py} +3 -3
- edsl/caching/sql_dict.py +441 -0
- edsl/config/__init__.py +8 -0
- edsl/config/config_class.py +177 -0
- edsl/config.py +4 -176
- edsl/conversation/Conversation.py +7 -7
- edsl/conversation/car_buying.py +4 -4
- edsl/conversation/chips.py +6 -6
- edsl/coop/__init__.py +25 -2
- edsl/coop/coop.py +303 -67
- edsl/coop/{ExpectedParrotKeyHandler.py → ep_key_handling.py} +86 -10
- edsl/coop/exceptions.py +62 -0
- edsl/coop/price_fetcher.py +126 -0
- edsl/coop/utils.py +89 -24
- edsl/data_transfer_models.py +5 -72
- edsl/dataset/__init__.py +10 -0
- edsl/{results/Dataset.py → dataset/dataset.py} +116 -36
- edsl/{results/DatasetExportMixin.py → dataset/dataset_operations_mixin.py} +606 -122
- edsl/{results/DatasetTree.py → dataset/dataset_tree.py} +156 -75
- edsl/{results/TableDisplay.py → dataset/display/table_display.py} +18 -7
- edsl/{results → dataset/display}/table_renderers.py +58 -2
- edsl/{results → dataset}/file_exports.py +4 -5
- edsl/{results → dataset}/smart_objects.py +2 -2
- edsl/enums.py +5 -205
- edsl/inference_services/__init__.py +5 -0
- edsl/inference_services/{AvailableModelCacheHandler.py → available_model_cache_handler.py} +2 -3
- edsl/inference_services/{AvailableModelFetcher.py → available_model_fetcher.py} +8 -14
- edsl/inference_services/data_structures.py +3 -2
- edsl/{exceptions/inference_services.py → inference_services/exceptions.py} +1 -1
- edsl/inference_services/{InferenceServiceABC.py → inference_service_abc.py} +1 -1
- edsl/inference_services/{InferenceServicesCollection.py → inference_services_collection.py} +8 -7
- edsl/inference_services/registry.py +4 -41
- edsl/inference_services/{ServiceAvailability.py → service_availability.py} +5 -25
- edsl/inference_services/services/__init__.py +31 -0
- edsl/inference_services/{AnthropicService.py → services/anthropic_service.py} +3 -3
- edsl/inference_services/{AwsBedrock.py → services/aws_bedrock.py} +2 -2
- edsl/inference_services/{AzureAI.py → services/azure_ai.py} +2 -2
- edsl/inference_services/{DeepInfraService.py → services/deep_infra_service.py} +1 -3
- edsl/inference_services/{DeepSeekService.py → services/deep_seek_service.py} +2 -4
- edsl/inference_services/{GoogleService.py → services/google_service.py} +5 -4
- edsl/inference_services/{GroqService.py → services/groq_service.py} +1 -1
- edsl/inference_services/{MistralAIService.py → services/mistral_ai_service.py} +3 -3
- edsl/inference_services/{OllamaService.py → services/ollama_service.py} +1 -7
- edsl/inference_services/{OpenAIService.py → services/open_ai_service.py} +5 -6
- edsl/inference_services/{PerplexityService.py → services/perplexity_service.py} +3 -7
- edsl/inference_services/{TestService.py → services/test_service.py} +7 -6
- edsl/inference_services/{TogetherAIService.py → services/together_ai_service.py} +2 -6
- edsl/inference_services/{XAIService.py → services/xai_service.py} +1 -1
- edsl/inference_services/write_available.py +1 -2
- edsl/instructions/__init__.py +6 -0
- edsl/{surveys/instructions/Instruction.py → instructions/instruction.py} +11 -6
- edsl/{surveys/instructions/InstructionCollection.py → instructions/instruction_collection.py} +10 -5
- edsl/{surveys/InstructionHandler.py → instructions/instruction_handler.py} +3 -3
- edsl/{jobs/interviews → interviews}/ReportErrors.py +2 -2
- edsl/interviews/__init__.py +4 -0
- edsl/{jobs/AnswerQuestionFunctionConstructor.py → interviews/answering_function.py} +45 -18
- edsl/{jobs/interviews/InterviewExceptionEntry.py → interviews/exception_tracking.py} +107 -22
- edsl/interviews/interview.py +638 -0
- edsl/{jobs/interviews/InterviewStatusDictionary.py → interviews/interview_status_dictionary.py} +21 -12
- edsl/{jobs/interviews/InterviewStatusLog.py → interviews/interview_status_log.py} +16 -7
- edsl/{jobs/InterviewTaskManager.py → interviews/interview_task_manager.py} +12 -7
- edsl/{jobs/RequestTokenEstimator.py → interviews/request_token_estimator.py} +8 -3
- edsl/{jobs/interviews/InterviewStatistic.py → interviews/statistics.py} +36 -10
- edsl/invigilators/__init__.py +38 -0
- edsl/invigilators/invigilator_base.py +477 -0
- edsl/{agents/Invigilator.py → invigilators/invigilators.py} +263 -10
- edsl/invigilators/prompt_constructor.py +476 -0
- edsl/{agents → invigilators}/prompt_helpers.py +2 -1
- edsl/{agents/QuestionInstructionPromptBuilder.py → invigilators/question_instructions_prompt_builder.py} +18 -13
- edsl/{agents → invigilators}/question_option_processor.py +96 -21
- edsl/{agents/QuestionTemplateReplacementsBuilder.py → invigilators/question_template_replacements_builder.py} +64 -12
- edsl/jobs/__init__.py +7 -1
- edsl/jobs/async_interview_runner.py +99 -35
- edsl/jobs/check_survey_scenario_compatibility.py +7 -5
- edsl/jobs/data_structures.py +153 -22
- edsl/{exceptions/jobs.py → jobs/exceptions.py} +2 -1
- edsl/jobs/{FetchInvigilator.py → fetch_invigilator.py} +4 -4
- edsl/jobs/{loggers/HTMLTableJobLogger.py → html_table_job_logger.py} +6 -2
- edsl/jobs/{Jobs.py → jobs.py} +313 -167
- edsl/jobs/{JobsChecks.py → jobs_checks.py} +15 -7
- edsl/jobs/{JobsComponentConstructor.py → jobs_component_constructor.py} +19 -17
- edsl/jobs/{InterviewsConstructor.py → jobs_interview_constructor.py} +10 -5
- edsl/jobs/jobs_pricing_estimation.py +347 -0
- edsl/jobs/{JobsRemoteInferenceLogger.py → jobs_remote_inference_logger.py} +4 -3
- edsl/jobs/jobs_runner_asyncio.py +282 -0
- edsl/jobs/{JobsRemoteInferenceHandler.py → remote_inference.py} +19 -22
- edsl/jobs/results_exceptions_handler.py +2 -2
- edsl/key_management/__init__.py +28 -0
- edsl/key_management/key_lookup.py +161 -0
- edsl/{language_models/key_management/KeyLookupBuilder.py → key_management/key_lookup_builder.py} +118 -47
- edsl/key_management/key_lookup_collection.py +82 -0
- edsl/key_management/models.py +218 -0
- edsl/language_models/__init__.py +7 -2
- edsl/language_models/{ComputeCost.py → compute_cost.py} +18 -3
- edsl/{exceptions/language_models.py → language_models/exceptions.py} +2 -1
- edsl/language_models/language_model.py +1080 -0
- edsl/language_models/model.py +10 -25
- edsl/language_models/{ModelList.py → model_list.py} +9 -14
- edsl/language_models/{RawResponseHandler.py → raw_response_handler.py} +1 -1
- edsl/language_models/{RegisterLanguageModelsMeta.py → registry.py} +1 -1
- edsl/language_models/repair.py +4 -4
- edsl/language_models/utilities.py +4 -4
- edsl/notebooks/__init__.py +3 -1
- edsl/notebooks/{Notebook.py → notebook.py} +7 -8
- edsl/prompts/__init__.py +1 -1
- edsl/{exceptions/prompts.py → prompts/exceptions.py} +3 -1
- edsl/prompts/{Prompt.py → prompt.py} +101 -95
- edsl/questions/HTMLQuestion.py +1 -1
- edsl/questions/__init__.py +154 -25
- edsl/questions/answer_validator_mixin.py +1 -1
- edsl/questions/compose_questions.py +4 -3
- edsl/questions/derived/question_likert_five.py +166 -0
- edsl/questions/derived/{QuestionLinearScale.py → question_linear_scale.py} +4 -4
- edsl/questions/derived/{QuestionTopK.py → question_top_k.py} +4 -4
- edsl/questions/derived/{QuestionYesNo.py → question_yes_no.py} +4 -5
- edsl/questions/descriptors.py +24 -30
- edsl/questions/loop_processor.py +65 -19
- edsl/questions/question_base.py +881 -0
- edsl/questions/question_base_gen_mixin.py +15 -16
- edsl/questions/{QuestionBasePromptsMixin.py → question_base_prompts_mixin.py} +2 -2
- edsl/questions/{QuestionBudget.py → question_budget.py} +3 -4
- edsl/questions/{QuestionCheckBox.py → question_check_box.py} +16 -16
- edsl/questions/{QuestionDict.py → question_dict.py} +39 -5
- edsl/questions/{QuestionExtract.py → question_extract.py} +9 -9
- edsl/questions/question_free_text.py +282 -0
- edsl/questions/{QuestionFunctional.py → question_functional.py} +6 -5
- edsl/questions/{QuestionList.py → question_list.py} +6 -7
- edsl/questions/{QuestionMatrix.py → question_matrix.py} +6 -5
- edsl/questions/{QuestionMultipleChoice.py → question_multiple_choice.py} +126 -21
- edsl/questions/{QuestionNumerical.py → question_numerical.py} +5 -5
- edsl/questions/{QuestionRank.py → question_rank.py} +6 -6
- edsl/questions/question_registry.py +4 -9
- edsl/questions/register_questions_meta.py +8 -4
- edsl/questions/response_validator_abc.py +17 -16
- edsl/results/__init__.py +4 -1
- edsl/{exceptions/results.py → results/exceptions.py} +1 -1
- edsl/results/report.py +197 -0
- edsl/results/{Result.py → result.py} +131 -45
- edsl/results/{Results.py → results.py} +365 -220
- edsl/results/results_selector.py +344 -25
- edsl/scenarios/__init__.py +30 -3
- edsl/scenarios/{ConstructDownloadLink.py → construct_download_link.py} +7 -0
- edsl/scenarios/directory_scanner.py +156 -13
- edsl/scenarios/document_chunker.py +186 -0
- edsl/scenarios/exceptions.py +101 -0
- edsl/scenarios/file_methods.py +2 -3
- edsl/scenarios/{FileStore.py → file_store.py} +275 -189
- edsl/scenarios/handlers/__init__.py +14 -14
- edsl/scenarios/handlers/{csv.py → csv_file_store.py} +1 -2
- edsl/scenarios/handlers/{docx.py → docx_file_store.py} +8 -7
- edsl/scenarios/handlers/{html.py → html_file_store.py} +1 -2
- edsl/scenarios/handlers/{jpeg.py → jpeg_file_store.py} +1 -1
- edsl/scenarios/handlers/{json.py → json_file_store.py} +1 -1
- edsl/scenarios/handlers/latex_file_store.py +5 -0
- edsl/scenarios/handlers/{md.py → md_file_store.py} +1 -1
- edsl/scenarios/handlers/{pdf.py → pdf_file_store.py} +2 -2
- edsl/scenarios/handlers/{png.py → png_file_store.py} +1 -1
- edsl/scenarios/handlers/{pptx.py → pptx_file_store.py} +8 -7
- edsl/scenarios/handlers/{py.py → py_file_store.py} +1 -3
- edsl/scenarios/handlers/{sql.py → sql_file_store.py} +2 -1
- edsl/scenarios/handlers/{sqlite.py → sqlite_file_store.py} +2 -3
- edsl/scenarios/handlers/{txt.py → txt_file_store.py} +1 -1
- edsl/scenarios/scenario.py +928 -0
- edsl/scenarios/scenario_join.py +18 -5
- edsl/scenarios/{ScenarioList.py → scenario_list.py} +294 -106
- edsl/scenarios/{ScenarioListPdfMixin.py → scenario_list_pdf_tools.py} +16 -15
- edsl/scenarios/scenario_selector.py +5 -1
- edsl/study/ObjectEntry.py +2 -2
- edsl/study/SnapShot.py +5 -5
- edsl/study/Study.py +18 -19
- edsl/study/__init__.py +6 -4
- edsl/surveys/__init__.py +7 -4
- edsl/surveys/dag/__init__.py +2 -0
- edsl/surveys/{ConstructDAG.py → dag/construct_dag.py} +3 -3
- edsl/surveys/{DAG.py → dag/dag.py} +13 -10
- edsl/surveys/descriptors.py +1 -1
- edsl/surveys/{EditSurvey.py → edit_survey.py} +9 -9
- edsl/{exceptions/surveys.py → surveys/exceptions.py} +1 -2
- edsl/surveys/memory/__init__.py +3 -0
- edsl/surveys/{MemoryPlan.py → memory/memory_plan.py} +10 -9
- edsl/surveys/rules/__init__.py +3 -0
- edsl/surveys/{Rule.py → rules/rule.py} +103 -43
- edsl/surveys/{RuleCollection.py → rules/rule_collection.py} +21 -30
- edsl/surveys/{RuleManager.py → rules/rule_manager.py} +19 -13
- edsl/surveys/survey.py +1743 -0
- edsl/surveys/{SurveyExportMixin.py → survey_export.py} +22 -27
- edsl/surveys/{SurveyFlowVisualization.py → survey_flow_visualization.py} +11 -2
- edsl/surveys/{Simulator.py → survey_simulator.py} +10 -3
- edsl/tasks/__init__.py +32 -0
- edsl/{jobs/tasks/QuestionTaskCreator.py → tasks/question_task_creator.py} +115 -57
- edsl/tasks/task_creators.py +135 -0
- edsl/{jobs/tasks/TaskHistory.py → tasks/task_history.py} +86 -47
- edsl/{jobs/tasks → tasks}/task_status_enum.py +91 -7
- edsl/tasks/task_status_log.py +85 -0
- edsl/tokens/__init__.py +2 -0
- edsl/tokens/interview_token_usage.py +53 -0
- edsl/utilities/PrettyList.py +1 -1
- edsl/utilities/SystemInfo.py +25 -22
- edsl/utilities/__init__.py +29 -21
- edsl/utilities/gcp_bucket/__init__.py +2 -0
- edsl/utilities/gcp_bucket/cloud_storage.py +99 -96
- edsl/utilities/interface.py +44 -536
- edsl/{results/MarkdownToPDF.py → utilities/markdown_to_pdf.py} +13 -5
- edsl/utilities/repair_functions.py +1 -1
- {edsl-0.1.47.dist-info → edsl-0.1.48.dist-info}/METADATA +1 -1
- edsl-0.1.48.dist-info/RECORD +347 -0
- edsl/Base.py +0 -493
- edsl/BaseDiff.py +0 -260
- edsl/agents/InvigilatorBase.py +0 -260
- edsl/agents/PromptConstructor.py +0 -318
- edsl/coop/PriceFetcher.py +0 -54
- edsl/data/Cache.py +0 -582
- edsl/data/CacheEntry.py +0 -238
- edsl/data/SQLiteDict.py +0 -292
- edsl/data/__init__.py +0 -5
- edsl/data/orm.py +0 -10
- edsl/exceptions/cache.py +0 -5
- edsl/exceptions/coop.py +0 -14
- edsl/exceptions/data.py +0 -14
- edsl/exceptions/scenarios.py +0 -29
- edsl/jobs/Answers.py +0 -43
- edsl/jobs/JobsPrompts.py +0 -354
- edsl/jobs/buckets/BucketCollection.py +0 -134
- edsl/jobs/buckets/ModelBuckets.py +0 -65
- edsl/jobs/buckets/TokenBucket.py +0 -283
- edsl/jobs/buckets/TokenBucketClient.py +0 -191
- edsl/jobs/interviews/Interview.py +0 -395
- edsl/jobs/interviews/InterviewExceptionCollection.py +0 -99
- edsl/jobs/interviews/InterviewStatisticsCollection.py +0 -25
- edsl/jobs/runners/JobsRunnerAsyncio.py +0 -163
- edsl/jobs/runners/JobsRunnerStatusData.py +0 -0
- edsl/jobs/tasks/TaskCreators.py +0 -64
- edsl/jobs/tasks/TaskStatusLog.py +0 -23
- edsl/jobs/tokens/InterviewTokenUsage.py +0 -27
- edsl/language_models/LanguageModel.py +0 -635
- edsl/language_models/ServiceDataSources.py +0 -0
- edsl/language_models/key_management/KeyLookup.py +0 -63
- edsl/language_models/key_management/KeyLookupCollection.py +0 -38
- edsl/language_models/key_management/models.py +0 -137
- edsl/questions/QuestionBase.py +0 -544
- edsl/questions/QuestionFreeText.py +0 -130
- edsl/questions/derived/QuestionLikertFive.py +0 -76
- edsl/results/ResultsExportMixin.py +0 -45
- edsl/results/TextEditor.py +0 -50
- edsl/results/results_fetch_mixin.py +0 -33
- edsl/results/results_tools_mixin.py +0 -98
- edsl/scenarios/DocumentChunker.py +0 -104
- edsl/scenarios/Scenario.py +0 -548
- edsl/scenarios/ScenarioHtmlMixin.py +0 -65
- edsl/scenarios/ScenarioListExportMixin.py +0 -45
- edsl/scenarios/handlers/latex.py +0 -5
- edsl/shared.py +0 -1
- edsl/surveys/Survey.py +0 -1301
- edsl/surveys/SurveyQualtricsImport.py +0 -284
- edsl/surveys/SurveyToApp.py +0 -141
- edsl/surveys/instructions/__init__.py +0 -0
- edsl/tools/__init__.py +0 -1
- edsl/tools/clusters.py +0 -192
- edsl/tools/embeddings.py +0 -27
- edsl/tools/embeddings_plotting.py +0 -118
- edsl/tools/plotting.py +0 -112
- edsl/tools/summarize.py +0 -18
- edsl/utilities/data/Registry.py +0 -6
- edsl/utilities/data/__init__.py +0 -1
- edsl/utilities/data/scooter_results.json +0 -1
- edsl-0.1.47.dist-info/RECORD +0 -354
- /edsl/coop/{CoopFunctionsMixin.py → coop_functions.py} +0 -0
- /edsl/{results → dataset/display}/CSSParameterizer.py +0 -0
- /edsl/{language_models/key_management → dataset/display}/__init__.py +0 -0
- /edsl/{results → dataset/display}/table_data_class.py +0 -0
- /edsl/{results → dataset/display}/table_display.css +0 -0
- /edsl/{results/ResultsGGMixin.py → dataset/r/ggplot.py} +0 -0
- /edsl/{results → dataset}/tree_explore.py +0 -0
- /edsl/{surveys/instructions/ChangeInstruction.py → instructions/change_instruction.py} +0 -0
- /edsl/{jobs/interviews → interviews}/interview_status_enum.py +0 -0
- /edsl/jobs/{runners/JobsRunnerStatus.py → jobs_runner_status.py} +0 -0
- /edsl/language_models/{PriceManager.py → price_manager.py} +0 -0
- /edsl/language_models/{fake_openai_call.py → unused/fake_openai_call.py} +0 -0
- /edsl/language_models/{fake_openai_service.py → unused/fake_openai_service.py} +0 -0
- /edsl/notebooks/{NotebookToLaTeX.py → notebook_to_latex.py} +0 -0
- /edsl/{exceptions/questions.py → questions/exceptions.py} +0 -0
- /edsl/questions/{SimpleAskMixin.py → simple_ask_mixin.py} +0 -0
- /edsl/surveys/{Memory.py → memory/memory.py} +0 -0
- /edsl/surveys/{MemoryManagement.py → memory/memory_management.py} +0 -0
- /edsl/surveys/{SurveyCSS.py → survey_css.py} +0 -0
- /edsl/{jobs/tokens/TokenUsage.py → tokens/token_usage.py} +0 -0
- /edsl/{results/MarkdownToDocx.py → utilities/markdown_to_docx.py} +0 -0
- /edsl/{TemplateLoader.py → utilities/template_loader.py} +0 -0
- {edsl-0.1.47.dist-info → edsl-0.1.48.dist-info}/LICENSE +0 -0
- {edsl-0.1.47.dist-info → edsl-0.1.48.dist-info}/WHEEL +0 -0
@@ -4,6 +4,9 @@ import copy
|
|
4
4
|
import atexit
|
5
5
|
import tempfile
|
6
6
|
import subprocess
|
7
|
+
import requests
|
8
|
+
|
9
|
+
from .scenario import Scenario
|
7
10
|
|
8
11
|
|
9
12
|
class GoogleDriveDownloader:
|
@@ -12,7 +15,6 @@ class GoogleDriveDownloader:
|
|
12
15
|
|
13
16
|
@classmethod
|
14
17
|
def fetch_from_drive(cls, url, filename=None):
|
15
|
-
import requests
|
16
18
|
|
17
19
|
# Extract file ID from the URL
|
18
20
|
file_id = cls._extract_file_id(url)
|
@@ -107,11 +109,13 @@ def fetch_and_save_pdf(url, filename):
|
|
107
109
|
return temp_file_path
|
108
110
|
|
109
111
|
|
110
|
-
class
|
111
|
-
|
112
|
-
|
112
|
+
class PdfTools:
|
113
|
+
"""Class for handling PDF-related operations for scenarios"""
|
114
|
+
|
115
|
+
@staticmethod
|
116
|
+
def from_pdf(filename_or_url, collapse_pages=False):
|
113
117
|
# Check if the input is a URL
|
114
|
-
if
|
118
|
+
if PdfTools.is_url(filename_or_url):
|
115
119
|
# Check if it's a Google Drive URL
|
116
120
|
if "drive.google.com" in filename_or_url:
|
117
121
|
temp_filename = GoogleDriveDownloader.fetch_from_drive(
|
@@ -121,17 +125,16 @@ class ScenarioListPdfMixin:
|
|
121
125
|
# For other URLs, use the previous fetch_and_save_pdf function
|
122
126
|
temp_filename = fetch_and_save_pdf(filename_or_url, "temp_pdf.pdf")
|
123
127
|
|
124
|
-
scenarios = list(
|
128
|
+
scenarios = list(PdfTools.extract_text_from_pdf(temp_filename))
|
125
129
|
else:
|
126
130
|
# If it's not a URL, assume it's a local file path
|
127
|
-
scenarios = list(
|
131
|
+
scenarios = list(PdfTools.extract_text_from_pdf(filename_or_url))
|
128
132
|
if not collapse_pages:
|
129
|
-
return
|
133
|
+
return scenarios
|
130
134
|
else:
|
131
135
|
txt = ""
|
132
136
|
for scenario in scenarios:
|
133
137
|
txt += scenario["text"]
|
134
|
-
from edsl.scenarios import Scenario
|
135
138
|
|
136
139
|
base_scenario = copy.copy(scenarios[0])
|
137
140
|
base_scenario["text"] = txt
|
@@ -147,8 +150,8 @@ class ScenarioListPdfMixin:
|
|
147
150
|
except ValueError:
|
148
151
|
return False
|
149
152
|
|
150
|
-
@
|
151
|
-
def from_pdf_to_image(
|
153
|
+
@staticmethod
|
154
|
+
def from_pdf_to_image(pdf_path, image_format="jpeg"):
|
152
155
|
"""
|
153
156
|
Convert each page of a PDF into an image and create Scenario instances.
|
154
157
|
|
@@ -160,7 +163,6 @@ class ScenarioListPdfMixin:
|
|
160
163
|
"""
|
161
164
|
import tempfile
|
162
165
|
from pdf2image import convert_from_path
|
163
|
-
from edsl.scenarios import Scenario
|
164
166
|
|
165
167
|
with tempfile.TemporaryDirectory() as output_folder:
|
166
168
|
# Convert PDF to images
|
@@ -173,7 +175,6 @@ class ScenarioListPdfMixin:
|
|
173
175
|
image_path = os.path.join(output_folder, f"page_{i+1}.{image_format}")
|
174
176
|
image.save(image_path, image_format.upper())
|
175
177
|
|
176
|
-
from edsl import FileStore
|
177
178
|
scenario = Scenario({
|
178
179
|
"filepath":image_path,
|
179
180
|
"page":i,
|
@@ -181,11 +182,10 @@ class ScenarioListPdfMixin:
|
|
181
182
|
})
|
182
183
|
scenarios.append(scenario)
|
183
184
|
|
184
|
-
return
|
185
|
+
return scenarios
|
185
186
|
|
186
187
|
@staticmethod
|
187
188
|
def extract_text_from_pdf(pdf_path):
|
188
|
-
from edsl.scenarios.Scenario import Scenario
|
189
189
|
import fitz # PyMuPDF
|
190
190
|
|
191
191
|
# TODO: Add test case
|
@@ -208,6 +208,7 @@ class ScenarioListPdfMixin:
|
|
208
208
|
page_info = {"filename": filename, "page": page_num + 1, "text": text}
|
209
209
|
yield Scenario(page_info)
|
210
210
|
|
211
|
+
@staticmethod
|
211
212
|
def create_hello_world_pdf(pdf_path):
|
212
213
|
# LaTeX content
|
213
214
|
latex_content = r"""
|
@@ -1,6 +1,10 @@
|
|
1
1
|
from typing import TYPE_CHECKING
|
2
2
|
|
3
3
|
|
4
|
+
if TYPE_CHECKING:
|
5
|
+
from .scenario_list import ScenarioList
|
6
|
+
from .scenario import Scenario
|
7
|
+
|
4
8
|
class ScenarioSelector:
|
5
9
|
"""
|
6
10
|
A class for performing advanced field selection on ScenarioList objects,
|
@@ -34,7 +38,7 @@ class ScenarioSelector:
|
|
34
38
|
field: The field name to check
|
35
39
|
|
36
40
|
Examples:
|
37
|
-
>>> from edsl
|
41
|
+
>>> from edsl import ScenarioList, Scenario
|
38
42
|
>>> selector = ScenarioSelector(ScenarioList([]))
|
39
43
|
>>> selector._match_field_pattern('test*', 'test_field')
|
40
44
|
True
|
edsl/study/ObjectEntry.py
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
import time
|
2
2
|
import webbrowser
|
3
3
|
from typing import Any, Dict, Optional, Type
|
4
|
-
from edsl.questions
|
5
|
-
from edsl.
|
4
|
+
from edsl.questions import QuestionBase
|
5
|
+
from edsl.base import RegisterSubclassesMeta
|
6
6
|
|
7
7
|
|
8
8
|
class ObjectEntry:
|
edsl/study/SnapShot.py
CHANGED
@@ -26,13 +26,13 @@ class SnapShot:
|
|
26
26
|
>>> sn.edsl_classes
|
27
27
|
{}
|
28
28
|
|
29
|
-
>>> from edsl.
|
29
|
+
>>> from edsl.caching import Cache
|
30
30
|
>>> sn = SnapShot(namespace = globals())
|
31
31
|
>>> sn.edsl_classes
|
32
|
-
{'Cache': <class 'edsl.
|
32
|
+
{'Cache': <class 'edsl.caching.cache.Cache'>}
|
33
33
|
"""
|
34
|
-
from
|
35
|
-
from
|
34
|
+
from ..base import RegisterSubclassesMeta
|
35
|
+
from ..questions import QuestionBase
|
36
36
|
|
37
37
|
all_edsl_objects = RegisterSubclassesMeta.get_registry()
|
38
38
|
|
@@ -54,7 +54,7 @@ class SnapShot:
|
|
54
54
|
{}
|
55
55
|
|
56
56
|
"""
|
57
|
-
from edsl.
|
57
|
+
from edsl.base import Base
|
58
58
|
from edsl.study.Study import Study
|
59
59
|
|
60
60
|
def is_edsl_object(obj):
|
edsl/study/Study.py
CHANGED
@@ -8,12 +8,12 @@ from datetime import datetime
|
|
8
8
|
from typing import Dict, Optional, Union
|
9
9
|
from uuid import UUID, uuid4
|
10
10
|
|
11
|
-
from
|
12
|
-
from edsl import set_session_cache, unset_session_cache
|
13
|
-
from
|
14
|
-
from
|
15
|
-
from
|
16
|
-
from
|
11
|
+
from ..caching import Cache
|
12
|
+
#from edsl import set_session_cache, unset_session_cache
|
13
|
+
from ..utilities.utilities import dict_hash
|
14
|
+
from ..study.ObjectEntry import ObjectEntry
|
15
|
+
from ..study.ProofOfWork import ProofOfWork
|
16
|
+
from ..study.SnapShot import SnapShot
|
17
17
|
|
18
18
|
|
19
19
|
class Study:
|
@@ -224,15 +224,13 @@ class Study:
|
|
224
224
|
|
225
225
|
def __enter__(self):
|
226
226
|
"""
|
227
|
-
>>> s = Study(name = "temp", use_study_cache = True, verbose = False)
|
228
|
-
>>> _ = s.__enter__()
|
229
|
-
>>> from edsl.config import CONFIG
|
230
|
-
>>> hasattr(CONFIG, "EDSL_SESSION_CACHE")
|
231
|
-
|
232
|
-
>>>
|
233
|
-
>>>
|
234
|
-
0
|
235
|
-
>>> os.remove("temp.json")
|
227
|
+
>>> #s = Study(name = "temp", use_study_cache = True, verbose = False)
|
228
|
+
>>> #_ = s.__enter__()
|
229
|
+
>>> #from edsl.config import CONFIG
|
230
|
+
>>> #hasattr(CONFIG, "EDSL_SESSION_CACHE")
|
231
|
+
>>> #_ = s.__exit__(None, None, None)
|
232
|
+
>>> #len(s.objects)
|
233
|
+
>>> #os.remove("temp.json")
|
236
234
|
|
237
235
|
"""
|
238
236
|
if self.verbose:
|
@@ -242,7 +240,7 @@ class Study:
|
|
242
240
|
if self.use_study_cache:
|
243
241
|
if self.verbose:
|
244
242
|
print("Using study cache.")
|
245
|
-
set_session_cache(self.cache)
|
243
|
+
#set_session_cache(self.cache)
|
246
244
|
|
247
245
|
if snapshot.edsl_objects:
|
248
246
|
raise ValueError(
|
@@ -258,7 +256,7 @@ class Study:
|
|
258
256
|
|
259
257
|
def study_diff(self):
|
260
258
|
## Need to also report missing.
|
261
|
-
from
|
259
|
+
from ..base import BaseDiff
|
262
260
|
|
263
261
|
raise NotImplementedError("Need to implement this.")
|
264
262
|
|
@@ -308,7 +306,8 @@ class Study:
|
|
308
306
|
# print("Frame objects are:", snapshot.namespace.keys())
|
309
307
|
# breakpoint()
|
310
308
|
if self.use_study_cache:
|
311
|
-
unset_session_cache()
|
309
|
+
#unset_session_cache()
|
310
|
+
pass
|
312
311
|
|
313
312
|
for variable_name, object in snapshot.edsl_objects.items():
|
314
313
|
self._add_edsl_object(object=object, variable_name=variable_name)
|
@@ -407,7 +406,7 @@ class Study:
|
|
407
406
|
|
408
407
|
study_file = tempfile.NamedTemporaryFile()
|
409
408
|
with cls(filename=study_file.name, verbose=verbose) as study:
|
410
|
-
from
|
409
|
+
from ..questions import QuestionFreeText
|
411
410
|
|
412
411
|
q = QuestionFreeText.example(randomize=randomize)
|
413
412
|
return study
|
edsl/study/__init__.py
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
from
|
2
|
-
from
|
3
|
-
from
|
4
|
-
from
|
1
|
+
from .ObjectEntry import ObjectEntry
|
2
|
+
from .ProofOfWork import ProofOfWork
|
3
|
+
from .SnapShot import SnapShot
|
4
|
+
from .Study import Study
|
5
|
+
|
6
|
+
__all__ = ["ObjectEntry", "ProofOfWork", "SnapShot", "Study"]
|
edsl/surveys/__init__.py
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
-
from
|
2
|
-
from
|
1
|
+
from .survey import Survey
|
2
|
+
from .survey_flow_visualization import SurveyFlowVisualization
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
from .rules import Rule, RuleCollection
|
5
|
+
from .base import EndOfSurvey, RulePriority
|
6
|
+
|
7
|
+
__all__ = ["Survey"]
|
8
|
+
## , "SurveyFlowVisualization", "Rule", "RuleCollection", "EndOfSurvey", "RulePriority"]
|
@@ -13,7 +13,7 @@ class DAG(UserDict):
|
|
13
13
|
self.reverse_mapping = self._create_reverse_mapping()
|
14
14
|
self.validate_no_cycles()
|
15
15
|
|
16
|
-
def _create_reverse_mapping(self):
|
16
|
+
def _create_reverse_mapping(self) -> dict:
|
17
17
|
"""
|
18
18
|
Create a reverse mapping of the DAG, where the keys are the children and the values are the parents.
|
19
19
|
|
@@ -33,7 +33,7 @@ class DAG(UserDict):
|
|
33
33
|
rev_map.setdefault(value, set()).add(key)
|
34
34
|
return rev_map
|
35
35
|
|
36
|
-
def get_all_children(self, key):
|
36
|
+
def get_all_children(self, key) -> set:
|
37
37
|
"""Get all children of a node in the DAG."""
|
38
38
|
children = set()
|
39
39
|
|
@@ -46,7 +46,7 @@ class DAG(UserDict):
|
|
46
46
|
dfs(key)
|
47
47
|
return children
|
48
48
|
|
49
|
-
def topologically_sorted_nodes(self):
|
49
|
+
def topologically_sorted_nodes(self) -> list[str]:
|
50
50
|
"""
|
51
51
|
Return a sequence of the DAG.
|
52
52
|
|
@@ -62,17 +62,20 @@ class DAG(UserDict):
|
|
62
62
|
"""
|
63
63
|
return list(TopologicalSorter(self).static_order())
|
64
64
|
|
65
|
-
def __add__(self, other_dag):
|
66
|
-
"""Combine two DAGs.
|
65
|
+
def __add__(self, other_dag: 'DAG') -> 'DAG':
|
66
|
+
"""Combine two DAGs.
|
67
|
+
|
68
|
+
>>> from edsl.surveys.dag import DAG
|
69
|
+
>>> dag1 = DAG({'a': {'b'}, 'b': {'c'}})
|
70
|
+
>>> dag2 = DAG({'d': {'e'}, 'e': {'f'}})
|
71
|
+
>>> dag1 + dag2 == {'d': {'e'}, 'a': {'b'}, 'e': {'f'}, 'b': {'c'}}
|
72
|
+
True
|
73
|
+
"""
|
67
74
|
d = {}
|
68
75
|
combined_keys = set(self.keys()).union(set(other_dag.keys()))
|
69
76
|
for key in combined_keys:
|
70
|
-
d[key] = self.get(key, set({})).union(other_dag.get(key, set({})))
|
77
|
+
d[key] = set(self.get(key, set({}))).union(set(other_dag.get(key, set({}))))
|
71
78
|
return DAG(d)
|
72
|
-
# if textify:
|
73
|
-
# return DAG(self.textify(d))
|
74
|
-
# else:
|
75
|
-
# return DAG(d)
|
76
79
|
|
77
80
|
def remove_node(self, node: int) -> None:
|
78
81
|
"""Remove a node and all its connections from the DAG."""
|
edsl/surveys/descriptors.py
CHANGED
@@ -38,7 +38,7 @@ class QuestionsDescriptor(BaseDescriptor):
|
|
38
38
|
|
39
39
|
def validate(self, value: Any, instance) -> None:
|
40
40
|
"""Validate the value. If it is invalid, raise an exception. If it is valid, do nothing."""
|
41
|
-
from
|
41
|
+
from ..questions import QuestionBase
|
42
42
|
|
43
43
|
if not isinstance(value, list):
|
44
44
|
raise TypeError("Questions must be a list.")
|
@@ -1,13 +1,14 @@
|
|
1
|
+
import math
|
2
|
+
|
1
3
|
from typing import Union, Optional, TYPE_CHECKING
|
2
|
-
from edsl.exceptions.surveys import SurveyError
|
3
4
|
|
4
5
|
if TYPE_CHECKING:
|
5
|
-
from
|
6
|
-
|
7
|
-
from edsl.exceptions.surveys import SurveyError, SurveyCreationError
|
8
|
-
from edsl.surveys.Rule import Rule
|
9
|
-
from edsl.surveys.base import RulePriority, EndOfSurvey
|
6
|
+
from ..questions import QuestionBase
|
7
|
+
from .survey import Survey
|
10
8
|
|
9
|
+
from .exceptions import SurveyError, SurveyCreationError
|
10
|
+
from .rules.rule import Rule
|
11
|
+
from .base import RulePriority, EndOfSurvey
|
11
12
|
|
12
13
|
class EditSurvey:
|
13
14
|
def __init__(self, survey):
|
@@ -147,7 +148,7 @@ class EditSurvey:
|
|
147
148
|
self.survey._pseudo_indices[question_name] = old_index - 1
|
148
149
|
|
149
150
|
# Update rules
|
150
|
-
from .
|
151
|
+
from .rules import RuleCollection
|
151
152
|
|
152
153
|
new_rule_collection = RuleCollection()
|
153
154
|
for rule in self.survey.rule_collection:
|
@@ -182,7 +183,7 @@ class EditSurvey:
|
|
182
183
|
:param instruction: The instruction to add to the survey.
|
183
184
|
|
184
185
|
>>> from edsl import Instruction
|
185
|
-
>>> from edsl.surveys
|
186
|
+
>>> from edsl.surveys import Survey
|
186
187
|
>>> i = Instruction(text="Pay attention to the following questions.", name="intro")
|
187
188
|
>>> s = Survey().add_instruction(i)
|
188
189
|
>>> s._instruction_names_to_instructions
|
@@ -190,7 +191,6 @@ class EditSurvey:
|
|
190
191
|
>>> s._pseudo_indices
|
191
192
|
{'intro': -0.5}
|
192
193
|
"""
|
193
|
-
import math
|
194
194
|
|
195
195
|
if instruction.name in self.survey._instruction_names_to_instructions:
|
196
196
|
raise SurveyCreationError(
|
@@ -1,12 +1,13 @@
|
|
1
1
|
"""A survey has a memory plan that specifies what the agent should remember when answering a question."""
|
2
2
|
|
3
|
+
from typing import TYPE_CHECKING
|
3
4
|
from collections import UserDict, defaultdict
|
4
5
|
from typing import Optional
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from ...surveys import Survey
|
9
|
+
from ...prompts import Prompt
|
10
|
+
from ..dag import DAG
|
10
11
|
|
11
12
|
class MemoryPlan(UserDict):
|
12
13
|
"""A survey has a memory plan that specifies what the agent should remember when answering a question.
|
@@ -61,7 +62,7 @@ class MemoryPlan(UserDict):
|
|
61
62
|
:param answers: A dictionary of question names to answers.
|
62
63
|
|
63
64
|
"""
|
64
|
-
from
|
65
|
+
from ...prompts import Prompt
|
65
66
|
|
66
67
|
self._check_valid_question_name(focal_question)
|
67
68
|
|
@@ -123,7 +124,7 @@ class MemoryPlan(UserDict):
|
|
123
124
|
self._check_valid_question_name(focal_question)
|
124
125
|
self._check_valid_question_name(prior_question)
|
125
126
|
self._check_order(focal_question, prior_question)
|
126
|
-
from
|
127
|
+
from .memory import Memory
|
127
128
|
|
128
129
|
if focal_question not in self:
|
129
130
|
memory = Memory()
|
@@ -163,7 +164,7 @@ class MemoryPlan(UserDict):
|
|
163
164
|
@classmethod
|
164
165
|
def from_dict(cls, data) -> "MemoryPlan":
|
165
166
|
"""Deserialize a memory plan from a dictionary."""
|
166
|
-
from
|
167
|
+
from .memory import Memory
|
167
168
|
|
168
169
|
newdata = {}
|
169
170
|
for question_name, memory in data["data"].items():
|
@@ -194,7 +195,7 @@ class MemoryPlan(UserDict):
|
|
194
195
|
>>> mp.dag
|
195
196
|
{1: {0}}
|
196
197
|
"""
|
197
|
-
from edsl.surveys.
|
198
|
+
from edsl.surveys.dag import DAG
|
198
199
|
|
199
200
|
d = defaultdict(set)
|
200
201
|
for focal_question, memory in self.items():
|
@@ -205,7 +206,7 @@ class MemoryPlan(UserDict):
|
|
205
206
|
@classmethod
|
206
207
|
def example(cls):
|
207
208
|
"""Return an example memory plan."""
|
208
|
-
from edsl import Survey
|
209
|
+
from edsl.surveys import Survey
|
209
210
|
|
210
211
|
mp = cls(survey=Survey.example())
|
211
212
|
mp.add_single_memory("q1", "q0")
|