edsl 0.1.40.dev2__tar.gz → 0.1.41__tar.gz

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 (363) hide show
  1. {edsl-0.1.40.dev2 → edsl-0.1.41}/PKG-INFO +2 -2
  2. {edsl-0.1.40.dev2 → edsl-0.1.41}/README.md +1 -1
  3. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/__init__.py +1 -0
  4. edsl-0.1.41/edsl/__version__.py +1 -0
  5. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/agents/Agent.py +1 -1
  6. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/agents/Invigilator.py +3 -2
  7. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/coop/coop.py +5 -2
  8. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/data/Cache.py +7 -0
  9. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/data/RemoteCacheSync.py +16 -16
  10. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/AnswerQuestionFunctionConstructor.py +1 -1
  11. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/Jobs.py +24 -23
  12. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/interviews/Interview.py +1 -5
  13. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/interviews/InterviewExceptionEntry.py +14 -4
  14. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/runners/JobsRunnerAsyncio.py +18 -6
  15. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/runners/JobsRunnerStatus.py +2 -1
  16. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/key_management/KeyLookupBuilder.py +7 -3
  17. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/QuestionBudget.py +2 -2
  18. edsl-0.1.41/edsl/questions/QuestionDict.py +343 -0
  19. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/QuestionExtract.py +1 -1
  20. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/__init__.py +1 -0
  21. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/answer_validator_mixin.py +29 -0
  22. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/derived/QuestionLinearScale.py +1 -1
  23. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/descriptors.py +44 -0
  24. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/question_registry.py +1 -1
  25. edsl-0.1.41/edsl/questions/templates/dict/answering_instructions.jinja +21 -0
  26. edsl-0.1.41/edsl/questions/templates/free_text/question_presentation.jinja +1 -0
  27. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/Result.py +16 -0
  28. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/Results.py +16 -4
  29. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/FileStore.py +32 -0
  30. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/handlers/csv.py +11 -0
  31. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/Survey.py +4 -0
  32. edsl-0.1.41/edsl/utilities/gcp_bucket/__init__.py +0 -0
  33. {edsl-0.1.40.dev2 → edsl-0.1.41}/pyproject.toml +1 -1
  34. edsl-0.1.40.dev2/edsl/__version__.py +0 -1
  35. {edsl-0.1.40.dev2 → edsl-0.1.41}/LICENSE +0 -0
  36. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/Base.py +0 -0
  37. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/BaseDiff.py +0 -0
  38. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/TemplateLoader.py +0 -0
  39. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/agents/AgentList.py +0 -0
  40. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/agents/InvigilatorBase.py +0 -0
  41. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/agents/PromptConstructor.py +0 -0
  42. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/agents/QuestionInstructionPromptBuilder.py +0 -0
  43. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/agents/QuestionTemplateReplacementsBuilder.py +0 -0
  44. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/agents/__init__.py +0 -0
  45. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/agents/descriptors.py +0 -0
  46. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/agents/prompt_helpers.py +0 -0
  47. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/agents/question_option_processor.py +0 -0
  48. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/auto/AutoStudy.py +0 -0
  49. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/auto/StageBase.py +0 -0
  50. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/auto/StageGenerateSurvey.py +0 -0
  51. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/auto/StageLabelQuestions.py +0 -0
  52. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/auto/StagePersona.py +0 -0
  53. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/auto/StagePersonaDimensionValueRanges.py +0 -0
  54. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/auto/StagePersonaDimensionValues.py +0 -0
  55. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/auto/StagePersonaDimensions.py +0 -0
  56. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/auto/StageQuestions.py +0 -0
  57. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/auto/SurveyCreatorPipeline.py +0 -0
  58. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/auto/utilities.py +0 -0
  59. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/base/Base.py +0 -0
  60. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/config.py +0 -0
  61. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/conversation/Conversation.py +0 -0
  62. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/conversation/car_buying.py +0 -0
  63. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/conversation/chips.py +0 -0
  64. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/conversation/mug_negotiation.py +0 -0
  65. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/conversation/next_speaker_utilities.py +0 -0
  66. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/coop/CoopFunctionsMixin.py +0 -0
  67. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/coop/ExpectedParrotKeyHandler.py +0 -0
  68. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/coop/PriceFetcher.py +0 -0
  69. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/coop/__init__.py +0 -0
  70. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/coop/utils.py +0 -0
  71. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/data/CacheEntry.py +0 -0
  72. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/data/CacheHandler.py +0 -0
  73. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/data/SQLiteDict.py +0 -0
  74. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/data/__init__.py +0 -0
  75. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/data/orm.py +0 -0
  76. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/data_transfer_models.py +0 -0
  77. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/enums.py +0 -0
  78. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/BaseException.py +0 -0
  79. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/__init__.py +0 -0
  80. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/agents.py +0 -0
  81. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/cache.py +0 -0
  82. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/configuration.py +0 -0
  83. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/coop.py +0 -0
  84. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/data.py +0 -0
  85. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/general.py +0 -0
  86. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/inference_services.py +0 -0
  87. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/jobs.py +0 -0
  88. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/language_models.py +0 -0
  89. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/prompts.py +0 -0
  90. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/questions.py +0 -0
  91. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/results.py +0 -0
  92. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/scenarios.py +0 -0
  93. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/exceptions/surveys.py +0 -0
  94. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/AnthropicService.py +0 -0
  95. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/AvailableModelCacheHandler.py +0 -0
  96. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/AvailableModelFetcher.py +0 -0
  97. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/AwsBedrock.py +0 -0
  98. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/AzureAI.py +0 -0
  99. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/DeepInfraService.py +0 -0
  100. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/GoogleService.py +0 -0
  101. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/GroqService.py +0 -0
  102. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/InferenceServiceABC.py +0 -0
  103. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/InferenceServicesCollection.py +0 -0
  104. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/MistralAIService.py +0 -0
  105. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/OllamaService.py +0 -0
  106. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/OpenAIService.py +0 -0
  107. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/PerplexityService.py +0 -0
  108. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/ServiceAvailability.py +0 -0
  109. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/TestService.py +0 -0
  110. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/TogetherAIService.py +0 -0
  111. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/__init__.py +0 -0
  112. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/data_structures.py +0 -0
  113. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/models_available_cache.py +0 -0
  114. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/rate_limits_cache.py +0 -0
  115. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/registry.py +0 -0
  116. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/inference_services/write_available.py +0 -0
  117. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/Answers.py +0 -0
  118. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/FetchInvigilator.py +0 -0
  119. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/InterviewTaskManager.py +0 -0
  120. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/InterviewsConstructor.py +0 -0
  121. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/JobsChecks.py +0 -0
  122. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/JobsComponentConstructor.py +0 -0
  123. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/JobsPrompts.py +0 -0
  124. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/JobsRemoteInferenceHandler.py +0 -0
  125. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/JobsRemoteInferenceLogger.py +0 -0
  126. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/RequestTokenEstimator.py +0 -0
  127. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/__init__.py +0 -0
  128. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/async_interview_runner.py +0 -0
  129. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/buckets/BucketCollection.py +0 -0
  130. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/buckets/ModelBuckets.py +0 -0
  131. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/buckets/TokenBucket.py +0 -0
  132. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/buckets/TokenBucketAPI.py +0 -0
  133. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/buckets/TokenBucketClient.py +0 -0
  134. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/check_survey_scenario_compatibility.py +0 -0
  135. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/data_structures.py +0 -0
  136. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/decorators.py +0 -0
  137. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/interviews/InterviewExceptionCollection.py +0 -0
  138. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/interviews/InterviewStatistic.py +0 -0
  139. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/interviews/InterviewStatisticsCollection.py +0 -0
  140. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/interviews/InterviewStatusDictionary.py +0 -0
  141. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/interviews/InterviewStatusLog.py +0 -0
  142. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/interviews/ReportErrors.py +0 -0
  143. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/interviews/interview_status_enum.py +0 -0
  144. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/jobs_status_enums.py +0 -0
  145. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/loggers/HTMLTableJobLogger.py +0 -0
  146. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/results_exceptions_handler.py +0 -0
  147. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/runners/JobsRunnerStatusData.py +0 -0
  148. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/tasks/QuestionTaskCreator.py +0 -0
  149. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/tasks/TaskCreators.py +0 -0
  150. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/tasks/TaskHistory.py +0 -0
  151. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/tasks/TaskStatusLog.py +0 -0
  152. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/tasks/task_status_enum.py +0 -0
  153. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/tokens/InterviewTokenUsage.py +0 -0
  154. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/jobs/tokens/TokenUsage.py +0 -0
  155. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/ComputeCost.py +0 -0
  156. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/LanguageModel.py +0 -0
  157. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/ModelList.py +0 -0
  158. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/PriceManager.py +0 -0
  159. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/RawResponseHandler.py +0 -0
  160. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/RegisterLanguageModelsMeta.py +0 -0
  161. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/ServiceDataSources.py +0 -0
  162. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/__init__.py +0 -0
  163. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/fake_openai_call.py +0 -0
  164. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/fake_openai_service.py +0 -0
  165. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/key_management/KeyLookup.py +0 -0
  166. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/key_management/KeyLookupCollection.py +0 -0
  167. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/key_management/__init__.py +0 -0
  168. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/key_management/models.py +0 -0
  169. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/model.py +0 -0
  170. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/repair.py +0 -0
  171. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/language_models/utilities.py +0 -0
  172. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/notebooks/Notebook.py +0 -0
  173. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/notebooks/NotebookToLaTeX.py +0 -0
  174. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/notebooks/__init__.py +0 -0
  175. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/prompts/Prompt.py +0 -0
  176. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/prompts/__init__.py +0 -0
  177. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/ExceptionExplainer.py +0 -0
  178. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/HTMLQuestion.py +0 -0
  179. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/QuestionBase.py +0 -0
  180. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/QuestionBasePromptsMixin.py +0 -0
  181. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/QuestionCheckBox.py +0 -0
  182. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/QuestionFreeText.py +0 -0
  183. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/QuestionFunctional.py +0 -0
  184. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/QuestionList.py +0 -0
  185. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/QuestionMatrix.py +0 -0
  186. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/QuestionMultipleChoice.py +0 -0
  187. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/QuestionNumerical.py +0 -0
  188. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/QuestionRank.py +0 -0
  189. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/Quick.py +0 -0
  190. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/SimpleAskMixin.py +0 -0
  191. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/compose_questions.py +0 -0
  192. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/data_structures.py +0 -0
  193. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/decorators.py +0 -0
  194. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/derived/QuestionLikertFive.py +0 -0
  195. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/derived/QuestionTopK.py +0 -0
  196. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/derived/QuestionYesNo.py +0 -0
  197. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/derived/__init__.py +0 -0
  198. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/loop_processor.py +0 -0
  199. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/prompt_templates/question_budget.jinja +0 -0
  200. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/prompt_templates/question_checkbox.jinja +0 -0
  201. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/prompt_templates/question_extract.jinja +0 -0
  202. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/prompt_templates/question_free_text.jinja +0 -0
  203. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/prompt_templates/question_linear_scale.jinja +0 -0
  204. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/prompt_templates/question_list.jinja +0 -0
  205. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/prompt_templates/question_multiple_choice.jinja +0 -0
  206. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/prompt_templates/question_numerical.jinja +0 -0
  207. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/question_base_gen_mixin.py +0 -0
  208. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/register_questions_meta.py +0 -0
  209. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/response_validator_abc.py +0 -0
  210. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/response_validator_factory.py +0 -0
  211. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/settings.py +0 -0
  212. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/__init__.py +0 -0
  213. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/budget/__init__.py +0 -0
  214. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/budget/answering_instructions.jinja +0 -0
  215. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/budget/question_presentation.jinja +0 -0
  216. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/checkbox/__init__.py +0 -0
  217. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/checkbox/answering_instructions.jinja +0 -0
  218. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/checkbox/question_presentation.jinja +0 -0
  219. {edsl-0.1.40.dev2/edsl/questions/templates/extract → edsl-0.1.41/edsl/questions/templates/dict}/__init__.py +0 -0
  220. {edsl-0.1.40.dev2/edsl/questions/templates/extract → edsl-0.1.41/edsl/questions/templates/dict}/question_presentation.jinja +0 -0
  221. {edsl-0.1.40.dev2/edsl/questions/templates/free_text → edsl-0.1.41/edsl/questions/templates/extract}/__init__.py +0 -0
  222. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/extract/answering_instructions.jinja +0 -0
  223. {edsl-0.1.40.dev2/edsl/questions/templates/free_text → edsl-0.1.41/edsl/questions/templates/extract}/question_presentation.jinja +0 -0
  224. {edsl-0.1.40.dev2/edsl/questions/templates/likert_five → edsl-0.1.41/edsl/questions/templates/free_text}/__init__.py +0 -0
  225. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/free_text/answering_instructions.jinja +0 -0
  226. {edsl-0.1.40.dev2/edsl/questions/templates/linear_scale → edsl-0.1.41/edsl/questions/templates/likert_five}/__init__.py +0 -0
  227. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/likert_five/answering_instructions.jinja +0 -0
  228. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/likert_five/question_presentation.jinja +0 -0
  229. {edsl-0.1.40.dev2/edsl/questions/templates/list → edsl-0.1.41/edsl/questions/templates/linear_scale}/__init__.py +0 -0
  230. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/linear_scale/answering_instructions.jinja +0 -0
  231. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/linear_scale/question_presentation.jinja +0 -0
  232. {edsl-0.1.40.dev2/edsl/questions/templates/multiple_choice → edsl-0.1.41/edsl/questions/templates/list}/__init__.py +0 -0
  233. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/list/answering_instructions.jinja +0 -0
  234. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/list/question_presentation.jinja +0 -0
  235. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/matrix/__init__.py +0 -0
  236. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/matrix/answering_instructions.jinja +0 -0
  237. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/matrix/question_presentation.jinja +0 -0
  238. {edsl-0.1.40.dev2/edsl/questions/templates/numerical → edsl-0.1.41/edsl/questions/templates/multiple_choice}/__init__.py +0 -0
  239. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/multiple_choice/answering_instructions.jinja +0 -0
  240. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/multiple_choice/html.jinja +0 -0
  241. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/multiple_choice/question_presentation.jinja +0 -0
  242. {edsl-0.1.40.dev2/edsl/questions/templates/rank → edsl-0.1.41/edsl/questions/templates/numerical}/__init__.py +0 -0
  243. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/numerical/answering_instructions.jinja +0 -0
  244. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/numerical/question_presentation.jinja +0 -0
  245. {edsl-0.1.40.dev2/edsl/questions/templates/top_k → edsl-0.1.41/edsl/questions/templates/rank}/__init__.py +0 -0
  246. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/rank/answering_instructions.jinja +0 -0
  247. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/rank/question_presentation.jinja +0 -0
  248. {edsl-0.1.40.dev2/edsl/questions/templates/yes_no → edsl-0.1.41/edsl/questions/templates/top_k}/__init__.py +0 -0
  249. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/top_k/answering_instructions.jinja +0 -0
  250. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/top_k/question_presentation.jinja +0 -0
  251. {edsl-0.1.40.dev2/edsl/surveys/instructions → edsl-0.1.41/edsl/questions/templates/yes_no}/__init__.py +0 -0
  252. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/yes_no/answering_instructions.jinja +0 -0
  253. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/questions/templates/yes_no/question_presentation.jinja +0 -0
  254. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/CSSParameterizer.py +0 -0
  255. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/Dataset.py +0 -0
  256. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/DatasetExportMixin.py +0 -0
  257. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/DatasetTree.py +0 -0
  258. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/MarkdownToDocx.py +0 -0
  259. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/MarkdownToPDF.py +0 -0
  260. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/ResultsExportMixin.py +0 -0
  261. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/ResultsGGMixin.py +0 -0
  262. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/TableDisplay.py +0 -0
  263. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/TextEditor.py +0 -0
  264. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/__init__.py +0 -0
  265. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/file_exports.py +0 -0
  266. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/results_fetch_mixin.py +0 -0
  267. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/results_selector.py +0 -0
  268. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/results_tools_mixin.py +0 -0
  269. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/smart_objects.py +0 -0
  270. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/table_data_class.py +0 -0
  271. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/table_display.css +0 -0
  272. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/table_renderers.py +0 -0
  273. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/results/tree_explore.py +0 -0
  274. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/ConstructDownloadLink.py +0 -0
  275. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/DocumentChunker.py +0 -0
  276. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/DocxScenario.py +0 -0
  277. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/PdfExtractor.py +0 -0
  278. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/Scenario.py +0 -0
  279. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/ScenarioHtmlMixin.py +0 -0
  280. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/ScenarioList.py +0 -0
  281. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/ScenarioListExportMixin.py +0 -0
  282. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/ScenarioListPdfMixin.py +0 -0
  283. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/__init__.py +0 -0
  284. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/directory_scanner.py +0 -0
  285. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/file_methods.py +0 -0
  286. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/handlers/__init__.py +0 -0
  287. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/handlers/docx.py +0 -0
  288. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/handlers/html.py +0 -0
  289. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/handlers/json.py +0 -0
  290. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/handlers/latex.py +0 -0
  291. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/handlers/md.py +0 -0
  292. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/handlers/pdf.py +0 -0
  293. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/handlers/png.py +0 -0
  294. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/handlers/pptx.py +0 -0
  295. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/handlers/py.py +0 -0
  296. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/handlers/sql.py +0 -0
  297. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/handlers/sqlite.py +0 -0
  298. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/handlers/txt.py +0 -0
  299. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/scenario_join.py +0 -0
  300. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/scenarios/scenario_selector.py +0 -0
  301. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/shared.py +0 -0
  302. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/study/ObjectEntry.py +0 -0
  303. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/study/ProofOfWork.py +0 -0
  304. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/study/SnapShot.py +0 -0
  305. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/study/Study.py +0 -0
  306. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/study/__init__.py +0 -0
  307. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/ConstructDAG.py +0 -0
  308. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/DAG.py +0 -0
  309. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/EditSurvey.py +0 -0
  310. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/InstructionHandler.py +0 -0
  311. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/Memory.py +0 -0
  312. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/MemoryManagement.py +0 -0
  313. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/MemoryPlan.py +0 -0
  314. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/Rule.py +0 -0
  315. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/RuleCollection.py +0 -0
  316. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/RuleManager.py +0 -0
  317. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/Simulator.py +0 -0
  318. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/SurveyCSS.py +0 -0
  319. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/SurveyExportMixin.py +0 -0
  320. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/SurveyFlowVisualization.py +0 -0
  321. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/SurveyQualtricsImport.py +0 -0
  322. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/SurveyToApp.py +0 -0
  323. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/__init__.py +0 -0
  324. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/base.py +0 -0
  325. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/descriptors.py +0 -0
  326. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/instructions/ChangeInstruction.py +0 -0
  327. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/instructions/Instruction.py +0 -0
  328. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/surveys/instructions/InstructionCollection.py +0 -0
  329. {edsl-0.1.40.dev2/edsl/utilities/gcp_bucket → edsl-0.1.41/edsl/surveys/instructions}/__init__.py +0 -0
  330. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/templates/error_reporting/base.html +0 -0
  331. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/templates/error_reporting/exceptions_by_model.html +0 -0
  332. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/templates/error_reporting/exceptions_by_question_name.html +0 -0
  333. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/templates/error_reporting/exceptions_by_type.html +0 -0
  334. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/templates/error_reporting/interview_details.html +0 -0
  335. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/templates/error_reporting/interviews.html +0 -0
  336. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/templates/error_reporting/overview.html +0 -0
  337. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/templates/error_reporting/performance_plot.html +0 -0
  338. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/templates/error_reporting/report.css +0 -0
  339. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/templates/error_reporting/report.html +0 -0
  340. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/templates/error_reporting/report.js +0 -0
  341. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/tools/__init__.py +0 -0
  342. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/tools/clusters.py +0 -0
  343. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/tools/embeddings.py +0 -0
  344. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/tools/embeddings_plotting.py +0 -0
  345. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/tools/plotting.py +0 -0
  346. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/tools/summarize.py +0 -0
  347. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/PrettyList.py +0 -0
  348. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/SystemInfo.py +0 -0
  349. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/__init__.py +0 -0
  350. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/ast_utilities.py +0 -0
  351. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/data/Registry.py +0 -0
  352. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/data/__init__.py +0 -0
  353. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/data/scooter_results.json +0 -0
  354. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/decorators.py +0 -0
  355. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/gcp_bucket/cloud_storage.py +0 -0
  356. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/interface.py +0 -0
  357. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/is_notebook.py +0 -0
  358. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/is_valid_variable_name.py +0 -0
  359. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/naming_utilities.py +0 -0
  360. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/remove_edsl_version.py +0 -0
  361. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/repair_functions.py +0 -0
  362. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/restricted_python.py +0 -0
  363. {edsl-0.1.40.dev2 → edsl-0.1.41}/edsl/utilities/utilities.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edsl
3
- Version: 0.1.40.dev2
3
+ Version: 0.1.41
4
4
  Summary: Create and analyze LLM-based surveys
5
5
  Home-page: https://www.expectedparrot.com/
6
6
  License: MIT
@@ -107,5 +107,5 @@ See instructions on [storing API keys](https://docs.expectedparrot.com/en/latest
107
107
 
108
108
  ## 💡 Contributions, feature requests & bugs
109
109
  Interested in contributing? Want us to add a new feature? Found a bug for us to squash?
110
- Please send us an email at [info@expectedparrot.com](mailto:info@expectedparrot.com) or message us at our [Discord channel](https://discord.com/invite/mxAYkjfy9m)..
110
+ Please send us an email at [info@expectedparrot.com](mailto:info@expectedparrot.com) or message us at our [Discord channel](https://discord.com/invite/mxAYkjfy9m).
111
111
 
@@ -51,4 +51,4 @@ See instructions on [storing API keys](https://docs.expectedparrot.com/en/latest
51
51
 
52
52
  ## 💡 Contributions, feature requests & bugs
53
53
  Interested in contributing? Want us to add a new feature? Found a bug for us to squash?
54
- Please send us an email at [info@expectedparrot.com](mailto:info@expectedparrot.com) or message us at our [Discord channel](https://discord.com/invite/mxAYkjfy9m)..
54
+ Please send us an email at [info@expectedparrot.com](mailto:info@expectedparrot.com) or message us at our [Discord channel](https://discord.com/invite/mxAYkjfy9m).
@@ -21,6 +21,7 @@ from edsl.questions import QuestionFunctional
21
21
  from edsl.questions import QuestionLikertFive
22
22
  from edsl.questions import QuestionList
23
23
  from edsl.questions import QuestionMatrix
24
+ from edsl.questions import QuestionDict
24
25
  from edsl.questions import QuestionLinearScale
25
26
  from edsl.questions import QuestionNumerical
26
27
  from edsl.questions import QuestionYesNo
@@ -0,0 +1 @@
1
+ __version__ = "0.1.41"
@@ -906,7 +906,7 @@ class Agent(Base):
906
906
  {'traits': {'age': 10, 'hair': 'brown', 'height': 5.5}, 'instruction': 'Have fun.', 'edsl_version': '...', 'edsl_class_name': 'Agent'}
907
907
  """
908
908
  d = {}
909
- d["traits"] = copy.deepcopy(self.traits)
909
+ d["traits"] = copy.deepcopy(dict(self._traits))
910
910
  if self.name:
911
911
  d["name"] = self.name
912
912
  if self.set_instructions:
@@ -48,13 +48,14 @@ class InvigilatorAI(InvigilatorBase):
48
48
  """Store the response in the invigilator, in case it is needed later because of validation failure."""
49
49
  self.raw_model_response = agent_response_dict.model_outputs.response
50
50
  self.generated_tokens = agent_response_dict.edsl_dict.generated_tokens
51
+ self.cache_key = agent_response_dict.model_outputs.cache_key
51
52
 
52
- async def async_answer_question(self) -> AgentResponseDict:
53
+ async def async_answer_question(self) -> EDSLResultObjectInput:
53
54
  """Answer a question using the AI model.
54
55
 
55
56
  >>> i = InvigilatorAI.example()
56
57
  """
57
- agent_response_dict = await self.async_get_agent_response()
58
+ agent_response_dict: AgentResponseDict = await self.async_get_agent_response()
58
59
  self.store_response(agent_response_dict)
59
60
  return self._extract_edsl_result_entry_and_validate(agent_response_dict)
60
61
 
@@ -111,13 +111,13 @@ class Coop(CoopFunctionsMixin):
111
111
  url = f"{self.api_url}/{uri}"
112
112
  method = method.upper()
113
113
  if payload is None:
114
- timeout = 20
114
+ timeout = 40
115
115
  elif (
116
116
  method.upper() == "POST"
117
117
  and "json_string" in payload
118
118
  and payload.get("json_string") is not None
119
119
  ):
120
- timeout = max(20, (len(payload.get("json_string", "")) // (1024 * 1024)))
120
+ timeout = max(40, (len(payload.get("json_string", "")) // (1024 * 1024)))
121
121
  try:
122
122
  if method in ["GET", "DELETE"]:
123
123
  response = requests.request(
@@ -533,6 +533,7 @@ class Coop(CoopFunctionsMixin):
533
533
  uri="api/v0/remote-cache/many",
534
534
  method="POST",
535
535
  payload=payload,
536
+ timeout=40,
536
537
  )
537
538
  self._resolve_server_response(response)
538
539
  response_json = response.json()
@@ -563,6 +564,7 @@ class Coop(CoopFunctionsMixin):
563
564
  uri="api/v0/remote-cache/get-many",
564
565
  method="POST",
565
566
  payload={"keys": exclude_keys},
567
+ timeout=40,
566
568
  )
567
569
  self._resolve_server_response(response)
568
570
  return [
@@ -581,6 +583,7 @@ class Coop(CoopFunctionsMixin):
581
583
  uri="api/v0/remote-cache/get-diff",
582
584
  method="POST",
583
585
  payload={"keys": client_cacheentry_keys},
586
+ timeout=40,
584
587
  )
585
588
  self._resolve_server_response(response)
586
589
  response_json = response.json()
@@ -535,6 +535,13 @@ class Cache(Base):
535
535
  """
536
536
  return html
537
537
 
538
+ def subset(self, keys: list[str]) -> Cache:
539
+ """
540
+ Return a subset of the Cache with the specified keys.
541
+ """
542
+ new_data = {k: v for k, v in self.data.items() if k in keys}
543
+ return Cache(data=new_data)
544
+
538
545
  def view(self) -> None:
539
546
  """View the Cache in a new browser tab."""
540
547
  import tempfile
@@ -112,18 +112,18 @@ class RemoteCacheSync(AbstractContextManager):
112
112
  missing_count = len(diff.client_missing_entries)
113
113
 
114
114
  if missing_count == 0:
115
- self._output("No new entries to add to local cache.")
115
+ # self._output("No new entries to add to local cache.")
116
116
  return
117
117
 
118
- self._output(
119
- f"Updating local cache with {missing_count:,} new "
120
- f"{'entry' if missing_count == 1 else 'entries'} from remote..."
121
- )
118
+ # self._output(
119
+ # f"Updating local cache with {missing_count:,} new "
120
+ # f"{'entry' if missing_count == 1 else 'entries'} from remote..."
121
+ # )
122
122
 
123
123
  self.cache.add_from_dict(
124
124
  {entry.key: entry for entry in diff.client_missing_entries}
125
125
  )
126
- self._output("Local cache updated!")
126
+ # self._output("Local cache updated!")
127
127
 
128
128
  def _get_entries_to_upload(self, diff: CacheDifference) -> CacheEntriesList:
129
129
  """Determines which entries need to be uploaded to remote cache."""
@@ -154,23 +154,23 @@ class RemoteCacheSync(AbstractContextManager):
154
154
  upload_count = len(entries_to_upload)
155
155
 
156
156
  if upload_count > 0:
157
- self._output(
158
- f"Updating remote cache with {upload_count:,} new "
159
- f"{'entry' if upload_count == 1 else 'entries'}..."
160
- )
157
+ # self._output(
158
+ # f"Updating remote cache with {upload_count:,} new "
159
+ # f"{'entry' if upload_count == 1 else 'entries'}..."
160
+ # )
161
161
 
162
162
  self.coop.remote_cache_create_many(
163
163
  entries_to_upload,
164
164
  visibility="private",
165
165
  description=self.remote_cache_description,
166
166
  )
167
- self._output("Remote cache updated!")
168
- else:
169
- self._output("No new entries to add to remote cache.")
167
+ # self._output("Remote cache updated!")
168
+ # else:
169
+ # self._output("No new entries to add to remote cache.")
170
170
 
171
- self._output(
172
- f"There are {len(self.cache.keys()):,} entries in the local cache."
173
- )
171
+ # self._output(
172
+ # f"There are {len(self.cache.keys()):,} entries in the local cache."
173
+ # )
174
174
 
175
175
 
176
176
  if __name__ == "__main__":
@@ -139,7 +139,7 @@ class AnswerQuestionFunctionConstructor:
139
139
  *,
140
140
  question: "QuestionBase",
141
141
  task=None,
142
- ) -> "AgentResponseDict":
142
+ ) -> "EDSLResultObjectInput":
143
143
 
144
144
  from tenacity import (
145
145
  retry,
@@ -499,7 +499,6 @@ class Jobs(Base):
499
499
  jc.check_api_keys()
500
500
 
501
501
  async def _execute_with_remote_cache(self, run_job_async: bool) -> Results:
502
-
503
502
  use_remote_cache = self.use_remote_cache()
504
503
 
505
504
  from edsl.coop.coop import Coop
@@ -508,22 +507,21 @@ class Jobs(Base):
508
507
 
509
508
  assert isinstance(self.run_config.environment.cache, Cache)
510
509
 
511
- with RemoteCacheSync(
512
- coop=Coop(),
513
- cache=self.run_config.environment.cache,
514
- output_func=self._output,
515
- remote_cache=use_remote_cache,
516
- remote_cache_description=self.run_config.parameters.remote_cache_description,
517
- ):
518
- runner = JobsRunnerAsyncio(self, environment=self.run_config.environment)
519
- if run_job_async:
520
- results = await runner.run_async(self.run_config.parameters)
521
- else:
522
- results = runner.run(self.run_config.parameters)
510
+ # with RemoteCacheSync(
511
+ # coop=Coop(),
512
+ # cache=self.run_config.environment.cache,
513
+ # output_func=self._output,
514
+ # remote_cache=use_remote_cache,
515
+ # remote_cache_description=self.run_config.parameters.remote_cache_description,
516
+ # ):
517
+ runner = JobsRunnerAsyncio(self, environment=self.run_config.environment)
518
+ if run_job_async:
519
+ results = await runner.run_async(self.run_config.parameters)
520
+ else:
521
+ results = runner.run(self.run_config.parameters)
523
522
  return results
524
523
 
525
524
  def _setup_and_check(self) -> Tuple[RunConfig, Optional[Results]]:
526
-
527
525
  self._prepare_to_run()
528
526
  self._check_if_remote_keys_ok()
529
527
 
@@ -539,12 +537,16 @@ class Jobs(Base):
539
537
  if self.run_config.parameters.n is None:
540
538
  return len(self)
541
539
  else:
542
- len(self) * self.run_config.parameters.n
540
+ return len(self) * self.run_config.parameters.n
543
541
 
544
542
  def _run(self, config: RunConfig):
545
543
  "Shared code for run and run_async"
546
544
  if config.environment.cache is not None:
547
545
  self.run_config.environment.cache = config.environment.cache
546
+ if config.environment.jobs_runner_status is not None:
547
+ self.run_config.environment.jobs_runner_status = (
548
+ config.environment.jobs_runner_status
549
+ )
548
550
 
549
551
  if config.environment.bucket_collection is not None:
550
552
  self.run_config.environment.bucket_collection = (
@@ -646,20 +648,19 @@ class Jobs(Base):
646
648
  }
647
649
 
648
650
  def __len__(self) -> int:
649
- """Return the maximum number of questions that will be asked while running this job.
650
- Note that this is the maximum number of questions, not the actual number of questions that will be asked, as some questions may be skipped.
651
+ """Return the number of interviews that will be conducted for one iteration of this job.
652
+ An interview is the result of one survey, taken by one agent, with one model, with one scenario.
651
653
 
652
654
  >>> from edsl.jobs import Jobs
653
655
  >>> len(Jobs.example())
654
- 8
656
+ 4
655
657
  """
656
- number_of_questions = (
658
+ number_of_interviews = (
657
659
  len(self.agents or [1])
658
660
  * len(self.scenarios or [1])
659
661
  * len(self.models or [1])
660
- * len(self.survey)
661
662
  )
662
- return number_of_questions
663
+ return number_of_interviews
663
664
 
664
665
  def to_dict(self, add_edsl_version=True):
665
666
  d = {
@@ -810,9 +811,9 @@ def main():
810
811
  from edsl.data.Cache import Cache
811
812
 
812
813
  job = Jobs.example()
813
- len(job) == 8
814
+ len(job) == 4
814
815
  results = job.run(cache=Cache())
815
- len(results) == 8
816
+ len(results) == 4
816
817
  results
817
818
 
818
819
 
@@ -213,10 +213,6 @@ class Interview:
213
213
  async def async_conduct_interview(
214
214
  self,
215
215
  run_config: Optional["RunConfig"] = None,
216
- # model_buckets: Optional[ModelBuckets] = None,
217
- # stop_on_exception: bool = False,
218
- # raise_validation_errors: bool = True,
219
- # key_lookup: Optional[KeyLookup] = None,
220
216
  ) -> tuple["Answers", List[dict[str, Any]]]:
221
217
  """
222
218
  Conduct an Interview asynchronously.
@@ -313,7 +309,7 @@ class Interview:
313
309
 
314
310
  def handle_task(task, invigilator):
315
311
  try:
316
- result = task.result()
312
+ result: Answers = task.result()
317
313
  except asyncio.CancelledError as e: # task was cancelled
318
314
  result = invigilator.get_failed_task_result(
319
315
  failure_reason="Task was cancelled."
@@ -1,5 +1,6 @@
1
1
  import traceback
2
2
  import datetime
3
+ from edsl.agents.InvigilatorBase import InvigilatorBase
3
4
 
4
5
 
5
6
  class InterviewExceptionEntry:
@@ -9,7 +10,7 @@ class InterviewExceptionEntry:
9
10
  self,
10
11
  *,
11
12
  exception: Exception,
12
- invigilator: "Invigilator",
13
+ invigilator: "InvigilatorBase",
13
14
  traceback_format="text",
14
15
  answers=None,
15
16
  ):
@@ -20,6 +21,8 @@ class InterviewExceptionEntry:
20
21
  self.traceback_format = traceback_format
21
22
  self.answers = answers
22
23
 
24
+ # breakpoint()
25
+
23
26
  @property
24
27
  def question_type(self):
25
28
  # return self.failed_question.question.question_type
@@ -163,12 +166,16 @@ class InterviewExceptionEntry:
163
166
  >>> entry = InterviewExceptionEntry.example()
164
167
  >>> _ = entry.to_dict()
165
168
  """
166
- return {
169
+ invigilator = (
170
+ self.invigilator.to_dict() if self.invigilator is not None else None
171
+ )
172
+ d = {
167
173
  "exception": self.serialize_exception(self.exception),
168
174
  "time": self.time,
169
175
  "traceback": self.traceback,
170
- "invigilator": self.invigilator.to_dict(),
176
+ "invigilator": invigilator,
171
177
  }
178
+ return d
172
179
 
173
180
  @classmethod
174
181
  def from_dict(cls, data: dict) -> "InterviewExceptionEntry":
@@ -176,7 +183,10 @@ class InterviewExceptionEntry:
176
183
  from edsl.agents.Invigilator import InvigilatorAI
177
184
 
178
185
  exception = cls.deserialize_exception(data["exception"])
179
- invigilator = InvigilatorAI.from_dict(data["invigilator"])
186
+ if data["invigilator"] is None:
187
+ invigilator = None
188
+ else:
189
+ invigilator = InvigilatorAI.from_dict(data["invigilator"])
180
190
  return cls(exception=exception, invigilator=invigilator)
181
191
 
182
192
 
@@ -44,7 +44,16 @@ class JobsRunnerAsyncio:
44
44
  data.append(result)
45
45
  task_history.add_interview(interview)
46
46
 
47
- return Results(survey=self.jobs.survey, task_history=task_history, data=data)
47
+ results = Results(survey=self.jobs.survey, task_history=task_history, data=data)
48
+
49
+ relevant_cache = results.relevant_cache(self.environment.cache)
50
+
51
+ return Results(
52
+ survey=self.jobs.survey,
53
+ task_history=task_history,
54
+ data=data,
55
+ cache=relevant_cache,
56
+ )
48
57
 
49
58
  def simple_run(self):
50
59
  data = asyncio.run(self.run_async())
@@ -93,16 +102,16 @@ class JobsRunnerAsyncio:
93
102
 
94
103
  self.completed = True
95
104
 
96
- def run_progress_bar(stop_event) -> None:
105
+ def run_progress_bar(stop_event, jobs_runner_status) -> None:
97
106
  """Runs the progress bar in a separate thread."""
98
- self.jobs_runner_status.update_progress(stop_event)
107
+ jobs_runner_status.update_progress(stop_event)
99
108
 
100
109
  def set_up_progress_bar(progress_bar: bool, jobs_runner_status):
101
110
  progress_thread = None
102
111
  if progress_bar and jobs_runner_status.has_ep_api_key():
103
112
  jobs_runner_status.setup()
104
113
  progress_thread = threading.Thread(
105
- target=run_progress_bar, args=(stop_event,)
114
+ target=run_progress_bar, args=(stop_event, jobs_runner_status)
106
115
  )
107
116
  progress_thread.start()
108
117
  elif progress_bar:
@@ -115,8 +124,9 @@ class JobsRunnerAsyncio:
115
124
  survey=self.jobs.survey,
116
125
  data=[],
117
126
  task_history=TaskHistory(),
118
- cache=self.environment.cache.new_entries_cache(),
127
+ # cache=self.environment.cache.new_entries_cache(),
119
128
  )
129
+
120
130
  stop_event = threading.Event()
121
131
  progress_thread = set_up_progress_bar(
122
132
  parameters.progress_bar, run_config.environment.jobs_runner_status
@@ -140,7 +150,9 @@ class JobsRunnerAsyncio:
140
150
  if exception_to_raise:
141
151
  raise exception_to_raise
142
152
 
143
- results.cache = self.environment.cache.new_entries_cache()
153
+ relevant_cache = results.relevant_cache(self.environment.cache)
154
+ results.cache = relevant_cache
155
+ # breakpoint()
144
156
  results.bucket_collection = self.environment.bucket_collection
145
157
 
146
158
  from edsl.jobs.results_exceptions_handler import ResultsExceptionsHandler
@@ -148,7 +148,8 @@ class JobsRunnerStatusBase(ABC):
148
148
  }
149
149
 
150
150
  model_queues = {}
151
- for model, bucket in self.jobs_runner.bucket_collection.items():
151
+ # for model, bucket in self.jobs_runner.bucket_collection.items():
152
+ for model, bucket in self.jobs_runner.environment.bucket_collection.items():
152
153
  model_name = model.model
153
154
  model_queues[model_name] = {
154
155
  "language_model_name": model_name,
@@ -36,7 +36,7 @@ class KeyLookupBuilder:
36
36
 
37
37
  >>> builder = KeyLookupBuilder(fetch_order=("config", "env"))
38
38
  >>> builder.DEFAULT_RPM
39
- 10
39
+ 100
40
40
  >>> builder.DEFAULT_TPM
41
41
  2000000
42
42
  >>> builder.fetch_order
@@ -54,8 +54,12 @@ class KeyLookupBuilder:
54
54
  ('openai', 'rpm')
55
55
  """
56
56
 
57
- DEFAULT_RPM = 10
58
- DEFAULT_TPM = 2000000
57
+ # DEFAULT_RPM = 10
58
+ # DEFAULT_TPM = 2000000
59
+ from edsl.config import CONFIG
60
+
61
+ DEFAULT_RPM = int(CONFIG.get("EDSL_SERVICE_RPM_BASELINE"))
62
+ DEFAULT_TPM = int(CONFIG.get("EDSL_SERVICE_TPM_BASELINE"))
59
63
 
60
64
  def __init__(self, fetch_order: Optional[tuple[str]] = None):
61
65
  if fetch_order is None:
@@ -8,7 +8,7 @@ from edsl.questions.descriptors import IntegerDescriptor, QuestionOptionsDescrip
8
8
  from edsl.questions.response_validator_abc import ResponseValidatorABC
9
9
 
10
10
 
11
- class BudgewResponseValidator(ResponseValidatorABC):
11
+ class BudgetResponseValidator(ResponseValidatorABC):
12
12
  valid_examples = []
13
13
 
14
14
  invalid_examples = []
@@ -64,7 +64,7 @@ class QuestionBudget(QuestionBase):
64
64
  budget_sum: int = IntegerDescriptor(none_allowed=False)
65
65
  question_options: list[str] = QuestionOptionsDescriptor(q_budget=True)
66
66
  _response_model = None
67
- response_validator_class = BudgewResponseValidator
67
+ response_validator_class = BudgetResponseValidator
68
68
 
69
69
  def __init__(
70
70
  self,