edsl 0.1.47__py3-none-any.whl → 0.1.49__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.
Files changed (314) hide show
  1. edsl/__init__.py +44 -39
  2. edsl/__version__.py +1 -1
  3. edsl/agents/__init__.py +4 -2
  4. edsl/agents/{Agent.py → agent.py} +442 -152
  5. edsl/agents/{AgentList.py → agent_list.py} +220 -162
  6. edsl/agents/descriptors.py +46 -7
  7. edsl/{exceptions/agents.py → agents/exceptions.py} +3 -12
  8. edsl/base/__init__.py +75 -0
  9. edsl/base/base_class.py +1303 -0
  10. edsl/base/data_transfer_models.py +114 -0
  11. edsl/base/enums.py +215 -0
  12. edsl/base.py +8 -0
  13. edsl/buckets/__init__.py +25 -0
  14. edsl/buckets/bucket_collection.py +324 -0
  15. edsl/buckets/model_buckets.py +206 -0
  16. edsl/buckets/token_bucket.py +502 -0
  17. edsl/{jobs/buckets/TokenBucketAPI.py → buckets/token_bucket_api.py} +1 -1
  18. edsl/buckets/token_bucket_client.py +509 -0
  19. edsl/caching/__init__.py +20 -0
  20. edsl/caching/cache.py +814 -0
  21. edsl/caching/cache_entry.py +427 -0
  22. edsl/{data/CacheHandler.py → caching/cache_handler.py} +14 -15
  23. edsl/caching/exceptions.py +24 -0
  24. edsl/caching/orm.py +30 -0
  25. edsl/{data/RemoteCacheSync.py → caching/remote_cache_sync.py} +3 -3
  26. edsl/caching/sql_dict.py +441 -0
  27. edsl/config/__init__.py +8 -0
  28. edsl/config/config_class.py +177 -0
  29. edsl/config.py +4 -176
  30. edsl/conversation/Conversation.py +7 -7
  31. edsl/conversation/car_buying.py +4 -4
  32. edsl/conversation/chips.py +6 -6
  33. edsl/coop/__init__.py +25 -2
  34. edsl/coop/coop.py +311 -75
  35. edsl/coop/{ExpectedParrotKeyHandler.py → ep_key_handling.py} +86 -10
  36. edsl/coop/exceptions.py +62 -0
  37. edsl/coop/price_fetcher.py +126 -0
  38. edsl/coop/utils.py +89 -24
  39. edsl/data_transfer_models.py +5 -72
  40. edsl/dataset/__init__.py +10 -0
  41. edsl/{results/Dataset.py → dataset/dataset.py} +116 -36
  42. edsl/{results/DatasetExportMixin.py → dataset/dataset_operations_mixin.py} +606 -122
  43. edsl/{results/DatasetTree.py → dataset/dataset_tree.py} +156 -75
  44. edsl/{results/TableDisplay.py → dataset/display/table_display.py} +18 -7
  45. edsl/{results → dataset/display}/table_renderers.py +58 -2
  46. edsl/{results → dataset}/file_exports.py +4 -5
  47. edsl/{results → dataset}/smart_objects.py +2 -2
  48. edsl/enums.py +5 -205
  49. edsl/inference_services/__init__.py +5 -0
  50. edsl/inference_services/{AvailableModelCacheHandler.py → available_model_cache_handler.py} +2 -3
  51. edsl/inference_services/{AvailableModelFetcher.py → available_model_fetcher.py} +8 -14
  52. edsl/inference_services/data_structures.py +3 -2
  53. edsl/{exceptions/inference_services.py → inference_services/exceptions.py} +1 -1
  54. edsl/inference_services/{InferenceServiceABC.py → inference_service_abc.py} +1 -1
  55. edsl/inference_services/{InferenceServicesCollection.py → inference_services_collection.py} +8 -7
  56. edsl/inference_services/registry.py +4 -41
  57. edsl/inference_services/{ServiceAvailability.py → service_availability.py} +5 -25
  58. edsl/inference_services/services/__init__.py +31 -0
  59. edsl/inference_services/{AnthropicService.py → services/anthropic_service.py} +3 -3
  60. edsl/inference_services/{AwsBedrock.py → services/aws_bedrock.py} +2 -2
  61. edsl/inference_services/{AzureAI.py → services/azure_ai.py} +2 -2
  62. edsl/inference_services/{DeepInfraService.py → services/deep_infra_service.py} +1 -3
  63. edsl/inference_services/{DeepSeekService.py → services/deep_seek_service.py} +2 -4
  64. edsl/inference_services/{GoogleService.py → services/google_service.py} +5 -4
  65. edsl/inference_services/{GroqService.py → services/groq_service.py} +1 -1
  66. edsl/inference_services/{MistralAIService.py → services/mistral_ai_service.py} +3 -3
  67. edsl/inference_services/{OllamaService.py → services/ollama_service.py} +1 -7
  68. edsl/inference_services/{OpenAIService.py → services/open_ai_service.py} +5 -6
  69. edsl/inference_services/{PerplexityService.py → services/perplexity_service.py} +3 -7
  70. edsl/inference_services/{TestService.py → services/test_service.py} +7 -6
  71. edsl/inference_services/{TogetherAIService.py → services/together_ai_service.py} +2 -6
  72. edsl/inference_services/{XAIService.py → services/xai_service.py} +1 -1
  73. edsl/inference_services/write_available.py +1 -2
  74. edsl/instructions/__init__.py +6 -0
  75. edsl/{surveys/instructions/Instruction.py → instructions/instruction.py} +11 -6
  76. edsl/{surveys/instructions/InstructionCollection.py → instructions/instruction_collection.py} +10 -5
  77. edsl/{surveys/InstructionHandler.py → instructions/instruction_handler.py} +3 -3
  78. edsl/{jobs/interviews → interviews}/ReportErrors.py +2 -2
  79. edsl/interviews/__init__.py +4 -0
  80. edsl/{jobs/AnswerQuestionFunctionConstructor.py → interviews/answering_function.py} +45 -18
  81. edsl/{jobs/interviews/InterviewExceptionEntry.py → interviews/exception_tracking.py} +107 -22
  82. edsl/interviews/interview.py +638 -0
  83. edsl/{jobs/interviews/InterviewStatusDictionary.py → interviews/interview_status_dictionary.py} +21 -12
  84. edsl/{jobs/interviews/InterviewStatusLog.py → interviews/interview_status_log.py} +16 -7
  85. edsl/{jobs/InterviewTaskManager.py → interviews/interview_task_manager.py} +12 -7
  86. edsl/{jobs/RequestTokenEstimator.py → interviews/request_token_estimator.py} +8 -3
  87. edsl/{jobs/interviews/InterviewStatistic.py → interviews/statistics.py} +36 -10
  88. edsl/invigilators/__init__.py +38 -0
  89. edsl/invigilators/invigilator_base.py +477 -0
  90. edsl/{agents/Invigilator.py → invigilators/invigilators.py} +263 -10
  91. edsl/invigilators/prompt_constructor.py +476 -0
  92. edsl/{agents → invigilators}/prompt_helpers.py +2 -1
  93. edsl/{agents/QuestionInstructionPromptBuilder.py → invigilators/question_instructions_prompt_builder.py} +18 -13
  94. edsl/{agents → invigilators}/question_option_processor.py +96 -21
  95. edsl/{agents/QuestionTemplateReplacementsBuilder.py → invigilators/question_template_replacements_builder.py} +64 -12
  96. edsl/jobs/__init__.py +7 -1
  97. edsl/jobs/async_interview_runner.py +99 -35
  98. edsl/jobs/check_survey_scenario_compatibility.py +7 -5
  99. edsl/jobs/data_structures.py +153 -22
  100. edsl/{exceptions/jobs.py → jobs/exceptions.py} +2 -1
  101. edsl/jobs/{FetchInvigilator.py → fetch_invigilator.py} +4 -4
  102. edsl/jobs/{loggers/HTMLTableJobLogger.py → html_table_job_logger.py} +6 -2
  103. edsl/jobs/{Jobs.py → jobs.py} +313 -167
  104. edsl/jobs/{JobsChecks.py → jobs_checks.py} +15 -7
  105. edsl/jobs/{JobsComponentConstructor.py → jobs_component_constructor.py} +19 -17
  106. edsl/jobs/{InterviewsConstructor.py → jobs_interview_constructor.py} +10 -5
  107. edsl/jobs/jobs_pricing_estimation.py +347 -0
  108. edsl/jobs/{JobsRemoteInferenceLogger.py → jobs_remote_inference_logger.py} +4 -3
  109. edsl/jobs/jobs_runner_asyncio.py +282 -0
  110. edsl/jobs/{JobsRemoteInferenceHandler.py → remote_inference.py} +19 -22
  111. edsl/jobs/results_exceptions_handler.py +2 -2
  112. edsl/key_management/__init__.py +28 -0
  113. edsl/key_management/key_lookup.py +161 -0
  114. edsl/{language_models/key_management/KeyLookupBuilder.py → key_management/key_lookup_builder.py} +118 -47
  115. edsl/key_management/key_lookup_collection.py +82 -0
  116. edsl/key_management/models.py +218 -0
  117. edsl/language_models/__init__.py +7 -2
  118. edsl/language_models/{ComputeCost.py → compute_cost.py} +18 -3
  119. edsl/{exceptions/language_models.py → language_models/exceptions.py} +2 -1
  120. edsl/language_models/language_model.py +1080 -0
  121. edsl/language_models/model.py +10 -25
  122. edsl/language_models/{ModelList.py → model_list.py} +9 -14
  123. edsl/language_models/{RawResponseHandler.py → raw_response_handler.py} +1 -1
  124. edsl/language_models/{RegisterLanguageModelsMeta.py → registry.py} +1 -1
  125. edsl/language_models/repair.py +4 -4
  126. edsl/language_models/utilities.py +4 -4
  127. edsl/notebooks/__init__.py +3 -1
  128. edsl/notebooks/{Notebook.py → notebook.py} +7 -8
  129. edsl/prompts/__init__.py +1 -1
  130. edsl/{exceptions/prompts.py → prompts/exceptions.py} +3 -1
  131. edsl/prompts/{Prompt.py → prompt.py} +101 -95
  132. edsl/questions/HTMLQuestion.py +1 -1
  133. edsl/questions/__init__.py +154 -25
  134. edsl/questions/answer_validator_mixin.py +1 -1
  135. edsl/questions/compose_questions.py +4 -3
  136. edsl/questions/derived/question_likert_five.py +166 -0
  137. edsl/questions/derived/{QuestionLinearScale.py → question_linear_scale.py} +4 -4
  138. edsl/questions/derived/{QuestionTopK.py → question_top_k.py} +4 -4
  139. edsl/questions/derived/{QuestionYesNo.py → question_yes_no.py} +4 -5
  140. edsl/questions/descriptors.py +24 -30
  141. edsl/questions/loop_processor.py +65 -19
  142. edsl/questions/question_base.py +881 -0
  143. edsl/questions/question_base_gen_mixin.py +15 -16
  144. edsl/questions/{QuestionBasePromptsMixin.py → question_base_prompts_mixin.py} +2 -2
  145. edsl/questions/{QuestionBudget.py → question_budget.py} +3 -4
  146. edsl/questions/{QuestionCheckBox.py → question_check_box.py} +16 -16
  147. edsl/questions/{QuestionDict.py → question_dict.py} +39 -5
  148. edsl/questions/{QuestionExtract.py → question_extract.py} +9 -9
  149. edsl/questions/question_free_text.py +282 -0
  150. edsl/questions/{QuestionFunctional.py → question_functional.py} +6 -5
  151. edsl/questions/{QuestionList.py → question_list.py} +6 -7
  152. edsl/questions/{QuestionMatrix.py → question_matrix.py} +6 -5
  153. edsl/questions/{QuestionMultipleChoice.py → question_multiple_choice.py} +126 -21
  154. edsl/questions/{QuestionNumerical.py → question_numerical.py} +5 -5
  155. edsl/questions/{QuestionRank.py → question_rank.py} +6 -6
  156. edsl/questions/question_registry.py +4 -9
  157. edsl/questions/register_questions_meta.py +8 -4
  158. edsl/questions/response_validator_abc.py +17 -16
  159. edsl/results/__init__.py +4 -1
  160. edsl/{exceptions/results.py → results/exceptions.py} +1 -1
  161. edsl/results/report.py +197 -0
  162. edsl/results/{Result.py → result.py} +131 -45
  163. edsl/results/{Results.py → results.py} +365 -220
  164. edsl/results/results_selector.py +344 -25
  165. edsl/scenarios/__init__.py +30 -3
  166. edsl/scenarios/{ConstructDownloadLink.py → construct_download_link.py} +7 -0
  167. edsl/scenarios/directory_scanner.py +156 -13
  168. edsl/scenarios/document_chunker.py +186 -0
  169. edsl/scenarios/exceptions.py +101 -0
  170. edsl/scenarios/file_methods.py +2 -3
  171. edsl/scenarios/{FileStore.py → file_store.py} +275 -189
  172. edsl/scenarios/handlers/__init__.py +14 -14
  173. edsl/scenarios/handlers/{csv.py → csv_file_store.py} +1 -2
  174. edsl/scenarios/handlers/{docx.py → docx_file_store.py} +8 -7
  175. edsl/scenarios/handlers/{html.py → html_file_store.py} +1 -2
  176. edsl/scenarios/handlers/{jpeg.py → jpeg_file_store.py} +1 -1
  177. edsl/scenarios/handlers/{json.py → json_file_store.py} +1 -1
  178. edsl/scenarios/handlers/latex_file_store.py +5 -0
  179. edsl/scenarios/handlers/{md.py → md_file_store.py} +1 -1
  180. edsl/scenarios/handlers/{pdf.py → pdf_file_store.py} +2 -2
  181. edsl/scenarios/handlers/{png.py → png_file_store.py} +1 -1
  182. edsl/scenarios/handlers/{pptx.py → pptx_file_store.py} +8 -7
  183. edsl/scenarios/handlers/{py.py → py_file_store.py} +1 -3
  184. edsl/scenarios/handlers/{sql.py → sql_file_store.py} +2 -1
  185. edsl/scenarios/handlers/{sqlite.py → sqlite_file_store.py} +2 -3
  186. edsl/scenarios/handlers/{txt.py → txt_file_store.py} +1 -1
  187. edsl/scenarios/scenario.py +928 -0
  188. edsl/scenarios/scenario_join.py +18 -5
  189. edsl/scenarios/{ScenarioList.py → scenario_list.py} +294 -106
  190. edsl/scenarios/{ScenarioListPdfMixin.py → scenario_list_pdf_tools.py} +16 -15
  191. edsl/scenarios/scenario_selector.py +5 -1
  192. edsl/study/ObjectEntry.py +2 -2
  193. edsl/study/SnapShot.py +5 -5
  194. edsl/study/Study.py +18 -19
  195. edsl/study/__init__.py +6 -4
  196. edsl/surveys/__init__.py +7 -4
  197. edsl/surveys/dag/__init__.py +2 -0
  198. edsl/surveys/{ConstructDAG.py → dag/construct_dag.py} +3 -3
  199. edsl/surveys/{DAG.py → dag/dag.py} +13 -10
  200. edsl/surveys/descriptors.py +1 -1
  201. edsl/surveys/{EditSurvey.py → edit_survey.py} +9 -9
  202. edsl/{exceptions/surveys.py → surveys/exceptions.py} +1 -2
  203. edsl/surveys/memory/__init__.py +3 -0
  204. edsl/surveys/{MemoryPlan.py → memory/memory_plan.py} +10 -9
  205. edsl/surveys/rules/__init__.py +3 -0
  206. edsl/surveys/{Rule.py → rules/rule.py} +103 -43
  207. edsl/surveys/{RuleCollection.py → rules/rule_collection.py} +21 -30
  208. edsl/surveys/{RuleManager.py → rules/rule_manager.py} +19 -13
  209. edsl/surveys/survey.py +1743 -0
  210. edsl/surveys/{SurveyExportMixin.py → survey_export.py} +22 -27
  211. edsl/surveys/{SurveyFlowVisualization.py → survey_flow_visualization.py} +11 -2
  212. edsl/surveys/{Simulator.py → survey_simulator.py} +10 -3
  213. edsl/tasks/__init__.py +32 -0
  214. edsl/{jobs/tasks/QuestionTaskCreator.py → tasks/question_task_creator.py} +115 -57
  215. edsl/tasks/task_creators.py +135 -0
  216. edsl/{jobs/tasks/TaskHistory.py → tasks/task_history.py} +86 -47
  217. edsl/{jobs/tasks → tasks}/task_status_enum.py +91 -7
  218. edsl/tasks/task_status_log.py +85 -0
  219. edsl/tokens/__init__.py +2 -0
  220. edsl/tokens/interview_token_usage.py +53 -0
  221. edsl/utilities/PrettyList.py +1 -1
  222. edsl/utilities/SystemInfo.py +25 -22
  223. edsl/utilities/__init__.py +29 -21
  224. edsl/utilities/gcp_bucket/__init__.py +2 -0
  225. edsl/utilities/gcp_bucket/cloud_storage.py +99 -96
  226. edsl/utilities/interface.py +44 -536
  227. edsl/{results/MarkdownToPDF.py → utilities/markdown_to_pdf.py} +13 -5
  228. edsl/utilities/repair_functions.py +1 -1
  229. {edsl-0.1.47.dist-info → edsl-0.1.49.dist-info}/METADATA +1 -1
  230. edsl-0.1.49.dist-info/RECORD +347 -0
  231. edsl/Base.py +0 -493
  232. edsl/BaseDiff.py +0 -260
  233. edsl/agents/InvigilatorBase.py +0 -260
  234. edsl/agents/PromptConstructor.py +0 -318
  235. edsl/coop/PriceFetcher.py +0 -54
  236. edsl/data/Cache.py +0 -582
  237. edsl/data/CacheEntry.py +0 -238
  238. edsl/data/SQLiteDict.py +0 -292
  239. edsl/data/__init__.py +0 -5
  240. edsl/data/orm.py +0 -10
  241. edsl/exceptions/cache.py +0 -5
  242. edsl/exceptions/coop.py +0 -14
  243. edsl/exceptions/data.py +0 -14
  244. edsl/exceptions/scenarios.py +0 -29
  245. edsl/jobs/Answers.py +0 -43
  246. edsl/jobs/JobsPrompts.py +0 -354
  247. edsl/jobs/buckets/BucketCollection.py +0 -134
  248. edsl/jobs/buckets/ModelBuckets.py +0 -65
  249. edsl/jobs/buckets/TokenBucket.py +0 -283
  250. edsl/jobs/buckets/TokenBucketClient.py +0 -191
  251. edsl/jobs/interviews/Interview.py +0 -395
  252. edsl/jobs/interviews/InterviewExceptionCollection.py +0 -99
  253. edsl/jobs/interviews/InterviewStatisticsCollection.py +0 -25
  254. edsl/jobs/runners/JobsRunnerAsyncio.py +0 -163
  255. edsl/jobs/runners/JobsRunnerStatusData.py +0 -0
  256. edsl/jobs/tasks/TaskCreators.py +0 -64
  257. edsl/jobs/tasks/TaskStatusLog.py +0 -23
  258. edsl/jobs/tokens/InterviewTokenUsage.py +0 -27
  259. edsl/language_models/LanguageModel.py +0 -635
  260. edsl/language_models/ServiceDataSources.py +0 -0
  261. edsl/language_models/key_management/KeyLookup.py +0 -63
  262. edsl/language_models/key_management/KeyLookupCollection.py +0 -38
  263. edsl/language_models/key_management/models.py +0 -137
  264. edsl/questions/QuestionBase.py +0 -544
  265. edsl/questions/QuestionFreeText.py +0 -130
  266. edsl/questions/derived/QuestionLikertFive.py +0 -76
  267. edsl/results/ResultsExportMixin.py +0 -45
  268. edsl/results/TextEditor.py +0 -50
  269. edsl/results/results_fetch_mixin.py +0 -33
  270. edsl/results/results_tools_mixin.py +0 -98
  271. edsl/scenarios/DocumentChunker.py +0 -104
  272. edsl/scenarios/Scenario.py +0 -548
  273. edsl/scenarios/ScenarioHtmlMixin.py +0 -65
  274. edsl/scenarios/ScenarioListExportMixin.py +0 -45
  275. edsl/scenarios/handlers/latex.py +0 -5
  276. edsl/shared.py +0 -1
  277. edsl/surveys/Survey.py +0 -1301
  278. edsl/surveys/SurveyQualtricsImport.py +0 -284
  279. edsl/surveys/SurveyToApp.py +0 -141
  280. edsl/surveys/instructions/__init__.py +0 -0
  281. edsl/tools/__init__.py +0 -1
  282. edsl/tools/clusters.py +0 -192
  283. edsl/tools/embeddings.py +0 -27
  284. edsl/tools/embeddings_plotting.py +0 -118
  285. edsl/tools/plotting.py +0 -112
  286. edsl/tools/summarize.py +0 -18
  287. edsl/utilities/data/Registry.py +0 -6
  288. edsl/utilities/data/__init__.py +0 -1
  289. edsl/utilities/data/scooter_results.json +0 -1
  290. edsl-0.1.47.dist-info/RECORD +0 -354
  291. /edsl/coop/{CoopFunctionsMixin.py → coop_functions.py} +0 -0
  292. /edsl/{results → dataset/display}/CSSParameterizer.py +0 -0
  293. /edsl/{language_models/key_management → dataset/display}/__init__.py +0 -0
  294. /edsl/{results → dataset/display}/table_data_class.py +0 -0
  295. /edsl/{results → dataset/display}/table_display.css +0 -0
  296. /edsl/{results/ResultsGGMixin.py → dataset/r/ggplot.py} +0 -0
  297. /edsl/{results → dataset}/tree_explore.py +0 -0
  298. /edsl/{surveys/instructions/ChangeInstruction.py → instructions/change_instruction.py} +0 -0
  299. /edsl/{jobs/interviews → interviews}/interview_status_enum.py +0 -0
  300. /edsl/jobs/{runners/JobsRunnerStatus.py → jobs_runner_status.py} +0 -0
  301. /edsl/language_models/{PriceManager.py → price_manager.py} +0 -0
  302. /edsl/language_models/{fake_openai_call.py → unused/fake_openai_call.py} +0 -0
  303. /edsl/language_models/{fake_openai_service.py → unused/fake_openai_service.py} +0 -0
  304. /edsl/notebooks/{NotebookToLaTeX.py → notebook_to_latex.py} +0 -0
  305. /edsl/{exceptions/questions.py → questions/exceptions.py} +0 -0
  306. /edsl/questions/{SimpleAskMixin.py → simple_ask_mixin.py} +0 -0
  307. /edsl/surveys/{Memory.py → memory/memory.py} +0 -0
  308. /edsl/surveys/{MemoryManagement.py → memory/memory_management.py} +0 -0
  309. /edsl/surveys/{SurveyCSS.py → survey_css.py} +0 -0
  310. /edsl/{jobs/tokens/TokenUsage.py → tokens/token_usage.py} +0 -0
  311. /edsl/{results/MarkdownToDocx.py → utilities/markdown_to_docx.py} +0 -0
  312. /edsl/{TemplateLoader.py → utilities/template_loader.py} +0 -0
  313. {edsl-0.1.47.dist-info → edsl-0.1.49.dist-info}/LICENSE +0 -0
  314. {edsl-0.1.47.dist-info → edsl-0.1.49.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 ScenarioListPdfMixin:
111
- @classmethod
112
- def from_pdf(cls, filename_or_url, collapse_pages=False):
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 cls.is_url(filename_or_url):
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(cls.extract_text_from_pdf(temp_filename))
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(cls.extract_text_from_pdf(filename_or_url))
131
+ scenarios = list(PdfTools.extract_text_from_pdf(filename_or_url))
128
132
  if not collapse_pages:
129
- return cls(scenarios)
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
- @classmethod
151
- def from_pdf_to_image(cls, pdf_path, image_format="jpeg"):
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 cls(scenarios)
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.scenarios import ScenarioList, Scenario
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.QuestionBase import QuestionBase
5
- from edsl.Base import RegisterSubclassesMeta
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.data.Cache import Cache
29
+ >>> from edsl.caching import Cache
30
30
  >>> sn = SnapShot(namespace = globals())
31
31
  >>> sn.edsl_classes
32
- {'Cache': <class 'edsl.data.Cache.Cache'>}
32
+ {'Cache': <class 'edsl.caching.cache.Cache'>}
33
33
  """
34
- from edsl.Base import RegisterSubclassesMeta
35
- from edsl.questions.QuestionBase import QuestionBase
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.Base import Base
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 edsl.data.Cache import Cache
12
- from edsl import set_session_cache, unset_session_cache
13
- from edsl.utilities.utilities import dict_hash
14
- from edsl.study.ObjectEntry import ObjectEntry
15
- from edsl.study.ProofOfWork import ProofOfWork
16
- from edsl.study.SnapShot import SnapShot
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
- True
232
- >>> _ = s.__exit__(None, None, None)
233
- >>> len(s.objects)
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 edsl.BaseDiff import BaseDiff
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 edsl.questions.QuestionFreeText import QuestionFreeText
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 edsl.study.ObjectEntry import ObjectEntry
2
- from edsl.study.ProofOfWork import ProofOfWork
3
- from edsl.study.SnapShot import SnapShot
4
- from edsl.study.Study import Study
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 edsl.surveys.Survey import Survey
2
- from edsl.surveys.instructions.Instruction import Instruction
1
+ from .survey import Survey
2
+ from .survey_flow_visualization import SurveyFlowVisualization
3
3
 
4
- # from edsl.surveys.Rule import Rule
5
- # from edsl.surveys.RuleCollection import RuleCollection
4
+ from .rules import Rule, RuleCollection
5
+ from .base import EndOfSurvey, RulePriority
6
+
7
+ __all__ = ["Survey"]
8
+ ## , "SurveyFlowVisualization", "Rule", "RuleCollection", "EndOfSurvey", "RulePriority"]
@@ -0,0 +1,2 @@
1
+ from .dag import DAG
2
+ from .construct_dag import ConstructDAG
@@ -1,6 +1,6 @@
1
- from edsl.surveys.base import EndOfSurvey
2
- from edsl.surveys.DAG import DAG
3
- from edsl.exceptions.surveys import SurveyError
1
+ from ..base import EndOfSurvey
2
+ from . import DAG
3
+ from ..exceptions import SurveyError
4
4
 
5
5
 
6
6
  class ConstructDAG:
@@ -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."""
@@ -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 edsl.questions.QuestionBase import QuestionBase
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 edsl.questions.QuestionBase import QuestionBase
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 .RuleCollection import RuleCollection
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.Survey import Survey
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,5 +1,4 @@
1
- from edsl.exceptions.BaseException import BaseException
2
-
1
+ from ..base import BaseException
3
2
 
4
3
  class SurveyError(BaseException):
5
4
  relevant_doc = "https://docs.expectedparrot.com/en/latest/surveys.html"
@@ -0,0 +1,3 @@
1
+ from .memory_plan import MemoryPlan
2
+ from .memory_management import MemoryManagement
3
+ from .memory import Memory
@@ -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
- # from edsl.surveys.Memory import Memory
7
- # from edsl.prompts.Prompt import Prompt
8
- # from edsl.surveys.DAG import DAG
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 edsl.prompts.Prompt import Prompt
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 edsl.surveys.Memory import Memory
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 edsl.surveys.Memory import Memory
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.DAG import DAG
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")
@@ -0,0 +1,3 @@
1
+ from .rule import Rule
2
+ from .rule_manager import RuleManager
3
+ from .rule_collection import RuleCollection