edsl 0.1.46__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.
Files changed (328) 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 +430 -113
  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/dataset/dataset_operations_mixin.py +1492 -0
  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} +12 -12
  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} +321 -155
  104. edsl/jobs/{JobsChecks.py → jobs_checks.py} +15 -7
  105. edsl/jobs/{JobsComponentConstructor.py → jobs_component_constructor.py} +20 -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 +10 -16
  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} +420 -216
  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/file_store.py +755 -0
  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} +424 -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 +20 -21
  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.46.dist-info → edsl-0.1.48.dist-info}/METADATA +3 -2
  230. edsl-0.1.48.dist-info/RECORD +347 -0
  231. edsl/Base.py +0 -426
  232. edsl/BaseDiff.py +0 -260
  233. edsl/agents/InvigilatorBase.py +0 -260
  234. edsl/agents/PromptConstructor.py +0 -318
  235. edsl/auto/AutoStudy.py +0 -130
  236. edsl/auto/StageBase.py +0 -243
  237. edsl/auto/StageGenerateSurvey.py +0 -178
  238. edsl/auto/StageLabelQuestions.py +0 -125
  239. edsl/auto/StagePersona.py +0 -61
  240. edsl/auto/StagePersonaDimensionValueRanges.py +0 -88
  241. edsl/auto/StagePersonaDimensionValues.py +0 -74
  242. edsl/auto/StagePersonaDimensions.py +0 -69
  243. edsl/auto/StageQuestions.py +0 -74
  244. edsl/auto/SurveyCreatorPipeline.py +0 -21
  245. edsl/auto/utilities.py +0 -218
  246. edsl/base/Base.py +0 -279
  247. edsl/coop/PriceFetcher.py +0 -54
  248. edsl/data/Cache.py +0 -580
  249. edsl/data/CacheEntry.py +0 -230
  250. edsl/data/SQLiteDict.py +0 -292
  251. edsl/data/__init__.py +0 -5
  252. edsl/data/orm.py +0 -10
  253. edsl/exceptions/cache.py +0 -5
  254. edsl/exceptions/coop.py +0 -14
  255. edsl/exceptions/data.py +0 -14
  256. edsl/exceptions/scenarios.py +0 -29
  257. edsl/jobs/Answers.py +0 -43
  258. edsl/jobs/JobsPrompts.py +0 -354
  259. edsl/jobs/buckets/BucketCollection.py +0 -134
  260. edsl/jobs/buckets/ModelBuckets.py +0 -65
  261. edsl/jobs/buckets/TokenBucket.py +0 -283
  262. edsl/jobs/buckets/TokenBucketClient.py +0 -191
  263. edsl/jobs/interviews/Interview.py +0 -395
  264. edsl/jobs/interviews/InterviewExceptionCollection.py +0 -99
  265. edsl/jobs/interviews/InterviewStatisticsCollection.py +0 -25
  266. edsl/jobs/runners/JobsRunnerAsyncio.py +0 -163
  267. edsl/jobs/runners/JobsRunnerStatusData.py +0 -0
  268. edsl/jobs/tasks/TaskCreators.py +0 -64
  269. edsl/jobs/tasks/TaskStatusLog.py +0 -23
  270. edsl/jobs/tokens/InterviewTokenUsage.py +0 -27
  271. edsl/language_models/LanguageModel.py +0 -635
  272. edsl/language_models/ServiceDataSources.py +0 -0
  273. edsl/language_models/key_management/KeyLookup.py +0 -63
  274. edsl/language_models/key_management/KeyLookupCollection.py +0 -38
  275. edsl/language_models/key_management/models.py +0 -137
  276. edsl/questions/QuestionBase.py +0 -539
  277. edsl/questions/QuestionFreeText.py +0 -130
  278. edsl/questions/derived/QuestionLikertFive.py +0 -76
  279. edsl/results/DatasetExportMixin.py +0 -911
  280. edsl/results/ResultsExportMixin.py +0 -45
  281. edsl/results/TextEditor.py +0 -50
  282. edsl/results/results_fetch_mixin.py +0 -33
  283. edsl/results/results_tools_mixin.py +0 -98
  284. edsl/scenarios/DocumentChunker.py +0 -104
  285. edsl/scenarios/FileStore.py +0 -564
  286. edsl/scenarios/Scenario.py +0 -548
  287. edsl/scenarios/ScenarioHtmlMixin.py +0 -65
  288. edsl/scenarios/ScenarioListExportMixin.py +0 -45
  289. edsl/scenarios/handlers/latex.py +0 -5
  290. edsl/shared.py +0 -1
  291. edsl/surveys/Survey.py +0 -1306
  292. edsl/surveys/SurveyQualtricsImport.py +0 -284
  293. edsl/surveys/SurveyToApp.py +0 -141
  294. edsl/surveys/instructions/__init__.py +0 -0
  295. edsl/tools/__init__.py +0 -1
  296. edsl/tools/clusters.py +0 -192
  297. edsl/tools/embeddings.py +0 -27
  298. edsl/tools/embeddings_plotting.py +0 -118
  299. edsl/tools/plotting.py +0 -112
  300. edsl/tools/summarize.py +0 -18
  301. edsl/utilities/data/Registry.py +0 -6
  302. edsl/utilities/data/__init__.py +0 -1
  303. edsl/utilities/data/scooter_results.json +0 -1
  304. edsl-0.1.46.dist-info/RECORD +0 -366
  305. /edsl/coop/{CoopFunctionsMixin.py → coop_functions.py} +0 -0
  306. /edsl/{results → dataset/display}/CSSParameterizer.py +0 -0
  307. /edsl/{language_models/key_management → dataset/display}/__init__.py +0 -0
  308. /edsl/{results → dataset/display}/table_data_class.py +0 -0
  309. /edsl/{results → dataset/display}/table_display.css +0 -0
  310. /edsl/{results/ResultsGGMixin.py → dataset/r/ggplot.py} +0 -0
  311. /edsl/{results → dataset}/tree_explore.py +0 -0
  312. /edsl/{surveys/instructions/ChangeInstruction.py → instructions/change_instruction.py} +0 -0
  313. /edsl/{jobs/interviews → interviews}/interview_status_enum.py +0 -0
  314. /edsl/jobs/{runners/JobsRunnerStatus.py → jobs_runner_status.py} +0 -0
  315. /edsl/language_models/{PriceManager.py → price_manager.py} +0 -0
  316. /edsl/language_models/{fake_openai_call.py → unused/fake_openai_call.py} +0 -0
  317. /edsl/language_models/{fake_openai_service.py → unused/fake_openai_service.py} +0 -0
  318. /edsl/notebooks/{NotebookToLaTeX.py → notebook_to_latex.py} +0 -0
  319. /edsl/{exceptions/questions.py → questions/exceptions.py} +0 -0
  320. /edsl/questions/{SimpleAskMixin.py → simple_ask_mixin.py} +0 -0
  321. /edsl/surveys/{Memory.py → memory/memory.py} +0 -0
  322. /edsl/surveys/{MemoryManagement.py → memory/memory_management.py} +0 -0
  323. /edsl/surveys/{SurveyCSS.py → survey_css.py} +0 -0
  324. /edsl/{jobs/tokens/TokenUsage.py → tokens/token_usage.py} +0 -0
  325. /edsl/{results/MarkdownToDocx.py → utilities/markdown_to_docx.py} +0 -0
  326. /edsl/{TemplateLoader.py → utilities/template_loader.py} +0 -0
  327. {edsl-0.1.46.dist-info → edsl-0.1.48.dist-info}/LICENSE +0 -0
  328. {edsl-0.1.46.dist-info → edsl-0.1.48.dist-info}/WHEEL +0 -0
@@ -2,17 +2,30 @@ from typing import Optional, Literal
2
2
  from dataclasses import dataclass, asdict
3
3
 
4
4
  # from edsl.data_transfer_models import VisibilityType
5
- from edsl.data.Cache import Cache
6
- from edsl.jobs.buckets.BucketCollection import BucketCollection
7
- from edsl.language_models.key_management.KeyLookup import KeyLookup
8
- from edsl.jobs.runners.JobsRunnerStatus import JobsRunnerStatus
5
+ from ..caching import Cache
6
+ from ..buckets import BucketCollection
7
+ from ..key_management import KeyLookup
8
+ from ..base import Base
9
9
 
10
- VisibilityType = Literal["private", "public", "unlisted"]
11
- from edsl.Base import Base
10
+ from .jobs_runner_status import JobsRunnerStatus
12
11
 
12
+ VisibilityType = Literal["private", "public", "unlisted"]
13
13
 
14
14
  @dataclass
15
15
  class RunEnvironment:
16
+ """
17
+ Contains environment-related resources for job execution.
18
+
19
+ This dataclass holds references to shared resources and infrastructure components
20
+ needed for job execution. These components are typically long-lived and may be
21
+ shared across multiple job runs.
22
+
23
+ Attributes:
24
+ cache (Cache, optional): Cache for storing and retrieving interview results
25
+ bucket_collection (BucketCollection, optional): Collection of token rate limit buckets
26
+ key_lookup (KeyLookup, optional): Manager for API keys across models
27
+ jobs_runner_status (JobsRunnerStatus, optional): Tracker for job execution progress
28
+ """
16
29
  cache: Optional[Cache] = None
17
30
  bucket_collection: Optional[BucketCollection] = None
18
31
  key_lookup: Optional[KeyLookup] = None
@@ -21,6 +34,32 @@ class RunEnvironment:
21
34
 
22
35
  @dataclass
23
36
  class RunParameters(Base):
37
+ """
38
+ Contains execution-specific parameters for job runs.
39
+
40
+ This dataclass holds parameters that control the behavior of a specific job run,
41
+ such as iteration count, error handling preferences, and remote execution options.
42
+ Unlike RunEnvironment, these parameters are specific to a single job execution.
43
+
44
+ Attributes:
45
+ n (int): Number of iterations to run each interview, default is 1
46
+ progress_bar (bool): Whether to show a progress bar, default is False
47
+ stop_on_exception (bool): Whether to stop if an exception occurs, default is False
48
+ check_api_keys (bool): Whether to validate API keys before running, default is False
49
+ verbose (bool): Whether to print detailed execution information, default is True
50
+ print_exceptions (bool): Whether to print exceptions as they occur, default is True
51
+ remote_cache_description (str, optional): Description for entries in the remote cache
52
+ remote_inference_description (str, optional): Description for the remote inference job
53
+ remote_inference_results_visibility (VisibilityType): Visibility setting for results
54
+ on Coop: "private", "public", or "unlisted" (default is "unlisted")
55
+ skip_retry (bool): Whether to skip retry attempts for failed interviews, default is False
56
+ raise_validation_errors (bool): Whether to raise validation errors, default is False
57
+ background (bool): Whether to run in background mode, default is False
58
+ disable_remote_cache (bool): Whether to disable remote cache usage, default is False
59
+ disable_remote_inference (bool): Whether to disable remote inference, default is False
60
+ job_uuid (str, optional): UUID for the job, used for tracking
61
+ fresh (bool): If True, ignore cache and generate new results, default is False
62
+ """
24
63
  n: int = 1
25
64
  progress_bar: bool = False
26
65
  stop_on_exception: bool = False
@@ -36,9 +75,7 @@ class RunParameters(Base):
36
75
  disable_remote_cache: bool = False
37
76
  disable_remote_inference: bool = False
38
77
  job_uuid: Optional[str] = None
39
- fresh: Optional[
40
- bool
41
- ] = False # if True, will not use cache and will save new results to cache
78
+ fresh: bool = False # if True, will not use cache and will save new results to cache
42
79
 
43
80
  def to_dict(self, add_edsl_version=False) -> dict:
44
81
  d = asdict(self)
@@ -63,58 +100,152 @@ class RunParameters(Base):
63
100
 
64
101
  @dataclass
65
102
  class RunConfig:
103
+ """
104
+ Combines environment resources and execution parameters for a job run.
105
+
106
+ This class brings together the two aspects of job configuration:
107
+ 1. Environment resources (caches, API keys, etc.) via RunEnvironment
108
+ 2. Execution parameters (iterations, error handling, etc.) via RunParameters
109
+
110
+ It provides helper methods for modifying environment components after construction.
111
+
112
+ Attributes:
113
+ environment (RunEnvironment): The environment resources for the job
114
+ parameters (RunParameters): The execution parameters for the job
115
+ """
66
116
  environment: RunEnvironment
67
117
  parameters: RunParameters
68
118
 
69
- def add_environment(self, environment: RunEnvironment):
119
+ def add_environment(self, environment: RunEnvironment) -> None:
120
+ """
121
+ Replace the entire environment configuration.
122
+
123
+ Parameters:
124
+ environment (RunEnvironment): The new environment configuration
125
+ """
70
126
  self.environment = environment
71
127
 
72
- def add_bucket_collection(self, bucket_collection: BucketCollection):
128
+ def add_bucket_collection(self, bucket_collection: BucketCollection) -> None:
129
+ """
130
+ Set or replace the bucket collection in the environment.
131
+
132
+ Parameters:
133
+ bucket_collection (BucketCollection): The bucket collection to use
134
+ """
73
135
  self.environment.bucket_collection = bucket_collection
74
136
 
75
- def add_cache(self, cache: Cache):
137
+ def add_cache(self, cache: Cache) -> None:
138
+ """
139
+ Set or replace the cache in the environment.
140
+
141
+ Parameters:
142
+ cache (Cache): The cache to use
143
+ """
76
144
  self.environment.cache = cache
77
145
 
78
- def add_key_lookup(self, key_lookup: KeyLookup):
146
+ def add_key_lookup(self, key_lookup: KeyLookup) -> None:
147
+ """
148
+ Set or replace the key lookup in the environment.
149
+
150
+ Parameters:
151
+ key_lookup (KeyLookup): The key lookup to use
152
+ """
79
153
  self.environment.key_lookup = key_lookup
80
154
 
81
155
 
82
- """This module contains the Answers class, which is a helper class to hold the answers to a survey."""
156
+ """
157
+ Additional data structures for working with job results and answers.
158
+ """
83
159
 
84
160
  from collections import UserDict
85
161
  from edsl.data_transfer_models import EDSLResultObjectInput
86
162
 
87
163
 
88
164
  class Answers(UserDict):
89
- """Helper class to hold the answers to a survey."""
165
+ """
166
+ A specialized dictionary for holding interview response data.
167
+
168
+ This class extends UserDict to provide a flexible container for survey answers,
169
+ with special handling for response metadata like comments and token usage.
170
+
171
+ Key features:
172
+ - Stores answers by question name
173
+ - Associates comments with their respective questions
174
+ - Tracks token usage for generation
175
+ - Handles missing answers automatically
176
+ """
90
177
 
91
178
  def add_answer(
92
179
  self, response: EDSLResultObjectInput, question: "QuestionBase"
93
180
  ) -> None:
94
- """Add a response to the answers dictionary."""
181
+ """
182
+ Add a response to the answers dictionary.
183
+
184
+ This method processes a response and stores it in the dictionary with appropriate
185
+ naming conventions for the answer itself, comments, and token usage tracking.
186
+
187
+ Parameters:
188
+ response (EDSLResultObjectInput): The response object containing answer data
189
+ question (QuestionBase): The question that was answered
190
+
191
+ Notes:
192
+ - The main answer is stored with the question's name as the key
193
+ - Comments are stored with "_comment" appended to the question name
194
+ - Token usage is stored with "_generated_tokens" appended
195
+ """
95
196
  answer = response.answer
96
197
  comment = response.comment
97
198
  generated_tokens = response.generated_tokens
98
- # record the answer
199
+
200
+ # Record token usage if available
99
201
  if generated_tokens:
100
202
  self[question.question_name + "_generated_tokens"] = generated_tokens
203
+
204
+ # Record the primary answer
101
205
  self[question.question_name] = answer
206
+
207
+ # Record comment if present
102
208
  if comment:
103
209
  self[question.question_name + "_comment"] = comment
104
210
 
105
211
  def replace_missing_answers_with_none(self, survey: "Survey") -> None:
106
- """Replace missing answers with None. Answers can be missing if the agent skips a question."""
212
+ """
213
+ Replace missing answers with None for all questions in the survey.
214
+
215
+ This method ensures that all questions in the survey have an entry in the
216
+ answers dictionary, even if they were skipped during the interview.
217
+
218
+ Parameters:
219
+ survey (Survey): The survey containing the questions to check
220
+
221
+ Notes:
222
+ - Answers can be missing if the agent skips a question due to skip logic
223
+ - This ensures consistent data structure even with partial responses
224
+ """
107
225
  for question_name in survey.question_names:
108
226
  if question_name not in self:
109
227
  self[question_name] = None
110
228
 
111
- def to_dict(self):
112
- """Return a dictionary of the answers."""
229
+ def to_dict(self) -> dict:
230
+ """
231
+ Convert the answers to a standard dictionary.
232
+
233
+ Returns:
234
+ dict: A plain dictionary containing all the answers data
235
+ """
113
236
  return self.data
114
237
 
115
238
  @classmethod
116
- def from_dict(cls, d):
117
- """Return an Answers object from a dictionary."""
239
+ def from_dict(cls, d: dict) -> "Answers":
240
+ """
241
+ Create an Answers object from a dictionary.
242
+
243
+ Parameters:
244
+ d (dict): The dictionary containing answer data
245
+
246
+ Returns:
247
+ Answers: A new Answers instance with the provided data
248
+ """
118
249
  return cls(d)
119
250
 
120
251
 
@@ -1,7 +1,8 @@
1
1
  from textwrap import dedent
2
2
 
3
+ from ..base import BaseException
3
4
 
4
- class JobsErrors(Exception):
5
+ class JobsErrors(BaseException):
5
6
  pass
6
7
 
7
8
 
@@ -1,10 +1,10 @@
1
1
  from typing import List, Dict, Any, Optional, TYPE_CHECKING
2
2
 
3
3
  if TYPE_CHECKING:
4
- from edsl.questions.QuestionBase import QuestionBase
5
- from edsl.agents.InvigilatorBase import InvigilatorBase
6
- from edsl.language_models.key_management.KeyLookup import KeyLookup
7
- from edsl.jobs.interviews.Interview import Interview
4
+ from ..questions import QuestionBase
5
+ from ..agents import InvigilatorBase
6
+ from ..language_models.key_management import KeyLookup
7
+ from .interviews import Interview
8
8
 
9
9
 
10
10
  class FetchInvigilator:
@@ -1,14 +1,17 @@
1
1
  import re
2
2
  import uuid
3
3
  from datetime import datetime
4
+
4
5
  from IPython.display import display, HTML
5
- from edsl.jobs.JobsRemoteInferenceLogger import JobLogger
6
- from edsl.jobs.jobs_status_enums import JobsStatus
7
6
 
7
+ from .jobs_remote_inference_logger import JobLogger
8
+ from .jobs_status_enums import JobsStatus
8
9
 
10
+
9
11
  class HTMLTableJobLogger(JobLogger):
10
12
  def __init__(self, verbose=True, theme="auto", **kwargs):
11
13
  super().__init__(verbose=verbose)
14
+
12
15
  self.display_handle = display(HTML(""), display_id=True) if verbose else None
13
16
  #self.display_handle = display(HTML(""), display_id=True)
14
17
  self.current_message = None
@@ -22,6 +25,7 @@ class HTMLTableJobLogger(JobLogger):
22
25
  self._init_css()
23
26
 
24
27
  def _init_css(self):
28
+
25
29
  """Initialize the CSS styles with enhanced theme support"""
26
30
  if not self.verbose:
27
31
  return None