edsl 0.1.42__tar.gz → 0.1.44__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.
- {edsl-0.1.42 → edsl-0.1.44}/PKG-INFO +3 -4
- {edsl-0.1.42 → edsl-0.1.44}/README.md +1 -1
- {edsl-0.1.42 → edsl-0.1.44}/edsl/Base.py +15 -6
- edsl-0.1.44/edsl/__version__.py +1 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/agents/Invigilator.py +1 -1
- {edsl-0.1.42 → edsl-0.1.44}/edsl/agents/PromptConstructor.py +92 -21
- {edsl-0.1.42 → edsl-0.1.44}/edsl/agents/QuestionInstructionPromptBuilder.py +68 -9
- {edsl-0.1.42 → edsl-0.1.44}/edsl/agents/prompt_helpers.py +2 -2
- {edsl-0.1.42 → edsl-0.1.44}/edsl/coop/coop.py +100 -22
- {edsl-0.1.42 → edsl-0.1.44}/edsl/enums.py +3 -1
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/coop.py +4 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/AnthropicService.py +2 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/AvailableModelFetcher.py +4 -1
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/GoogleService.py +2 -0
- edsl-0.1.44/edsl/inference_services/GrokService.py +11 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/InferenceServiceABC.py +1 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/OpenAIService.py +1 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/TestService.py +1 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/registry.py +2 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/Jobs.py +54 -35
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/JobsChecks.py +7 -7
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/JobsPrompts.py +57 -6
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/JobsRemoteInferenceHandler.py +41 -25
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/buckets/BucketCollection.py +30 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/data_structures.py +1 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/LanguageModel.py +5 -2
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/key_management/KeyLookupBuilder.py +47 -20
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/key_management/models.py +10 -4
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/model.py +43 -11
- {edsl-0.1.42 → edsl-0.1.44}/edsl/prompts/Prompt.py +124 -61
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/descriptors.py +32 -18
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/question_base_gen_mixin.py +1 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/DatasetExportMixin.py +35 -6
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/Results.py +180 -1
- edsl-0.1.44/edsl/results/ResultsGGMixin.py +178 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/FileStore.py +19 -8
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/Scenario.py +33 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/ScenarioList.py +22 -3
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/ScenarioListPdfMixin.py +9 -3
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/Survey.py +27 -6
- {edsl-0.1.42 → edsl-0.1.44}/pyproject.toml +2 -3
- edsl-0.1.42/edsl/__version__.py +0 -1
- edsl-0.1.42/edsl/results/ResultsGGMixin.py +0 -121
- {edsl-0.1.42 → edsl-0.1.44}/LICENSE +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/BaseDiff.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/TemplateLoader.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/agents/Agent.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/agents/AgentList.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/agents/InvigilatorBase.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/agents/QuestionTemplateReplacementsBuilder.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/agents/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/agents/descriptors.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/agents/question_option_processor.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/auto/AutoStudy.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/auto/StageBase.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/auto/StageGenerateSurvey.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/auto/StageLabelQuestions.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/auto/StagePersona.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/auto/StagePersonaDimensionValueRanges.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/auto/StagePersonaDimensionValues.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/auto/StagePersonaDimensions.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/auto/StageQuestions.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/auto/SurveyCreatorPipeline.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/auto/utilities.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/base/Base.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/config.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/conversation/Conversation.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/conversation/car_buying.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/conversation/chips.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/conversation/mug_negotiation.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/conversation/next_speaker_utilities.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/coop/CoopFunctionsMixin.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/coop/ExpectedParrotKeyHandler.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/coop/PriceFetcher.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/coop/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/coop/utils.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/data/Cache.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/data/CacheEntry.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/data/CacheHandler.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/data/RemoteCacheSync.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/data/SQLiteDict.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/data/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/data/orm.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/data_transfer_models.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/BaseException.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/agents.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/cache.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/configuration.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/data.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/general.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/inference_services.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/jobs.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/language_models.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/prompts.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/questions.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/results.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/scenarios.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/exceptions/surveys.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/AvailableModelCacheHandler.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/AwsBedrock.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/AzureAI.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/DeepInfraService.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/DeepSeekService.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/GroqService.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/InferenceServicesCollection.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/MistralAIService.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/OllamaService.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/PerplexityService.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/ServiceAvailability.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/TogetherAIService.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/data_structures.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/models_available_cache.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/rate_limits_cache.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/inference_services/write_available.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/AnswerQuestionFunctionConstructor.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/Answers.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/FetchInvigilator.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/InterviewTaskManager.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/InterviewsConstructor.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/JobsComponentConstructor.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/JobsRemoteInferenceLogger.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/RequestTokenEstimator.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/async_interview_runner.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/buckets/ModelBuckets.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/buckets/TokenBucket.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/buckets/TokenBucketAPI.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/buckets/TokenBucketClient.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/check_survey_scenario_compatibility.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/decorators.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/interviews/Interview.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/interviews/InterviewExceptionCollection.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/interviews/InterviewExceptionEntry.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/interviews/InterviewStatistic.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/interviews/InterviewStatisticsCollection.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/interviews/InterviewStatusDictionary.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/interviews/InterviewStatusLog.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/interviews/ReportErrors.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/interviews/interview_status_enum.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/jobs_status_enums.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/loggers/HTMLTableJobLogger.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/results_exceptions_handler.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/runners/JobsRunnerAsyncio.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/runners/JobsRunnerStatus.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/runners/JobsRunnerStatusData.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/tasks/QuestionTaskCreator.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/tasks/TaskCreators.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/tasks/TaskHistory.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/tasks/TaskStatusLog.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/tasks/task_status_enum.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/tokens/InterviewTokenUsage.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/jobs/tokens/TokenUsage.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/ComputeCost.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/ModelList.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/PriceManager.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/RawResponseHandler.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/RegisterLanguageModelsMeta.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/ServiceDataSources.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/fake_openai_call.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/fake_openai_service.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/key_management/KeyLookup.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/key_management/KeyLookupCollection.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/key_management/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/repair.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/language_models/utilities.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/notebooks/Notebook.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/notebooks/NotebookToLaTeX.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/notebooks/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/prompts/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/ExceptionExplainer.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/HTMLQuestion.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/QuestionBase.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/QuestionBasePromptsMixin.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/QuestionBudget.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/QuestionCheckBox.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/QuestionDict.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/QuestionExtract.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/QuestionFreeText.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/QuestionFunctional.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/QuestionList.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/QuestionMatrix.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/QuestionMultipleChoice.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/QuestionNumerical.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/QuestionRank.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/Quick.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/SimpleAskMixin.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/answer_validator_mixin.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/compose_questions.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/data_structures.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/decorators.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/derived/QuestionLikertFive.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/derived/QuestionLinearScale.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/derived/QuestionTopK.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/derived/QuestionYesNo.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/derived/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/loop_processor.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/prompt_templates/question_budget.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/prompt_templates/question_checkbox.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/prompt_templates/question_extract.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/prompt_templates/question_free_text.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/prompt_templates/question_linear_scale.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/prompt_templates/question_list.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/prompt_templates/question_multiple_choice.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/prompt_templates/question_numerical.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/question_registry.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/register_questions_meta.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/response_validator_abc.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/response_validator_factory.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/settings.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/budget/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/budget/answering_instructions.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/budget/question_presentation.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/checkbox/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/checkbox/answering_instructions.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/checkbox/question_presentation.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/dict/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/dict/answering_instructions.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/dict/question_presentation.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/extract/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/extract/answering_instructions.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/extract/question_presentation.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/free_text/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/free_text/answering_instructions.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/free_text/question_presentation.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/likert_five/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/likert_five/answering_instructions.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/likert_five/question_presentation.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/linear_scale/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/linear_scale/answering_instructions.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/linear_scale/question_presentation.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/list/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/list/answering_instructions.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/list/question_presentation.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/matrix/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/matrix/answering_instructions.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/matrix/question_presentation.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/multiple_choice/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/multiple_choice/answering_instructions.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/multiple_choice/html.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/multiple_choice/question_presentation.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/numerical/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/numerical/answering_instructions.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/numerical/question_presentation.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/rank/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/rank/answering_instructions.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/rank/question_presentation.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/top_k/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/top_k/answering_instructions.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/top_k/question_presentation.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/yes_no/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/yes_no/answering_instructions.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/questions/templates/yes_no/question_presentation.jinja +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/CSSParameterizer.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/Dataset.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/DatasetTree.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/MarkdownToDocx.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/MarkdownToPDF.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/Result.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/ResultsExportMixin.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/TableDisplay.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/TextEditor.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/file_exports.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/results_fetch_mixin.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/results_selector.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/results_tools_mixin.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/smart_objects.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/table_data_class.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/table_display.css +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/table_renderers.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/results/tree_explore.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/ConstructDownloadLink.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/DocumentChunker.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/DocxScenario.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/PdfExtractor.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/ScenarioHtmlMixin.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/ScenarioListExportMixin.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/directory_scanner.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/file_methods.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/handlers/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/handlers/csv.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/handlers/docx.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/handlers/html.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/handlers/json.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/handlers/latex.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/handlers/md.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/handlers/pdf.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/handlers/png.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/handlers/pptx.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/handlers/py.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/handlers/sql.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/handlers/sqlite.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/handlers/txt.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/scenario_join.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/scenarios/scenario_selector.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/shared.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/study/ObjectEntry.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/study/ProofOfWork.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/study/SnapShot.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/study/Study.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/study/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/ConstructDAG.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/DAG.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/EditSurvey.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/InstructionHandler.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/Memory.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/MemoryManagement.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/MemoryPlan.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/Rule.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/RuleCollection.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/RuleManager.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/Simulator.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/SurveyCSS.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/SurveyExportMixin.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/SurveyFlowVisualization.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/SurveyQualtricsImport.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/SurveyToApp.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/base.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/descriptors.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/instructions/ChangeInstruction.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/instructions/Instruction.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/instructions/InstructionCollection.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/surveys/instructions/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/templates/error_reporting/base.html +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/templates/error_reporting/exceptions_by_model.html +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/templates/error_reporting/exceptions_by_question_name.html +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/templates/error_reporting/exceptions_by_type.html +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/templates/error_reporting/exceptions_table.html +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/templates/error_reporting/interview_details.html +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/templates/error_reporting/interviews.html +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/templates/error_reporting/overview.html +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/templates/error_reporting/performance_plot.html +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/templates/error_reporting/report.css +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/templates/error_reporting/report.html +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/templates/error_reporting/report.js +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/tools/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/tools/clusters.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/tools/embeddings.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/tools/embeddings_plotting.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/tools/plotting.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/tools/summarize.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/PrettyList.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/SystemInfo.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/ast_utilities.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/data/Registry.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/data/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/data/scooter_results.json +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/decorators.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/gcp_bucket/__init__.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/gcp_bucket/cloud_storage.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/interface.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/is_notebook.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/is_valid_variable_name.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/naming_utilities.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/remove_edsl_version.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/repair_functions.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/restricted_python.py +0 -0
- {edsl-0.1.42 → edsl-0.1.44}/edsl/utilities/utilities.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: edsl
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.44
|
4
4
|
Summary: Create and analyze LLM-based surveys
|
5
5
|
Home-page: https://www.expectedparrot.com/
|
6
6
|
License: MIT
|
@@ -17,7 +17,7 @@ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
17
17
|
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
18
18
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
19
19
|
Requires-Dist: aiohttp (>=3.9.1,<4.0.0)
|
20
|
-
Requires-Dist: anthropic (>=0.
|
20
|
+
Requires-Dist: anthropic (>=0.45.0,<0.46.0)
|
21
21
|
Requires-Dist: azure-ai-inference (>=1.0.0b3,<2.0.0)
|
22
22
|
Requires-Dist: black[jupyter] (>=24.4.2,<25.0.0)
|
23
23
|
Requires-Dist: boto3 (>=1.34.161,<2.0.0)
|
@@ -37,7 +37,6 @@ Requires-Dist: pandas (>=2.1.4,<3.0.0)
|
|
37
37
|
Requires-Dist: platformdirs (>=4.3.6,<5.0.0)
|
38
38
|
Requires-Dist: pydot (>=2.0.0,<3.0.0)
|
39
39
|
Requires-Dist: pygments (>=2.17.2,<3.0.0)
|
40
|
-
Requires-Dist: pymupdf (>=1.24.4,<2.0.0)
|
41
40
|
Requires-Dist: pypdf2 (>=3.0.1,<4.0.0)
|
42
41
|
Requires-Dist: pyreadstat (>=1.2.7,<2.0.0)
|
43
42
|
Requires-Dist: python-docx (>=1.1.0,<2.0.0)
|
@@ -107,5 +106,5 @@ See instructions on [storing API keys](https://docs.expectedparrot.com/en/latest
|
|
107
106
|
|
108
107
|
## 💡 Contributions, feature requests & bugs
|
109
108
|
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)
|
109
|
+
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
110
|
|
@@ -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).
|
@@ -64,17 +64,26 @@ class PersistenceMixin:
|
|
64
64
|
@classmethod
|
65
65
|
def pull(
|
66
66
|
cls,
|
67
|
-
|
68
|
-
|
69
|
-
expected_parrot_url: Optional[str] = None,
|
67
|
+
url_or_uuid: Optional[Union[str, UUID]] = None,
|
68
|
+
#expected_parrot_url: Optional[str] = None,
|
70
69
|
):
|
71
|
-
"""Pull the object from coop.
|
70
|
+
"""Pull the object from coop.
|
71
|
+
|
72
|
+
Args:
|
73
|
+
url_or_uuid: Either a UUID string or a URL pointing to the object
|
74
|
+
expected_parrot_url: Optional URL for the Parrot server
|
75
|
+
"""
|
72
76
|
from edsl.coop import Coop
|
73
77
|
from edsl.coop.utils import ObjectRegistry
|
74
78
|
|
75
79
|
object_type = ObjectRegistry.get_object_type_by_edsl_class(cls)
|
76
|
-
coop = Coop(
|
77
|
-
|
80
|
+
coop = Coop()
|
81
|
+
|
82
|
+
# Determine if input is URL or UUID
|
83
|
+
if url_or_uuid and ("http://" in str(url_or_uuid) or "https://" in str(url_or_uuid)):
|
84
|
+
return coop.get(url=url_or_uuid, expected_object_type=object_type)
|
85
|
+
else:
|
86
|
+
return coop.get(uuid=url_or_uuid, expected_object_type=object_type)
|
78
87
|
|
79
88
|
@classmethod
|
80
89
|
def delete(cls, uuid: Optional[Union[str, UUID]] = None, url: Optional[str] = None):
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.1.44"
|
@@ -156,7 +156,7 @@ class InvigilatorAI(InvigilatorBase):
|
|
156
156
|
self.question.question_options = new_question_options
|
157
157
|
|
158
158
|
question_with_validators = self.question.render(
|
159
|
-
self.scenario | prior_answers_dict
|
159
|
+
self.scenario | prior_answers_dict | {'agent':self.agent.traits}
|
160
160
|
)
|
161
161
|
question_with_validators.use_code = self.question.use_code
|
162
162
|
else:
|
@@ -1,6 +1,10 @@
|
|
1
1
|
from __future__ import annotations
|
2
|
-
from typing import Dict, Any, Optional, Set, Union, TYPE_CHECKING
|
2
|
+
from typing import Dict, Any, Optional, Set, Union, TYPE_CHECKING, Literal
|
3
3
|
from functools import cached_property
|
4
|
+
from multiprocessing import Pool, freeze_support, get_context
|
5
|
+
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
|
6
|
+
import time
|
7
|
+
import logging
|
4
8
|
|
5
9
|
from edsl.prompts.Prompt import Prompt
|
6
10
|
|
@@ -22,6 +26,7 @@ if TYPE_CHECKING:
|
|
22
26
|
from edsl.questions.QuestionBase import QuestionBase
|
23
27
|
from edsl.scenarios.Scenario import Scenario
|
24
28
|
|
29
|
+
logger = logging.getLogger(__name__)
|
25
30
|
|
26
31
|
class BasePlaceholder:
|
27
32
|
"""Base class for placeholder values when a question is not yet answered."""
|
@@ -242,31 +247,97 @@ class PromptConstructor:
|
|
242
247
|
question_name, self.current_answers
|
243
248
|
)
|
244
249
|
|
245
|
-
def get_prompts(self) -> Dict[str,
|
246
|
-
"""Get
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
)
|
261
|
-
|
250
|
+
def get_prompts(self, parallel: Literal["thread", "process", None] = None) -> Dict[str, Any]:
|
251
|
+
"""Get the prompts for the question."""
|
252
|
+
start = time.time()
|
253
|
+
|
254
|
+
# Build all the components
|
255
|
+
instr_start = time.time()
|
256
|
+
agent_instructions = self.agent_instructions_prompt
|
257
|
+
instr_end = time.time()
|
258
|
+
logger.debug(f"Time taken for agent instructions: {instr_end - instr_start:.4f}s")
|
259
|
+
|
260
|
+
persona_start = time.time()
|
261
|
+
agent_persona = self.agent_persona_prompt
|
262
|
+
persona_end = time.time()
|
263
|
+
logger.debug(f"Time taken for agent persona: {persona_end - persona_start:.4f}s")
|
264
|
+
|
265
|
+
q_instr_start = time.time()
|
266
|
+
question_instructions = self.question_instructions_prompt
|
267
|
+
q_instr_end = time.time()
|
268
|
+
logger.debug(f"Time taken for question instructions: {q_instr_end - q_instr_start:.4f}s")
|
269
|
+
|
270
|
+
memory_start = time.time()
|
271
|
+
prior_question_memory = self.prior_question_memory_prompt
|
272
|
+
memory_end = time.time()
|
273
|
+
logger.debug(f"Time taken for prior question memory: {memory_end - memory_start:.4f}s")
|
274
|
+
|
275
|
+
# Get components dict
|
276
|
+
components = {
|
277
|
+
"agent_instructions": agent_instructions.text,
|
278
|
+
"agent_persona": agent_persona.text,
|
279
|
+
"question_instructions": question_instructions.text,
|
280
|
+
"prior_question_memory": prior_question_memory.text,
|
281
|
+
}
|
282
|
+
|
283
|
+
# Use PromptPlan's get_prompts method
|
284
|
+
plan_start = time.time()
|
285
|
+
|
286
|
+
# Get arranged components first
|
287
|
+
arranged = self.prompt_plan.arrange_components(**components)
|
288
|
+
|
289
|
+
if parallel == "process":
|
290
|
+
ctx = get_context('fork')
|
291
|
+
with ctx.Pool() as pool:
|
292
|
+
results = pool.map(_process_prompt, [
|
293
|
+
(arranged["user_prompt"], {}),
|
294
|
+
(arranged["system_prompt"], {})
|
295
|
+
])
|
296
|
+
prompts = {
|
297
|
+
"user_prompt": results[0],
|
298
|
+
"system_prompt": results[1]
|
299
|
+
}
|
300
|
+
|
301
|
+
elif parallel == "thread":
|
302
|
+
with ThreadPoolExecutor() as executor:
|
303
|
+
user_prompt_list = arranged["user_prompt"]
|
304
|
+
system_prompt_list = arranged["system_prompt"]
|
305
|
+
|
306
|
+
# Process both prompt lists in parallel
|
307
|
+
rendered_user = executor.submit(_process_prompt, (user_prompt_list, {}))
|
308
|
+
rendered_system = executor.submit(_process_prompt, (system_prompt_list, {}))
|
309
|
+
|
310
|
+
prompts = {
|
311
|
+
"user_prompt": rendered_user.result(),
|
312
|
+
"system_prompt": rendered_system.result()
|
313
|
+
}
|
314
|
+
|
315
|
+
else: # sequential processing
|
316
|
+
prompts = self.prompt_plan.get_prompts(**components)
|
317
|
+
|
318
|
+
plan_end = time.time()
|
319
|
+
logger.debug(f"Time taken for prompt processing: {plan_end - plan_start:.4f}s")
|
320
|
+
|
321
|
+
# Handle file keys if present
|
322
|
+
if hasattr(self, 'question_file_keys') and self.question_file_keys:
|
323
|
+
files_start = time.time()
|
262
324
|
files_list = []
|
263
325
|
for key in self.question_file_keys:
|
264
326
|
files_list.append(self.scenario[key])
|
265
327
|
prompts["files_list"] = files_list
|
328
|
+
files_end = time.time()
|
329
|
+
logger.debug(f"Time taken for file key processing: {files_end - files_start:.4f}s")
|
330
|
+
|
331
|
+
end = time.time()
|
332
|
+
logger.debug(f"Total time in get_prompts: {end - start:.4f}s")
|
266
333
|
return prompts
|
267
334
|
|
268
335
|
|
269
|
-
|
270
|
-
|
336
|
+
def _process_prompt(args):
|
337
|
+
"""Helper function to process a single prompt list with its replacements."""
|
338
|
+
prompt_list, replacements = args
|
339
|
+
return prompt_list.reduce()
|
340
|
+
|
271
341
|
|
272
|
-
|
342
|
+
if __name__ == '__main__':
|
343
|
+
freeze_support()
|
@@ -1,5 +1,6 @@
|
|
1
1
|
from typing import Dict, List, Set
|
2
2
|
from warnings import warn
|
3
|
+
import logging
|
3
4
|
from edsl.prompts.Prompt import Prompt
|
4
5
|
|
5
6
|
from edsl.agents.QuestionTemplateReplacementsBuilder import (
|
@@ -23,12 +24,44 @@ class QuestionInstructionPromptBuilder:
|
|
23
24
|
Returns:
|
24
25
|
Prompt: The fully rendered question instructions
|
25
26
|
"""
|
27
|
+
import time
|
28
|
+
|
29
|
+
start = time.time()
|
30
|
+
|
31
|
+
# Create base prompt
|
32
|
+
base_start = time.time()
|
26
33
|
base_prompt = self._create_base_prompt()
|
34
|
+
base_end = time.time()
|
35
|
+
logging.debug(f"Time for base prompt: {base_end - base_start}")
|
36
|
+
|
37
|
+
# Enrich with options
|
38
|
+
enrich_start = time.time()
|
27
39
|
enriched_prompt = self._enrich_with_question_options(base_prompt)
|
40
|
+
enrich_end = time.time()
|
41
|
+
logging.debug(f"Time for enriching with options: {enrich_end - enrich_start}")
|
42
|
+
|
43
|
+
# Render prompt
|
44
|
+
render_start = time.time()
|
28
45
|
rendered_prompt = self._render_prompt(enriched_prompt)
|
46
|
+
render_end = time.time()
|
47
|
+
logging.debug(f"Time for rendering prompt: {render_end - render_start}")
|
48
|
+
|
49
|
+
# Validate template variables
|
50
|
+
validate_start = time.time()
|
29
51
|
self._validate_template_variables(rendered_prompt)
|
30
|
-
|
31
|
-
|
52
|
+
validate_end = time.time()
|
53
|
+
logging.debug(f"Time for template validation: {validate_end - validate_start}")
|
54
|
+
|
55
|
+
# Append survey instructions
|
56
|
+
append_start = time.time()
|
57
|
+
final_prompt = self._append_survey_instructions(rendered_prompt)
|
58
|
+
append_end = time.time()
|
59
|
+
logging.debug(f"Time for appending survey instructions: {append_end - append_start}")
|
60
|
+
|
61
|
+
end = time.time()
|
62
|
+
logging.debug(f"Total time in build_question_instructions: {end - start}")
|
63
|
+
|
64
|
+
return final_prompt
|
32
65
|
|
33
66
|
def _create_base_prompt(self) -> Dict:
|
34
67
|
"""Creates the initial prompt with basic question data.
|
@@ -50,14 +83,25 @@ class QuestionInstructionPromptBuilder:
|
|
50
83
|
Returns:
|
51
84
|
Dict: Enriched prompt data
|
52
85
|
"""
|
86
|
+
import time
|
87
|
+
|
88
|
+
start = time.time()
|
89
|
+
|
53
90
|
if "question_options" in prompt_data["data"]:
|
54
91
|
from edsl.agents.question_option_processor import QuestionOptionProcessor
|
55
|
-
|
92
|
+
|
93
|
+
processor_start = time.time()
|
56
94
|
question_options = QuestionOptionProcessor(
|
57
95
|
self.prompt_constructor
|
58
96
|
).get_question_options(question_data=prompt_data["data"])
|
59
|
-
|
97
|
+
processor_end = time.time()
|
98
|
+
logging.debug(f"Time to process question options: {processor_end - processor_start}")
|
99
|
+
|
60
100
|
prompt_data["data"]["question_options"] = question_options
|
101
|
+
|
102
|
+
end = time.time()
|
103
|
+
logging.debug(f"Total time in _enrich_with_question_options: {end - start}")
|
104
|
+
|
61
105
|
return prompt_data
|
62
106
|
|
63
107
|
def _render_prompt(self, prompt_data: Dict) -> Prompt:
|
@@ -69,11 +113,28 @@ class QuestionInstructionPromptBuilder:
|
|
69
113
|
Returns:
|
70
114
|
Prompt: Rendered instructions
|
71
115
|
"""
|
72
|
-
|
116
|
+
import time
|
117
|
+
|
118
|
+
start = time.time()
|
119
|
+
|
120
|
+
# Build replacement dict
|
121
|
+
dict_start = time.time()
|
73
122
|
replacement_dict = QTRB(self.prompt_constructor).build_replacement_dict(
|
74
123
|
prompt_data["data"]
|
75
124
|
)
|
76
|
-
|
125
|
+
dict_end = time.time()
|
126
|
+
logging.debug(f"Time to build replacement dict: {dict_end - dict_start}")
|
127
|
+
|
128
|
+
# Render with dict
|
129
|
+
render_start = time.time()
|
130
|
+
result = prompt_data["prompt"].render(replacement_dict)
|
131
|
+
render_end = time.time()
|
132
|
+
logging.debug(f"Time to render with dict: {render_end - render_start}")
|
133
|
+
|
134
|
+
end = time.time()
|
135
|
+
logging.debug(f"Total time in _render_prompt: {end - start}")
|
136
|
+
|
137
|
+
return result
|
77
138
|
|
78
139
|
def _validate_template_variables(self, rendered_prompt: Prompt) -> None:
|
79
140
|
"""Validates that all template variables have been properly replaced.
|
@@ -101,9 +162,7 @@ class QuestionInstructionPromptBuilder:
|
|
101
162
|
"""
|
102
163
|
for question_name in self.survey.question_names:
|
103
164
|
if question_name in undefined_vars:
|
104
|
-
|
105
|
-
f"Question name found in undefined_template_variables: {question_name}"
|
106
|
-
)
|
165
|
+
logging.warning(f"Question name found in undefined_template_variables: {question_name}")
|
107
166
|
|
108
167
|
def _append_survey_instructions(self, rendered_prompt: Prompt) -> Prompt:
|
109
168
|
"""Appends any relevant survey instructions to the rendered prompt.
|
@@ -124,6 +124,6 @@ class PromptPlan:
|
|
124
124
|
"""Get both prompts for the LLM call."""
|
125
125
|
prompts = self.arrange_components(**kwargs)
|
126
126
|
return {
|
127
|
-
"user_prompt": prompts["user_prompt"]
|
128
|
-
"system_prompt": prompts["system_prompt"]
|
127
|
+
"user_prompt": Prompt("".join(str(p) for p in prompts["user_prompt"])),
|
128
|
+
"system_prompt": Prompt("".join(str(p) for p in prompts["system_prompt"])),
|
129
129
|
}
|
@@ -4,17 +4,19 @@ import requests
|
|
4
4
|
|
5
5
|
from typing import Any, Optional, Union, Literal, TypedDict
|
6
6
|
from uuid import UUID
|
7
|
-
from collections import UserDict, defaultdict
|
8
7
|
|
9
8
|
import edsl
|
10
|
-
from pathlib import Path
|
11
9
|
|
12
10
|
from edsl.config import CONFIG
|
13
11
|
from edsl.data.CacheEntry import CacheEntry
|
14
12
|
from edsl.jobs.Jobs import Jobs
|
15
13
|
from edsl.surveys.Survey import Survey
|
16
14
|
|
17
|
-
from edsl.exceptions.coop import
|
15
|
+
from edsl.exceptions.coop import (
|
16
|
+
CoopInvalidURLError,
|
17
|
+
CoopNoUUIDError,
|
18
|
+
CoopServerResponseError,
|
19
|
+
)
|
18
20
|
from edsl.coop.utils import (
|
19
21
|
EDSLObject,
|
20
22
|
ObjectRegistry,
|
@@ -285,17 +287,46 @@ class Coop(CoopFunctionsMixin):
|
|
285
287
|
if value is None:
|
286
288
|
return "null"
|
287
289
|
|
288
|
-
def
|
290
|
+
def _resolve_uuid_or_alias(
|
289
291
|
self, uuid: Union[str, UUID] = None, url: str = None
|
290
|
-
) ->
|
292
|
+
) -> tuple[Optional[str], Optional[str], Optional[str]]:
|
291
293
|
"""
|
292
|
-
Resolve the uuid from a uuid or a url.
|
294
|
+
Resolve the uuid or alias information from a uuid or a url.
|
295
|
+
Returns a tuple of (uuid, owner_username, alias)
|
296
|
+
- For content/<uuid> URLs: returns (uuid, None, None)
|
297
|
+
- For content/<username>/<alias> URLs: returns (None, username, alias)
|
293
298
|
"""
|
294
299
|
if not url and not uuid:
|
295
300
|
raise CoopNoUUIDError("No uuid or url provided for the object.")
|
301
|
+
|
296
302
|
if not uuid and url:
|
297
|
-
|
298
|
-
|
303
|
+
parts = (
|
304
|
+
url.replace("http://", "")
|
305
|
+
.replace("https://", "")
|
306
|
+
.rstrip("/")
|
307
|
+
.split("/")
|
308
|
+
)
|
309
|
+
|
310
|
+
# Remove domain
|
311
|
+
parts = parts[1:]
|
312
|
+
|
313
|
+
if len(parts) < 2 or parts[0] != "content":
|
314
|
+
raise CoopInvalidURLError(
|
315
|
+
f"Invalid URL format. The URL must end with /content/<uuid> or /content/<username>/<alias>: {url}"
|
316
|
+
)
|
317
|
+
|
318
|
+
if len(parts) == 2:
|
319
|
+
obj_uuid = parts[1]
|
320
|
+
return obj_uuid, None, None
|
321
|
+
elif len(parts) == 3:
|
322
|
+
username, alias = parts[1], parts[2]
|
323
|
+
return None, username, alias
|
324
|
+
else:
|
325
|
+
raise CoopInvalidURLError(
|
326
|
+
f"Invalid URL format. The URL must end with /content/<uuid> or /content/<username>/<alias>: {url}"
|
327
|
+
)
|
328
|
+
|
329
|
+
return str(uuid), None, None
|
299
330
|
|
300
331
|
@property
|
301
332
|
def edsl_settings(self) -> dict:
|
@@ -307,7 +338,7 @@ class Coop(CoopFunctionsMixin):
|
|
307
338
|
|
308
339
|
try:
|
309
340
|
response = self._send_server_request(
|
310
|
-
uri="api/v0/edsl-settings", method="GET", timeout=
|
341
|
+
uri="api/v0/edsl-settings", method="GET", timeout=20
|
311
342
|
)
|
312
343
|
self._resolve_server_response(response, check_api_key=False)
|
313
344
|
return response.json()
|
@@ -361,22 +392,31 @@ class Coop(CoopFunctionsMixin):
|
|
361
392
|
expected_object_type: Optional[ObjectType] = None,
|
362
393
|
) -> EDSLObject:
|
363
394
|
"""
|
364
|
-
Retrieve an EDSL object by its uuid or
|
395
|
+
Retrieve an EDSL object by its uuid/url or by owner username and alias.
|
365
396
|
- If the object's visibility is private, the user must be the owner.
|
366
397
|
- Optionally, check if the retrieved object is of a certain type.
|
367
398
|
|
368
399
|
:param uuid: the uuid of the object either in str or UUID format.
|
369
|
-
:param url: the url of the object.
|
400
|
+
:param url: the url of the object (can be content/uuid or content/username/alias format).
|
370
401
|
:param expected_object_type: the expected type of the object.
|
371
402
|
|
372
403
|
:return: the object instance.
|
373
404
|
"""
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
405
|
+
obj_uuid, owner_username, alias = self._resolve_uuid_or_alias(uuid, url)
|
406
|
+
|
407
|
+
if obj_uuid:
|
408
|
+
response = self._send_server_request(
|
409
|
+
uri=f"api/v0/object",
|
410
|
+
method="GET",
|
411
|
+
params={"uuid": obj_uuid},
|
412
|
+
)
|
413
|
+
else:
|
414
|
+
response = self._send_server_request(
|
415
|
+
uri=f"api/v0/object/alias",
|
416
|
+
method="GET",
|
417
|
+
params={"owner_username": owner_username, "alias": alias},
|
418
|
+
)
|
419
|
+
|
380
420
|
self._resolve_server_response(response)
|
381
421
|
json_string = response.json().get("json_string")
|
382
422
|
object_type = response.json().get("object_type")
|
@@ -414,12 +454,13 @@ class Coop(CoopFunctionsMixin):
|
|
414
454
|
"""
|
415
455
|
Delete an object from the server.
|
416
456
|
"""
|
417
|
-
|
457
|
+
obj_uuid, _, _ = self._resolve_uuid_or_alias(uuid, url)
|
418
458
|
response = self._send_server_request(
|
419
459
|
uri=f"api/v0/object",
|
420
460
|
method="DELETE",
|
421
|
-
params={"uuid":
|
461
|
+
params={"uuid": obj_uuid},
|
422
462
|
)
|
463
|
+
|
423
464
|
self._resolve_server_response(response)
|
424
465
|
return response.json()
|
425
466
|
|
@@ -438,11 +479,11 @@ class Coop(CoopFunctionsMixin):
|
|
438
479
|
"""
|
439
480
|
if description is None and visibility is None and value is None:
|
440
481
|
raise Exception("Nothing to patch.")
|
441
|
-
|
482
|
+
obj_uuid, _, _ = self._resolve_uuid_or_alias(uuid, url)
|
442
483
|
response = self._send_server_request(
|
443
484
|
uri=f"api/v0/object",
|
444
485
|
method="PATCH",
|
445
|
-
params={"uuid":
|
486
|
+
params={"uuid": obj_uuid},
|
446
487
|
payload={
|
447
488
|
"description": description,
|
448
489
|
"alias": alias,
|
@@ -549,6 +590,7 @@ class Coop(CoopFunctionsMixin):
|
|
549
590
|
def remote_cache_get(
|
550
591
|
self,
|
551
592
|
exclude_keys: Optional[list[str]] = None,
|
593
|
+
select_keys: Optional[list[str]] = None,
|
552
594
|
) -> list[CacheEntry]:
|
553
595
|
"""
|
554
596
|
Get all remote cache entries.
|
@@ -560,10 +602,12 @@ class Coop(CoopFunctionsMixin):
|
|
560
602
|
"""
|
561
603
|
if exclude_keys is None:
|
562
604
|
exclude_keys = []
|
605
|
+
if select_keys is None:
|
606
|
+
select_keys = []
|
563
607
|
response = self._send_server_request(
|
564
608
|
uri="api/v0/remote-cache/get-many",
|
565
609
|
method="POST",
|
566
|
-
payload={"keys": exclude_keys},
|
610
|
+
payload={"keys": exclude_keys, "selected_keys": select_keys},
|
567
611
|
timeout=40,
|
568
612
|
)
|
569
613
|
self._resolve_server_response(response)
|
@@ -820,6 +864,40 @@ class Coop(CoopFunctionsMixin):
|
|
820
864
|
"usd": response_json.get("cost_in_usd"),
|
821
865
|
}
|
822
866
|
|
867
|
+
################
|
868
|
+
# PROJECTS
|
869
|
+
################
|
870
|
+
def create_project(
|
871
|
+
self,
|
872
|
+
survey: Survey,
|
873
|
+
project_name: str,
|
874
|
+
survey_description: Optional[str] = None,
|
875
|
+
survey_alias: Optional[str] = None,
|
876
|
+
survey_visibility: Optional[VisibilityType] = "unlisted",
|
877
|
+
):
|
878
|
+
"""
|
879
|
+
Create a survey object on Coop, then create a project from the survey.
|
880
|
+
"""
|
881
|
+
survey_details = self.create(
|
882
|
+
object=survey,
|
883
|
+
description=survey_description,
|
884
|
+
alias=survey_alias,
|
885
|
+
visibility=survey_visibility,
|
886
|
+
)
|
887
|
+
survey_uuid = survey_details.get("uuid")
|
888
|
+
response = self._send_server_request(
|
889
|
+
uri=f"api/v0/projects/create-from-survey",
|
890
|
+
method="POST",
|
891
|
+
payload={"project_name": project_name, "survey_uuid": str(survey_uuid)},
|
892
|
+
)
|
893
|
+
self._resolve_server_response(response)
|
894
|
+
response_json = response.json()
|
895
|
+
return {
|
896
|
+
"name": response_json.get("project_name"),
|
897
|
+
"uuid": response_json.get("uuid"),
|
898
|
+
"url": f"{self.url}/home/projects/{response_json.get('uuid')}",
|
899
|
+
}
|
900
|
+
|
823
901
|
################
|
824
902
|
# DUNDER METHODS
|
825
903
|
################
|
@@ -67,6 +67,7 @@ class InferenceServiceType(EnumWithChecks):
|
|
67
67
|
TOGETHER = "together"
|
68
68
|
PERPLEXITY = "perplexity"
|
69
69
|
DEEPSEEK = "deepseek"
|
70
|
+
GROK = "grok"
|
70
71
|
|
71
72
|
|
72
73
|
# unavoidable violation of the DRY principle but it is necessary
|
@@ -86,6 +87,7 @@ InferenceServiceLiteral = Literal[
|
|
86
87
|
"together",
|
87
88
|
"perplexity",
|
88
89
|
"deepseek",
|
90
|
+
"grok",
|
89
91
|
]
|
90
92
|
|
91
93
|
available_models_urls = {
|
@@ -97,7 +99,6 @@ available_models_urls = {
|
|
97
99
|
|
98
100
|
|
99
101
|
service_to_api_keyname = {
|
100
|
-
InferenceServiceType.BEDROCK.value: "TBD",
|
101
102
|
InferenceServiceType.DEEP_INFRA.value: "DEEP_INFRA_API_KEY",
|
102
103
|
InferenceServiceType.REPLICATE.value: "TBD",
|
103
104
|
InferenceServiceType.OPENAI.value: "OPENAI_API_KEY",
|
@@ -110,6 +111,7 @@ service_to_api_keyname = {
|
|
110
111
|
InferenceServiceType.TOGETHER.value: "TOGETHER_API_KEY",
|
111
112
|
InferenceServiceType.PERPLEXITY.value: "PERPLEXITY_API_KEY",
|
112
113
|
InferenceServiceType.DEEPSEEK.value: "DEEPSEEK_API_KEY",
|
114
|
+
InferenceServiceType.GROK.value: "XAI_API_KEY",
|
113
115
|
}
|
114
116
|
|
115
117
|
|
@@ -17,6 +17,8 @@ class AnthropicService(InferenceServiceABC):
|
|
17
17
|
output_token_name = "output_tokens"
|
18
18
|
model_exclude_list = []
|
19
19
|
|
20
|
+
available_models_url = 'https://docs.anthropic.com/en/docs/about-claude/models'
|
21
|
+
|
20
22
|
@classmethod
|
21
23
|
def get_model_list(cls, api_key: str = None):
|
22
24
|
|
@@ -136,7 +136,10 @@ class AvailableModelFetcher:
|
|
136
136
|
if not service_models:
|
137
137
|
import warnings
|
138
138
|
|
139
|
-
warnings.
|
139
|
+
with warnings.catch_warnings():
|
140
|
+
warnings.simplefilter("ignore") # Ignores the warning
|
141
|
+
warnings.warn(f"No models found for service {service_name}")
|
142
|
+
|
140
143
|
return [], service_name
|
141
144
|
|
142
145
|
models_list = AvailableModels(
|
@@ -0,0 +1,11 @@
|
|
1
|
+
from typing import Any, List
|
2
|
+
from edsl.inference_services.OpenAIService import OpenAIService
|
3
|
+
|
4
|
+
|
5
|
+
class GrokService(OpenAIService):
|
6
|
+
"""Openai service class."""
|
7
|
+
|
8
|
+
_inference_service_ = "grok"
|
9
|
+
_env_key_name_ = "XAI_API_KEY"
|
10
|
+
_base_url_ = "https://api.x.ai/v1"
|
11
|
+
_models_list_cache: List[str] = []
|