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,48 +1,54 @@
1
- from .agents import (
2
- AgentAttributeLookupCallbackError,
3
- AgentCombinationError,
4
- AgentLacksLLMError,
5
- AgentRespondedWithBadJSONError,
6
- )
7
- from .configuration import (
8
- InvalidEnvironmentVariableError,
9
- MissingEnvironmentVariableError,
10
- )
11
- from .data import (
12
- DatabaseConnectionError,
13
- DatabaseCRUDError,
14
- DatabaseIntegrityError,
15
- )
1
+ # from .agents import (
2
+ # # AgentAttributeLookupCallbackError,
3
+ # AgentCombinationError,
4
+ # # AgentLacksLLMError,
5
+ # # AgentRespondedWithBadJSONError,
6
+ # )
7
+ # from .configuration import (
8
+ # InvalidEnvironmentVariableError,
9
+ # MissingEnvironmentVariableError,
10
+ # )
11
+ # from .data import (
12
+ # DatabaseConnectionError,
13
+ # DatabaseCRUDError,
14
+ # DatabaseIntegrityError,
15
+ # )
16
16
 
17
- from .jobs import JobsRunError, InterviewErrorPriorTaskCanceled, InterviewTimeoutError
17
+ # from .scenarios import (
18
+ # ScenarioError,
19
+ # )
18
20
 
19
- from .language_models import (
20
- LanguageModelResponseNotJSONError,
21
- LanguageModelMissingAttributeError,
22
- LanguageModelAttributeTypeError,
23
- LanguageModelDoNotAddError,
24
- )
25
- from .questions import (
26
- QuestionAnswerValidationError,
27
- QuestionAttributeMissing,
28
- QuestionCreationValidationError,
29
- QuestionResponseValidationError,
30
- QuestionSerializationError,
31
- QuestionScenarioRenderError,
32
- )
33
- from .results import (
34
- ResultsBadMutationstringError,
35
- ResultsColumnNotFoundError,
36
- ResultsInvalidNameError,
37
- ResultsMutateError,
38
- )
39
- from .surveys import (
40
- SurveyCreationError,
41
- SurveyHasNoRulesError,
42
- SurveyRuleCannotEvaluateError,
43
- SurveyRuleCollectionHasNoRulesAtNodeError,
44
- SurveyRuleReferenceInRuleToUnknownQuestionError,
45
- SurveyRuleRefersToFutureStateError,
46
- SurveyRuleSendsYouBackwardsError,
47
- SurveyRuleSkipLogicSyntaxError,
48
- )
21
+ # from .general import MissingAPIKeyError
22
+
23
+ # from .jobs import JobsRunError, InterviewErrorPriorTaskCanceled, InterviewTimeoutError
24
+
25
+ # from .language_models import (
26
+ # LanguageModelResponseNotJSONError,
27
+ # LanguageModelMissingAttributeError,
28
+ # LanguageModelAttributeTypeError,
29
+ # LanguageModelDoNotAddError,
30
+ # )
31
+ # from .questions import (
32
+ # QuestionAnswerValidationError,
33
+ # QuestionAttributeMissing,
34
+ # QuestionCreationValidationError,
35
+ # QuestionResponseValidationError,
36
+ # QuestionSerializationError,
37
+ # QuestionScenarioRenderError,
38
+ # )
39
+ # from .results import (
40
+ # ResultsBadMutationstringError,
41
+ # ResultsColumnNotFoundError,
42
+ # ResultsInvalidNameError,
43
+ # ResultsMutateError,
44
+ # )
45
+ # from .surveys import (
46
+ # SurveyCreationError,
47
+ # SurveyHasNoRulesError,
48
+ # SurveyRuleCannotEvaluateError,
49
+ # SurveyRuleCollectionHasNoRulesAtNodeError,
50
+ # SurveyRuleReferenceInRuleToUnknownQuestionError,
51
+ # SurveyRuleRefersToFutureStateError,
52
+ # SurveyRuleSendsYouBackwardsError,
53
+ # SurveyRuleSkipLogicSyntaxError,
54
+ # )
edsl/exceptions/agents.py CHANGED
@@ -1,33 +1,51 @@
1
- class AgentErrors(Exception):
2
- pass
1
+ from edsl.exceptions.BaseException import BaseException
3
2
 
4
3
 
5
- class AgentDynamicTraitsFunctionError(AgentErrors):
6
- pass
4
+ # from edsl.utilities.utilities import is_notebook
7
5
 
6
+ # from IPython.core.error import UsageError
8
7
 
9
- class AgentDirectAnswerFunctionError(AgentErrors):
10
- pass
8
+ # class AgentListErrorAlternative(UsageError):
9
+ # def __init__(self, message):
10
+ # super().__init__(message)
11
11
 
12
+ import sys
13
+ from edsl.utilities.is_notebook import is_notebook
12
14
 
13
- class AgentAttributeLookupCallbackError(AgentErrors):
14
- pass
15
15
 
16
+ class AgentListError(BaseException):
17
+ relevant_doc = "https://docs.expectedparrot.com/en/latest/agents.html#agent-lists"
16
18
 
17
- class AgentCombinationError(AgentErrors):
18
- pass
19
19
 
20
+ class AgentErrors(BaseException):
21
+ relevant_doc = "https://docs.expectedparrot.com/en/latest/agents.html"
20
22
 
21
- class AgentLacksLLMError(AgentErrors):
22
- pass
23
+
24
+ class AgentDynamicTraitsFunctionError(AgentErrors):
25
+ relevant_doc = (
26
+ "https://docs.expectedparrot.com/en/latest/agents.html#dynamic-traits-function"
27
+ )
28
+ relevant_notebook = "https://docs.expectedparrot.com/en/latest/notebooks/example_agent_dynamic_traits.html"
23
29
 
24
30
 
25
- class AgentRespondedWithBadJSONError(AgentErrors):
26
- pass
31
+ class AgentDirectAnswerFunctionError(AgentErrors):
32
+ relevant_doc = "https://docs.expectedparrot.com/en/latest/agents.html#agent-direct-answering-methods"
33
+
34
+
35
+ class AgentCombinationError(AgentErrors):
36
+ relevant_doc = (
37
+ "https://docs.expectedparrot.com/en/latest/agents.html#combining-agents"
38
+ )
27
39
 
28
40
 
29
41
  class AgentNameError(AgentErrors):
30
- pass
42
+ relevant_doc = "https://docs.expectedparrot.com/en/latest/agents.html#agent-names"
43
+
44
+
45
+ class AgentTraitKeyError(AgentErrors):
46
+ relevant_doc = (
47
+ "https://docs.expectedparrot.com/en/latest/agents.html#constructing-an-agent"
48
+ )
31
49
 
32
50
 
33
51
  class FailedTaskException(Exception):
@@ -0,0 +1,5 @@
1
+ from edsl.exceptions.BaseException import BaseException
2
+
3
+
4
+ class CacheError(BaseException):
5
+ relevant_doc = "https://docs.expectedparrot.com/en/latest/agents.html#agent-lists"
edsl/exceptions/coop.py CHANGED
@@ -1,2 +1,10 @@
1
1
  class CoopErrors(Exception):
2
2
  pass
3
+
4
+
5
+ class CoopNoUUIDError(CoopErrors):
6
+ pass
7
+
8
+
9
+ class CoopServerResponseError(CoopErrors):
10
+ pass
@@ -0,0 +1,34 @@
1
+ import re
2
+ from textwrap import dedent
3
+
4
+
5
+ class GeneralErrors(Exception):
6
+ def __init__(self, message):
7
+ super().__init__(message)
8
+ self.message = message
9
+
10
+ def __str__(self):
11
+ return self.make_urls_clickable(self.message)
12
+
13
+ @staticmethod
14
+ def make_urls_clickable(text):
15
+ url_pattern = r"https?://[^\s]+"
16
+ urls = re.findall(url_pattern, text)
17
+ for url in urls:
18
+ clickable_url = f"\033]8;;{url}\007{url}\033]8;;\007"
19
+ text = text.replace(url, clickable_url)
20
+ return text
21
+
22
+
23
+ class MissingAPIKeyError(GeneralErrors):
24
+ def __init__(self, full_message=None, model_name=None, inference_service=None):
25
+ if model_name and inference_service:
26
+ full_message = dedent(
27
+ f"""
28
+ An API Key for model `{model_name}` is missing from the .env file.
29
+ This key is associated with the inference service `{inference_service}`.
30
+ Please see https://docs.expectedparrot.com/en/latest/api_keys.html for more information.
31
+ """
32
+ )
33
+
34
+ super().__init__(full_message)
@@ -0,0 +1,5 @@
1
+ from edsl.exceptions.BaseException import BaseException
2
+
3
+
4
+ class InferenceServiceError(BaseException):
5
+ relevant_doc = "https://docs.expectedparrot.com/"
edsl/exceptions/jobs.py CHANGED
@@ -1,3 +1,6 @@
1
+ from textwrap import dedent
2
+
3
+
1
4
  class JobsErrors(Exception):
2
5
  pass
3
6
 
@@ -6,6 +9,18 @@ class JobsRunError(JobsErrors):
6
9
  pass
7
10
 
8
11
 
12
+ class MissingRemoteInferenceError(JobsErrors):
13
+ def __init__(self):
14
+ message = dedent(
15
+ """\\
16
+ You are trying to run the job remotely, but you have not set the EXPECTED_PARROT_INFERENCE_URL environment variable.
17
+ This remote running service is not quite ready yet!
18
+ But please see https://docs.expectedparrot.com/en/latest/coop.html for what we are working on.
19
+ """
20
+ )
21
+ super().__init__(message)
22
+
23
+
9
24
  class InterviewError(Exception):
10
25
  pass
11
26
 
@@ -1,5 +1,50 @@
1
+ from textwrap import dedent
2
+ from typing import Optional
3
+
4
+
1
5
  class LanguageModelExceptions(Exception):
2
- pass
6
+ explanation = (
7
+ "This is the base class for all exceptions in the LanguageModel class."
8
+ )
9
+
10
+ def __init__(self, message):
11
+ super().__init__(message)
12
+ self.message = message
13
+
14
+
15
+ class LanguageModelNoResponseError(LanguageModelExceptions):
16
+ explanation = (
17
+ """This happens when the LLM API cannot be reached and/or does not respond."""
18
+ )
19
+
20
+ def __init__(self, message):
21
+ super().__init__(message)
22
+
23
+
24
+ class LanguageModelBadResponseError(LanguageModelExceptions):
25
+ explanation = """This happens when the LLM API can be reached and responds, does not return a usable answer."""
26
+
27
+ def __init__(self, message, response_json: Optional[dict] = None):
28
+ super().__init__(message)
29
+ self.response_json = response_json
30
+
31
+
32
+ class LanguageModelNotFound(LanguageModelExceptions):
33
+ def __init__(self, model_name):
34
+ msg = dedent(
35
+ f"""\
36
+ Model {model_name} not found.
37
+ To create an instance, you can do:
38
+ >>> m = Model('gpt-4-1106-preview', temperature=0.5, ...)
39
+
40
+ To get the default model, you can leave out the model name.
41
+ To see the available models, you can do:
42
+ >>> Model.available()
43
+
44
+ See https://docs.expectedparrot.com/en/latest/language_models.html#available-models for more details.
45
+ """
46
+ )
47
+ super().__init__(msg)
3
48
 
4
49
 
5
50
  class LanguageModelResponseNotJSONError(LanguageModelExceptions):
@@ -1,16 +1,91 @@
1
+ from typing import Any, SupportsIndex
2
+ import json
3
+ from pydantic import ValidationError
4
+
5
+
1
6
  class QuestionErrors(Exception):
2
- pass
7
+ """
8
+ Base exception class for question-related errors.
9
+ """
3
10
 
11
+ def __init__(self, message="An error occurred with the question"):
12
+ self.message = message
13
+ super().__init__(self.message)
4
14
 
5
- class QuestionCreationValidationError(QuestionErrors):
6
- pass
7
15
 
16
+ class QuestionAnswerValidationError(QuestionErrors):
17
+ documentation = "https://docs.expectedparrot.com/en/latest/exceptions.html"
18
+
19
+ explanation = """This when the answer coming from the Language Model does not conform to the expectation for that question type.
20
+ For example, if the question is a multiple choice question, the answer should be drawn from the list of options provided.
21
+ """
22
+
23
+ def __init__(
24
+ self,
25
+ message="Invalid answer.",
26
+ pydantic_error: ValidationError = None,
27
+ data: dict = None,
28
+ model=None,
29
+ ):
30
+ self.message = message
31
+ self.pydantic_error = pydantic_error
32
+ self.data = data
33
+ self.model = model
34
+ super().__init__(self.message)
35
+
36
+ def __str__(self):
37
+ if isinstance(self.message, ValidationError):
38
+ # If it's a ValidationError, just return the core error message
39
+ return str(self.message)
40
+ elif hasattr(self.message, "errors"):
41
+ # Handle the case where it's already been converted to a string but has errors
42
+ error_list = self.message.errors()
43
+ if error_list:
44
+ return str(error_list[0].get("msg", "Unknown error"))
45
+ return str(self.message)
46
+
47
+ # def __str__(self):
48
+ # return f"""{repr(self)}
49
+ # Data being validated: {self.data}
50
+ # Pydnantic Model: {self.model}.
51
+ # Reported error: {self.message}."""
52
+
53
+ def to_html_dict(self):
54
+ return {
55
+ "error_type": ("Name of the exception", "p", "/p", self.__class__.__name__),
56
+ "explaination": ("Explanation", "p", "/p", self.explanation),
57
+ "edsl answer": (
58
+ "What model returned",
59
+ "pre",
60
+ "/pre",
61
+ json.dumps(self.data, indent=2),
62
+ ),
63
+ "validating_model": (
64
+ "Pydantic model for answers",
65
+ "pre",
66
+ "/pre",
67
+ json.dumps(self.model.model_json_schema(), indent=2),
68
+ ),
69
+ "error_message": (
70
+ "Error message Pydantic returned",
71
+ "p",
72
+ "/p",
73
+ self.message,
74
+ ),
75
+ "documentation_url": (
76
+ "URL to EDSL docs",
77
+ f"a href='{self.documentation}'",
78
+ "/a",
79
+ self.documentation,
80
+ ),
81
+ }
8
82
 
9
- class QuestionResponseValidationError(QuestionErrors):
83
+
84
+ class QuestionCreationValidationError(QuestionErrors):
10
85
  pass
11
86
 
12
87
 
13
- class QuestionAnswerValidationError(QuestionErrors):
88
+ class QuestionResponseValidationError(QuestionErrors):
14
89
  pass
15
90
 
16
91
 
@@ -1,18 +1,29 @@
1
- class ResultsErrors(Exception):
1
+ from edsl.exceptions.BaseException import BaseException
2
+
3
+
4
+ class ResultsError(BaseException):
5
+ relevant_docs = "https://docs.expectedparrot.com/en/latest/results.html"
6
+
7
+
8
+ class ResultsDeserializationError(ResultsError):
9
+ pass
10
+
11
+
12
+ class ResultsBadMutationstringError(ResultsError):
2
13
  pass
3
14
 
4
15
 
5
- class ResultsBadMutationstringError(ResultsErrors):
16
+ class ResultsColumnNotFoundError(ResultsError):
6
17
  pass
7
18
 
8
19
 
9
- class ResultsColumnNotFoundError(ResultsErrors):
20
+ class ResultsInvalidNameError(ResultsError):
10
21
  pass
11
22
 
12
23
 
13
- class ResultsInvalidNameError(ResultsErrors):
24
+ class ResultsMutateError(ResultsError):
14
25
  pass
15
26
 
16
27
 
17
- class ResultsMutateError(ResultsErrors):
28
+ class ResultsFilterError(ResultsError):
18
29
  pass
@@ -0,0 +1,29 @@
1
+ import re
2
+ import textwrap
3
+
4
+ # from IPython.core.error import UsageError
5
+
6
+
7
+ class AgentListError(Exception):
8
+ def __init__(self, message):
9
+ super().__init__(message)
10
+
11
+
12
+ class ScenarioError(Exception):
13
+ documentation = "https://docs.expectedparrot.com/en/latest/scenarios.html#module-edsl.scenarios.Scenario"
14
+
15
+ def __init__(self, message: str):
16
+ self.message = message + "\n" + "Documentation: " + self.documentation
17
+ super().__init__(self.message)
18
+
19
+ def __str__(self):
20
+ return self.make_urls_clickable(self.message)
21
+
22
+ @staticmethod
23
+ def make_urls_clickable(text):
24
+ url_pattern = r"https?://[^\s]+"
25
+ urls = re.findall(url_pattern, text)
26
+ for url in urls:
27
+ clickable_url = f"\033]8;;{url}\007{url}\033]8;;\007"
28
+ text = text.replace(url, clickable_url)
29
+ return text
@@ -1,34 +1,37 @@
1
- class SurveyErrors(Exception):
2
- pass
1
+ from edsl.exceptions.BaseException import BaseException
2
+
3
+
4
+ class SurveyError(BaseException):
5
+ relevant_doc = "https://docs.expectedparrot.com/en/latest/surveys.html"
3
6
 
4
7
 
5
- class SurveyCreationError(SurveyErrors):
8
+ class SurveyCreationError(SurveyError):
6
9
  pass
7
10
 
8
11
 
9
- class SurveyHasNoRulesError(SurveyErrors):
12
+ class SurveyHasNoRulesError(SurveyError):
10
13
  pass
11
14
 
12
15
 
13
- class SurveyRuleSendsYouBackwardsError(SurveyErrors):
16
+ class SurveyRuleSendsYouBackwardsError(SurveyError):
14
17
  pass
15
18
 
16
19
 
17
- class SurveyRuleSkipLogicSyntaxError(SurveyErrors):
20
+ class SurveyRuleSkipLogicSyntaxError(SurveyError):
18
21
  pass
19
22
 
20
23
 
21
- class SurveyRuleReferenceInRuleToUnknownQuestionError(SurveyErrors):
24
+ class SurveyRuleReferenceInRuleToUnknownQuestionError(SurveyError):
22
25
  pass
23
26
 
24
27
 
25
- class SurveyRuleRefersToFutureStateError(SurveyErrors):
28
+ class SurveyRuleRefersToFutureStateError(SurveyError):
26
29
  pass
27
30
 
28
31
 
29
- class SurveyRuleCollectionHasNoRulesAtNodeError(SurveyErrors):
32
+ class SurveyRuleCollectionHasNoRulesAtNodeError(SurveyError):
30
33
  pass
31
34
 
32
35
 
33
- class SurveyRuleCannotEvaluateError(SurveyErrors):
36
+ class SurveyRuleCannotEvaluateError(SurveyError):
34
37
  pass
@@ -0,0 +1,106 @@
1
+ import os
2
+ from typing import Any, Optional, List
3
+ import re
4
+ from anthropic import AsyncAnthropic
5
+ from edsl.inference_services.InferenceServiceABC import InferenceServiceABC
6
+ from edsl.language_models.LanguageModel import LanguageModel
7
+
8
+
9
+ class AnthropicService(InferenceServiceABC):
10
+ """Anthropic service class."""
11
+
12
+ _inference_service_ = "anthropic"
13
+ _env_key_name_ = "ANTHROPIC_API_KEY"
14
+ key_sequence = ["content", 0, "text"]
15
+ usage_sequence = ["usage"]
16
+ input_token_name = "input_tokens"
17
+ output_token_name = "output_tokens"
18
+ model_exclude_list = []
19
+
20
+ @classmethod
21
+ def get_model_list(cls, api_key: str = None):
22
+
23
+ import requests
24
+
25
+ if api_key is None:
26
+ api_key = os.environ.get("ANTHROPIC_API_KEY")
27
+ headers = {"x-api-key": api_key, "anthropic-version": "2023-06-01"}
28
+ response = requests.get("https://api.anthropic.com/v1/models", headers=headers)
29
+ model_names = [m["id"] for m in response.json()["data"]]
30
+ return model_names
31
+
32
+ @classmethod
33
+ def available(cls):
34
+ return cls.get_model_list()
35
+
36
+ @classmethod
37
+ def create_model(
38
+ cls, model_name: str = "claude-3-opus-20240229", model_class_name=None
39
+ ) -> LanguageModel:
40
+ if model_class_name is None:
41
+ model_class_name = cls.to_class_name(model_name)
42
+
43
+ class LLM(LanguageModel):
44
+ """
45
+ Child class of LanguageModel for interacting with OpenAI models
46
+ """
47
+
48
+ key_sequence = cls.key_sequence
49
+ usage_sequence = cls.usage_sequence
50
+ input_token_name = cls.input_token_name
51
+ output_token_name = cls.output_token_name
52
+
53
+ _inference_service_ = cls._inference_service_
54
+ _model_ = model_name
55
+ _parameters_ = {
56
+ "temperature": 0.5,
57
+ "max_tokens": 1000,
58
+ "top_p": 1,
59
+ "frequency_penalty": 0,
60
+ "presence_penalty": 0,
61
+ "logprobs": False,
62
+ "top_logprobs": 3,
63
+ }
64
+
65
+ async def async_execute_model_call(
66
+ self,
67
+ user_prompt: str,
68
+ system_prompt: str = "",
69
+ files_list: Optional[List["Files"]] = None,
70
+ ) -> dict[str, Any]:
71
+ """Calls the Anthropic API and returns the API response."""
72
+
73
+ messages = [
74
+ {
75
+ "role": "user",
76
+ "content": [{"type": "text", "text": user_prompt}],
77
+ }
78
+ ]
79
+ if files_list:
80
+ for file_entry in files_list:
81
+ encoded_image = file_entry.base64_string
82
+ messages[0]["content"].append(
83
+ {
84
+ "type": "image",
85
+ "source": {
86
+ "type": "base64",
87
+ "media_type": file_entry.mime_type,
88
+ "data": encoded_image,
89
+ },
90
+ }
91
+ )
92
+ # breakpoint()
93
+ client = AsyncAnthropic(api_key=self.api_token)
94
+
95
+ response = await client.messages.create(
96
+ model=model_name,
97
+ max_tokens=self.max_tokens,
98
+ temperature=self.temperature,
99
+ system=system_prompt, # note that the Anthropic API uses "system" parameter rather than put it in the message
100
+ messages=messages,
101
+ )
102
+ return response.model_dump()
103
+
104
+ LLM.__name__ = model_class_name
105
+
106
+ return LLM