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
edsl/config.py CHANGED
@@ -1,177 +1,5 @@
1
- """This module provides a Config class that loads environment variables from a .env file and sets them as class attributes."""
1
+ """Config module wrapper for backward compatibility.
2
2
 
3
- import os
4
- import platformdirs
5
- from dotenv import load_dotenv, find_dotenv
6
- from edsl.exceptions.configuration import (
7
- InvalidEnvironmentVariableError,
8
- MissingEnvironmentVariableError,
9
- )
10
-
11
- cache_dir = platformdirs.user_cache_dir("edsl")
12
- os.makedirs(cache_dir, exist_ok=True)
13
-
14
- # valid values for EDSL_RUN_MODE
15
- EDSL_RUN_MODES = [
16
- "development",
17
- "development-testrun",
18
- "production",
19
- ]
20
-
21
- # `default` is used to impute values only in "production" mode
22
- # `info` gives a brief description of the env var
23
- CONFIG_MAP = {
24
- "EDSL_RUN_MODE": {
25
- "default": "production",
26
- "info": "This config var determines the run mode of the application.",
27
- },
28
- "EDSL_API_TIMEOUT": {
29
- "default": "60",
30
- "info": "This config var determines the maximum number of seconds to wait for an API call to return.",
31
- },
32
- "EDSL_BACKOFF_START_SEC": {
33
- "default": "1",
34
- "info": "This config var determines the number of seconds to wait before retrying a failed API call.",
35
- },
36
- "EDSL_BACKOFF_MAX_SEC": {
37
- "default": "60",
38
- "info": "This config var determines the maximum number of seconds to wait before retrying a failed API call.",
39
- },
40
- "EDSL_DATABASE_PATH": {
41
- # "default": f"sqlite:///{os.path.join(os.getcwd(), '.edsl_cache/data.db')}",
42
- "default": f"sqlite:///{os.path.join(platformdirs.user_cache_dir('edsl'), 'lm_model_calls.db')}",
43
- "info": "This config var determines the path to the cache file.",
44
- },
45
- "EDSL_DEFAULT_MODEL": {
46
- "default": "gpt-4o",
47
- "info": "This config var holds the default model that will be used if a model is not explicitly passed.",
48
- },
49
- "EDSL_FETCH_TOKEN_PRICES": {
50
- "default": "True",
51
- "info": "This config var determines whether to fetch prices for tokens used in remote inference",
52
- },
53
- "EDSL_MAX_ATTEMPTS": {
54
- "default": "5",
55
- "info": "This config var determines the maximum number of times to retry a failed API call.",
56
- },
57
- "EDSL_SERVICE_RPM_BASELINE": {
58
- "default": "100",
59
- "info": "This config var holds the maximum number of requests per minute. Model-specific values provided in env vars such as EDSL_SERVICE_RPM_OPENAI will override this. value for the corresponding model",
60
- },
61
- "EDSL_SERVICE_TPM_BASELINE": {
62
- "default": "2000000",
63
- "info": "This config var holds the maximum number of tokens per minute for all models. Model-specific values provided in env vars such as EDSL_SERVICE_TPM_OPENAI will override this value for the corresponding model.",
64
- },
65
- "EXPECTED_PARROT_URL": {
66
- "default": "https://www.expectedparrot.com",
67
- "info": "This config var holds the URL of the Expected Parrot API.",
68
- },
69
- "EDSL_MAX_CONCURRENT_TASKS": {
70
- "default": "500",
71
- "info": "This config var determines the maximum number of concurrent tasks that can be run by the async job-runner",
72
- },
73
- "EDSL_OPEN_EXCEPTION_REPORT_URL": {
74
- "default": "False",
75
- "info": "This config var determines whether to open the exception report URL in the browser",
76
- },
77
- "EDSL_REMOTE_TOKEN_BUCKET_URL": {
78
- "default": "None",
79
- "info": "This config var holds the URL of the remote token bucket server.",
80
- },
81
- }
82
-
83
-
84
- class Config:
85
- """A class that loads environment variables from a .env file and sets them as class attributes."""
86
-
87
- def __init__(self):
88
- """Initialize the Config class."""
89
- self._set_run_mode()
90
- self._load_dotenv()
91
- self._set_env_vars()
92
-
93
- def show_path_to_dot_env(self):
94
- print(find_dotenv(usecwd=True))
95
-
96
- def _set_run_mode(self) -> None:
97
- """
98
- Sets EDSL_RUN_MODE as a class attribute.
99
- """
100
- run_mode = os.getenv("EDSL_RUN_MODE")
101
- default = CONFIG_MAP.get("EDSL_RUN_MODE").get("default")
102
- if run_mode is None:
103
- run_mode = default
104
- if run_mode not in EDSL_RUN_MODES:
105
- raise InvalidEnvironmentVariableError(
106
- f"Value `{run_mode}` is not allowed for EDSL_RUN_MODE."
107
- )
108
- self.EDSL_RUN_MODE = run_mode
109
-
110
- def _load_dotenv(self) -> None:
111
- """
112
- Loads the .env
113
- - The .env will override existing env vars **unless** EDSL_RUN_MODE=="development-testrun"
114
- """
115
-
116
- if self.EDSL_RUN_MODE == "development-testrun":
117
- override = False
118
- else:
119
- override = True
120
- _ = load_dotenv(dotenv_path=find_dotenv(usecwd=True), override=override)
121
-
122
- def __contains__(self, env_var: str) -> bool:
123
- """
124
- Checks if an env var is set as a class attribute.
125
- """
126
- return env_var in self.__dict__
127
-
128
- def _set_env_vars(self) -> None:
129
- """
130
- Sets env vars as class attributes.
131
- - EDSL_RUN_MODE is not set my this method, but by _set_run_mode
132
- - If an env var is not set and has a default value in the CONFIG_MAP, sets it to the default value.
133
- """
134
- # for each env var in the CONFIG_MAP
135
- for env_var, config in CONFIG_MAP.items():
136
- # EDSL_RUN_MODE is already set by _set_run_mode
137
- if env_var == "EDSL_RUN_MODE":
138
- continue
139
- value = os.getenv(env_var)
140
- default_value = config.get("default")
141
- # if an env var exists, set it as a class attribute
142
- if value:
143
- setattr(self, env_var, value)
144
- # otherwise, if EDSL_RUN_MODE == "production" set it to its default value
145
- elif self.EDSL_RUN_MODE == "production":
146
- setattr(self, env_var, default_value)
147
-
148
- def get(self, env_var: str) -> str:
149
- """
150
- Returns the value of an environment variable.
151
- """
152
- if env_var not in CONFIG_MAP:
153
- raise InvalidEnvironmentVariableError(f"{env_var} is not a valid env var. ")
154
- elif env_var not in self.__dict__:
155
- info = CONFIG_MAP[env_var].get("info")
156
- raise MissingEnvironmentVariableError(f"{env_var} is not set. {info}")
157
- return self.__dict__.get(env_var)
158
-
159
- def __iter__(self):
160
- """Iterate over the environment variables."""
161
- return iter(self.__dict__)
162
-
163
- def items(self):
164
- """Iterate over the environment variables and their values."""
165
- return self.__dict__.items()
166
-
167
- def show(self) -> str:
168
- """Print the currently set environment vars."""
169
- max_env_var_length = max(len(env_var) for env_var in self.__dict__)
170
- print("Here are the current configuration settings:")
171
- for env_var, value in self.__dict__.items():
172
- print(f"{env_var:<{max_env_var_length}} : {value}")
173
-
174
-
175
- # Note: Python modules are singletons. As such, once this module is imported
176
- # the same instance of it is reused across the application.
177
- CONFIG = Config()
3
+ # Re-export everything from edsl.config module
4
+ from edsl.config import *
5
+ from edsl.config.config_class import *
@@ -2,13 +2,13 @@ from collections import UserList
2
2
  import asyncio
3
3
  import inspect
4
4
  from typing import Optional, Callable
5
- from edsl import Agent, QuestionFreeText, Results, AgentList, ScenarioList, Scenario
6
- from edsl.questions import QuestionBase
7
- from edsl.results.Result import Result
5
+ from .. import Agent, QuestionFreeText, Results, AgentList, ScenarioList, Scenario
6
+ from ..questions import QuestionBase
7
+ from ..results.Result import Result
8
8
  from jinja2 import Template
9
- from edsl.data import Cache
9
+ from ..caching import Cache
10
10
 
11
- from edsl.conversation.next_speaker_utilities import (
11
+ from .next_speaker_utilities import (
12
12
  default_turn_taking_generator,
13
13
  speaker_closure,
14
14
  )
@@ -83,7 +83,7 @@ class Conversation:
83
83
 
84
84
  self.agent_list = agent_list
85
85
 
86
- from edsl import Model
86
+ from .. import Model
87
87
 
88
88
  for agent in self.agent_list:
89
89
  if not hasattr(agent, "model"):
@@ -200,7 +200,7 @@ What do you say next?"""
200
200
  """Get the next statement from the speaker."""
201
201
  q = self.next_statement_question
202
202
  # assert q.parameters == {"agent_name", "conversation"}, q.parameters
203
- from edsl import Scenario
203
+ from .. import Scenario
204
204
 
205
205
  if self.per_round_message_template is None:
206
206
  round_message = None
@@ -1,6 +1,6 @@
1
- from edsl import Agent, AgentList, QuestionFreeText
2
- from edsl import Cache
3
- from edsl.conversation.Conversation import Conversation, ConversationList
1
+ from .. import Agent, AgentList, QuestionFreeText
2
+ from .. import Cache
3
+ from .Conversation import Conversation, ConversationList
4
4
 
5
5
  a1 = Agent(
6
6
  name="Alice",
@@ -46,7 +46,7 @@ q = QuestionFreeText(
46
46
  question_name="car_brand",
47
47
  )
48
48
 
49
- from edsl import QuestionList
49
+ from .. import QuestionList
50
50
 
51
51
  q_actors = QuestionList(
52
52
  question_text="""This was a conversation about buying a car: {{ transcript }}.
@@ -1,11 +1,11 @@
1
1
  from typing import Optional
2
2
 
3
- from edsl import Agent, AgentList, QuestionFreeText
4
- from edsl import Cache
5
- from edsl import QuestionList
6
- from edsl import Model
3
+ from .. import Agent, AgentList, QuestionFreeText
4
+ from .. import Cache
5
+ from .. import QuestionList
6
+ from .. import Model
7
7
 
8
- from edsl.conversation.Conversation import Conversation, ConversationList
8
+ from .Conversation import Conversation, ConversationList
9
9
 
10
10
  m = Model("gemini-1.5-flash")
11
11
 
@@ -79,7 +79,7 @@ with Cache() as c:
79
79
  question_name="actors",
80
80
  )
81
81
 
82
- from edsl import QuestionList
82
+ from .. import QuestionList
83
83
 
84
84
  q_transfers = QuestionList(
85
85
  question_text="""This was a conversation/negotiation: {{ transcript }}.
edsl/coop/__init__.py CHANGED
@@ -1,2 +1,25 @@
1
- from edsl.coop.utils import EDSLObject, ObjectType, VisibilityType, ObjectRegistry
2
- from edsl.coop.coop import Coop
1
+
2
+ """
3
+ The coop module provides connectivity with Expected Parrot's cloud services.
4
+
5
+ This module enables EDSL to interact with cloud-based resources for enhanced functionality:
6
+ 1. Remote storage and sharing of EDSL objects (surveys, agents, models, results, etc.)
7
+ 2. Remote inference execution for running jobs in the cloud
8
+ 3. Caching of interview results for improved performance and cost savings
9
+ 4. API key management and authentication
10
+ 5. Price and model availability information
11
+
12
+ The primary interface is the Coop class, which serves as a client for the
13
+ Expected Parrot API. Most users will only need to interact with the Coop class directly.
14
+
15
+ Example:
16
+ >>> from edsl.coop import Coop
17
+ >>> coop = Coop() # Uses API key from environment or stored location
18
+ >>> survey = my_survey.push() # Uploads survey to Expected Parrot
19
+ >>> job_info = coop.remote_inference_create(my_job) # Creates remote job
20
+ """
21
+
22
+ from .utils import EDSLObject, ObjectType, VisibilityType, ObjectRegistry
23
+ from .coop import Coop
24
+ from .exceptions import CoopServerResponseError
25
+ __all__ = ["Coop"]