edsl 0.1.14__py3-none-any.whl → 0.1.40__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 (407) hide show
  1. edsl/Base.py +348 -38
  2. edsl/BaseDiff.py +260 -0
  3. edsl/TemplateLoader.py +24 -0
  4. edsl/__init__.py +46 -10
  5. edsl/__version__.py +1 -0
  6. edsl/agents/Agent.py +842 -144
  7. edsl/agents/AgentList.py +521 -25
  8. edsl/agents/Invigilator.py +250 -374
  9. edsl/agents/InvigilatorBase.py +257 -0
  10. edsl/agents/PromptConstructor.py +272 -0
  11. edsl/agents/QuestionInstructionPromptBuilder.py +128 -0
  12. edsl/agents/QuestionTemplateReplacementsBuilder.py +137 -0
  13. edsl/agents/descriptors.py +43 -13
  14. edsl/agents/prompt_helpers.py +129 -0
  15. edsl/agents/question_option_processor.py +172 -0
  16. edsl/auto/AutoStudy.py +130 -0
  17. edsl/auto/StageBase.py +243 -0
  18. edsl/auto/StageGenerateSurvey.py +178 -0
  19. edsl/auto/StageLabelQuestions.py +125 -0
  20. edsl/auto/StagePersona.py +61 -0
  21. edsl/auto/StagePersonaDimensionValueRanges.py +88 -0
  22. edsl/auto/StagePersonaDimensionValues.py +74 -0
  23. edsl/auto/StagePersonaDimensions.py +69 -0
  24. edsl/auto/StageQuestions.py +74 -0
  25. edsl/auto/SurveyCreatorPipeline.py +21 -0
  26. edsl/auto/utilities.py +218 -0
  27. edsl/base/Base.py +279 -0
  28. edsl/config.py +121 -104
  29. edsl/conversation/Conversation.py +290 -0
  30. edsl/conversation/car_buying.py +59 -0
  31. edsl/conversation/chips.py +95 -0
  32. edsl/conversation/mug_negotiation.py +81 -0
  33. edsl/conversation/next_speaker_utilities.py +93 -0
  34. edsl/coop/CoopFunctionsMixin.py +15 -0
  35. edsl/coop/ExpectedParrotKeyHandler.py +125 -0
  36. edsl/coop/PriceFetcher.py +54 -0
  37. edsl/coop/__init__.py +1 -0
  38. edsl/coop/coop.py +1029 -134
  39. edsl/coop/utils.py +131 -0
  40. edsl/data/Cache.py +560 -89
  41. edsl/data/CacheEntry.py +230 -0
  42. edsl/data/CacheHandler.py +168 -0
  43. edsl/data/RemoteCacheSync.py +186 -0
  44. edsl/data/SQLiteDict.py +292 -0
  45. edsl/data/__init__.py +5 -3
  46. edsl/data/orm.py +6 -33
  47. edsl/data_transfer_models.py +74 -27
  48. edsl/enums.py +165 -8
  49. edsl/exceptions/BaseException.py +21 -0
  50. edsl/exceptions/__init__.py +52 -46
  51. edsl/exceptions/agents.py +33 -15
  52. edsl/exceptions/cache.py +5 -0
  53. edsl/exceptions/coop.py +8 -0
  54. edsl/exceptions/general.py +34 -0
  55. edsl/exceptions/inference_services.py +5 -0
  56. edsl/exceptions/jobs.py +15 -0
  57. edsl/exceptions/language_models.py +46 -1
  58. edsl/exceptions/questions.py +80 -5
  59. edsl/exceptions/results.py +16 -5
  60. edsl/exceptions/scenarios.py +29 -0
  61. edsl/exceptions/surveys.py +13 -10
  62. edsl/inference_services/AnthropicService.py +106 -0
  63. edsl/inference_services/AvailableModelCacheHandler.py +184 -0
  64. edsl/inference_services/AvailableModelFetcher.py +215 -0
  65. edsl/inference_services/AwsBedrock.py +118 -0
  66. edsl/inference_services/AzureAI.py +215 -0
  67. edsl/inference_services/DeepInfraService.py +18 -0
  68. edsl/inference_services/GoogleService.py +143 -0
  69. edsl/inference_services/GroqService.py +20 -0
  70. edsl/inference_services/InferenceServiceABC.py +80 -0
  71. edsl/inference_services/InferenceServicesCollection.py +138 -0
  72. edsl/inference_services/MistralAIService.py +120 -0
  73. edsl/inference_services/OllamaService.py +18 -0
  74. edsl/inference_services/OpenAIService.py +236 -0
  75. edsl/inference_services/PerplexityService.py +160 -0
  76. edsl/inference_services/ServiceAvailability.py +135 -0
  77. edsl/inference_services/TestService.py +90 -0
  78. edsl/inference_services/TogetherAIService.py +172 -0
  79. edsl/inference_services/data_structures.py +134 -0
  80. edsl/inference_services/models_available_cache.py +118 -0
  81. edsl/inference_services/rate_limits_cache.py +25 -0
  82. edsl/inference_services/registry.py +41 -0
  83. edsl/inference_services/write_available.py +10 -0
  84. edsl/jobs/AnswerQuestionFunctionConstructor.py +223 -0
  85. edsl/jobs/Answers.py +21 -20
  86. edsl/jobs/FetchInvigilator.py +47 -0
  87. edsl/jobs/InterviewTaskManager.py +98 -0
  88. edsl/jobs/InterviewsConstructor.py +50 -0
  89. edsl/jobs/Jobs.py +684 -204
  90. edsl/jobs/JobsChecks.py +172 -0
  91. edsl/jobs/JobsComponentConstructor.py +189 -0
  92. edsl/jobs/JobsPrompts.py +270 -0
  93. edsl/jobs/JobsRemoteInferenceHandler.py +311 -0
  94. edsl/jobs/JobsRemoteInferenceLogger.py +239 -0
  95. edsl/jobs/RequestTokenEstimator.py +30 -0
  96. edsl/jobs/async_interview_runner.py +138 -0
  97. edsl/jobs/buckets/BucketCollection.py +104 -0
  98. edsl/jobs/buckets/ModelBuckets.py +65 -0
  99. edsl/jobs/buckets/TokenBucket.py +283 -0
  100. edsl/jobs/buckets/TokenBucketAPI.py +211 -0
  101. edsl/jobs/buckets/TokenBucketClient.py +191 -0
  102. edsl/jobs/check_survey_scenario_compatibility.py +85 -0
  103. edsl/jobs/data_structures.py +120 -0
  104. edsl/jobs/decorators.py +35 -0
  105. edsl/jobs/interviews/Interview.py +392 -0
  106. edsl/jobs/interviews/InterviewExceptionCollection.py +99 -0
  107. edsl/jobs/interviews/InterviewExceptionEntry.py +186 -0
  108. edsl/jobs/interviews/InterviewStatistic.py +63 -0
  109. edsl/jobs/interviews/InterviewStatisticsCollection.py +25 -0
  110. edsl/jobs/interviews/InterviewStatusDictionary.py +78 -0
  111. edsl/jobs/interviews/InterviewStatusLog.py +92 -0
  112. edsl/jobs/interviews/ReportErrors.py +66 -0
  113. edsl/jobs/interviews/interview_status_enum.py +9 -0
  114. edsl/jobs/jobs_status_enums.py +9 -0
  115. edsl/jobs/loggers/HTMLTableJobLogger.py +304 -0
  116. edsl/jobs/results_exceptions_handler.py +98 -0
  117. edsl/jobs/runners/JobsRunnerAsyncio.py +151 -110
  118. edsl/jobs/runners/JobsRunnerStatus.py +298 -0
  119. edsl/jobs/tasks/QuestionTaskCreator.py +244 -0
  120. edsl/jobs/tasks/TaskCreators.py +64 -0
  121. edsl/jobs/tasks/TaskHistory.py +470 -0
  122. edsl/jobs/tasks/TaskStatusLog.py +23 -0
  123. edsl/jobs/tasks/task_status_enum.py +161 -0
  124. edsl/jobs/tokens/InterviewTokenUsage.py +27 -0
  125. edsl/jobs/tokens/TokenUsage.py +34 -0
  126. edsl/language_models/ComputeCost.py +63 -0
  127. edsl/language_models/LanguageModel.py +507 -386
  128. edsl/language_models/ModelList.py +164 -0
  129. edsl/language_models/PriceManager.py +127 -0
  130. edsl/language_models/RawResponseHandler.py +106 -0
  131. edsl/language_models/RegisterLanguageModelsMeta.py +184 -0
  132. edsl/language_models/__init__.py +1 -8
  133. edsl/language_models/fake_openai_call.py +15 -0
  134. edsl/language_models/fake_openai_service.py +61 -0
  135. edsl/language_models/key_management/KeyLookup.py +63 -0
  136. edsl/language_models/key_management/KeyLookupBuilder.py +273 -0
  137. edsl/language_models/key_management/KeyLookupCollection.py +38 -0
  138. edsl/language_models/key_management/__init__.py +0 -0
  139. edsl/language_models/key_management/models.py +131 -0
  140. edsl/language_models/model.py +256 -0
  141. edsl/language_models/repair.py +109 -41
  142. edsl/language_models/utilities.py +65 -0
  143. edsl/notebooks/Notebook.py +263 -0
  144. edsl/notebooks/NotebookToLaTeX.py +142 -0
  145. edsl/notebooks/__init__.py +1 -0
  146. edsl/prompts/Prompt.py +222 -93
  147. edsl/prompts/__init__.py +1 -1
  148. edsl/questions/ExceptionExplainer.py +77 -0
  149. edsl/questions/HTMLQuestion.py +103 -0
  150. edsl/questions/QuestionBase.py +518 -0
  151. edsl/questions/QuestionBasePromptsMixin.py +221 -0
  152. edsl/questions/QuestionBudget.py +164 -67
  153. edsl/questions/QuestionCheckBox.py +281 -62
  154. edsl/questions/QuestionDict.py +343 -0
  155. edsl/questions/QuestionExtract.py +136 -50
  156. edsl/questions/QuestionFreeText.py +79 -55
  157. edsl/questions/QuestionFunctional.py +138 -41
  158. edsl/questions/QuestionList.py +184 -57
  159. edsl/questions/QuestionMatrix.py +265 -0
  160. edsl/questions/QuestionMultipleChoice.py +293 -69
  161. edsl/questions/QuestionNumerical.py +109 -56
  162. edsl/questions/QuestionRank.py +244 -49
  163. edsl/questions/Quick.py +41 -0
  164. edsl/questions/SimpleAskMixin.py +74 -0
  165. edsl/questions/__init__.py +9 -6
  166. edsl/questions/{AnswerValidatorMixin.py → answer_validator_mixin.py} +153 -38
  167. edsl/questions/compose_questions.py +13 -7
  168. edsl/questions/data_structures.py +20 -0
  169. edsl/questions/decorators.py +21 -0
  170. edsl/questions/derived/QuestionLikertFive.py +28 -26
  171. edsl/questions/derived/QuestionLinearScale.py +41 -28
  172. edsl/questions/derived/QuestionTopK.py +34 -26
  173. edsl/questions/derived/QuestionYesNo.py +40 -27
  174. edsl/questions/descriptors.py +228 -74
  175. edsl/questions/loop_processor.py +149 -0
  176. edsl/questions/prompt_templates/question_budget.jinja +13 -0
  177. edsl/questions/prompt_templates/question_checkbox.jinja +32 -0
  178. edsl/questions/prompt_templates/question_extract.jinja +11 -0
  179. edsl/questions/prompt_templates/question_free_text.jinja +3 -0
  180. edsl/questions/prompt_templates/question_linear_scale.jinja +11 -0
  181. edsl/questions/prompt_templates/question_list.jinja +17 -0
  182. edsl/questions/prompt_templates/question_multiple_choice.jinja +33 -0
  183. edsl/questions/prompt_templates/question_numerical.jinja +37 -0
  184. edsl/questions/question_base_gen_mixin.py +168 -0
  185. edsl/questions/question_registry.py +130 -46
  186. edsl/questions/register_questions_meta.py +71 -0
  187. edsl/questions/response_validator_abc.py +188 -0
  188. edsl/questions/response_validator_factory.py +34 -0
  189. edsl/questions/settings.py +5 -2
  190. edsl/questions/templates/__init__.py +0 -0
  191. edsl/questions/templates/budget/__init__.py +0 -0
  192. edsl/questions/templates/budget/answering_instructions.jinja +7 -0
  193. edsl/questions/templates/budget/question_presentation.jinja +7 -0
  194. edsl/questions/templates/checkbox/__init__.py +0 -0
  195. edsl/questions/templates/checkbox/answering_instructions.jinja +10 -0
  196. edsl/questions/templates/checkbox/question_presentation.jinja +22 -0
  197. edsl/questions/templates/dict/__init__.py +0 -0
  198. edsl/questions/templates/dict/answering_instructions.jinja +21 -0
  199. edsl/questions/templates/dict/question_presentation.jinja +1 -0
  200. edsl/questions/templates/extract/__init__.py +0 -0
  201. edsl/questions/templates/extract/answering_instructions.jinja +7 -0
  202. edsl/questions/templates/extract/question_presentation.jinja +1 -0
  203. edsl/questions/templates/free_text/__init__.py +0 -0
  204. edsl/questions/templates/free_text/answering_instructions.jinja +0 -0
  205. edsl/questions/templates/free_text/question_presentation.jinja +1 -0
  206. edsl/questions/templates/likert_five/__init__.py +0 -0
  207. edsl/questions/templates/likert_five/answering_instructions.jinja +10 -0
  208. edsl/questions/templates/likert_five/question_presentation.jinja +12 -0
  209. edsl/questions/templates/linear_scale/__init__.py +0 -0
  210. edsl/questions/templates/linear_scale/answering_instructions.jinja +5 -0
  211. edsl/questions/templates/linear_scale/question_presentation.jinja +5 -0
  212. edsl/questions/templates/list/__init__.py +0 -0
  213. edsl/questions/templates/list/answering_instructions.jinja +4 -0
  214. edsl/questions/templates/list/question_presentation.jinja +5 -0
  215. edsl/questions/templates/matrix/__init__.py +1 -0
  216. edsl/questions/templates/matrix/answering_instructions.jinja +5 -0
  217. edsl/questions/templates/matrix/question_presentation.jinja +20 -0
  218. edsl/questions/templates/multiple_choice/__init__.py +0 -0
  219. edsl/questions/templates/multiple_choice/answering_instructions.jinja +9 -0
  220. edsl/questions/templates/multiple_choice/html.jinja +0 -0
  221. edsl/questions/templates/multiple_choice/question_presentation.jinja +12 -0
  222. edsl/questions/templates/numerical/__init__.py +0 -0
  223. edsl/questions/templates/numerical/answering_instructions.jinja +7 -0
  224. edsl/questions/templates/numerical/question_presentation.jinja +7 -0
  225. edsl/questions/templates/rank/__init__.py +0 -0
  226. edsl/questions/templates/rank/answering_instructions.jinja +11 -0
  227. edsl/questions/templates/rank/question_presentation.jinja +15 -0
  228. edsl/questions/templates/top_k/__init__.py +0 -0
  229. edsl/questions/templates/top_k/answering_instructions.jinja +8 -0
  230. edsl/questions/templates/top_k/question_presentation.jinja +22 -0
  231. edsl/questions/templates/yes_no/__init__.py +0 -0
  232. edsl/questions/templates/yes_no/answering_instructions.jinja +6 -0
  233. edsl/questions/templates/yes_no/question_presentation.jinja +12 -0
  234. edsl/results/CSSParameterizer.py +108 -0
  235. edsl/results/Dataset.py +550 -19
  236. edsl/results/DatasetExportMixin.py +594 -0
  237. edsl/results/DatasetTree.py +295 -0
  238. edsl/results/MarkdownToDocx.py +122 -0
  239. edsl/results/MarkdownToPDF.py +111 -0
  240. edsl/results/Result.py +477 -173
  241. edsl/results/Results.py +987 -269
  242. edsl/results/ResultsExportMixin.py +28 -125
  243. edsl/results/ResultsGGMixin.py +83 -15
  244. edsl/results/TableDisplay.py +125 -0
  245. edsl/results/TextEditor.py +50 -0
  246. edsl/results/__init__.py +1 -1
  247. edsl/results/file_exports.py +252 -0
  248. edsl/results/results_fetch_mixin.py +33 -0
  249. edsl/results/results_selector.py +145 -0
  250. edsl/results/results_tools_mixin.py +98 -0
  251. edsl/results/smart_objects.py +96 -0
  252. edsl/results/table_data_class.py +12 -0
  253. edsl/results/table_display.css +78 -0
  254. edsl/results/table_renderers.py +118 -0
  255. edsl/results/tree_explore.py +115 -0
  256. edsl/scenarios/ConstructDownloadLink.py +109 -0
  257. edsl/scenarios/DocumentChunker.py +102 -0
  258. edsl/scenarios/DocxScenario.py +16 -0
  259. edsl/scenarios/FileStore.py +543 -0
  260. edsl/scenarios/PdfExtractor.py +40 -0
  261. edsl/scenarios/Scenario.py +431 -62
  262. edsl/scenarios/ScenarioHtmlMixin.py +65 -0
  263. edsl/scenarios/ScenarioList.py +1415 -45
  264. edsl/scenarios/ScenarioListExportMixin.py +45 -0
  265. edsl/scenarios/ScenarioListPdfMixin.py +239 -0
  266. edsl/scenarios/__init__.py +2 -0
  267. edsl/scenarios/directory_scanner.py +96 -0
  268. edsl/scenarios/file_methods.py +85 -0
  269. edsl/scenarios/handlers/__init__.py +13 -0
  270. edsl/scenarios/handlers/csv.py +49 -0
  271. edsl/scenarios/handlers/docx.py +76 -0
  272. edsl/scenarios/handlers/html.py +37 -0
  273. edsl/scenarios/handlers/json.py +111 -0
  274. edsl/scenarios/handlers/latex.py +5 -0
  275. edsl/scenarios/handlers/md.py +51 -0
  276. edsl/scenarios/handlers/pdf.py +68 -0
  277. edsl/scenarios/handlers/png.py +39 -0
  278. edsl/scenarios/handlers/pptx.py +105 -0
  279. edsl/scenarios/handlers/py.py +294 -0
  280. edsl/scenarios/handlers/sql.py +313 -0
  281. edsl/scenarios/handlers/sqlite.py +149 -0
  282. edsl/scenarios/handlers/txt.py +33 -0
  283. edsl/scenarios/scenario_join.py +131 -0
  284. edsl/scenarios/scenario_selector.py +156 -0
  285. edsl/shared.py +1 -0
  286. edsl/study/ObjectEntry.py +173 -0
  287. edsl/study/ProofOfWork.py +113 -0
  288. edsl/study/SnapShot.py +80 -0
  289. edsl/study/Study.py +521 -0
  290. edsl/study/__init__.py +4 -0
  291. edsl/surveys/ConstructDAG.py +92 -0
  292. edsl/surveys/DAG.py +92 -11
  293. edsl/surveys/EditSurvey.py +221 -0
  294. edsl/surveys/InstructionHandler.py +100 -0
  295. edsl/surveys/Memory.py +9 -4
  296. edsl/surveys/MemoryManagement.py +72 -0
  297. edsl/surveys/MemoryPlan.py +156 -35
  298. edsl/surveys/Rule.py +221 -74
  299. edsl/surveys/RuleCollection.py +241 -61
  300. edsl/surveys/RuleManager.py +172 -0
  301. edsl/surveys/Simulator.py +75 -0
  302. edsl/surveys/Survey.py +1079 -339
  303. edsl/surveys/SurveyCSS.py +273 -0
  304. edsl/surveys/SurveyExportMixin.py +235 -40
  305. edsl/surveys/SurveyFlowVisualization.py +181 -0
  306. edsl/surveys/SurveyQualtricsImport.py +284 -0
  307. edsl/surveys/SurveyToApp.py +141 -0
  308. edsl/surveys/__init__.py +4 -2
  309. edsl/surveys/base.py +19 -3
  310. edsl/surveys/descriptors.py +17 -6
  311. edsl/surveys/instructions/ChangeInstruction.py +48 -0
  312. edsl/surveys/instructions/Instruction.py +56 -0
  313. edsl/surveys/instructions/InstructionCollection.py +82 -0
  314. edsl/surveys/instructions/__init__.py +0 -0
  315. edsl/templates/error_reporting/base.html +24 -0
  316. edsl/templates/error_reporting/exceptions_by_model.html +35 -0
  317. edsl/templates/error_reporting/exceptions_by_question_name.html +17 -0
  318. edsl/templates/error_reporting/exceptions_by_type.html +17 -0
  319. edsl/templates/error_reporting/interview_details.html +116 -0
  320. edsl/templates/error_reporting/interviews.html +19 -0
  321. edsl/templates/error_reporting/overview.html +5 -0
  322. edsl/templates/error_reporting/performance_plot.html +2 -0
  323. edsl/templates/error_reporting/report.css +74 -0
  324. edsl/templates/error_reporting/report.html +118 -0
  325. edsl/templates/error_reporting/report.js +25 -0
  326. edsl/tools/__init__.py +1 -0
  327. edsl/tools/clusters.py +192 -0
  328. edsl/tools/embeddings.py +27 -0
  329. edsl/tools/embeddings_plotting.py +118 -0
  330. edsl/tools/plotting.py +112 -0
  331. edsl/tools/summarize.py +18 -0
  332. edsl/utilities/PrettyList.py +56 -0
  333. edsl/utilities/SystemInfo.py +5 -0
  334. edsl/utilities/__init__.py +21 -20
  335. edsl/utilities/ast_utilities.py +3 -0
  336. edsl/utilities/data/Registry.py +2 -0
  337. edsl/utilities/decorators.py +41 -0
  338. edsl/utilities/gcp_bucket/__init__.py +0 -0
  339. edsl/utilities/gcp_bucket/cloud_storage.py +96 -0
  340. edsl/utilities/interface.py +310 -60
  341. edsl/utilities/is_notebook.py +18 -0
  342. edsl/utilities/is_valid_variable_name.py +11 -0
  343. edsl/utilities/naming_utilities.py +263 -0
  344. edsl/utilities/remove_edsl_version.py +24 -0
  345. edsl/utilities/repair_functions.py +28 -0
  346. edsl/utilities/restricted_python.py +70 -0
  347. edsl/utilities/utilities.py +203 -13
  348. edsl-0.1.40.dist-info/METADATA +111 -0
  349. edsl-0.1.40.dist-info/RECORD +362 -0
  350. {edsl-0.1.14.dist-info → edsl-0.1.40.dist-info}/WHEEL +1 -1
  351. edsl/agents/AgentListExportMixin.py +0 -24
  352. edsl/coop/old.py +0 -31
  353. edsl/data/Database.py +0 -141
  354. edsl/data/crud.py +0 -121
  355. edsl/jobs/Interview.py +0 -417
  356. edsl/jobs/JobsRunner.py +0 -63
  357. edsl/jobs/JobsRunnerStatusMixin.py +0 -115
  358. edsl/jobs/base.py +0 -47
  359. edsl/jobs/buckets.py +0 -166
  360. edsl/jobs/runners/JobsRunnerDryRun.py +0 -19
  361. edsl/jobs/runners/JobsRunnerStreaming.py +0 -54
  362. edsl/jobs/task_management.py +0 -218
  363. edsl/jobs/token_tracking.py +0 -78
  364. edsl/language_models/DeepInfra.py +0 -69
  365. edsl/language_models/OpenAI.py +0 -98
  366. edsl/language_models/model_interfaces/GeminiPro.py +0 -66
  367. edsl/language_models/model_interfaces/LanguageModelOpenAIFour.py +0 -8
  368. edsl/language_models/model_interfaces/LanguageModelOpenAIThreeFiveTurbo.py +0 -8
  369. edsl/language_models/model_interfaces/LlamaTwo13B.py +0 -21
  370. edsl/language_models/model_interfaces/LlamaTwo70B.py +0 -21
  371. edsl/language_models/model_interfaces/Mixtral8x7B.py +0 -24
  372. edsl/language_models/registry.py +0 -81
  373. edsl/language_models/schemas.py +0 -15
  374. edsl/language_models/unused/ReplicateBase.py +0 -83
  375. edsl/prompts/QuestionInstructionsBase.py +0 -6
  376. edsl/prompts/library/agent_instructions.py +0 -29
  377. edsl/prompts/library/agent_persona.py +0 -17
  378. edsl/prompts/library/question_budget.py +0 -26
  379. edsl/prompts/library/question_checkbox.py +0 -32
  380. edsl/prompts/library/question_extract.py +0 -19
  381. edsl/prompts/library/question_freetext.py +0 -14
  382. edsl/prompts/library/question_linear_scale.py +0 -20
  383. edsl/prompts/library/question_list.py +0 -22
  384. edsl/prompts/library/question_multiple_choice.py +0 -44
  385. edsl/prompts/library/question_numerical.py +0 -31
  386. edsl/prompts/library/question_rank.py +0 -21
  387. edsl/prompts/prompt_config.py +0 -33
  388. edsl/prompts/registry.py +0 -185
  389. edsl/questions/Question.py +0 -240
  390. edsl/report/InputOutputDataTypes.py +0 -134
  391. edsl/report/RegressionMixin.py +0 -28
  392. edsl/report/ReportOutputs.py +0 -1228
  393. edsl/report/ResultsFetchMixin.py +0 -106
  394. edsl/report/ResultsOutputMixin.py +0 -14
  395. edsl/report/demo.ipynb +0 -645
  396. edsl/results/ResultsDBMixin.py +0 -184
  397. edsl/surveys/SurveyFlowVisualizationMixin.py +0 -92
  398. edsl/trackers/Tracker.py +0 -91
  399. edsl/trackers/TrackerAPI.py +0 -196
  400. edsl/trackers/TrackerTasks.py +0 -70
  401. edsl/utilities/pastebin.py +0 -141
  402. edsl-0.1.14.dist-info/METADATA +0 -69
  403. edsl-0.1.14.dist-info/RECORD +0 -141
  404. /edsl/{language_models/model_interfaces → inference_services}/__init__.py +0 -0
  405. /edsl/{report/__init__.py → jobs/runners/JobsRunnerStatusData.py} +0 -0
  406. /edsl/{trackers/__init__.py → language_models/ServiceDataSources.py} +0 -0
  407. {edsl-0.1.14.dist-info → edsl-0.1.40.dist-info}/LICENSE +0 -0
@@ -1,26 +1,14 @@
1
1
  from __future__ import annotations
2
- import textwrap
3
2
  from typing import Optional
3
+
4
4
  from edsl.questions.descriptors import QuestionOptionsDescriptor, OptionLabelDescriptor
5
5
  from edsl.questions.QuestionMultipleChoice import QuestionMultipleChoice
6
6
 
7
+ from edsl.questions.decorators import inject_exception
7
8
 
8
- class QuestionLinearScale(QuestionMultipleChoice):
9
- """
10
- This question asks the user to respond to a statement on a linear scale.
11
-
12
- Arguments:
13
- - `question_name` is the name of the question (string)
14
- - `question_text` is the text of the question (string)
15
- - `question_options` are the options the user should select from (list of integers)
16
-
17
- Optional arguments:
18
- - `instructions` are the instructions for the question (string). If not provided, the default instructions are used. To view them, run `QuestionLinearScale.default_instructions`
19
- - `option_labels` maps question_options to labels (dictionary mapping integers to strings)
20
- - `short_names_dict` maps question_options to short names (dictionary mapping strings to strings)
21
9
 
22
- For an example, see `QuestionLinearScale.example()`
23
- """
10
+ class QuestionLinearScale(QuestionMultipleChoice):
11
+ """This question prompts the agent to respond to a statement on a linear scale."""
24
12
 
25
13
  question_type = "linear_scale"
26
14
  option_labels: Optional[dict[int, str]] = OptionLabelDescriptor()
@@ -28,50 +16,75 @@ class QuestionLinearScale(QuestionMultipleChoice):
28
16
 
29
17
  def __init__(
30
18
  self,
19
+ question_name: str,
31
20
  question_text: str,
32
21
  question_options: list[int],
33
- question_name: str,
34
- short_names_dict: Optional[dict[str, str]] = None,
35
22
  option_labels: Optional[dict[int, str]] = None,
23
+ answering_instructions: Optional[str] = None,
24
+ question_presentation: Optional[str] = None,
25
+ include_comment: Optional[bool] = True,
36
26
  ):
27
+ """Instantiate a new QuestionLinearScale.
28
+
29
+ :param question_name: The name of the question.
30
+ :param question_text: The text of the question.
31
+ :param question_options: The options the respondent should select from.
32
+ :param option_labels: Maps question_options to labels.
33
+ :param instructions: Instructions for the question. If not provided, the default instructions are used. To view them, run `QuestionLinearScale.default_instructions`.
34
+ """
37
35
  super().__init__(
36
+ question_name=question_name,
38
37
  question_text=question_text,
39
38
  question_options=question_options,
40
- question_name=question_name,
41
- short_names_dict=short_names_dict,
39
+ use_code=False, # question linear scale will have its own code
40
+ include_comment=include_comment,
42
41
  )
43
42
  self.question_options = question_options
44
- self.option_labels = option_labels
43
+ if isinstance(option_labels, str):
44
+ self.option_labels = option_labels
45
+ else:
46
+ self.option_labels = (
47
+ {int(k): v for k, v in option_labels.items()} if option_labels else {}
48
+ )
49
+ self.answering_instructions = answering_instructions
50
+ self.question_presentation = question_presentation
45
51
 
46
52
  ################
47
53
  # Helpful
48
54
  ################
49
55
  @classmethod
50
- def example(cls) -> QuestionLinearScale:
56
+ @inject_exception
57
+ def example(cls, include_comment: bool = True) -> QuestionLinearScale:
58
+ """Return an example of a linear scale question."""
51
59
  return cls(
52
60
  question_text="How much do you like ice cream?",
53
61
  question_options=[1, 2, 3, 4, 5],
54
62
  question_name="ice_cream",
55
63
  option_labels={1: "I hate it", 5: "I love it"},
64
+ include_comment=include_comment,
56
65
  )
57
66
 
58
67
 
59
68
  def main():
69
+ """Create an example of a linear scale question and demonstrate its functionality."""
60
70
  from edsl.questions.derived.QuestionLinearScale import QuestionLinearScale
61
71
 
62
72
  q = QuestionLinearScale.example()
63
73
  q.question_text
64
74
  q.question_options
65
75
  q.question_name
66
- q.short_names_dict
67
76
  # validate an answer
68
- q.validate_answer({"answer": 3, "comment": "I like custard"})
77
+ q._validate_answer({"answer": 3, "comment": "I like custard"})
69
78
  # translate answer code
70
- q.translate_answer_code_to_answer(3, {})
79
+ q._translate_answer_code_to_answer(3, {})
71
80
  # simulate answer
72
- q.simulate_answer()
73
- q.simulate_answer(human_readable=False)
74
- q.validate_answer(q.simulate_answer(human_readable=False))
81
+ q._simulate_answer()
82
+ q._simulate_answer(human_readable=False)
83
+ q._validate_answer(q._simulate_answer(human_readable=False))
75
84
  # serialization (inherits from Question)
76
85
  q.to_dict()
77
86
  assert q.from_dict(q.to_dict()) == q
87
+
88
+ import doctest
89
+
90
+ doctest.testmod(optionflags=doctest.ELLIPSIS)
@@ -1,26 +1,13 @@
1
1
  from __future__ import annotations
2
2
  from typing import Optional
3
- from edsl.exceptions import QuestionCreationValidationError
3
+
4
+ from edsl.exceptions.questions import QuestionCreationValidationError
4
5
  from edsl.questions.QuestionCheckBox import QuestionCheckBox
6
+ from edsl.questions.decorators import inject_exception
5
7
 
6
8
 
7
9
  class QuestionTopK(QuestionCheckBox):
8
- """
9
- This question asks the user to select exactly K options from a list.
10
-
11
- Arguments:
12
- - `question_name` is the name of the question (string)
13
- - `question_text` is the text of the question (string)
14
- - `question_options` are the options the user should select from (list of strings)
15
- - `min_selections` is the minimum number of options that must be selected (positive integer).
16
- - `max_selections` is the maximum number of options that must be selected (positive integer). Must be equal to `min_selections`
17
-
18
- Optional arguments:
19
- - `instructions` are the instructions for the question (string). If not provided, the default instructions are used. To view them, run `QuestionTopK.default_instructions`
20
- - `short_names_dict` maps question_options to short names (dictionary mapping strings to strings)
21
-
22
- For an example, run `QuestionTopK.example()`
23
- """
10
+ """This question prompts the agent to select exactly K options from a list."""
24
11
 
25
12
  question_type = "top_k"
26
13
 
@@ -31,15 +18,29 @@ class QuestionTopK(QuestionCheckBox):
31
18
  question_options: list[str],
32
19
  min_selections: int,
33
20
  max_selections: int,
34
- short_names_dict: Optional[dict[str, str]] = None,
21
+ question_presentation: Optional[str] = None,
22
+ answering_instructions: Optional[str] = None,
23
+ include_comment: Optional[bool] = True,
24
+ use_code: Optional[bool] = True,
35
25
  ):
26
+ """Initialize the question.
27
+
28
+ :param question_name: The name of the question.
29
+ :param question_text: The text of the question.
30
+ :param question_options: The options the respondent should select from.
31
+ :param instructions: Instructions for the question. If not provided, the default instructions are used. To view them, run `QuestionTopK.default_instructions`.
32
+ :param num_selections: The number of options that must be selected.
33
+ """
36
34
  super().__init__(
37
35
  question_name=question_name,
38
36
  question_text=question_text,
39
37
  question_options=question_options,
40
- short_names_dict=short_names_dict,
41
38
  min_selections=min_selections,
42
39
  max_selections=max_selections,
40
+ question_presentation=question_presentation,
41
+ answering_instructions=answering_instructions,
42
+ include_comment=include_comment,
43
+ use_code=use_code,
43
44
  )
44
45
  if min_selections != max_selections:
45
46
  raise QuestionCreationValidationError(
@@ -54,32 +55,39 @@ class QuestionTopK(QuestionCheckBox):
54
55
  # Helpful
55
56
  ################
56
57
  @classmethod
57
- def example(cls) -> QuestionTopK:
58
+ @inject_exception
59
+ def example(cls, include_comment: bool = True) -> QuestionTopK:
60
+ """Return an example question."""
58
61
  return cls(
59
62
  question_name="two_fruits",
60
63
  question_text="Which of the following fruits do you prefer?",
61
64
  question_options=["apple", "banana", "carrot", "durian"],
62
65
  min_selections=2,
63
66
  max_selections=2,
67
+ include_comment=include_comment,
64
68
  )
65
69
 
66
70
 
67
71
  def main():
72
+ """Test QuestionTopK."""
68
73
  from edsl.questions.derived.QuestionTopK import QuestionTopK
69
74
 
70
75
  q = QuestionTopK.example()
71
76
  q.question_text
72
77
  q.question_options
73
78
  q.question_name
74
- q.short_names_dict
75
79
  # validate an answer
76
- q.validate_answer({"answer": [0, 3], "comment": "I like custard"})
80
+ q._validate_answer({"answer": [0, 3], "comment": "I like custard"})
77
81
  # translate answer code
78
- q.translate_answer_code_to_answer([0, 3], {})
82
+ q._translate_answer_code_to_answer([0, 3], {})
79
83
  # simulate answer
80
- q.simulate_answer()
81
- q.simulate_answer(human_readable=False)
82
- q.validate_answer(q.simulate_answer(human_readable=False))
84
+ q._simulate_answer()
85
+ q._simulate_answer(human_readable=False)
86
+ q._validate_answer(q._simulate_answer(human_readable=False))
83
87
  # serialization (inherits from Question)
84
88
  q.to_dict()
85
89
  assert q.from_dict(q.to_dict()) == q
90
+
91
+ import doctest
92
+
93
+ doctest.testmod(optionflags=doctest.ELLIPSIS)
@@ -1,23 +1,13 @@
1
1
  from __future__ import annotations
2
+ from typing import Optional
2
3
  from edsl.questions.descriptors import QuestionOptionsDescriptor
3
4
  from edsl.questions.QuestionMultipleChoice import QuestionMultipleChoice
4
5
 
6
+ from edsl.questions.decorators import inject_exception
5
7
 
6
- class QuestionYesNo(QuestionMultipleChoice):
7
- """
8
- This question asks the user to respond with "Yes" or "No".
9
-
10
- Arguments:
11
- - `question_name` is the name of the question (string)
12
- - `question_text` is the text of the question (string)
13
- - `question_options` are the options the user should select from (list of strings)
14
-
15
- Optional arguments:
16
- - `instructions` are the instructions for the question (string). If not provided, the default instructions are used. To view them, run `QuestionYesNo.default_instructions`
17
- - `short_names_dict` maps question_options to short names (dictionary mapping strings to strings)
18
8
 
19
- For an example, see `QuestionYesNo.example()`
20
- """
9
+ class QuestionYesNo(QuestionMultipleChoice):
10
+ """This question prompts the agent to respond with 'Yes' or 'No'."""
21
11
 
22
12
  question_type = "yes_no"
23
13
  question_options = QuestionOptionsDescriptor(num_choices=2)
@@ -26,14 +16,25 @@ class QuestionYesNo(QuestionMultipleChoice):
26
16
  self,
27
17
  question_name: str,
28
18
  question_text: str,
29
- short_names_dict: dict[str, str] = None,
30
- question_options: list[str] = ["Yes", "No"],
19
+ question_options: list[str] = ["No", "Yes"],
20
+ answering_instructions: Optional[str] = None,
21
+ question_presentation: Optional[str] = None,
22
+ include_comment: Optional[bool] = True,
31
23
  ):
24
+ """Instantiate a new QuestionYesNo.
25
+
26
+ :param question_name: The name of the question.
27
+ :param question_text: The text of the question.
28
+ :param instructions: Instructions for the question. If not provided, the default instructions are used. To view them, run `QuestionYesNo.default_instructions`.
29
+ """
32
30
  super().__init__(
33
31
  question_name=question_name,
34
32
  question_text=question_text,
35
33
  question_options=question_options,
36
- short_names_dict=short_names_dict,
34
+ use_code=False,
35
+ answering_instructions=answering_instructions,
36
+ question_presentation=question_presentation,
37
+ include_comment=include_comment,
37
38
  )
38
39
  self.question_options = question_options
39
40
 
@@ -41,29 +42,41 @@ class QuestionYesNo(QuestionMultipleChoice):
41
42
  # Helpful
42
43
  ################
43
44
  @classmethod
44
- def example(cls) -> QuestionYesNo:
45
+ @inject_exception
46
+ def example(cls, include_comment: bool = True) -> QuestionYesNo:
47
+ """Return an example of a yes/no question."""
45
48
  return cls(
46
- question_name="is_it_raining",
47
- question_text="Is it raining?",
48
- short_names_dict={"Yes": "y", "No": "y"},
49
+ question_name="is_it_equal",
50
+ question_text="Is 5 + 5 equal to 11?",
51
+ include_comment=include_comment,
49
52
  )
50
53
 
51
54
 
52
55
  def main():
56
+ """Create an example of a yes/no question and demonstrate its functionality."""
53
57
  from edsl.questions.derived.QuestionYesNo import QuestionYesNo
54
58
 
55
59
  q = QuestionYesNo.example()
56
60
  q.question_text
57
61
  q.question_options
58
62
  q.question_name
59
- q.short_names_dict
60
63
  # validate an answer
61
- q.validate_answer({"answer": 0, "comment": "I like custard"})
64
+ q._validate_answer({"answer": 0, "comment": "I like custard"})
62
65
  # translate answer code
63
- q.translate_answer_code_to_answer(0, {})
64
- q.simulate_answer()
65
- q.simulate_answer(human_readable=False)
66
- q.validate_answer(q.simulate_answer(human_readable=False))
66
+ q._translate_answer_code_to_answer(0, {})
67
+ q._simulate_answer()
68
+ q._simulate_answer(human_readable=False)
69
+ q._validate_answer(q._simulate_answer(human_readable=False))
67
70
  # serialization (inherits from Question)
68
71
  q.to_dict()
69
72
  assert q.from_dict(q.to_dict()) == q
73
+
74
+ import doctest
75
+
76
+ doctest.testmod(optionflags=doctest.ELLIPSIS)
77
+
78
+
79
+ if __name__ == "__main__":
80
+ import doctest
81
+
82
+ doctest.testmod(optionflags=doctest.ELLIPSIS)