edsl 0.1.47__py3-none-any.whl → 0.1.48__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- edsl/__init__.py +44 -39
- edsl/__version__.py +1 -1
- edsl/agents/__init__.py +4 -2
- edsl/agents/{Agent.py → agent.py} +442 -152
- edsl/agents/{AgentList.py → agent_list.py} +220 -162
- edsl/agents/descriptors.py +46 -7
- edsl/{exceptions/agents.py → agents/exceptions.py} +3 -12
- edsl/base/__init__.py +75 -0
- edsl/base/base_class.py +1303 -0
- edsl/base/data_transfer_models.py +114 -0
- edsl/base/enums.py +215 -0
- edsl/base.py +8 -0
- edsl/buckets/__init__.py +25 -0
- edsl/buckets/bucket_collection.py +324 -0
- edsl/buckets/model_buckets.py +206 -0
- edsl/buckets/token_bucket.py +502 -0
- edsl/{jobs/buckets/TokenBucketAPI.py → buckets/token_bucket_api.py} +1 -1
- edsl/buckets/token_bucket_client.py +509 -0
- edsl/caching/__init__.py +20 -0
- edsl/caching/cache.py +814 -0
- edsl/caching/cache_entry.py +427 -0
- edsl/{data/CacheHandler.py → caching/cache_handler.py} +14 -15
- edsl/caching/exceptions.py +24 -0
- edsl/caching/orm.py +30 -0
- edsl/{data/RemoteCacheSync.py → caching/remote_cache_sync.py} +3 -3
- edsl/caching/sql_dict.py +441 -0
- edsl/config/__init__.py +8 -0
- edsl/config/config_class.py +177 -0
- edsl/config.py +4 -176
- edsl/conversation/Conversation.py +7 -7
- edsl/conversation/car_buying.py +4 -4
- edsl/conversation/chips.py +6 -6
- edsl/coop/__init__.py +25 -2
- edsl/coop/coop.py +303 -67
- edsl/coop/{ExpectedParrotKeyHandler.py → ep_key_handling.py} +86 -10
- edsl/coop/exceptions.py +62 -0
- edsl/coop/price_fetcher.py +126 -0
- edsl/coop/utils.py +89 -24
- edsl/data_transfer_models.py +5 -72
- edsl/dataset/__init__.py +10 -0
- edsl/{results/Dataset.py → dataset/dataset.py} +116 -36
- edsl/{results/DatasetExportMixin.py → dataset/dataset_operations_mixin.py} +606 -122
- edsl/{results/DatasetTree.py → dataset/dataset_tree.py} +156 -75
- edsl/{results/TableDisplay.py → dataset/display/table_display.py} +18 -7
- edsl/{results → dataset/display}/table_renderers.py +58 -2
- edsl/{results → dataset}/file_exports.py +4 -5
- edsl/{results → dataset}/smart_objects.py +2 -2
- edsl/enums.py +5 -205
- edsl/inference_services/__init__.py +5 -0
- edsl/inference_services/{AvailableModelCacheHandler.py → available_model_cache_handler.py} +2 -3
- edsl/inference_services/{AvailableModelFetcher.py → available_model_fetcher.py} +8 -14
- edsl/inference_services/data_structures.py +3 -2
- edsl/{exceptions/inference_services.py → inference_services/exceptions.py} +1 -1
- edsl/inference_services/{InferenceServiceABC.py → inference_service_abc.py} +1 -1
- edsl/inference_services/{InferenceServicesCollection.py → inference_services_collection.py} +8 -7
- edsl/inference_services/registry.py +4 -41
- edsl/inference_services/{ServiceAvailability.py → service_availability.py} +5 -25
- edsl/inference_services/services/__init__.py +31 -0
- edsl/inference_services/{AnthropicService.py → services/anthropic_service.py} +3 -3
- edsl/inference_services/{AwsBedrock.py → services/aws_bedrock.py} +2 -2
- edsl/inference_services/{AzureAI.py → services/azure_ai.py} +2 -2
- edsl/inference_services/{DeepInfraService.py → services/deep_infra_service.py} +1 -3
- edsl/inference_services/{DeepSeekService.py → services/deep_seek_service.py} +2 -4
- edsl/inference_services/{GoogleService.py → services/google_service.py} +5 -4
- edsl/inference_services/{GroqService.py → services/groq_service.py} +1 -1
- edsl/inference_services/{MistralAIService.py → services/mistral_ai_service.py} +3 -3
- edsl/inference_services/{OllamaService.py → services/ollama_service.py} +1 -7
- edsl/inference_services/{OpenAIService.py → services/open_ai_service.py} +5 -6
- edsl/inference_services/{PerplexityService.py → services/perplexity_service.py} +3 -7
- edsl/inference_services/{TestService.py → services/test_service.py} +7 -6
- edsl/inference_services/{TogetherAIService.py → services/together_ai_service.py} +2 -6
- edsl/inference_services/{XAIService.py → services/xai_service.py} +1 -1
- edsl/inference_services/write_available.py +1 -2
- edsl/instructions/__init__.py +6 -0
- edsl/{surveys/instructions/Instruction.py → instructions/instruction.py} +11 -6
- edsl/{surveys/instructions/InstructionCollection.py → instructions/instruction_collection.py} +10 -5
- edsl/{surveys/InstructionHandler.py → instructions/instruction_handler.py} +3 -3
- edsl/{jobs/interviews → interviews}/ReportErrors.py +2 -2
- edsl/interviews/__init__.py +4 -0
- edsl/{jobs/AnswerQuestionFunctionConstructor.py → interviews/answering_function.py} +45 -18
- edsl/{jobs/interviews/InterviewExceptionEntry.py → interviews/exception_tracking.py} +107 -22
- edsl/interviews/interview.py +638 -0
- edsl/{jobs/interviews/InterviewStatusDictionary.py → interviews/interview_status_dictionary.py} +21 -12
- edsl/{jobs/interviews/InterviewStatusLog.py → interviews/interview_status_log.py} +16 -7
- edsl/{jobs/InterviewTaskManager.py → interviews/interview_task_manager.py} +12 -7
- edsl/{jobs/RequestTokenEstimator.py → interviews/request_token_estimator.py} +8 -3
- edsl/{jobs/interviews/InterviewStatistic.py → interviews/statistics.py} +36 -10
- edsl/invigilators/__init__.py +38 -0
- edsl/invigilators/invigilator_base.py +477 -0
- edsl/{agents/Invigilator.py → invigilators/invigilators.py} +263 -10
- edsl/invigilators/prompt_constructor.py +476 -0
- edsl/{agents → invigilators}/prompt_helpers.py +2 -1
- edsl/{agents/QuestionInstructionPromptBuilder.py → invigilators/question_instructions_prompt_builder.py} +18 -13
- edsl/{agents → invigilators}/question_option_processor.py +96 -21
- edsl/{agents/QuestionTemplateReplacementsBuilder.py → invigilators/question_template_replacements_builder.py} +64 -12
- edsl/jobs/__init__.py +7 -1
- edsl/jobs/async_interview_runner.py +99 -35
- edsl/jobs/check_survey_scenario_compatibility.py +7 -5
- edsl/jobs/data_structures.py +153 -22
- edsl/{exceptions/jobs.py → jobs/exceptions.py} +2 -1
- edsl/jobs/{FetchInvigilator.py → fetch_invigilator.py} +4 -4
- edsl/jobs/{loggers/HTMLTableJobLogger.py → html_table_job_logger.py} +6 -2
- edsl/jobs/{Jobs.py → jobs.py} +313 -167
- edsl/jobs/{JobsChecks.py → jobs_checks.py} +15 -7
- edsl/jobs/{JobsComponentConstructor.py → jobs_component_constructor.py} +19 -17
- edsl/jobs/{InterviewsConstructor.py → jobs_interview_constructor.py} +10 -5
- edsl/jobs/jobs_pricing_estimation.py +347 -0
- edsl/jobs/{JobsRemoteInferenceLogger.py → jobs_remote_inference_logger.py} +4 -3
- edsl/jobs/jobs_runner_asyncio.py +282 -0
- edsl/jobs/{JobsRemoteInferenceHandler.py → remote_inference.py} +19 -22
- edsl/jobs/results_exceptions_handler.py +2 -2
- edsl/key_management/__init__.py +28 -0
- edsl/key_management/key_lookup.py +161 -0
- edsl/{language_models/key_management/KeyLookupBuilder.py → key_management/key_lookup_builder.py} +118 -47
- edsl/key_management/key_lookup_collection.py +82 -0
- edsl/key_management/models.py +218 -0
- edsl/language_models/__init__.py +7 -2
- edsl/language_models/{ComputeCost.py → compute_cost.py} +18 -3
- edsl/{exceptions/language_models.py → language_models/exceptions.py} +2 -1
- edsl/language_models/language_model.py +1080 -0
- edsl/language_models/model.py +10 -25
- edsl/language_models/{ModelList.py → model_list.py} +9 -14
- edsl/language_models/{RawResponseHandler.py → raw_response_handler.py} +1 -1
- edsl/language_models/{RegisterLanguageModelsMeta.py → registry.py} +1 -1
- edsl/language_models/repair.py +4 -4
- edsl/language_models/utilities.py +4 -4
- edsl/notebooks/__init__.py +3 -1
- edsl/notebooks/{Notebook.py → notebook.py} +7 -8
- edsl/prompts/__init__.py +1 -1
- edsl/{exceptions/prompts.py → prompts/exceptions.py} +3 -1
- edsl/prompts/{Prompt.py → prompt.py} +101 -95
- edsl/questions/HTMLQuestion.py +1 -1
- edsl/questions/__init__.py +154 -25
- edsl/questions/answer_validator_mixin.py +1 -1
- edsl/questions/compose_questions.py +4 -3
- edsl/questions/derived/question_likert_five.py +166 -0
- edsl/questions/derived/{QuestionLinearScale.py → question_linear_scale.py} +4 -4
- edsl/questions/derived/{QuestionTopK.py → question_top_k.py} +4 -4
- edsl/questions/derived/{QuestionYesNo.py → question_yes_no.py} +4 -5
- edsl/questions/descriptors.py +24 -30
- edsl/questions/loop_processor.py +65 -19
- edsl/questions/question_base.py +881 -0
- edsl/questions/question_base_gen_mixin.py +15 -16
- edsl/questions/{QuestionBasePromptsMixin.py → question_base_prompts_mixin.py} +2 -2
- edsl/questions/{QuestionBudget.py → question_budget.py} +3 -4
- edsl/questions/{QuestionCheckBox.py → question_check_box.py} +16 -16
- edsl/questions/{QuestionDict.py → question_dict.py} +39 -5
- edsl/questions/{QuestionExtract.py → question_extract.py} +9 -9
- edsl/questions/question_free_text.py +282 -0
- edsl/questions/{QuestionFunctional.py → question_functional.py} +6 -5
- edsl/questions/{QuestionList.py → question_list.py} +6 -7
- edsl/questions/{QuestionMatrix.py → question_matrix.py} +6 -5
- edsl/questions/{QuestionMultipleChoice.py → question_multiple_choice.py} +126 -21
- edsl/questions/{QuestionNumerical.py → question_numerical.py} +5 -5
- edsl/questions/{QuestionRank.py → question_rank.py} +6 -6
- edsl/questions/question_registry.py +4 -9
- edsl/questions/register_questions_meta.py +8 -4
- edsl/questions/response_validator_abc.py +17 -16
- edsl/results/__init__.py +4 -1
- edsl/{exceptions/results.py → results/exceptions.py} +1 -1
- edsl/results/report.py +197 -0
- edsl/results/{Result.py → result.py} +131 -45
- edsl/results/{Results.py → results.py} +365 -220
- edsl/results/results_selector.py +344 -25
- edsl/scenarios/__init__.py +30 -3
- edsl/scenarios/{ConstructDownloadLink.py → construct_download_link.py} +7 -0
- edsl/scenarios/directory_scanner.py +156 -13
- edsl/scenarios/document_chunker.py +186 -0
- edsl/scenarios/exceptions.py +101 -0
- edsl/scenarios/file_methods.py +2 -3
- edsl/scenarios/{FileStore.py → file_store.py} +275 -189
- edsl/scenarios/handlers/__init__.py +14 -14
- edsl/scenarios/handlers/{csv.py → csv_file_store.py} +1 -2
- edsl/scenarios/handlers/{docx.py → docx_file_store.py} +8 -7
- edsl/scenarios/handlers/{html.py → html_file_store.py} +1 -2
- edsl/scenarios/handlers/{jpeg.py → jpeg_file_store.py} +1 -1
- edsl/scenarios/handlers/{json.py → json_file_store.py} +1 -1
- edsl/scenarios/handlers/latex_file_store.py +5 -0
- edsl/scenarios/handlers/{md.py → md_file_store.py} +1 -1
- edsl/scenarios/handlers/{pdf.py → pdf_file_store.py} +2 -2
- edsl/scenarios/handlers/{png.py → png_file_store.py} +1 -1
- edsl/scenarios/handlers/{pptx.py → pptx_file_store.py} +8 -7
- edsl/scenarios/handlers/{py.py → py_file_store.py} +1 -3
- edsl/scenarios/handlers/{sql.py → sql_file_store.py} +2 -1
- edsl/scenarios/handlers/{sqlite.py → sqlite_file_store.py} +2 -3
- edsl/scenarios/handlers/{txt.py → txt_file_store.py} +1 -1
- edsl/scenarios/scenario.py +928 -0
- edsl/scenarios/scenario_join.py +18 -5
- edsl/scenarios/{ScenarioList.py → scenario_list.py} +294 -106
- edsl/scenarios/{ScenarioListPdfMixin.py → scenario_list_pdf_tools.py} +16 -15
- edsl/scenarios/scenario_selector.py +5 -1
- edsl/study/ObjectEntry.py +2 -2
- edsl/study/SnapShot.py +5 -5
- edsl/study/Study.py +18 -19
- edsl/study/__init__.py +6 -4
- edsl/surveys/__init__.py +7 -4
- edsl/surveys/dag/__init__.py +2 -0
- edsl/surveys/{ConstructDAG.py → dag/construct_dag.py} +3 -3
- edsl/surveys/{DAG.py → dag/dag.py} +13 -10
- edsl/surveys/descriptors.py +1 -1
- edsl/surveys/{EditSurvey.py → edit_survey.py} +9 -9
- edsl/{exceptions/surveys.py → surveys/exceptions.py} +1 -2
- edsl/surveys/memory/__init__.py +3 -0
- edsl/surveys/{MemoryPlan.py → memory/memory_plan.py} +10 -9
- edsl/surveys/rules/__init__.py +3 -0
- edsl/surveys/{Rule.py → rules/rule.py} +103 -43
- edsl/surveys/{RuleCollection.py → rules/rule_collection.py} +21 -30
- edsl/surveys/{RuleManager.py → rules/rule_manager.py} +19 -13
- edsl/surveys/survey.py +1743 -0
- edsl/surveys/{SurveyExportMixin.py → survey_export.py} +22 -27
- edsl/surveys/{SurveyFlowVisualization.py → survey_flow_visualization.py} +11 -2
- edsl/surveys/{Simulator.py → survey_simulator.py} +10 -3
- edsl/tasks/__init__.py +32 -0
- edsl/{jobs/tasks/QuestionTaskCreator.py → tasks/question_task_creator.py} +115 -57
- edsl/tasks/task_creators.py +135 -0
- edsl/{jobs/tasks/TaskHistory.py → tasks/task_history.py} +86 -47
- edsl/{jobs/tasks → tasks}/task_status_enum.py +91 -7
- edsl/tasks/task_status_log.py +85 -0
- edsl/tokens/__init__.py +2 -0
- edsl/tokens/interview_token_usage.py +53 -0
- edsl/utilities/PrettyList.py +1 -1
- edsl/utilities/SystemInfo.py +25 -22
- edsl/utilities/__init__.py +29 -21
- edsl/utilities/gcp_bucket/__init__.py +2 -0
- edsl/utilities/gcp_bucket/cloud_storage.py +99 -96
- edsl/utilities/interface.py +44 -536
- edsl/{results/MarkdownToPDF.py → utilities/markdown_to_pdf.py} +13 -5
- edsl/utilities/repair_functions.py +1 -1
- {edsl-0.1.47.dist-info → edsl-0.1.48.dist-info}/METADATA +1 -1
- edsl-0.1.48.dist-info/RECORD +347 -0
- edsl/Base.py +0 -493
- edsl/BaseDiff.py +0 -260
- edsl/agents/InvigilatorBase.py +0 -260
- edsl/agents/PromptConstructor.py +0 -318
- edsl/coop/PriceFetcher.py +0 -54
- edsl/data/Cache.py +0 -582
- edsl/data/CacheEntry.py +0 -238
- edsl/data/SQLiteDict.py +0 -292
- edsl/data/__init__.py +0 -5
- edsl/data/orm.py +0 -10
- edsl/exceptions/cache.py +0 -5
- edsl/exceptions/coop.py +0 -14
- edsl/exceptions/data.py +0 -14
- edsl/exceptions/scenarios.py +0 -29
- edsl/jobs/Answers.py +0 -43
- edsl/jobs/JobsPrompts.py +0 -354
- edsl/jobs/buckets/BucketCollection.py +0 -134
- edsl/jobs/buckets/ModelBuckets.py +0 -65
- edsl/jobs/buckets/TokenBucket.py +0 -283
- edsl/jobs/buckets/TokenBucketClient.py +0 -191
- edsl/jobs/interviews/Interview.py +0 -395
- edsl/jobs/interviews/InterviewExceptionCollection.py +0 -99
- edsl/jobs/interviews/InterviewStatisticsCollection.py +0 -25
- edsl/jobs/runners/JobsRunnerAsyncio.py +0 -163
- edsl/jobs/runners/JobsRunnerStatusData.py +0 -0
- edsl/jobs/tasks/TaskCreators.py +0 -64
- edsl/jobs/tasks/TaskStatusLog.py +0 -23
- edsl/jobs/tokens/InterviewTokenUsage.py +0 -27
- edsl/language_models/LanguageModel.py +0 -635
- edsl/language_models/ServiceDataSources.py +0 -0
- edsl/language_models/key_management/KeyLookup.py +0 -63
- edsl/language_models/key_management/KeyLookupCollection.py +0 -38
- edsl/language_models/key_management/models.py +0 -137
- edsl/questions/QuestionBase.py +0 -544
- edsl/questions/QuestionFreeText.py +0 -130
- edsl/questions/derived/QuestionLikertFive.py +0 -76
- edsl/results/ResultsExportMixin.py +0 -45
- edsl/results/TextEditor.py +0 -50
- edsl/results/results_fetch_mixin.py +0 -33
- edsl/results/results_tools_mixin.py +0 -98
- edsl/scenarios/DocumentChunker.py +0 -104
- edsl/scenarios/Scenario.py +0 -548
- edsl/scenarios/ScenarioHtmlMixin.py +0 -65
- edsl/scenarios/ScenarioListExportMixin.py +0 -45
- edsl/scenarios/handlers/latex.py +0 -5
- edsl/shared.py +0 -1
- edsl/surveys/Survey.py +0 -1301
- edsl/surveys/SurveyQualtricsImport.py +0 -284
- edsl/surveys/SurveyToApp.py +0 -141
- edsl/surveys/instructions/__init__.py +0 -0
- edsl/tools/__init__.py +0 -1
- edsl/tools/clusters.py +0 -192
- edsl/tools/embeddings.py +0 -27
- edsl/tools/embeddings_plotting.py +0 -118
- edsl/tools/plotting.py +0 -112
- edsl/tools/summarize.py +0 -18
- edsl/utilities/data/Registry.py +0 -6
- edsl/utilities/data/__init__.py +0 -1
- edsl/utilities/data/scooter_results.json +0 -1
- edsl-0.1.47.dist-info/RECORD +0 -354
- /edsl/coop/{CoopFunctionsMixin.py → coop_functions.py} +0 -0
- /edsl/{results → dataset/display}/CSSParameterizer.py +0 -0
- /edsl/{language_models/key_management → dataset/display}/__init__.py +0 -0
- /edsl/{results → dataset/display}/table_data_class.py +0 -0
- /edsl/{results → dataset/display}/table_display.css +0 -0
- /edsl/{results/ResultsGGMixin.py → dataset/r/ggplot.py} +0 -0
- /edsl/{results → dataset}/tree_explore.py +0 -0
- /edsl/{surveys/instructions/ChangeInstruction.py → instructions/change_instruction.py} +0 -0
- /edsl/{jobs/interviews → interviews}/interview_status_enum.py +0 -0
- /edsl/jobs/{runners/JobsRunnerStatus.py → jobs_runner_status.py} +0 -0
- /edsl/language_models/{PriceManager.py → price_manager.py} +0 -0
- /edsl/language_models/{fake_openai_call.py → unused/fake_openai_call.py} +0 -0
- /edsl/language_models/{fake_openai_service.py → unused/fake_openai_service.py} +0 -0
- /edsl/notebooks/{NotebookToLaTeX.py → notebook_to_latex.py} +0 -0
- /edsl/{exceptions/questions.py → questions/exceptions.py} +0 -0
- /edsl/questions/{SimpleAskMixin.py → simple_ask_mixin.py} +0 -0
- /edsl/surveys/{Memory.py → memory/memory.py} +0 -0
- /edsl/surveys/{MemoryManagement.py → memory/memory_management.py} +0 -0
- /edsl/surveys/{SurveyCSS.py → survey_css.py} +0 -0
- /edsl/{jobs/tokens/TokenUsage.py → tokens/token_usage.py} +0 -0
- /edsl/{results/MarkdownToDocx.py → utilities/markdown_to_docx.py} +0 -0
- /edsl/{TemplateLoader.py → utilities/template_loader.py} +0 -0
- {edsl-0.1.47.dist-info → edsl-0.1.48.dist-info}/LICENSE +0 -0
- {edsl-0.1.47.dist-info → edsl-0.1.48.dist-info}/WHEEL +0 -0
@@ -1,7 +1,6 @@
|
|
1
1
|
from collections import UserDict
|
2
2
|
|
3
|
-
from
|
4
|
-
|
3
|
+
from ..tasks.task_status_enum import TaskStatus, status_colors
|
5
4
|
|
6
5
|
class InterviewStatusLog(UserDict):
|
7
6
|
"""A dictionary of TaskStatusLog objects.
|
@@ -10,14 +9,16 @@ class InterviewStatusLog(UserDict):
|
|
10
9
|
"""
|
11
10
|
|
12
11
|
@property
|
13
|
-
def min_time(self):
|
12
|
+
def min_time(self) -> float:
|
13
|
+
"""Return the minimum time of the status log."""
|
14
14
|
return min([log.min_time for log in self.values()])
|
15
15
|
|
16
16
|
@property
|
17
|
-
def max_time(self):
|
17
|
+
def max_time(self) -> float:
|
18
|
+
"""Return the maximum time of the status log."""
|
18
19
|
return max([log.max_time for log in self.values()])
|
19
20
|
|
20
|
-
def status_matrix(self, num_periods):
|
21
|
+
def status_matrix(self, num_periods: int) -> dict[str, list[TaskStatus]]:
|
21
22
|
"""Return a matrix of status values."""
|
22
23
|
start_time = self.min_time
|
23
24
|
end_time = self.max_time
|
@@ -28,7 +29,9 @@ class InterviewStatusLog(UserDict):
|
|
28
29
|
status_matrix[task_name] = [log.status_at_time(t) for t in time_periods]
|
29
30
|
return status_matrix
|
30
31
|
|
31
|
-
def numerical_matrix(
|
32
|
+
def numerical_matrix(
|
33
|
+
self, num_periods: int
|
34
|
+
) -> tuple[list[list[int]], dict[int, str]]:
|
32
35
|
"""Return a numerical matrix of status values."""
|
33
36
|
status_dicts = self.status_matrix(num_periods)
|
34
37
|
|
@@ -44,7 +47,7 @@ class InterviewStatusLog(UserDict):
|
|
44
47
|
index_to_names = {i: name for i, name in enumerate(status_dicts.keys())}
|
45
48
|
return matrix, index_to_names
|
46
49
|
|
47
|
-
def visualize(self, num_periods=10):
|
50
|
+
def visualize(self, num_periods: int = 10) -> None:
|
48
51
|
"""Visualize the status matrix with outlined squares."""
|
49
52
|
import matplotlib.pyplot as plt
|
50
53
|
from matplotlib.colors import ListedColormap
|
@@ -90,3 +93,9 @@ class InterviewStatusLog(UserDict):
|
|
90
93
|
|
91
94
|
# Show the plot
|
92
95
|
plt.show()
|
96
|
+
|
97
|
+
|
98
|
+
if __name__ == "__main__":
|
99
|
+
import doctest
|
100
|
+
|
101
|
+
doctest.testmod(optionflags=doctest.ELLIPSIS)
|
@@ -3,18 +3,18 @@ import asyncio
|
|
3
3
|
from typing import Any, Type, List, Generator, Optional, Union, TYPE_CHECKING
|
4
4
|
|
5
5
|
if TYPE_CHECKING:
|
6
|
-
from
|
7
|
-
from
|
8
|
-
from
|
9
|
-
from
|
6
|
+
from ..questions import QuestionBase
|
7
|
+
from ..tokens import InterviewTokenUsage
|
8
|
+
from . import InterviewStatusDictionary
|
9
|
+
from . import InterviewStatusLog
|
10
10
|
|
11
11
|
|
12
12
|
class InterviewTaskManager:
|
13
13
|
"""Handles creation and management of interview tasks."""
|
14
14
|
|
15
15
|
def __init__(self, survey, iteration=0):
|
16
|
-
from
|
17
|
-
from
|
16
|
+
from ..tasks import TaskCreators
|
17
|
+
from . import InterviewStatusLog
|
18
18
|
|
19
19
|
self.survey = survey
|
20
20
|
self.iteration = iteration
|
@@ -59,7 +59,7 @@ class InterviewTaskManager:
|
|
59
59
|
model_buckets,
|
60
60
|
) -> asyncio.Task:
|
61
61
|
"""Create a single question task with its dependencies."""
|
62
|
-
from
|
62
|
+
from ..tasks import QuestionTaskCreator
|
63
63
|
|
64
64
|
task_creator = QuestionTaskCreator(
|
65
65
|
question=question,
|
@@ -96,3 +96,8 @@ class InterviewTaskManager:
|
|
96
96
|
def interview_status(self) -> "InterviewStatusDictionary":
|
97
97
|
"""Return a dictionary mapping task status codes to counts."""
|
98
98
|
return self.task_creators.interview_status
|
99
|
+
|
100
|
+
|
101
|
+
if __name__ == "__main__":
|
102
|
+
import doctest
|
103
|
+
doctest.testmod()
|
@@ -1,5 +1,5 @@
|
|
1
|
-
from
|
2
|
-
|
1
|
+
from ..jobs.fetch_invigilator import FetchInvigilator
|
2
|
+
from ..scenarios import FileStore
|
3
3
|
|
4
4
|
class RequestTokenEstimator:
|
5
5
|
"""Estimate the number of tokens that will be required to run the focal task."""
|
@@ -9,7 +9,6 @@ class RequestTokenEstimator:
|
|
9
9
|
|
10
10
|
def __call__(self, question) -> float:
|
11
11
|
"""Estimate the number of tokens that will be required to run the focal task."""
|
12
|
-
from edsl.scenarios.FileStore import FileStore
|
13
12
|
|
14
13
|
invigilator = FetchInvigilator(self.interview)(question=question)
|
15
14
|
|
@@ -28,3 +27,9 @@ class RequestTokenEstimator:
|
|
28
27
|
else:
|
29
28
|
raise ValueError(f"Prompt is of type {type(prompt)}")
|
30
29
|
return len(combined_text) / 4.0 + file_tokens
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
if __name__ == "__main__":
|
34
|
+
import doctest
|
35
|
+
doctest.testmod(optionflags=doctest.ELLIPSIS)
|
@@ -1,19 +1,16 @@
|
|
1
|
-
import
|
2
|
-
from enum import Enum
|
1
|
+
from collections import UserDict
|
3
2
|
from typing import Literal, List, Type, DefaultDict
|
4
|
-
from collections import UserDict
|
3
|
+
from collections import UserDict
|
5
4
|
|
6
|
-
from
|
7
|
-
from edsl.jobs.tokens.InterviewTokenUsage import InterviewTokenUsage
|
8
|
-
from edsl.enums import pricing, TokenPricing
|
9
|
-
from edsl.jobs.tasks.task_status_enum import TaskStatus
|
5
|
+
from ..tokens import InterviewTokenUsage
|
10
6
|
|
11
7
|
InterviewTokenUsageMapping = DefaultDict[str, InterviewTokenUsage]
|
12
8
|
|
13
|
-
|
14
9
|
class InterviewStatistic(UserDict):
|
10
|
+
"""A statistic for an interview."""
|
11
|
+
|
15
12
|
@staticmethod
|
16
|
-
def _format_number(number, digits=0, units=""):
|
13
|
+
def _format_number(number, digits: int = 0, units: str = "") -> str:
|
17
14
|
"""Format a number.
|
18
15
|
|
19
16
|
:param number: the number to format
|
@@ -31,7 +28,7 @@ class InterviewStatistic(UserDict):
|
|
31
28
|
return f"{number:,.{digits}f}" + " " + units
|
32
29
|
|
33
30
|
@property
|
34
|
-
def _pretty_name(self):
|
31
|
+
def _pretty_name(self) -> str:
|
35
32
|
"""Return a pretty name for the statistic.
|
36
33
|
|
37
34
|
Example usage:
|
@@ -61,3 +58,32 @@ class InterviewStatistic(UserDict):
|
|
61
58
|
)
|
62
59
|
|
63
60
|
self.raw: dict = {self.name: self.value}
|
61
|
+
|
62
|
+
|
63
|
+
class InterviewStatisticsCollection(UserDict):
|
64
|
+
"""A collection of interview statistics."""
|
65
|
+
|
66
|
+
def __init__(self, *args, **kwargs):
|
67
|
+
super().__init__(*args, **kwargs)
|
68
|
+
self.raw: dict = {}
|
69
|
+
|
70
|
+
def add_stat(self, statistic: InterviewStatistic) -> None:
|
71
|
+
"""Add a statistic to the collection.
|
72
|
+
|
73
|
+
Each statistic is a dictionary with a single key-value pair.
|
74
|
+
|
75
|
+
Example usage:
|
76
|
+
|
77
|
+
>>> isc = InterviewStatisticsCollection()
|
78
|
+
>>> isc.add_stat(InterviewStatistic("elapsed_time", value=100, digits=1, units="sec."))
|
79
|
+
>>> isc.raw
|
80
|
+
{'elapsed_time': 100}
|
81
|
+
"""
|
82
|
+
self.update(statistic)
|
83
|
+
self.raw.update(statistic.raw)
|
84
|
+
|
85
|
+
|
86
|
+
if __name__ == "__main__":
|
87
|
+
import doctest
|
88
|
+
|
89
|
+
doctest.testmod(optionflags=doctest.ELLIPSIS)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
"""
|
2
|
+
The invigilators module handles the administration of questions to agents.
|
3
|
+
|
4
|
+
An invigilator (from the Latin "to watch over") is responsible for administering
|
5
|
+
questions to agents, managing the interaction between questions, language models,
|
6
|
+
and agents, and validating responses. This module is a core part of EDSL's architecture
|
7
|
+
for ensuring that questions are properly presented to agents and responses are
|
8
|
+
appropriately processed.
|
9
|
+
|
10
|
+
Technical architecture:
|
11
|
+
- InvigilatorBase: Abstract base class defining the core interface for invigilators
|
12
|
+
- PromptConstructor: Transforms questions, scenarios, and agent memory into prompts
|
13
|
+
- QuestionTemplateReplacementsBuilder: Handles template variable substitution
|
14
|
+
- PromptHelpers: Utilities for prompt construction and manipulation
|
15
|
+
|
16
|
+
Invigilator implementations:
|
17
|
+
- InvigilatorAI: Administers questions to AI agents via language models
|
18
|
+
- InvigilatorHuman: Handles questions to be answered by human users
|
19
|
+
- InvigilatorFunctional: Uses custom functions to generate responses
|
20
|
+
|
21
|
+
This module is primarily intended for EDSL developers or advanced users who need
|
22
|
+
to customize the question administration process. Most users interact with invigilators
|
23
|
+
indirectly through the Survey, Question, and Jobs interfaces.
|
24
|
+
|
25
|
+
Design considerations:
|
26
|
+
- Separation of prompt construction from response handling
|
27
|
+
- Support for different agents and response types
|
28
|
+
- Asynchronous execution for efficient processing
|
29
|
+
- Extensibility through the abstract base class
|
30
|
+
"""
|
31
|
+
|
32
|
+
from .invigilators import InvigilatorAI
|
33
|
+
from .invigilators import InvigilatorHuman
|
34
|
+
from .invigilator_base import InvigilatorBase
|
35
|
+
from .invigilators import InvigilatorFunctional
|
36
|
+
from .prompt_constructor import PromptConstructor
|
37
|
+
|
38
|
+
__all_ = []
|