edsl 0.1.36.dev5__py3-none-any.whl → 0.1.36.dev6__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/Base.py +303 -303
- edsl/BaseDiff.py +260 -260
- edsl/TemplateLoader.py +24 -24
- edsl/__init__.py +47 -47
- edsl/__version__.py +1 -1
- edsl/agents/Agent.py +804 -804
- edsl/agents/AgentList.py +337 -337
- edsl/agents/Invigilator.py +222 -222
- edsl/agents/InvigilatorBase.py +294 -294
- edsl/agents/PromptConstructor.py +312 -312
- edsl/agents/__init__.py +3 -3
- edsl/agents/descriptors.py +86 -86
- edsl/agents/prompt_helpers.py +129 -129
- edsl/auto/AutoStudy.py +117 -117
- edsl/auto/StageBase.py +230 -230
- edsl/auto/StageGenerateSurvey.py +178 -178
- edsl/auto/StageLabelQuestions.py +125 -125
- edsl/auto/StagePersona.py +61 -61
- edsl/auto/StagePersonaDimensionValueRanges.py +88 -88
- edsl/auto/StagePersonaDimensionValues.py +74 -74
- edsl/auto/StagePersonaDimensions.py +69 -69
- edsl/auto/StageQuestions.py +73 -73
- edsl/auto/SurveyCreatorPipeline.py +21 -21
- edsl/auto/utilities.py +224 -224
- edsl/base/Base.py +289 -289
- edsl/config.py +149 -149
- edsl/conjure/AgentConstructionMixin.py +152 -152
- edsl/conjure/Conjure.py +62 -62
- edsl/conjure/InputData.py +659 -659
- edsl/conjure/InputDataCSV.py +48 -48
- edsl/conjure/InputDataMixinQuestionStats.py +182 -182
- edsl/conjure/InputDataPyRead.py +91 -91
- edsl/conjure/InputDataSPSS.py +8 -8
- edsl/conjure/InputDataStata.py +8 -8
- edsl/conjure/QuestionOptionMixin.py +76 -76
- edsl/conjure/QuestionTypeMixin.py +23 -23
- edsl/conjure/RawQuestion.py +65 -65
- edsl/conjure/SurveyResponses.py +7 -7
- edsl/conjure/__init__.py +9 -9
- edsl/conjure/naming_utilities.py +263 -263
- edsl/conjure/utilities.py +201 -201
- edsl/conversation/Conversation.py +238 -238
- edsl/conversation/car_buying.py +58 -58
- edsl/conversation/mug_negotiation.py +81 -81
- edsl/conversation/next_speaker_utilities.py +93 -93
- edsl/coop/PriceFetcher.py +54 -54
- edsl/coop/__init__.py +2 -2
- edsl/coop/coop.py +849 -849
- edsl/coop/utils.py +131 -131
- edsl/data/Cache.py +527 -527
- edsl/data/CacheEntry.py +228 -228
- edsl/data/CacheHandler.py +149 -149
- edsl/data/RemoteCacheSync.py +83 -83
- edsl/data/SQLiteDict.py +292 -292
- edsl/data/__init__.py +4 -4
- edsl/data/orm.py +10 -10
- edsl/data_transfer_models.py +73 -73
- edsl/enums.py +173 -173
- edsl/exceptions/__init__.py +50 -50
- edsl/exceptions/agents.py +40 -40
- edsl/exceptions/configuration.py +16 -16
- edsl/exceptions/coop.py +10 -10
- edsl/exceptions/data.py +14 -14
- edsl/exceptions/general.py +34 -34
- edsl/exceptions/jobs.py +33 -33
- edsl/exceptions/language_models.py +63 -63
- edsl/exceptions/prompts.py +15 -15
- edsl/exceptions/questions.py +91 -91
- edsl/exceptions/results.py +26 -26
- edsl/exceptions/surveys.py +34 -34
- edsl/inference_services/AnthropicService.py +87 -87
- edsl/inference_services/AwsBedrock.py +115 -115
- edsl/inference_services/AzureAI.py +217 -217
- edsl/inference_services/DeepInfraService.py +18 -18
- edsl/inference_services/GoogleService.py +156 -156
- edsl/inference_services/GroqService.py +20 -20
- edsl/inference_services/InferenceServiceABC.py +147 -147
- edsl/inference_services/InferenceServicesCollection.py +72 -68
- edsl/inference_services/MistralAIService.py +123 -123
- edsl/inference_services/OllamaService.py +18 -18
- edsl/inference_services/OpenAIService.py +224 -224
- edsl/inference_services/TestService.py +89 -89
- edsl/inference_services/TogetherAIService.py +170 -170
- edsl/inference_services/models_available_cache.py +118 -94
- edsl/inference_services/rate_limits_cache.py +25 -25
- edsl/inference_services/registry.py +39 -39
- edsl/inference_services/write_available.py +10 -10
- edsl/jobs/Answers.py +56 -56
- edsl/jobs/Jobs.py +1112 -1112
- edsl/jobs/__init__.py +1 -1
- edsl/jobs/buckets/BucketCollection.py +63 -63
- edsl/jobs/buckets/ModelBuckets.py +65 -65
- edsl/jobs/buckets/TokenBucket.py +248 -248
- edsl/jobs/interviews/Interview.py +651 -651
- edsl/jobs/interviews/InterviewExceptionCollection.py +99 -99
- edsl/jobs/interviews/InterviewExceptionEntry.py +182 -182
- edsl/jobs/interviews/InterviewStatistic.py +63 -63
- edsl/jobs/interviews/InterviewStatisticsCollection.py +25 -25
- edsl/jobs/interviews/InterviewStatusDictionary.py +78 -78
- edsl/jobs/interviews/InterviewStatusLog.py +92 -92
- edsl/jobs/interviews/ReportErrors.py +66 -66
- edsl/jobs/interviews/interview_status_enum.py +9 -9
- edsl/jobs/runners/JobsRunnerAsyncio.py +337 -337
- edsl/jobs/runners/JobsRunnerStatus.py +332 -332
- edsl/jobs/tasks/QuestionTaskCreator.py +242 -242
- edsl/jobs/tasks/TaskCreators.py +64 -64
- edsl/jobs/tasks/TaskHistory.py +441 -441
- edsl/jobs/tasks/TaskStatusLog.py +23 -23
- edsl/jobs/tasks/task_status_enum.py +163 -163
- edsl/jobs/tokens/InterviewTokenUsage.py +27 -27
- edsl/jobs/tokens/TokenUsage.py +34 -34
- edsl/language_models/LanguageModel.py +718 -718
- edsl/language_models/ModelList.py +102 -102
- edsl/language_models/RegisterLanguageModelsMeta.py +184 -184
- edsl/language_models/__init__.py +2 -2
- edsl/language_models/fake_openai_call.py +15 -15
- edsl/language_models/fake_openai_service.py +61 -61
- edsl/language_models/registry.py +137 -137
- edsl/language_models/repair.py +156 -156
- edsl/language_models/unused/ReplicateBase.py +83 -83
- edsl/language_models/utilities.py +64 -64
- edsl/notebooks/Notebook.py +259 -259
- edsl/notebooks/__init__.py +1 -1
- edsl/prompts/Prompt.py +358 -358
- edsl/prompts/__init__.py +2 -2
- edsl/questions/AnswerValidatorMixin.py +289 -289
- edsl/questions/QuestionBase.py +616 -616
- edsl/questions/QuestionBaseGenMixin.py +161 -161
- edsl/questions/QuestionBasePromptsMixin.py +266 -266
- edsl/questions/QuestionBudget.py +227 -227
- edsl/questions/QuestionCheckBox.py +359 -359
- edsl/questions/QuestionExtract.py +183 -183
- edsl/questions/QuestionFreeText.py +113 -113
- edsl/questions/QuestionFunctional.py +159 -159
- edsl/questions/QuestionList.py +231 -231
- edsl/questions/QuestionMultipleChoice.py +286 -286
- edsl/questions/QuestionNumerical.py +153 -153
- edsl/questions/QuestionRank.py +324 -324
- edsl/questions/Quick.py +41 -41
- edsl/questions/RegisterQuestionsMeta.py +71 -71
- edsl/questions/ResponseValidatorABC.py +174 -174
- edsl/questions/SimpleAskMixin.py +73 -73
- edsl/questions/__init__.py +26 -26
- edsl/questions/compose_questions.py +98 -98
- edsl/questions/decorators.py +21 -21
- edsl/questions/derived/QuestionLikertFive.py +76 -76
- edsl/questions/derived/QuestionLinearScale.py +87 -87
- edsl/questions/derived/QuestionTopK.py +91 -91
- edsl/questions/derived/QuestionYesNo.py +82 -82
- edsl/questions/descriptors.py +418 -418
- edsl/questions/prompt_templates/question_budget.jinja +13 -13
- edsl/questions/prompt_templates/question_checkbox.jinja +32 -32
- edsl/questions/prompt_templates/question_extract.jinja +11 -11
- edsl/questions/prompt_templates/question_free_text.jinja +3 -3
- edsl/questions/prompt_templates/question_linear_scale.jinja +11 -11
- edsl/questions/prompt_templates/question_list.jinja +17 -17
- edsl/questions/prompt_templates/question_multiple_choice.jinja +33 -33
- edsl/questions/prompt_templates/question_numerical.jinja +36 -36
- edsl/questions/question_registry.py +147 -147
- edsl/questions/settings.py +12 -12
- edsl/questions/templates/budget/answering_instructions.jinja +7 -7
- edsl/questions/templates/budget/question_presentation.jinja +7 -7
- edsl/questions/templates/checkbox/answering_instructions.jinja +10 -10
- edsl/questions/templates/checkbox/question_presentation.jinja +22 -22
- edsl/questions/templates/extract/answering_instructions.jinja +7 -7
- edsl/questions/templates/likert_five/answering_instructions.jinja +10 -10
- edsl/questions/templates/likert_five/question_presentation.jinja +11 -11
- edsl/questions/templates/linear_scale/answering_instructions.jinja +5 -5
- edsl/questions/templates/linear_scale/question_presentation.jinja +5 -5
- edsl/questions/templates/list/answering_instructions.jinja +3 -3
- edsl/questions/templates/list/question_presentation.jinja +5 -5
- edsl/questions/templates/multiple_choice/answering_instructions.jinja +9 -9
- edsl/questions/templates/multiple_choice/question_presentation.jinja +11 -11
- edsl/questions/templates/numerical/answering_instructions.jinja +6 -6
- edsl/questions/templates/numerical/question_presentation.jinja +6 -6
- edsl/questions/templates/rank/answering_instructions.jinja +11 -11
- edsl/questions/templates/rank/question_presentation.jinja +15 -15
- edsl/questions/templates/top_k/answering_instructions.jinja +8 -8
- edsl/questions/templates/top_k/question_presentation.jinja +22 -22
- edsl/questions/templates/yes_no/answering_instructions.jinja +6 -6
- edsl/questions/templates/yes_no/question_presentation.jinja +11 -11
- edsl/results/Dataset.py +293 -293
- edsl/results/DatasetExportMixin.py +693 -693
- edsl/results/DatasetTree.py +145 -145
- edsl/results/Result.py +433 -433
- edsl/results/Results.py +1158 -1158
- edsl/results/ResultsDBMixin.py +238 -238
- edsl/results/ResultsExportMixin.py +43 -43
- edsl/results/ResultsFetchMixin.py +33 -33
- edsl/results/ResultsGGMixin.py +121 -121
- edsl/results/ResultsToolsMixin.py +98 -98
- edsl/results/Selector.py +118 -118
- edsl/results/__init__.py +2 -2
- edsl/results/tree_explore.py +115 -115
- edsl/scenarios/FileStore.py +443 -443
- edsl/scenarios/Scenario.py +507 -507
- edsl/scenarios/ScenarioHtmlMixin.py +59 -59
- edsl/scenarios/ScenarioList.py +1101 -1101
- edsl/scenarios/ScenarioListExportMixin.py +52 -52
- edsl/scenarios/ScenarioListPdfMixin.py +261 -261
- edsl/scenarios/__init__.py +2 -2
- edsl/shared.py +1 -1
- edsl/study/ObjectEntry.py +173 -173
- edsl/study/ProofOfWork.py +113 -113
- edsl/study/SnapShot.py +80 -80
- edsl/study/Study.py +528 -528
- edsl/study/__init__.py +4 -4
- edsl/surveys/DAG.py +148 -148
- edsl/surveys/Memory.py +31 -31
- edsl/surveys/MemoryPlan.py +244 -244
- edsl/surveys/Rule.py +324 -324
- edsl/surveys/RuleCollection.py +387 -387
- edsl/surveys/Survey.py +1772 -1772
- edsl/surveys/SurveyCSS.py +261 -261
- edsl/surveys/SurveyExportMixin.py +259 -259
- edsl/surveys/SurveyFlowVisualizationMixin.py +121 -121
- edsl/surveys/SurveyQualtricsImport.py +284 -284
- edsl/surveys/__init__.py +3 -3
- edsl/surveys/base.py +53 -53
- edsl/surveys/descriptors.py +56 -56
- edsl/surveys/instructions/ChangeInstruction.py +47 -47
- edsl/surveys/instructions/Instruction.py +51 -51
- edsl/surveys/instructions/InstructionCollection.py +77 -77
- edsl/templates/error_reporting/base.html +23 -23
- edsl/templates/error_reporting/exceptions_by_model.html +34 -34
- edsl/templates/error_reporting/exceptions_by_question_name.html +16 -16
- edsl/templates/error_reporting/exceptions_by_type.html +16 -16
- edsl/templates/error_reporting/interview_details.html +115 -115
- edsl/templates/error_reporting/interviews.html +9 -9
- edsl/templates/error_reporting/overview.html +4 -4
- edsl/templates/error_reporting/performance_plot.html +1 -1
- edsl/templates/error_reporting/report.css +73 -73
- edsl/templates/error_reporting/report.html +117 -117
- edsl/templates/error_reporting/report.js +25 -25
- edsl/tools/__init__.py +1 -1
- edsl/tools/clusters.py +192 -192
- edsl/tools/embeddings.py +27 -27
- edsl/tools/embeddings_plotting.py +118 -118
- edsl/tools/plotting.py +112 -112
- edsl/tools/summarize.py +18 -18
- edsl/utilities/SystemInfo.py +28 -28
- edsl/utilities/__init__.py +22 -22
- edsl/utilities/ast_utilities.py +25 -25
- edsl/utilities/data/Registry.py +6 -6
- edsl/utilities/data/__init__.py +1 -1
- edsl/utilities/data/scooter_results.json +1 -1
- edsl/utilities/decorators.py +77 -77
- edsl/utilities/gcp_bucket/cloud_storage.py +96 -96
- edsl/utilities/interface.py +627 -627
- edsl/utilities/repair_functions.py +28 -28
- edsl/utilities/restricted_python.py +70 -70
- edsl/utilities/utilities.py +391 -391
- {edsl-0.1.36.dev5.dist-info → edsl-0.1.36.dev6.dist-info}/LICENSE +21 -21
- {edsl-0.1.36.dev5.dist-info → edsl-0.1.36.dev6.dist-info}/METADATA +1 -1
- edsl-0.1.36.dev6.dist-info/RECORD +279 -0
- edsl-0.1.36.dev5.dist-info/RECORD +0 -279
- {edsl-0.1.36.dev5.dist-info → edsl-0.1.36.dev6.dist-info}/WHEEL +0 -0
@@ -1,153 +1,153 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
# from decimal import Decimal
|
4
|
-
from random import uniform
|
5
|
-
from typing import Any, Optional, Union, Literal
|
6
|
-
|
7
|
-
from pydantic import BaseModel, Field, field_validator
|
8
|
-
|
9
|
-
from edsl.exceptions import QuestionAnswerValidationError
|
10
|
-
from edsl.questions.QuestionBase import QuestionBase
|
11
|
-
from edsl.questions.descriptors import NumericalOrNoneDescriptor
|
12
|
-
from edsl.questions.decorators import inject_exception
|
13
|
-
from edsl.questions.ResponseValidatorABC import ResponseValidatorABC
|
14
|
-
from edsl.exceptions.questions import QuestionAnswerValidationError
|
15
|
-
|
16
|
-
|
17
|
-
def create_numeric_response(
|
18
|
-
min_value: Optional[float] = None,
|
19
|
-
max_value: Optional[float] = None,
|
20
|
-
permissive=False,
|
21
|
-
):
|
22
|
-
field_kwargs = {}
|
23
|
-
if not permissive:
|
24
|
-
field_kwargs = {}
|
25
|
-
if min_value is not None:
|
26
|
-
field_kwargs["ge"] = min_value
|
27
|
-
if max_value is not None:
|
28
|
-
field_kwargs["le"] = max_value
|
29
|
-
|
30
|
-
class ConstrainedNumericResponse(BaseModel):
|
31
|
-
answer: Union[int, float] = Field(**field_kwargs)
|
32
|
-
comment: Optional[str] = Field(None)
|
33
|
-
generated_tokens: Optional[Any] = Field(None)
|
34
|
-
|
35
|
-
return ConstrainedNumericResponse
|
36
|
-
|
37
|
-
|
38
|
-
class NumericalResponseValidator(ResponseValidatorABC):
|
39
|
-
required_params = ["min_value", "max_value", "permissive"]
|
40
|
-
|
41
|
-
valid_examples = [
|
42
|
-
({"answer": 1}, {"min_value": 0, "max_value": 10}),
|
43
|
-
({"answer": 1}, {"min_value": None, "max_value": None}),
|
44
|
-
]
|
45
|
-
|
46
|
-
invalid_examples = [
|
47
|
-
({"answer": 10}, {"min_value": 0, "max_value": 5}, "Answer is out of range"),
|
48
|
-
({"answer": "ten"}, {"min_value": 0, "max_value": 5}, "Answer is not a number"),
|
49
|
-
({}, {"min_value": 0, "max_value": 5}, "Answer key is missing"),
|
50
|
-
]
|
51
|
-
|
52
|
-
def fix(self, response, verbose=False):
|
53
|
-
response_text = str(response).lower()
|
54
|
-
import re
|
55
|
-
|
56
|
-
if verbose:
|
57
|
-
print(f"Ivalid generated tokens was was: {response_text}")
|
58
|
-
pattern = r"\b\d+(?:\.\d+)?\b"
|
59
|
-
match = re.search(pattern, response_text.replace(",", ""))
|
60
|
-
solution = match.group(0) if match else response.get("answer")
|
61
|
-
if verbose:
|
62
|
-
print("Proposed solution is: ", solution)
|
63
|
-
if "comment" in response:
|
64
|
-
return {"answer": solution, "comment": response["comment"]}
|
65
|
-
else:
|
66
|
-
return {"answer": solution}
|
67
|
-
|
68
|
-
def _check_constraints(self, pydantic_edsl_answer: BaseModel):
|
69
|
-
pass
|
70
|
-
|
71
|
-
|
72
|
-
class QuestionNumerical(QuestionBase):
|
73
|
-
"""This question prompts the agent to answer with a numerical value.
|
74
|
-
|
75
|
-
>>> QuestionNumerical.self_check()
|
76
|
-
|
77
|
-
"""
|
78
|
-
|
79
|
-
question_type = "numerical"
|
80
|
-
min_value: Optional[float] = NumericalOrNoneDescriptor()
|
81
|
-
max_value: Optional[float] = NumericalOrNoneDescriptor()
|
82
|
-
|
83
|
-
_response_model = None
|
84
|
-
response_validator_class = NumericalResponseValidator
|
85
|
-
|
86
|
-
def __init__(
|
87
|
-
self,
|
88
|
-
question_name: str,
|
89
|
-
question_text: str,
|
90
|
-
min_value: Optional[Union[int, float]] = None,
|
91
|
-
max_value: Optional[Union[int, float]] = None,
|
92
|
-
include_comment: bool = True,
|
93
|
-
question_presentation: Optional[str] = None,
|
94
|
-
answering_instructions: Optional[str] = None,
|
95
|
-
permissive: bool = False,
|
96
|
-
):
|
97
|
-
"""Initialize the question.
|
98
|
-
|
99
|
-
:param question_name: The name of the question.
|
100
|
-
:param question_text: The text of the question.
|
101
|
-
:param min_value: The minimum value of the answer.
|
102
|
-
:param max_value: The maximum value of the answer.
|
103
|
-
"""
|
104
|
-
self.question_name = question_name
|
105
|
-
self.question_text = question_text
|
106
|
-
self.min_value = min_value
|
107
|
-
self.max_value = max_value
|
108
|
-
|
109
|
-
self.include_comment = include_comment
|
110
|
-
self.question_presentation = question_presentation
|
111
|
-
self.answering_instructions = answering_instructions
|
112
|
-
self.permissive = permissive
|
113
|
-
|
114
|
-
def create_response_model(self):
|
115
|
-
return create_numeric_response(self.min_value, self.max_value, self.permissive)
|
116
|
-
|
117
|
-
################
|
118
|
-
# Answer methods
|
119
|
-
################
|
120
|
-
|
121
|
-
@property
|
122
|
-
def question_html_content(self) -> str:
|
123
|
-
from jinja2 import Template
|
124
|
-
|
125
|
-
question_html_content = Template(
|
126
|
-
"""
|
127
|
-
<div>
|
128
|
-
<input type="number" id="{{ question_name }}" name="{{ question_name }}">
|
129
|
-
</div>
|
130
|
-
"""
|
131
|
-
).render(question_name=self.question_name)
|
132
|
-
return question_html_content
|
133
|
-
|
134
|
-
################
|
135
|
-
# Helpful methods
|
136
|
-
################
|
137
|
-
@classmethod
|
138
|
-
@inject_exception
|
139
|
-
def example(cls, include_comment=False) -> QuestionNumerical:
|
140
|
-
"""Return an example question."""
|
141
|
-
return cls(
|
142
|
-
question_name="age",
|
143
|
-
question_text="You are a 45 year old man. How old are you in years?",
|
144
|
-
min_value=0,
|
145
|
-
max_value=86.7,
|
146
|
-
include_comment=include_comment,
|
147
|
-
)
|
148
|
-
|
149
|
-
|
150
|
-
if __name__ == "__main__":
|
151
|
-
import doctest
|
152
|
-
|
153
|
-
doctest.testmod(optionflags=doctest.ELLIPSIS)
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
# from decimal import Decimal
|
4
|
+
from random import uniform
|
5
|
+
from typing import Any, Optional, Union, Literal
|
6
|
+
|
7
|
+
from pydantic import BaseModel, Field, field_validator
|
8
|
+
|
9
|
+
from edsl.exceptions import QuestionAnswerValidationError
|
10
|
+
from edsl.questions.QuestionBase import QuestionBase
|
11
|
+
from edsl.questions.descriptors import NumericalOrNoneDescriptor
|
12
|
+
from edsl.questions.decorators import inject_exception
|
13
|
+
from edsl.questions.ResponseValidatorABC import ResponseValidatorABC
|
14
|
+
from edsl.exceptions.questions import QuestionAnswerValidationError
|
15
|
+
|
16
|
+
|
17
|
+
def create_numeric_response(
|
18
|
+
min_value: Optional[float] = None,
|
19
|
+
max_value: Optional[float] = None,
|
20
|
+
permissive=False,
|
21
|
+
):
|
22
|
+
field_kwargs = {}
|
23
|
+
if not permissive:
|
24
|
+
field_kwargs = {}
|
25
|
+
if min_value is not None:
|
26
|
+
field_kwargs["ge"] = min_value
|
27
|
+
if max_value is not None:
|
28
|
+
field_kwargs["le"] = max_value
|
29
|
+
|
30
|
+
class ConstrainedNumericResponse(BaseModel):
|
31
|
+
answer: Union[int, float] = Field(**field_kwargs)
|
32
|
+
comment: Optional[str] = Field(None)
|
33
|
+
generated_tokens: Optional[Any] = Field(None)
|
34
|
+
|
35
|
+
return ConstrainedNumericResponse
|
36
|
+
|
37
|
+
|
38
|
+
class NumericalResponseValidator(ResponseValidatorABC):
|
39
|
+
required_params = ["min_value", "max_value", "permissive"]
|
40
|
+
|
41
|
+
valid_examples = [
|
42
|
+
({"answer": 1}, {"min_value": 0, "max_value": 10}),
|
43
|
+
({"answer": 1}, {"min_value": None, "max_value": None}),
|
44
|
+
]
|
45
|
+
|
46
|
+
invalid_examples = [
|
47
|
+
({"answer": 10}, {"min_value": 0, "max_value": 5}, "Answer is out of range"),
|
48
|
+
({"answer": "ten"}, {"min_value": 0, "max_value": 5}, "Answer is not a number"),
|
49
|
+
({}, {"min_value": 0, "max_value": 5}, "Answer key is missing"),
|
50
|
+
]
|
51
|
+
|
52
|
+
def fix(self, response, verbose=False):
|
53
|
+
response_text = str(response).lower()
|
54
|
+
import re
|
55
|
+
|
56
|
+
if verbose:
|
57
|
+
print(f"Ivalid generated tokens was was: {response_text}")
|
58
|
+
pattern = r"\b\d+(?:\.\d+)?\b"
|
59
|
+
match = re.search(pattern, response_text.replace(",", ""))
|
60
|
+
solution = match.group(0) if match else response.get("answer")
|
61
|
+
if verbose:
|
62
|
+
print("Proposed solution is: ", solution)
|
63
|
+
if "comment" in response:
|
64
|
+
return {"answer": solution, "comment": response["comment"]}
|
65
|
+
else:
|
66
|
+
return {"answer": solution}
|
67
|
+
|
68
|
+
def _check_constraints(self, pydantic_edsl_answer: BaseModel):
|
69
|
+
pass
|
70
|
+
|
71
|
+
|
72
|
+
class QuestionNumerical(QuestionBase):
|
73
|
+
"""This question prompts the agent to answer with a numerical value.
|
74
|
+
|
75
|
+
>>> QuestionNumerical.self_check()
|
76
|
+
|
77
|
+
"""
|
78
|
+
|
79
|
+
question_type = "numerical"
|
80
|
+
min_value: Optional[float] = NumericalOrNoneDescriptor()
|
81
|
+
max_value: Optional[float] = NumericalOrNoneDescriptor()
|
82
|
+
|
83
|
+
_response_model = None
|
84
|
+
response_validator_class = NumericalResponseValidator
|
85
|
+
|
86
|
+
def __init__(
|
87
|
+
self,
|
88
|
+
question_name: str,
|
89
|
+
question_text: str,
|
90
|
+
min_value: Optional[Union[int, float]] = None,
|
91
|
+
max_value: Optional[Union[int, float]] = None,
|
92
|
+
include_comment: bool = True,
|
93
|
+
question_presentation: Optional[str] = None,
|
94
|
+
answering_instructions: Optional[str] = None,
|
95
|
+
permissive: bool = False,
|
96
|
+
):
|
97
|
+
"""Initialize the question.
|
98
|
+
|
99
|
+
:param question_name: The name of the question.
|
100
|
+
:param question_text: The text of the question.
|
101
|
+
:param min_value: The minimum value of the answer.
|
102
|
+
:param max_value: The maximum value of the answer.
|
103
|
+
"""
|
104
|
+
self.question_name = question_name
|
105
|
+
self.question_text = question_text
|
106
|
+
self.min_value = min_value
|
107
|
+
self.max_value = max_value
|
108
|
+
|
109
|
+
self.include_comment = include_comment
|
110
|
+
self.question_presentation = question_presentation
|
111
|
+
self.answering_instructions = answering_instructions
|
112
|
+
self.permissive = permissive
|
113
|
+
|
114
|
+
def create_response_model(self):
|
115
|
+
return create_numeric_response(self.min_value, self.max_value, self.permissive)
|
116
|
+
|
117
|
+
################
|
118
|
+
# Answer methods
|
119
|
+
################
|
120
|
+
|
121
|
+
@property
|
122
|
+
def question_html_content(self) -> str:
|
123
|
+
from jinja2 import Template
|
124
|
+
|
125
|
+
question_html_content = Template(
|
126
|
+
"""
|
127
|
+
<div>
|
128
|
+
<input type="number" id="{{ question_name }}" name="{{ question_name }}">
|
129
|
+
</div>
|
130
|
+
"""
|
131
|
+
).render(question_name=self.question_name)
|
132
|
+
return question_html_content
|
133
|
+
|
134
|
+
################
|
135
|
+
# Helpful methods
|
136
|
+
################
|
137
|
+
@classmethod
|
138
|
+
@inject_exception
|
139
|
+
def example(cls, include_comment=False) -> QuestionNumerical:
|
140
|
+
"""Return an example question."""
|
141
|
+
return cls(
|
142
|
+
question_name="age",
|
143
|
+
question_text="You are a 45 year old man. How old are you in years?",
|
144
|
+
min_value=0,
|
145
|
+
max_value=86.7,
|
146
|
+
include_comment=include_comment,
|
147
|
+
)
|
148
|
+
|
149
|
+
|
150
|
+
if __name__ == "__main__":
|
151
|
+
import doctest
|
152
|
+
|
153
|
+
doctest.testmod(optionflags=doctest.ELLIPSIS)
|