edsl 0.1.34.dev1__tar.gz → 0.1.35__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 (303) hide show
  1. {edsl-0.1.34.dev1 → edsl-0.1.35}/PKG-INFO +1 -1
  2. edsl-0.1.35/edsl/__version__.py +1 -0
  3. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/agents/PromptConstructor.py +17 -14
  4. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/OpenAIService.py +13 -2
  5. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/Jobs.py +91 -10
  6. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/interviews/Interview.py +12 -9
  7. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/runners/JobsRunnerAsyncio.py +9 -9
  8. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/language_models/LanguageModel.py +2 -2
  9. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/language_models/utilities.py +4 -2
  10. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/QuestionBase.py +2 -1
  11. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/QuestionMultipleChoice.py +3 -3
  12. edsl-0.1.35/edsl/questions/templates/__pycache__/__init__.cpython-311.pyc +0 -0
  13. edsl-0.1.35/edsl/questions/templates/checkbox/__pycache__/__init__.cpython-311.pyc +0 -0
  14. edsl-0.1.35/edsl/questions/templates/free_text/__pycache__/__init__.cpython-311.pyc +0 -0
  15. edsl-0.1.35/edsl/questions/templates/linear_scale/__pycache__/__init__.cpython-311.pyc +0 -0
  16. edsl-0.1.35/edsl/questions/templates/list/__pycache__/__init__.cpython-311.pyc +0 -0
  17. edsl-0.1.35/edsl/questions/templates/multiple_choice/__pycache__/__init__.cpython-311.pyc +0 -0
  18. edsl-0.1.35/edsl/questions/templates/numerical/__pycache__/__init__.cpython-311.pyc +0 -0
  19. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/numerical/answering_instructions.jinja +0 -1
  20. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/scenarios/FileStore.py +0 -5
  21. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/scenarios/ScenarioList.py +9 -0
  22. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/base.py +4 -0
  23. {edsl-0.1.34.dev1 → edsl-0.1.35}/pyproject.toml +20 -19
  24. edsl-0.1.34.dev1/edsl/__version__.py +0 -1
  25. {edsl-0.1.34.dev1 → edsl-0.1.35}/LICENSE +0 -0
  26. {edsl-0.1.34.dev1 → edsl-0.1.35}/README.md +0 -0
  27. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/Base.py +0 -0
  28. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/BaseDiff.py +0 -0
  29. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/TemplateLoader.py +0 -0
  30. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/__init__.py +0 -0
  31. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/agents/Agent.py +0 -0
  32. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/agents/AgentList.py +0 -0
  33. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/agents/Invigilator.py +0 -0
  34. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/agents/InvigilatorBase.py +0 -0
  35. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/agents/__init__.py +0 -0
  36. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/agents/descriptors.py +0 -0
  37. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/agents/prompt_helpers.py +0 -0
  38. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/auto/AutoStudy.py +0 -0
  39. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/auto/StageBase.py +0 -0
  40. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/auto/StageGenerateSurvey.py +0 -0
  41. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/auto/StageLabelQuestions.py +0 -0
  42. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/auto/StagePersona.py +0 -0
  43. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/auto/StagePersonaDimensionValueRanges.py +0 -0
  44. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/auto/StagePersonaDimensionValues.py +0 -0
  45. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/auto/StagePersonaDimensions.py +0 -0
  46. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/auto/StageQuestions.py +0 -0
  47. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/auto/SurveyCreatorPipeline.py +0 -0
  48. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/auto/utilities.py +0 -0
  49. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/base/Base.py +0 -0
  50. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/config.py +0 -0
  51. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/AgentConstructionMixin.py +0 -0
  52. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/Conjure.py +0 -0
  53. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/InputData.py +0 -0
  54. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/InputDataCSV.py +0 -0
  55. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/InputDataMixinQuestionStats.py +0 -0
  56. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/InputDataPyRead.py +0 -0
  57. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/InputDataSPSS.py +0 -0
  58. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/InputDataStata.py +0 -0
  59. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/QuestionOptionMixin.py +0 -0
  60. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/QuestionTypeMixin.py +0 -0
  61. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/RawQuestion.py +0 -0
  62. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/SurveyResponses.py +0 -0
  63. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/__init__.py +0 -0
  64. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/examples/placeholder.txt +0 -0
  65. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/naming_utilities.py +0 -0
  66. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conjure/utilities.py +0 -0
  67. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conversation/Conversation.py +0 -0
  68. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conversation/car_buying.py +0 -0
  69. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conversation/mug_negotiation.py +0 -0
  70. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/conversation/next_speaker_utilities.py +0 -0
  71. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/coop/PriceFetcher.py +0 -0
  72. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/coop/__init__.py +0 -0
  73. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/coop/coop.py +0 -0
  74. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/coop/utils.py +0 -0
  75. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/data/Cache.py +0 -0
  76. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/data/CacheEntry.py +0 -0
  77. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/data/CacheHandler.py +0 -0
  78. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/data/SQLiteDict.py +0 -0
  79. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/data/__init__.py +0 -0
  80. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/data/orm.py +0 -0
  81. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/data_transfer_models.py +0 -0
  82. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/enums.py +0 -0
  83. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/exceptions/__init__.py +0 -0
  84. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/exceptions/agents.py +0 -0
  85. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/exceptions/configuration.py +0 -0
  86. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/exceptions/coop.py +0 -0
  87. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/exceptions/data.py +0 -0
  88. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/exceptions/general.py +0 -0
  89. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/exceptions/jobs.py +0 -0
  90. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/exceptions/language_models.py +0 -0
  91. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/exceptions/prompts.py +0 -0
  92. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/exceptions/questions.py +0 -0
  93. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/exceptions/results.py +0 -0
  94. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/exceptions/surveys.py +0 -0
  95. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/AnthropicService.py +0 -0
  96. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/AwsBedrock.py +0 -0
  97. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/AzureAI.py +0 -0
  98. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/DeepInfraService.py +0 -0
  99. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/GoogleService.py +0 -0
  100. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/GroqService.py +0 -0
  101. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/InferenceServiceABC.py +0 -0
  102. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/InferenceServicesCollection.py +0 -0
  103. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/MistralAIService.py +0 -0
  104. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/OllamaService.py +0 -0
  105. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/TestService.py +0 -0
  106. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/TogetherAIService.py +0 -0
  107. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/__init__.py +0 -0
  108. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/models_available_cache.py +0 -0
  109. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/rate_limits_cache.py +0 -0
  110. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/registry.py +0 -0
  111. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/inference_services/write_available.py +0 -0
  112. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/Answers.py +0 -0
  113. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/FailedQuestion.py +0 -0
  114. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/__init__.py +0 -0
  115. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/buckets/BucketCollection.py +0 -0
  116. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/buckets/ModelBuckets.py +0 -0
  117. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/buckets/TokenBucket.py +0 -0
  118. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/interviews/InterviewExceptionCollection.py +0 -0
  119. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/interviews/InterviewExceptionEntry.py +0 -0
  120. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/interviews/InterviewStatistic.py +0 -0
  121. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/interviews/InterviewStatisticsCollection.py +0 -0
  122. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/interviews/InterviewStatusDictionary.py +0 -0
  123. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/interviews/InterviewStatusLog.py +0 -0
  124. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/interviews/InterviewStatusMixin.py +0 -0
  125. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/interviews/ReportErrors.py +0 -0
  126. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/interviews/interview_status_enum.py +0 -0
  127. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/runners/JobsRunnerStatus.py +0 -0
  128. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/runners/JobsRunnerStatusData.py +0 -0
  129. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/tasks/QuestionTaskCreator.py +0 -0
  130. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/tasks/TaskCreators.py +0 -0
  131. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/tasks/TaskHistory.py +0 -0
  132. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/tasks/TaskStatusLog.py +0 -0
  133. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/tasks/task_management.py +0 -0
  134. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/tasks/task_status_enum.py +0 -0
  135. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/tokens/InterviewTokenUsage.py +0 -0
  136. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/jobs/tokens/TokenUsage.py +0 -0
  137. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/language_models/ModelList.py +0 -0
  138. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/language_models/RegisterLanguageModelsMeta.py +0 -0
  139. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/language_models/__init__.py +0 -0
  140. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/language_models/fake_openai_call.py +0 -0
  141. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/language_models/fake_openai_service.py +0 -0
  142. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/language_models/registry.py +0 -0
  143. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/language_models/repair.py +0 -0
  144. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/language_models/unused/ReplicateBase.py +0 -0
  145. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/notebooks/Notebook.py +0 -0
  146. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/notebooks/__init__.py +0 -0
  147. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/Prompt.py +0 -0
  148. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/QuestionInstructionsBase.py +0 -0
  149. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/__init__.py +0 -0
  150. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/library/agent_instructions.py +0 -0
  151. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/library/agent_persona.py +0 -0
  152. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/library/question_budget.py +0 -0
  153. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/library/question_checkbox.py +0 -0
  154. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/library/question_extract.py +0 -0
  155. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/library/question_freetext.py +0 -0
  156. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/library/question_linear_scale.py +0 -0
  157. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/library/question_list.py +0 -0
  158. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/library/question_multiple_choice.py +0 -0
  159. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/library/question_numerical.py +0 -0
  160. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/library/question_rank.py +0 -0
  161. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/prompt_config.py +0 -0
  162. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/prompts/registry.py +0 -0
  163. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/AnswerValidatorMixin.py +0 -0
  164. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/QuestionBaseGenMixin.py +0 -0
  165. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/QuestionBasePromptsMixin.py +0 -0
  166. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/QuestionBudget.py +0 -0
  167. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/QuestionCheckBox.py +0 -0
  168. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/QuestionExtract.py +0 -0
  169. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/QuestionFreeText.py +0 -0
  170. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/QuestionFunctional.py +0 -0
  171. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/QuestionList.py +0 -0
  172. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/QuestionNumerical.py +0 -0
  173. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/QuestionRank.py +0 -0
  174. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/Quick.py +0 -0
  175. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/RegisterQuestionsMeta.py +0 -0
  176. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/ResponseValidatorABC.py +0 -0
  177. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/SimpleAskMixin.py +0 -0
  178. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/__init__.py +0 -0
  179. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/compose_questions.py +0 -0
  180. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/decorators.py +0 -0
  181. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/derived/QuestionLikertFive.py +0 -0
  182. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/derived/QuestionLinearScale.py +0 -0
  183. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/derived/QuestionTopK.py +0 -0
  184. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/derived/QuestionYesNo.py +0 -0
  185. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/derived/__init__.py +0 -0
  186. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/descriptors.py +0 -0
  187. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/prompt_templates/question_budget.jinja +0 -0
  188. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/prompt_templates/question_checkbox.jinja +0 -0
  189. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/prompt_templates/question_extract.jinja +0 -0
  190. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/prompt_templates/question_free_text.jinja +0 -0
  191. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/prompt_templates/question_linear_scale.jinja +0 -0
  192. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/prompt_templates/question_list.jinja +0 -0
  193. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/prompt_templates/question_multiple_choice.jinja +0 -0
  194. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/prompt_templates/question_numerical.jinja +0 -0
  195. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/question_registry.py +0 -0
  196. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/settings.py +0 -0
  197. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/__init__.py +0 -0
  198. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/budget/__init__.py +0 -0
  199. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/budget/answering_instructions.jinja +0 -0
  200. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/budget/question_presentation.jinja +0 -0
  201. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/checkbox/__init__.py +0 -0
  202. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/checkbox/answering_instructions.jinja +0 -0
  203. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/checkbox/question_presentation.jinja +0 -0
  204. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/extract/__init__.py +0 -0
  205. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/extract/answering_instructions.jinja +0 -0
  206. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/extract/question_presentation.jinja +0 -0
  207. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/free_text/__init__.py +0 -0
  208. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/free_text/answering_instructions.jinja +0 -0
  209. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/free_text/question_presentation.jinja +0 -0
  210. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/likert_five/__init__.py +0 -0
  211. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/likert_five/answering_instructions.jinja +0 -0
  212. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/likert_five/question_presentation.jinja +0 -0
  213. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/linear_scale/__init__.py +0 -0
  214. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/linear_scale/answering_instructions.jinja +0 -0
  215. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/linear_scale/question_presentation.jinja +0 -0
  216. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/list/__init__.py +0 -0
  217. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/list/answering_instructions.jinja +0 -0
  218. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/list/question_presentation.jinja +0 -0
  219. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/multiple_choice/__init__.py +0 -0
  220. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/multiple_choice/answering_instructions.jinja +0 -0
  221. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/multiple_choice/html.jinja +0 -0
  222. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/multiple_choice/question_presentation.jinja +0 -0
  223. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/numerical/__init__.py +0 -0
  224. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/numerical/question_presentation.jinja +0 -0
  225. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/rank/__init__.py +0 -0
  226. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/rank/answering_instructions.jinja +0 -0
  227. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/rank/question_presentation.jinja +0 -0
  228. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/top_k/__init__.py +0 -0
  229. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/top_k/answering_instructions.jinja +0 -0
  230. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/top_k/question_presentation.jinja +0 -0
  231. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/yes_no/__init__.py +0 -0
  232. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/yes_no/answering_instructions.jinja +0 -0
  233. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/questions/templates/yes_no/question_presentation.jinja +0 -0
  234. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/results/Dataset.py +0 -0
  235. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/results/DatasetExportMixin.py +0 -0
  236. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/results/DatasetTree.py +0 -0
  237. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/results/Result.py +0 -0
  238. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/results/Results.py +0 -0
  239. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/results/ResultsDBMixin.py +0 -0
  240. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/results/ResultsExportMixin.py +0 -0
  241. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/results/ResultsFetchMixin.py +0 -0
  242. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/results/ResultsGGMixin.py +0 -0
  243. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/results/ResultsToolsMixin.py +0 -0
  244. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/results/Selector.py +0 -0
  245. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/results/__init__.py +0 -0
  246. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/results/tree_explore.py +0 -0
  247. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/scenarios/Scenario.py +0 -0
  248. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/scenarios/ScenarioHtmlMixin.py +0 -0
  249. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/scenarios/ScenarioListExportMixin.py +0 -0
  250. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/scenarios/ScenarioListPdfMixin.py +0 -0
  251. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/scenarios/__init__.py +0 -0
  252. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/shared.py +0 -0
  253. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/study/ObjectEntry.py +0 -0
  254. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/study/ProofOfWork.py +0 -0
  255. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/study/SnapShot.py +0 -0
  256. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/study/Study.py +0 -0
  257. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/study/__init__.py +0 -0
  258. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/DAG.py +0 -0
  259. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/Memory.py +0 -0
  260. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/MemoryPlan.py +0 -0
  261. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/Rule.py +0 -0
  262. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/RuleCollection.py +0 -0
  263. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/Survey.py +0 -0
  264. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/SurveyCSS.py +0 -0
  265. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/SurveyExportMixin.py +0 -0
  266. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/SurveyFlowVisualizationMixin.py +0 -0
  267. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/SurveyQualtricsImport.py +0 -0
  268. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/__init__.py +0 -0
  269. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/descriptors.py +0 -0
  270. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/instructions/ChangeInstruction.py +0 -0
  271. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/instructions/Instruction.py +0 -0
  272. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/instructions/InstructionCollection.py +0 -0
  273. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/surveys/instructions/__init__.py +0 -0
  274. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/templates/error_reporting/base.html +0 -0
  275. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/templates/error_reporting/exceptions_by_model.html +0 -0
  276. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/templates/error_reporting/exceptions_by_question_name.html +0 -0
  277. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/templates/error_reporting/exceptions_by_type.html +0 -0
  278. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/templates/error_reporting/interview_details.html +0 -0
  279. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/templates/error_reporting/interviews.html +0 -0
  280. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/templates/error_reporting/overview.html +0 -0
  281. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/templates/error_reporting/performance_plot.html +0 -0
  282. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/templates/error_reporting/report.css +0 -0
  283. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/templates/error_reporting/report.html +0 -0
  284. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/templates/error_reporting/report.js +0 -0
  285. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/tools/__init__.py +0 -0
  286. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/tools/clusters.py +0 -0
  287. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/tools/embeddings.py +0 -0
  288. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/tools/embeddings_plotting.py +0 -0
  289. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/tools/plotting.py +0 -0
  290. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/tools/summarize.py +0 -0
  291. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/utilities/SystemInfo.py +0 -0
  292. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/utilities/__init__.py +0 -0
  293. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/utilities/ast_utilities.py +0 -0
  294. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/utilities/data/Registry.py +0 -0
  295. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/utilities/data/__init__.py +0 -0
  296. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/utilities/data/scooter_results.json +0 -0
  297. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/utilities/decorators.py +0 -0
  298. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/utilities/gcp_bucket/__init__.py +0 -0
  299. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/utilities/gcp_bucket/cloud_storage.py +0 -0
  300. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/utilities/interface.py +0 -0
  301. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/utilities/repair_functions.py +0 -0
  302. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/utilities/restricted_python.py +0 -0
  303. {edsl-0.1.34.dev1 → edsl-0.1.35}/edsl/utilities/utilities.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edsl
3
- Version: 0.1.34.dev1
3
+ Version: 0.1.35
4
4
  Summary: Create and analyze LLM-based surveys
5
5
  Home-page: https://www.expectedparrot.com/
6
6
  License: MIT
@@ -0,0 +1 @@
1
+ __version__ = "0.1.35"
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
  from typing import Dict, Any, Optional, Set
3
3
  from collections import UserList
4
- import enum
4
+ import pdb
5
5
 
6
6
  from jinja2 import Environment, meta
7
7
 
@@ -172,7 +172,6 @@ class PromptConstructor:
172
172
  """
173
173
  # The user might have passed a custom prompt, which would be stored in _question_instructions_prompt
174
174
  if not hasattr(self, "_question_instructions_prompt"):
175
-
176
175
  # Gets the instructions for the question - this is how the question should be answered
177
176
  question_prompt = self.question.get_instructions(model=self.model.model)
178
177
 
@@ -198,14 +197,15 @@ class PromptConstructor:
198
197
  self.question.question_options = question_options
199
198
 
200
199
  # might be getting it from the prior answers
201
- if isinstance(
202
- question_options := self.prior_answers_dict()
203
- .get(question_option_key)
204
- .answer,
205
- list,
206
- ):
207
- question_data["question_options"] = question_options
208
- self.question.question_options = question_options
200
+ if self.prior_answers_dict().get(question_option_key) is not None:
201
+ if isinstance(
202
+ question_options := self.prior_answers_dict()
203
+ .get(question_option_key)
204
+ .answer,
205
+ list,
206
+ ):
207
+ question_data["question_options"] = question_options
208
+ self.question.question_options = question_options
209
209
 
210
210
  replacement_dict = (
211
211
  {key: f"<see file {key}>" for key in self.scenario_file_keys}
@@ -241,10 +241,13 @@ class PromptConstructor:
241
241
  )
242
242
 
243
243
  if undefined_template_variables:
244
- # breakpoint()
245
- raise QuestionScenarioRenderError(
246
- f"Question instructions still has variables: {undefined_template_variables}."
247
- )
244
+ msg = f"Question instructions still has variables: {undefined_template_variables}."
245
+ import warnings
246
+
247
+ warnings.warn(msg)
248
+ # raise QuestionScenarioRenderError(
249
+ # f"Question instructions still has variables: {undefined_template_variables}."
250
+ # )
248
251
 
249
252
  ####################################
250
253
  # Check if question has instructions - these are instructions in a Survey that can apply to multiple follow-on questions
@@ -188,12 +188,16 @@ class OpenAIService(InferenceServiceABC):
188
188
  else:
189
189
  content = user_prompt
190
190
  client = self.async_client()
191
+
191
192
  messages = [
192
193
  {"role": "system", "content": system_prompt},
193
194
  {"role": "user", "content": content},
194
195
  ]
195
- if system_prompt == "" and self.omit_system_prompt_if_empty:
196
+ if (
197
+ system_prompt == "" and self.omit_system_prompt_if_empty
198
+ ) or "o1" in self.model:
196
199
  messages = messages[1:]
200
+
197
201
  params = {
198
202
  "model": self.model,
199
203
  "messages": messages,
@@ -205,7 +209,14 @@ class OpenAIService(InferenceServiceABC):
205
209
  "logprobs": self.logprobs,
206
210
  "top_logprobs": self.top_logprobs if self.logprobs else None,
207
211
  }
208
- response = await client.chat.completions.create(**params)
212
+ if "o1" in self.model:
213
+ params.pop("max_tokens")
214
+ params["max_completion_tokens"] = self.max_tokens
215
+ params["temperature"] = 1
216
+ try:
217
+ response = await client.chat.completions.create(**params)
218
+ except Exception as e:
219
+ print(e)
209
220
  return response.model_dump()
210
221
 
211
222
  LLM.__name__ = "LanguageModel"
@@ -145,14 +145,21 @@ class Jobs(Base):
145
145
  >>> Jobs.example().prompts()
146
146
  Dataset(...)
147
147
  """
148
+ from edsl import Coop
149
+
150
+ c = Coop()
151
+ price_lookup = c.fetch_prices()
148
152
 
149
153
  interviews = self.interviews()
150
154
  # data = []
151
155
  interview_indices = []
152
- question_indices = []
156
+ question_names = []
153
157
  user_prompts = []
154
158
  system_prompts = []
155
159
  scenario_indices = []
160
+ agent_indices = []
161
+ models = []
162
+ costs = []
156
163
  from edsl.results.Dataset import Dataset
157
164
 
158
165
  for interview_index, interview in enumerate(interviews):
@@ -160,23 +167,97 @@ class Jobs(Base):
160
167
  interview._get_invigilator(question)
161
168
  for question in self.survey.questions
162
169
  ]
163
- # list(interview._build_invigilators(debug=False))
164
170
  for _, invigilator in enumerate(invigilators):
165
171
  prompts = invigilator.get_prompts()
166
- user_prompts.append(prompts["user_prompt"])
167
- system_prompts.append(prompts["system_prompt"])
172
+ user_prompt = prompts["user_prompt"]
173
+ system_prompt = prompts["system_prompt"]
174
+ user_prompts.append(user_prompt)
175
+ system_prompts.append(system_prompt)
176
+ agent_index = self.agents.index(invigilator.agent)
177
+ agent_indices.append(agent_index)
168
178
  interview_indices.append(interview_index)
169
- scenario_indices.append(invigilator.scenario)
170
- question_indices.append(invigilator.question.question_name)
171
- return Dataset(
179
+ scenario_index = self.scenarios.index(invigilator.scenario)
180
+ scenario_indices.append(scenario_index)
181
+ models.append(invigilator.model.model)
182
+ question_names.append(invigilator.question.question_name)
183
+ # cost calculation
184
+ key = (invigilator.model._inference_service_, invigilator.model.model)
185
+ relevant_prices = price_lookup[key]
186
+ inverse_output_price = relevant_prices["output"]["one_usd_buys"]
187
+ inverse_input_price = relevant_prices["input"]["one_usd_buys"]
188
+ input_tokens = len(str(user_prompt) + str(system_prompt)) // 4
189
+ output_tokens = len(str(user_prompt) + str(system_prompt)) // 4
190
+ cost = input_tokens / float(
191
+ inverse_input_price
192
+ ) + output_tokens / float(inverse_output_price)
193
+ costs.append(cost)
194
+
195
+ d = Dataset(
172
196
  [
173
- {"interview_index": interview_indices},
174
- {"question_index": question_indices},
175
197
  {"user_prompt": user_prompts},
176
- {"scenario_index": scenario_indices},
177
198
  {"system_prompt": system_prompts},
199
+ {"interview_index": interview_indices},
200
+ {"question_name": question_names},
201
+ {"scenario_index": scenario_indices},
202
+ {"agent_index": agent_indices},
203
+ {"model": models},
204
+ {"estimated_cost": costs},
178
205
  ]
179
206
  )
207
+ return d
208
+ # if table:
209
+ # d.to_scenario_list().print(format="rich")
210
+ # else:
211
+ # return d
212
+
213
+ def show_prompts(self) -> None:
214
+ """Print the prompts."""
215
+ self.prompts().to_scenario_list().print(format="rich")
216
+
217
+ def estimate_job_cost(self):
218
+ from edsl import Coop
219
+
220
+ c = Coop()
221
+ price_lookup = c.fetch_prices()
222
+
223
+ prompts = self.prompts()
224
+
225
+ text_len = 0
226
+ for prompt in prompts:
227
+ text_len += len(str(prompt))
228
+
229
+ input_token_aproximations = text_len // 4
230
+
231
+ aproximation_cost = {}
232
+ total_cost = 0
233
+ for model in self.models:
234
+ key = (model._inference_service_, model.model)
235
+ relevant_prices = price_lookup[key]
236
+ inverse_output_price = relevant_prices["output"]["one_usd_buys"]
237
+ inverse_input_price = relevant_prices["input"]["one_usd_buys"]
238
+
239
+ aproximation_cost[key] = {
240
+ "input": input_token_aproximations / float(inverse_input_price),
241
+ "output": input_token_aproximations / float(inverse_output_price),
242
+ }
243
+ ##TODO curenlty we approximate the number of output tokens with the number
244
+ # of input tokens. A better solution will be to compute the quesiton answer options length and sum them
245
+ # to compute the output tokens
246
+
247
+ total_cost += input_token_aproximations / float(inverse_input_price)
248
+ total_cost += input_token_aproximations / float(inverse_output_price)
249
+
250
+ # multiply_factor = len(self.agents or [1]) * len(self.scenarios or [1])
251
+ multiply_factor = 1
252
+ out = {
253
+ "input_token_aproximations": input_token_aproximations,
254
+ "models_costs": aproximation_cost,
255
+ "estimated_total_cost": total_cost * multiply_factor,
256
+ "multiply_factor": multiply_factor,
257
+ "single_config_cost": total_cost,
258
+ }
259
+
260
+ return out
180
261
 
181
262
  @staticmethod
182
263
  def _get_container_class(object):
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
  import asyncio
5
5
  from typing import Any, Type, List, Generator, Optional, Union
6
+ import copy
6
7
 
7
8
  from tenacity import (
8
9
  retry,
@@ -99,15 +100,17 @@ class Interview(InterviewStatusMixin):
99
100
 
100
101
  """
101
102
  self.agent = agent
102
- self.survey = survey
103
+ # what I would like to do
104
+ self.survey = copy.deepcopy(survey) # survey copy.deepcopy(survey)
105
+ # self.survey = survey
103
106
  self.scenario = scenario
104
107
  self.model = model
105
108
  self.debug = debug
106
109
  self.iteration = iteration
107
110
  self.cache = cache
108
- self.answers: dict[str, str] = (
109
- Answers()
110
- ) # will get filled in as interview progresses
111
+ self.answers: dict[
112
+ str, str
113
+ ] = Answers() # will get filled in as interview progresses
111
114
  self.sidecar_model = sidecar_model
112
115
 
113
116
  # self.stop_on_exception = False
@@ -428,11 +431,11 @@ class Interview(InterviewStatusMixin):
428
431
  """
429
432
  current_question_index: int = self.to_index[current_question.question_name]
430
433
 
431
- next_question: Union[int, EndOfSurvey] = (
432
- self.survey.rule_collection.next_question(
433
- q_now=current_question_index,
434
- answers=self.answers | self.scenario | self.agent["traits"],
435
- )
434
+ next_question: Union[
435
+ int, EndOfSurvey
436
+ ] = self.survey.rule_collection.next_question(
437
+ q_now=current_question_index,
438
+ answers=self.answers | self.scenario | self.agent["traits"],
436
439
  )
437
440
 
438
441
  next_question_index = next_question.next_q
@@ -173,19 +173,19 @@ class JobsRunnerAsyncio:
173
173
 
174
174
  prompt_dictionary = {}
175
175
  for answer_key_name in answer_key_names:
176
- prompt_dictionary[answer_key_name + "_user_prompt"] = (
177
- question_name_to_prompts[answer_key_name]["user_prompt"]
178
- )
179
- prompt_dictionary[answer_key_name + "_system_prompt"] = (
180
- question_name_to_prompts[answer_key_name]["system_prompt"]
181
- )
176
+ prompt_dictionary[
177
+ answer_key_name + "_user_prompt"
178
+ ] = question_name_to_prompts[answer_key_name]["user_prompt"]
179
+ prompt_dictionary[
180
+ answer_key_name + "_system_prompt"
181
+ ] = question_name_to_prompts[answer_key_name]["system_prompt"]
182
182
 
183
183
  raw_model_results_dictionary = {}
184
184
  for result in valid_results:
185
185
  question_name = result.question_name
186
- raw_model_results_dictionary[question_name + "_raw_model_response"] = (
187
- result.raw_model_response
188
- )
186
+ raw_model_results_dictionary[
187
+ question_name + "_raw_model_response"
188
+ ] = result.raw_model_response
189
189
  raw_model_results_dictionary[question_name + "_cost"] = result.cost
190
190
  one_use_buys = (
191
191
  "NA"
@@ -490,7 +490,7 @@ class LanguageModel(
490
490
  "user_prompt": user_prompt,
491
491
  "system_prompt": system_prompt,
492
492
  "files_list": files_list
493
- #**({"encoded_image": encoded_image} if encoded_image else {}),
493
+ # **({"encoded_image": encoded_image} if encoded_image else {}),
494
494
  }
495
495
  # response = await f(**params)
496
496
  response = await asyncio.wait_for(f(**params), timeout=TIMEOUT)
@@ -534,7 +534,7 @@ class LanguageModel(
534
534
  system_prompt: str,
535
535
  cache: "Cache",
536
536
  iteration: int = 1,
537
- files_list: Optional[List['File']] = None,
537
+ files_list: Optional[List["File"]] = None,
538
538
  ) -> dict:
539
539
  """Get response, parse, and return as string.
540
540
 
@@ -40,8 +40,10 @@ def create_language_model(
40
40
  _tpm = 1000000000000
41
41
 
42
42
  async def async_execute_model_call(
43
- self, user_prompt: str, system_prompt: str,
44
- files_list: Optional[List[Any]] = None
43
+ self,
44
+ user_prompt: str,
45
+ system_prompt: str,
46
+ files_list: Optional[List[Any]] = None,
45
47
  ) -> dict[str, Any]:
46
48
  question_number = int(
47
49
  user_prompt.split("XX")[1]
@@ -82,7 +82,8 @@ class QuestionBase(
82
82
  if not hasattr(self, "_fake_data_factory"):
83
83
  from polyfactory.factories.pydantic_factory import ModelFactory
84
84
 
85
- class FakeData(ModelFactory[self.response_model]): ...
85
+ class FakeData(ModelFactory[self.response_model]):
86
+ ...
86
87
 
87
88
  self._fake_data_factory = FakeData
88
89
  return self._fake_data_factory
@@ -120,9 +120,9 @@ class QuestionMultipleChoice(QuestionBase):
120
120
 
121
121
  question_type = "multiple_choice"
122
122
  purpose = "When options are known and limited"
123
- question_options: Union[list[str], list[list], list[float], list[int]] = (
124
- QuestionOptionsDescriptor()
125
- )
123
+ question_options: Union[
124
+ list[str], list[list], list[float], list[int]
125
+ ] = QuestionOptionsDescriptor()
126
126
  _response_model = None
127
127
  response_validator_class = MultipleChoiceResponseValidator
128
128
 
@@ -1,7 +1,6 @@
1
1
  This question requires a numerical response in the form of an integer or decimal (e.g., -12, 0, 1, 2, 3.45, ...).
2
2
  Respond with just your number on a single line.
3
3
  If your response is equivalent to zero, report '0'
4
- If you cannot determine the answer, report 'None'
5
4
 
6
5
  {% if include_comment %}
7
6
  After the answer, put a comment explaining your choice on the next line.
@@ -263,7 +263,6 @@ class FileStore(Scenario):
263
263
 
264
264
 
265
265
  class CSVFileStore(FileStore):
266
-
267
266
  @classmethod
268
267
  def example(cls):
269
268
  from edsl.results.Results import Results
@@ -282,7 +281,6 @@ class CSVFileStore(FileStore):
282
281
 
283
282
 
284
283
  class PDFFileStore(FileStore):
285
-
286
284
  def view(self):
287
285
  pdf_path = self.to_tempfile()
288
286
  print(f"PDF path: {pdf_path}") # Print the path to ensure it exists
@@ -358,7 +356,6 @@ class PDFFileStore(FileStore):
358
356
 
359
357
 
360
358
  class PNGFileStore(FileStore):
361
-
362
359
  @classmethod
363
360
  def example(cls):
364
361
  import textwrap
@@ -382,7 +379,6 @@ class PNGFileStore(FileStore):
382
379
 
383
380
 
384
381
  class SQLiteFileStore(FileStore):
385
-
386
382
  @classmethod
387
383
  def example(cls):
388
384
  import sqlite3
@@ -405,7 +401,6 @@ class SQLiteFileStore(FileStore):
405
401
 
406
402
 
407
403
  class HTMLFileStore(FileStore):
408
-
409
404
  @classmethod
410
405
  def example(cls):
411
406
  import tempfile
@@ -39,6 +39,15 @@ class ScenarioList(Base, UserList, ScenarioListMixin):
39
39
  super().__init__([])
40
40
  self.codebook = codebook or {}
41
41
 
42
+ def unique(self) -> ScenarioList:
43
+ """Return a list of unique scenarios.
44
+
45
+ >>> s = ScenarioList([Scenario({'a': 1}), Scenario({'a': 1}), Scenario({'a': 2})])
46
+ >>> s.unique()
47
+ ScenarioList([Scenario({'a': 1}), Scenario({'a': 2})])
48
+ """
49
+ return ScenarioList(list(set(self)))
50
+
42
51
  @property
43
52
  def has_jinja_braces(self) -> bool:
44
53
  """Check if the ScenarioList has Jinja braces."""
@@ -36,6 +36,10 @@ class EndOfSurveyParent:
36
36
  """
37
37
  return self
38
38
 
39
+ def __deepcopy__(self, memo):
40
+ # Return the same instance when deepcopy is called
41
+ return self
42
+
39
43
  def __radd__(self, other):
40
44
  """Add the object to another object.
41
45
 
@@ -1,28 +1,19 @@
1
1
  [build-system]
2
2
  build-backend = "poetry.core.masonry.api"
3
- requires = [ "poetry-core", "setuptools<72.0",]
3
+ requires = ["poetry-core", "setuptools<72.0"]
4
4
 
5
5
  [tool.poetry]
6
- authors = [ "Apostolos Filippas <apostolos@expectedparrot.com>", "John Horton <john@expectedparrot.com>", "Robin Horton <robin@expectedparrot.com>",]
7
- classifiers = [ "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Libraries :: Application Frameworks", "Topic :: Software Development :: Libraries :: Python Modules",]
6
+ authors = ["Apostolos Filippas <apostolos@expectedparrot.com>", "John Horton <john@expectedparrot.com>", "Robin Horton <robin@expectedparrot.com>"]
7
+ classifiers = ["Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Libraries :: Application Frameworks", "Topic :: Software Development :: Libraries :: Python Modules"]
8
8
  description = "Create and analyze LLM-based surveys"
9
9
  documentation = "https://docs.expectedparrot.com"
10
10
  homepage = "https://www.expectedparrot.com/"
11
- include = [ "edsl/questions/templates/**/*",]
12
- keywords = [ "LLM", "social science", "surveys", "user research",]
11
+ include = ["edsl/questions/templates/**/*"]
12
+ keywords = ["LLM", "social science", "surveys", "user research"]
13
13
  license = "MIT"
14
14
  name = "edsl"
15
15
  readme = "README.md"
16
- version = "0.1.34.dev1"
17
- [[tool.poetry.packages]]
18
- include = "edsl"
19
-
20
- [tool.tomlsort]
21
- all = true
22
- in_place = true
23
- spaces_before_inline_comment = 2
24
- spaces_indent_inline_array = 4
25
- trailing_comma_inline_array = true
16
+ version = "0.1.35"
26
17
 
27
18
  [tool.poetry.dependencies]
28
19
  python = ">=3.9.1,<3.13"
@@ -58,12 +49,9 @@ urllib3 = ">=1.25.4,<1.27"
58
49
  google-generativeai = "^0.8.2"
59
50
 
60
51
  [tool.poetry.dependencies.black]
61
- extras = [ "jupyter",]
52
+ extras = ["jupyter"]
62
53
  version = "^24.4.2"
63
54
 
64
- [tool.tomlsort.overrides."tool.poetry.dependencies"]
65
- table_keys = false
66
-
67
55
  [tool.poetry.group.dev.dependencies]
68
56
  coverage = "^7.3.3"
69
57
  fastapi = "^0.112.1"
@@ -89,3 +77,16 @@ sphinx-rtd-theme = "^2.0.0"
89
77
  toml = "^0.10.2"
90
78
  toml-sort = "^0.23.1"
91
79
  uvicorn = "^0.30.6"
80
+
81
+ [[tool.poetry.packages]]
82
+ include = "edsl"
83
+
84
+ [tool.tomlsort]
85
+ all = true
86
+ in_place = true
87
+ spaces_before_inline_comment = 2
88
+ spaces_indent_inline_array = 4
89
+ trailing_comma_inline_array = true
90
+
91
+ [tool.tomlsort.overrides."tool.poetry.dependencies"]
92
+ table_keys = false
@@ -1 +0,0 @@
1
- __version__ = "0.1.34.dev1"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes