edsl 0.1.14__py3-none-any.whl → 0.1.40__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 +348 -38
- edsl/BaseDiff.py +260 -0
- edsl/TemplateLoader.py +24 -0
- edsl/__init__.py +46 -10
- edsl/__version__.py +1 -0
- edsl/agents/Agent.py +842 -144
- edsl/agents/AgentList.py +521 -25
- edsl/agents/Invigilator.py +250 -374
- edsl/agents/InvigilatorBase.py +257 -0
- edsl/agents/PromptConstructor.py +272 -0
- edsl/agents/QuestionInstructionPromptBuilder.py +128 -0
- edsl/agents/QuestionTemplateReplacementsBuilder.py +137 -0
- edsl/agents/descriptors.py +43 -13
- edsl/agents/prompt_helpers.py +129 -0
- edsl/agents/question_option_processor.py +172 -0
- edsl/auto/AutoStudy.py +130 -0
- edsl/auto/StageBase.py +243 -0
- edsl/auto/StageGenerateSurvey.py +178 -0
- edsl/auto/StageLabelQuestions.py +125 -0
- edsl/auto/StagePersona.py +61 -0
- edsl/auto/StagePersonaDimensionValueRanges.py +88 -0
- edsl/auto/StagePersonaDimensionValues.py +74 -0
- edsl/auto/StagePersonaDimensions.py +69 -0
- edsl/auto/StageQuestions.py +74 -0
- edsl/auto/SurveyCreatorPipeline.py +21 -0
- edsl/auto/utilities.py +218 -0
- edsl/base/Base.py +279 -0
- edsl/config.py +121 -104
- edsl/conversation/Conversation.py +290 -0
- edsl/conversation/car_buying.py +59 -0
- edsl/conversation/chips.py +95 -0
- edsl/conversation/mug_negotiation.py +81 -0
- edsl/conversation/next_speaker_utilities.py +93 -0
- edsl/coop/CoopFunctionsMixin.py +15 -0
- edsl/coop/ExpectedParrotKeyHandler.py +125 -0
- edsl/coop/PriceFetcher.py +54 -0
- edsl/coop/__init__.py +1 -0
- edsl/coop/coop.py +1029 -134
- edsl/coop/utils.py +131 -0
- edsl/data/Cache.py +560 -89
- edsl/data/CacheEntry.py +230 -0
- edsl/data/CacheHandler.py +168 -0
- edsl/data/RemoteCacheSync.py +186 -0
- edsl/data/SQLiteDict.py +292 -0
- edsl/data/__init__.py +5 -3
- edsl/data/orm.py +6 -33
- edsl/data_transfer_models.py +74 -27
- edsl/enums.py +165 -8
- edsl/exceptions/BaseException.py +21 -0
- edsl/exceptions/__init__.py +52 -46
- edsl/exceptions/agents.py +33 -15
- edsl/exceptions/cache.py +5 -0
- edsl/exceptions/coop.py +8 -0
- edsl/exceptions/general.py +34 -0
- edsl/exceptions/inference_services.py +5 -0
- edsl/exceptions/jobs.py +15 -0
- edsl/exceptions/language_models.py +46 -1
- edsl/exceptions/questions.py +80 -5
- edsl/exceptions/results.py +16 -5
- edsl/exceptions/scenarios.py +29 -0
- edsl/exceptions/surveys.py +13 -10
- edsl/inference_services/AnthropicService.py +106 -0
- edsl/inference_services/AvailableModelCacheHandler.py +184 -0
- edsl/inference_services/AvailableModelFetcher.py +215 -0
- edsl/inference_services/AwsBedrock.py +118 -0
- edsl/inference_services/AzureAI.py +215 -0
- edsl/inference_services/DeepInfraService.py +18 -0
- edsl/inference_services/GoogleService.py +143 -0
- edsl/inference_services/GroqService.py +20 -0
- edsl/inference_services/InferenceServiceABC.py +80 -0
- edsl/inference_services/InferenceServicesCollection.py +138 -0
- edsl/inference_services/MistralAIService.py +120 -0
- edsl/inference_services/OllamaService.py +18 -0
- edsl/inference_services/OpenAIService.py +236 -0
- edsl/inference_services/PerplexityService.py +160 -0
- edsl/inference_services/ServiceAvailability.py +135 -0
- edsl/inference_services/TestService.py +90 -0
- edsl/inference_services/TogetherAIService.py +172 -0
- edsl/inference_services/data_structures.py +134 -0
- edsl/inference_services/models_available_cache.py +118 -0
- edsl/inference_services/rate_limits_cache.py +25 -0
- edsl/inference_services/registry.py +41 -0
- edsl/inference_services/write_available.py +10 -0
- edsl/jobs/AnswerQuestionFunctionConstructor.py +223 -0
- edsl/jobs/Answers.py +21 -20
- edsl/jobs/FetchInvigilator.py +47 -0
- edsl/jobs/InterviewTaskManager.py +98 -0
- edsl/jobs/InterviewsConstructor.py +50 -0
- edsl/jobs/Jobs.py +684 -204
- edsl/jobs/JobsChecks.py +172 -0
- edsl/jobs/JobsComponentConstructor.py +189 -0
- edsl/jobs/JobsPrompts.py +270 -0
- edsl/jobs/JobsRemoteInferenceHandler.py +311 -0
- edsl/jobs/JobsRemoteInferenceLogger.py +239 -0
- edsl/jobs/RequestTokenEstimator.py +30 -0
- edsl/jobs/async_interview_runner.py +138 -0
- edsl/jobs/buckets/BucketCollection.py +104 -0
- edsl/jobs/buckets/ModelBuckets.py +65 -0
- edsl/jobs/buckets/TokenBucket.py +283 -0
- edsl/jobs/buckets/TokenBucketAPI.py +211 -0
- edsl/jobs/buckets/TokenBucketClient.py +191 -0
- edsl/jobs/check_survey_scenario_compatibility.py +85 -0
- edsl/jobs/data_structures.py +120 -0
- edsl/jobs/decorators.py +35 -0
- edsl/jobs/interviews/Interview.py +392 -0
- edsl/jobs/interviews/InterviewExceptionCollection.py +99 -0
- edsl/jobs/interviews/InterviewExceptionEntry.py +186 -0
- edsl/jobs/interviews/InterviewStatistic.py +63 -0
- edsl/jobs/interviews/InterviewStatisticsCollection.py +25 -0
- edsl/jobs/interviews/InterviewStatusDictionary.py +78 -0
- edsl/jobs/interviews/InterviewStatusLog.py +92 -0
- edsl/jobs/interviews/ReportErrors.py +66 -0
- edsl/jobs/interviews/interview_status_enum.py +9 -0
- edsl/jobs/jobs_status_enums.py +9 -0
- edsl/jobs/loggers/HTMLTableJobLogger.py +304 -0
- edsl/jobs/results_exceptions_handler.py +98 -0
- edsl/jobs/runners/JobsRunnerAsyncio.py +151 -110
- edsl/jobs/runners/JobsRunnerStatus.py +298 -0
- edsl/jobs/tasks/QuestionTaskCreator.py +244 -0
- edsl/jobs/tasks/TaskCreators.py +64 -0
- edsl/jobs/tasks/TaskHistory.py +470 -0
- edsl/jobs/tasks/TaskStatusLog.py +23 -0
- edsl/jobs/tasks/task_status_enum.py +161 -0
- edsl/jobs/tokens/InterviewTokenUsage.py +27 -0
- edsl/jobs/tokens/TokenUsage.py +34 -0
- edsl/language_models/ComputeCost.py +63 -0
- edsl/language_models/LanguageModel.py +507 -386
- edsl/language_models/ModelList.py +164 -0
- edsl/language_models/PriceManager.py +127 -0
- edsl/language_models/RawResponseHandler.py +106 -0
- edsl/language_models/RegisterLanguageModelsMeta.py +184 -0
- edsl/language_models/__init__.py +1 -8
- edsl/language_models/fake_openai_call.py +15 -0
- edsl/language_models/fake_openai_service.py +61 -0
- edsl/language_models/key_management/KeyLookup.py +63 -0
- edsl/language_models/key_management/KeyLookupBuilder.py +273 -0
- edsl/language_models/key_management/KeyLookupCollection.py +38 -0
- edsl/language_models/key_management/__init__.py +0 -0
- edsl/language_models/key_management/models.py +131 -0
- edsl/language_models/model.py +256 -0
- edsl/language_models/repair.py +109 -41
- edsl/language_models/utilities.py +65 -0
- edsl/notebooks/Notebook.py +263 -0
- edsl/notebooks/NotebookToLaTeX.py +142 -0
- edsl/notebooks/__init__.py +1 -0
- edsl/prompts/Prompt.py +222 -93
- edsl/prompts/__init__.py +1 -1
- edsl/questions/ExceptionExplainer.py +77 -0
- edsl/questions/HTMLQuestion.py +103 -0
- edsl/questions/QuestionBase.py +518 -0
- edsl/questions/QuestionBasePromptsMixin.py +221 -0
- edsl/questions/QuestionBudget.py +164 -67
- edsl/questions/QuestionCheckBox.py +281 -62
- edsl/questions/QuestionDict.py +343 -0
- edsl/questions/QuestionExtract.py +136 -50
- edsl/questions/QuestionFreeText.py +79 -55
- edsl/questions/QuestionFunctional.py +138 -41
- edsl/questions/QuestionList.py +184 -57
- edsl/questions/QuestionMatrix.py +265 -0
- edsl/questions/QuestionMultipleChoice.py +293 -69
- edsl/questions/QuestionNumerical.py +109 -56
- edsl/questions/QuestionRank.py +244 -49
- edsl/questions/Quick.py +41 -0
- edsl/questions/SimpleAskMixin.py +74 -0
- edsl/questions/__init__.py +9 -6
- edsl/questions/{AnswerValidatorMixin.py → answer_validator_mixin.py} +153 -38
- edsl/questions/compose_questions.py +13 -7
- edsl/questions/data_structures.py +20 -0
- edsl/questions/decorators.py +21 -0
- edsl/questions/derived/QuestionLikertFive.py +28 -26
- edsl/questions/derived/QuestionLinearScale.py +41 -28
- edsl/questions/derived/QuestionTopK.py +34 -26
- edsl/questions/derived/QuestionYesNo.py +40 -27
- edsl/questions/descriptors.py +228 -74
- edsl/questions/loop_processor.py +149 -0
- edsl/questions/prompt_templates/question_budget.jinja +13 -0
- edsl/questions/prompt_templates/question_checkbox.jinja +32 -0
- edsl/questions/prompt_templates/question_extract.jinja +11 -0
- edsl/questions/prompt_templates/question_free_text.jinja +3 -0
- edsl/questions/prompt_templates/question_linear_scale.jinja +11 -0
- edsl/questions/prompt_templates/question_list.jinja +17 -0
- edsl/questions/prompt_templates/question_multiple_choice.jinja +33 -0
- edsl/questions/prompt_templates/question_numerical.jinja +37 -0
- edsl/questions/question_base_gen_mixin.py +168 -0
- edsl/questions/question_registry.py +130 -46
- edsl/questions/register_questions_meta.py +71 -0
- edsl/questions/response_validator_abc.py +188 -0
- edsl/questions/response_validator_factory.py +34 -0
- edsl/questions/settings.py +5 -2
- edsl/questions/templates/__init__.py +0 -0
- edsl/questions/templates/budget/__init__.py +0 -0
- edsl/questions/templates/budget/answering_instructions.jinja +7 -0
- edsl/questions/templates/budget/question_presentation.jinja +7 -0
- edsl/questions/templates/checkbox/__init__.py +0 -0
- edsl/questions/templates/checkbox/answering_instructions.jinja +10 -0
- edsl/questions/templates/checkbox/question_presentation.jinja +22 -0
- edsl/questions/templates/dict/__init__.py +0 -0
- edsl/questions/templates/dict/answering_instructions.jinja +21 -0
- edsl/questions/templates/dict/question_presentation.jinja +1 -0
- edsl/questions/templates/extract/__init__.py +0 -0
- edsl/questions/templates/extract/answering_instructions.jinja +7 -0
- edsl/questions/templates/extract/question_presentation.jinja +1 -0
- edsl/questions/templates/free_text/__init__.py +0 -0
- edsl/questions/templates/free_text/answering_instructions.jinja +0 -0
- edsl/questions/templates/free_text/question_presentation.jinja +1 -0
- edsl/questions/templates/likert_five/__init__.py +0 -0
- edsl/questions/templates/likert_five/answering_instructions.jinja +10 -0
- edsl/questions/templates/likert_five/question_presentation.jinja +12 -0
- edsl/questions/templates/linear_scale/__init__.py +0 -0
- edsl/questions/templates/linear_scale/answering_instructions.jinja +5 -0
- edsl/questions/templates/linear_scale/question_presentation.jinja +5 -0
- edsl/questions/templates/list/__init__.py +0 -0
- edsl/questions/templates/list/answering_instructions.jinja +4 -0
- edsl/questions/templates/list/question_presentation.jinja +5 -0
- edsl/questions/templates/matrix/__init__.py +1 -0
- edsl/questions/templates/matrix/answering_instructions.jinja +5 -0
- edsl/questions/templates/matrix/question_presentation.jinja +20 -0
- edsl/questions/templates/multiple_choice/__init__.py +0 -0
- edsl/questions/templates/multiple_choice/answering_instructions.jinja +9 -0
- edsl/questions/templates/multiple_choice/html.jinja +0 -0
- edsl/questions/templates/multiple_choice/question_presentation.jinja +12 -0
- edsl/questions/templates/numerical/__init__.py +0 -0
- edsl/questions/templates/numerical/answering_instructions.jinja +7 -0
- edsl/questions/templates/numerical/question_presentation.jinja +7 -0
- edsl/questions/templates/rank/__init__.py +0 -0
- edsl/questions/templates/rank/answering_instructions.jinja +11 -0
- edsl/questions/templates/rank/question_presentation.jinja +15 -0
- edsl/questions/templates/top_k/__init__.py +0 -0
- edsl/questions/templates/top_k/answering_instructions.jinja +8 -0
- edsl/questions/templates/top_k/question_presentation.jinja +22 -0
- edsl/questions/templates/yes_no/__init__.py +0 -0
- edsl/questions/templates/yes_no/answering_instructions.jinja +6 -0
- edsl/questions/templates/yes_no/question_presentation.jinja +12 -0
- edsl/results/CSSParameterizer.py +108 -0
- edsl/results/Dataset.py +550 -19
- edsl/results/DatasetExportMixin.py +594 -0
- edsl/results/DatasetTree.py +295 -0
- edsl/results/MarkdownToDocx.py +122 -0
- edsl/results/MarkdownToPDF.py +111 -0
- edsl/results/Result.py +477 -173
- edsl/results/Results.py +987 -269
- edsl/results/ResultsExportMixin.py +28 -125
- edsl/results/ResultsGGMixin.py +83 -15
- edsl/results/TableDisplay.py +125 -0
- edsl/results/TextEditor.py +50 -0
- edsl/results/__init__.py +1 -1
- edsl/results/file_exports.py +252 -0
- edsl/results/results_fetch_mixin.py +33 -0
- edsl/results/results_selector.py +145 -0
- edsl/results/results_tools_mixin.py +98 -0
- edsl/results/smart_objects.py +96 -0
- edsl/results/table_data_class.py +12 -0
- edsl/results/table_display.css +78 -0
- edsl/results/table_renderers.py +118 -0
- edsl/results/tree_explore.py +115 -0
- edsl/scenarios/ConstructDownloadLink.py +109 -0
- edsl/scenarios/DocumentChunker.py +102 -0
- edsl/scenarios/DocxScenario.py +16 -0
- edsl/scenarios/FileStore.py +543 -0
- edsl/scenarios/PdfExtractor.py +40 -0
- edsl/scenarios/Scenario.py +431 -62
- edsl/scenarios/ScenarioHtmlMixin.py +65 -0
- edsl/scenarios/ScenarioList.py +1415 -45
- edsl/scenarios/ScenarioListExportMixin.py +45 -0
- edsl/scenarios/ScenarioListPdfMixin.py +239 -0
- edsl/scenarios/__init__.py +2 -0
- edsl/scenarios/directory_scanner.py +96 -0
- edsl/scenarios/file_methods.py +85 -0
- edsl/scenarios/handlers/__init__.py +13 -0
- edsl/scenarios/handlers/csv.py +49 -0
- edsl/scenarios/handlers/docx.py +76 -0
- edsl/scenarios/handlers/html.py +37 -0
- edsl/scenarios/handlers/json.py +111 -0
- edsl/scenarios/handlers/latex.py +5 -0
- edsl/scenarios/handlers/md.py +51 -0
- edsl/scenarios/handlers/pdf.py +68 -0
- edsl/scenarios/handlers/png.py +39 -0
- edsl/scenarios/handlers/pptx.py +105 -0
- edsl/scenarios/handlers/py.py +294 -0
- edsl/scenarios/handlers/sql.py +313 -0
- edsl/scenarios/handlers/sqlite.py +149 -0
- edsl/scenarios/handlers/txt.py +33 -0
- edsl/scenarios/scenario_join.py +131 -0
- edsl/scenarios/scenario_selector.py +156 -0
- edsl/shared.py +1 -0
- edsl/study/ObjectEntry.py +173 -0
- edsl/study/ProofOfWork.py +113 -0
- edsl/study/SnapShot.py +80 -0
- edsl/study/Study.py +521 -0
- edsl/study/__init__.py +4 -0
- edsl/surveys/ConstructDAG.py +92 -0
- edsl/surveys/DAG.py +92 -11
- edsl/surveys/EditSurvey.py +221 -0
- edsl/surveys/InstructionHandler.py +100 -0
- edsl/surveys/Memory.py +9 -4
- edsl/surveys/MemoryManagement.py +72 -0
- edsl/surveys/MemoryPlan.py +156 -35
- edsl/surveys/Rule.py +221 -74
- edsl/surveys/RuleCollection.py +241 -61
- edsl/surveys/RuleManager.py +172 -0
- edsl/surveys/Simulator.py +75 -0
- edsl/surveys/Survey.py +1079 -339
- edsl/surveys/SurveyCSS.py +273 -0
- edsl/surveys/SurveyExportMixin.py +235 -40
- edsl/surveys/SurveyFlowVisualization.py +181 -0
- edsl/surveys/SurveyQualtricsImport.py +284 -0
- edsl/surveys/SurveyToApp.py +141 -0
- edsl/surveys/__init__.py +4 -2
- edsl/surveys/base.py +19 -3
- edsl/surveys/descriptors.py +17 -6
- edsl/surveys/instructions/ChangeInstruction.py +48 -0
- edsl/surveys/instructions/Instruction.py +56 -0
- edsl/surveys/instructions/InstructionCollection.py +82 -0
- edsl/surveys/instructions/__init__.py +0 -0
- edsl/templates/error_reporting/base.html +24 -0
- edsl/templates/error_reporting/exceptions_by_model.html +35 -0
- edsl/templates/error_reporting/exceptions_by_question_name.html +17 -0
- edsl/templates/error_reporting/exceptions_by_type.html +17 -0
- edsl/templates/error_reporting/interview_details.html +116 -0
- edsl/templates/error_reporting/interviews.html +19 -0
- edsl/templates/error_reporting/overview.html +5 -0
- edsl/templates/error_reporting/performance_plot.html +2 -0
- edsl/templates/error_reporting/report.css +74 -0
- edsl/templates/error_reporting/report.html +118 -0
- edsl/templates/error_reporting/report.js +25 -0
- edsl/tools/__init__.py +1 -0
- edsl/tools/clusters.py +192 -0
- edsl/tools/embeddings.py +27 -0
- edsl/tools/embeddings_plotting.py +118 -0
- edsl/tools/plotting.py +112 -0
- edsl/tools/summarize.py +18 -0
- edsl/utilities/PrettyList.py +56 -0
- edsl/utilities/SystemInfo.py +5 -0
- edsl/utilities/__init__.py +21 -20
- edsl/utilities/ast_utilities.py +3 -0
- edsl/utilities/data/Registry.py +2 -0
- edsl/utilities/decorators.py +41 -0
- edsl/utilities/gcp_bucket/__init__.py +0 -0
- edsl/utilities/gcp_bucket/cloud_storage.py +96 -0
- edsl/utilities/interface.py +310 -60
- edsl/utilities/is_notebook.py +18 -0
- edsl/utilities/is_valid_variable_name.py +11 -0
- edsl/utilities/naming_utilities.py +263 -0
- edsl/utilities/remove_edsl_version.py +24 -0
- edsl/utilities/repair_functions.py +28 -0
- edsl/utilities/restricted_python.py +70 -0
- edsl/utilities/utilities.py +203 -13
- edsl-0.1.40.dist-info/METADATA +111 -0
- edsl-0.1.40.dist-info/RECORD +362 -0
- {edsl-0.1.14.dist-info → edsl-0.1.40.dist-info}/WHEEL +1 -1
- edsl/agents/AgentListExportMixin.py +0 -24
- edsl/coop/old.py +0 -31
- edsl/data/Database.py +0 -141
- edsl/data/crud.py +0 -121
- edsl/jobs/Interview.py +0 -417
- edsl/jobs/JobsRunner.py +0 -63
- edsl/jobs/JobsRunnerStatusMixin.py +0 -115
- edsl/jobs/base.py +0 -47
- edsl/jobs/buckets.py +0 -166
- edsl/jobs/runners/JobsRunnerDryRun.py +0 -19
- edsl/jobs/runners/JobsRunnerStreaming.py +0 -54
- edsl/jobs/task_management.py +0 -218
- edsl/jobs/token_tracking.py +0 -78
- edsl/language_models/DeepInfra.py +0 -69
- edsl/language_models/OpenAI.py +0 -98
- edsl/language_models/model_interfaces/GeminiPro.py +0 -66
- edsl/language_models/model_interfaces/LanguageModelOpenAIFour.py +0 -8
- edsl/language_models/model_interfaces/LanguageModelOpenAIThreeFiveTurbo.py +0 -8
- edsl/language_models/model_interfaces/LlamaTwo13B.py +0 -21
- edsl/language_models/model_interfaces/LlamaTwo70B.py +0 -21
- edsl/language_models/model_interfaces/Mixtral8x7B.py +0 -24
- edsl/language_models/registry.py +0 -81
- edsl/language_models/schemas.py +0 -15
- edsl/language_models/unused/ReplicateBase.py +0 -83
- edsl/prompts/QuestionInstructionsBase.py +0 -6
- edsl/prompts/library/agent_instructions.py +0 -29
- edsl/prompts/library/agent_persona.py +0 -17
- edsl/prompts/library/question_budget.py +0 -26
- edsl/prompts/library/question_checkbox.py +0 -32
- edsl/prompts/library/question_extract.py +0 -19
- edsl/prompts/library/question_freetext.py +0 -14
- edsl/prompts/library/question_linear_scale.py +0 -20
- edsl/prompts/library/question_list.py +0 -22
- edsl/prompts/library/question_multiple_choice.py +0 -44
- edsl/prompts/library/question_numerical.py +0 -31
- edsl/prompts/library/question_rank.py +0 -21
- edsl/prompts/prompt_config.py +0 -33
- edsl/prompts/registry.py +0 -185
- edsl/questions/Question.py +0 -240
- edsl/report/InputOutputDataTypes.py +0 -134
- edsl/report/RegressionMixin.py +0 -28
- edsl/report/ReportOutputs.py +0 -1228
- edsl/report/ResultsFetchMixin.py +0 -106
- edsl/report/ResultsOutputMixin.py +0 -14
- edsl/report/demo.ipynb +0 -645
- edsl/results/ResultsDBMixin.py +0 -184
- edsl/surveys/SurveyFlowVisualizationMixin.py +0 -92
- edsl/trackers/Tracker.py +0 -91
- edsl/trackers/TrackerAPI.py +0 -196
- edsl/trackers/TrackerTasks.py +0 -70
- edsl/utilities/pastebin.py +0 -141
- edsl-0.1.14.dist-info/METADATA +0 -69
- edsl-0.1.14.dist-info/RECORD +0 -141
- /edsl/{language_models/model_interfaces → inference_services}/__init__.py +0 -0
- /edsl/{report/__init__.py → jobs/runners/JobsRunnerStatusData.py} +0 -0
- /edsl/{trackers/__init__.py → language_models/ServiceDataSources.py} +0 -0
- {edsl-0.1.14.dist-info → edsl-0.1.40.dist-info}/LICENSE +0 -0
edsl/jobs/token_tracking.py
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
class TokenPricing:
|
2
|
-
def __init__(
|
3
|
-
self,
|
4
|
-
*,
|
5
|
-
model_name,
|
6
|
-
prompt_token_price_per_k: float,
|
7
|
-
completion_token_price_per_k: float,
|
8
|
-
):
|
9
|
-
self.model_name = model_name
|
10
|
-
self.prompt_token_price = prompt_token_price_per_k / 1_000.0
|
11
|
-
self.completion_token_price = completion_token_price_per_k / 1_000.0
|
12
|
-
|
13
|
-
def __eq__(self, other):
|
14
|
-
if not isinstance(other, TokenPricing):
|
15
|
-
return False
|
16
|
-
return (
|
17
|
-
self.model_name == other.model_name
|
18
|
-
and self.prompt_token_price == other.prompt_token_price
|
19
|
-
and self.completion_token_price == other.completion_token_price
|
20
|
-
)
|
21
|
-
|
22
|
-
|
23
|
-
class TokenUsage:
|
24
|
-
def __init__(
|
25
|
-
self, from_cache: bool, prompt_tokens: int = 0, completion_tokens: int = 0
|
26
|
-
):
|
27
|
-
self.from_cache = from_cache
|
28
|
-
self.prompt_tokens = prompt_tokens
|
29
|
-
self.completion_tokens = completion_tokens
|
30
|
-
|
31
|
-
def add_tokens(self, prompt_tokens, completion_tokens):
|
32
|
-
self.prompt_tokens += prompt_tokens
|
33
|
-
self.completion_tokens += completion_tokens
|
34
|
-
|
35
|
-
def __add__(self, other):
|
36
|
-
if not isinstance(other, TokenUsage):
|
37
|
-
raise ValueError(f"Can't add {type(other)} to InterviewTokenUsage")
|
38
|
-
if self.from_cache != other.from_cache:
|
39
|
-
raise ValueError(f"Can't add token usages from different sources")
|
40
|
-
return TokenUsage(
|
41
|
-
from_cache=self.from_cache,
|
42
|
-
prompt_tokens=self.prompt_tokens + other.prompt_tokens,
|
43
|
-
completion_tokens=self.completion_tokens + other.completion_tokens,
|
44
|
-
)
|
45
|
-
|
46
|
-
def __repr__(self):
|
47
|
-
return f"TokenUsage(from_cache={self.from_cache}, prompt_tokens={self.prompt_tokens}, completion_tokens={self.completion_tokens})"
|
48
|
-
|
49
|
-
def cost(self, prices: TokenPricing):
|
50
|
-
return (
|
51
|
-
self.prompt_tokens * prices.prompt_token_price
|
52
|
-
+ self.completion_tokens * prices.completion_token_price
|
53
|
-
)
|
54
|
-
|
55
|
-
|
56
|
-
class InterviewTokenUsage:
|
57
|
-
def __init__(
|
58
|
-
self, new_token_usage: TokenUsage = None, cached_token_usage: TokenUsage = None
|
59
|
-
):
|
60
|
-
self.new_token_usage = new_token_usage or TokenUsage(from_cache=False)
|
61
|
-
self.cached_token_usage = cached_token_usage or TokenUsage(from_cache=True)
|
62
|
-
|
63
|
-
def __add__(self, other):
|
64
|
-
if not isinstance(other, InterviewTokenUsage):
|
65
|
-
raise ValueError(f"Can't add {type(other)} to InterviewTokenSummary")
|
66
|
-
return InterviewTokenUsage(
|
67
|
-
new_token_usage=self.new_token_usage + other.new_token_usage,
|
68
|
-
cached_token_usage=self.cached_token_usage + other.cached_token_usage,
|
69
|
-
)
|
70
|
-
|
71
|
-
def __repr__(self):
|
72
|
-
return f"InterviewTokenUsage(new_token_usage={self.new_token_usage}, cached_token_usage={self.cached_token_usage})"
|
73
|
-
|
74
|
-
def cost(self, prices: TokenPricing):
|
75
|
-
return self.new_token_usage.cost(prices)
|
76
|
-
|
77
|
-
def saved(self, prices: TokenPricing):
|
78
|
-
return self.cached_token_usage.cost(prices)
|
@@ -1,69 +0,0 @@
|
|
1
|
-
import aiohttp
|
2
|
-
import json
|
3
|
-
from typing import Any
|
4
|
-
from edsl import CONFIG
|
5
|
-
from edsl.enums import LanguageModelType, InferenceServiceType
|
6
|
-
from edsl.language_models.LanguageModel import LanguageModel
|
7
|
-
|
8
|
-
|
9
|
-
def create_deep_infra_model(model_name, url, model_class_name) -> LanguageModel:
|
10
|
-
if not LanguageModelType.is_value_valid(model_name):
|
11
|
-
acceptable_values = [item.value for item in LanguageModelType]
|
12
|
-
raise Exception(
|
13
|
-
f"""
|
14
|
-
A Prompt's model must be one of {LanguageModelType} values, which are
|
15
|
-
currently {acceptable_values}. You passed {model_name}."""
|
16
|
-
)
|
17
|
-
|
18
|
-
class LLM(LanguageModel):
|
19
|
-
_inference_service_ = InferenceServiceType.DEEP_INFRA.value
|
20
|
-
_model_ = model_name
|
21
|
-
_parameters_ = {
|
22
|
-
"temperature": 0.5,
|
23
|
-
"top_p": 1,
|
24
|
-
"top_k": 1,
|
25
|
-
"max_new_tokens": 2048,
|
26
|
-
"stopSequences": [],
|
27
|
-
"use_cache": True,
|
28
|
-
}
|
29
|
-
api_token = CONFIG.get("DEEP_INFRA_API_KEY")
|
30
|
-
|
31
|
-
async def async_execute_model_call(
|
32
|
-
self, user_prompt: str, system_prompt: str = ""
|
33
|
-
) -> dict[str, Any]:
|
34
|
-
self.url = url
|
35
|
-
headers = {
|
36
|
-
"Content-Type": "application/json",
|
37
|
-
"Authorization": f"Token {self.api_token}",
|
38
|
-
}
|
39
|
-
data = {
|
40
|
-
"input": f"""
|
41
|
-
[INST]<<SYS>> {system_prompt}
|
42
|
-
<<SYS>[/INST]
|
43
|
-
{user_prompt} [/INST]
|
44
|
-
""",
|
45
|
-
"stream": False,
|
46
|
-
"temperature": self.temperature,
|
47
|
-
"top_p": self.top_p,
|
48
|
-
"top_k": self.top_k,
|
49
|
-
"max_new_tokens": self.max_new_tokens,
|
50
|
-
}
|
51
|
-
async with aiohttp.ClientSession() as session:
|
52
|
-
async with session.post(
|
53
|
-
self.url, headers=headers, data=json.dumps(data)
|
54
|
-
) as response:
|
55
|
-
raw_response_text = await response.text()
|
56
|
-
return json.loads(raw_response_text)
|
57
|
-
|
58
|
-
def parse_response(self, raw_response: dict[str, Any]) -> str:
|
59
|
-
return raw_response["results"][0]["generated_text"]
|
60
|
-
|
61
|
-
LLM.__name__ = model_class_name
|
62
|
-
|
63
|
-
return LLM
|
64
|
-
|
65
|
-
|
66
|
-
if __name__ == "__main__":
|
67
|
-
pass
|
68
|
-
# results = m.execute_model_call("Why is Cape Cod a popular vacation spot?")
|
69
|
-
# print(m.parse_response(results))
|
edsl/language_models/OpenAI.py
DELETED
@@ -1,98 +0,0 @@
|
|
1
|
-
import openai
|
2
|
-
import re
|
3
|
-
from typing import Any
|
4
|
-
from edsl import CONFIG
|
5
|
-
from openai import AsyncOpenAI
|
6
|
-
from edsl.enums import LanguageModelType, InferenceServiceType
|
7
|
-
from edsl.language_models import LanguageModel
|
8
|
-
|
9
|
-
LanguageModelType.GPT_4.value
|
10
|
-
|
11
|
-
|
12
|
-
def create_openai_model(model_name, model_class_name) -> LanguageModel:
|
13
|
-
openai.api_key = CONFIG.get("OPENAI_API_KEY")
|
14
|
-
|
15
|
-
class LLM(LanguageModel):
|
16
|
-
"""
|
17
|
-
Child class of LanguageModel for interacting with OpenAI models
|
18
|
-
"""
|
19
|
-
|
20
|
-
_inference_service_ = InferenceServiceType.OPENAI.value
|
21
|
-
_model_ = model_name
|
22
|
-
_parameters_ = {
|
23
|
-
"temperature": 0.5,
|
24
|
-
"max_tokens": 1000,
|
25
|
-
"top_p": 1,
|
26
|
-
"frequency_penalty": 0,
|
27
|
-
"presence_penalty": 0,
|
28
|
-
"use_cache": True,
|
29
|
-
}
|
30
|
-
client = AsyncOpenAI()
|
31
|
-
|
32
|
-
def get_headers(self) -> dict[str, Any]:
|
33
|
-
from openai import OpenAI
|
34
|
-
|
35
|
-
client = OpenAI()
|
36
|
-
response = client.chat.completions.with_raw_response.create(
|
37
|
-
messages=[
|
38
|
-
{
|
39
|
-
"role": "user",
|
40
|
-
"content": "Say this is a test",
|
41
|
-
}
|
42
|
-
],
|
43
|
-
model=self.model,
|
44
|
-
)
|
45
|
-
return dict(response.headers)
|
46
|
-
|
47
|
-
def get_rate_limits(self) -> dict[str, Any]:
|
48
|
-
try:
|
49
|
-
headers = self.get_headers()
|
50
|
-
except Exception as e:
|
51
|
-
return {
|
52
|
-
"rpm": 10_000,
|
53
|
-
"tpm": 2_000_000,
|
54
|
-
}
|
55
|
-
else:
|
56
|
-
return {
|
57
|
-
"rpm": int(headers["x-ratelimit-limit-requests"]),
|
58
|
-
"tpm": int(headers["x-ratelimit-limit-tokens"]),
|
59
|
-
}
|
60
|
-
|
61
|
-
async def async_execute_model_call(
|
62
|
-
self, user_prompt: str, system_prompt: str = ""
|
63
|
-
) -> dict[str, Any]:
|
64
|
-
"""Calls the OpenAI API and returns the API response."""
|
65
|
-
response = await self.client.chat.completions.create(
|
66
|
-
model=self.model,
|
67
|
-
messages=[
|
68
|
-
{"role": "system", "content": system_prompt},
|
69
|
-
{"role": "user", "content": user_prompt},
|
70
|
-
],
|
71
|
-
temperature=self.temperature,
|
72
|
-
max_tokens=self.max_tokens,
|
73
|
-
top_p=self.top_p,
|
74
|
-
frequency_penalty=self.frequency_penalty,
|
75
|
-
presence_penalty=self.presence_penalty,
|
76
|
-
)
|
77
|
-
return response.model_dump()
|
78
|
-
|
79
|
-
@staticmethod
|
80
|
-
def parse_response(raw_response: dict[str, Any]) -> str:
|
81
|
-
"""Parses the API response and returns the response text."""
|
82
|
-
response = raw_response["choices"][0]["message"]["content"]
|
83
|
-
pattern = r"^```json(?:\\n|\n)(.+?)(?:\\n|\n)```$"
|
84
|
-
match = re.match(pattern, response, re.DOTALL)
|
85
|
-
if match:
|
86
|
-
return match.group(1)
|
87
|
-
else:
|
88
|
-
return response
|
89
|
-
|
90
|
-
LLM.__name__ = model_class_name
|
91
|
-
|
92
|
-
return LLM
|
93
|
-
|
94
|
-
|
95
|
-
if __name__ == "__main__":
|
96
|
-
import doctest
|
97
|
-
|
98
|
-
doctest.testmod()
|
@@ -1,66 +0,0 @@
|
|
1
|
-
import aiohttp
|
2
|
-
import json
|
3
|
-
from typing import Any
|
4
|
-
from edsl import CONFIG
|
5
|
-
from edsl.language_models.LanguageModel import LanguageModel
|
6
|
-
from edsl.enums import LanguageModelType, InferenceServiceType
|
7
|
-
|
8
|
-
|
9
|
-
class GeminiPro(LanguageModel):
|
10
|
-
_inference_service_ = InferenceServiceType.GOOGLE.value
|
11
|
-
_model_ = LanguageModelType.GEMINI_PRO.value
|
12
|
-
_parameters_ = {
|
13
|
-
"temperature": 0.5,
|
14
|
-
"topP": 1,
|
15
|
-
"topK": 1,
|
16
|
-
"maxOutputTokens": 2048,
|
17
|
-
"stopSequences": [],
|
18
|
-
"use_cache": True,
|
19
|
-
}
|
20
|
-
api_token = CONFIG.get("GOOGLE_API_KEY")
|
21
|
-
|
22
|
-
async def async_execute_model_call(
|
23
|
-
self, user_prompt: str, system_prompt: str = ""
|
24
|
-
) -> dict[str, Any]:
|
25
|
-
combined_prompt = user_prompt + system_prompt
|
26
|
-
url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key={self.api_token}"
|
27
|
-
headers = {"Content-Type": "application/json"}
|
28
|
-
data = {
|
29
|
-
"contents": [{"parts": [{"text": combined_prompt}]}],
|
30
|
-
"generationConfig": {
|
31
|
-
"temperature": self.temperature,
|
32
|
-
"topK": self.topK,
|
33
|
-
"topP": self.topP,
|
34
|
-
"maxOutputTokens": self.maxOutputTokens,
|
35
|
-
"stopSequences": self.stopSequences,
|
36
|
-
},
|
37
|
-
}
|
38
|
-
|
39
|
-
async with aiohttp.ClientSession() as session:
|
40
|
-
async with session.post(
|
41
|
-
url, headers=headers, data=json.dumps(data)
|
42
|
-
) as response:
|
43
|
-
raw_response_text = await response.text()
|
44
|
-
return json.loads(raw_response_text)
|
45
|
-
|
46
|
-
def parse_response(self, raw_response: dict[str, Any]) -> str:
|
47
|
-
data = raw_response
|
48
|
-
return data["candidates"][0]["content"]["parts"][0]["text"]
|
49
|
-
|
50
|
-
|
51
|
-
if __name__ == "__main__":
|
52
|
-
m = GeminiPro(use_cache=True)
|
53
|
-
from edsl.questions import QuestionMultipleChoice
|
54
|
-
|
55
|
-
q = QuestionMultipleChoice(
|
56
|
-
question_text="Are pickled pigs feet a popular breakfast food in the US?",
|
57
|
-
question_options=["Yes", "No", "Unsure"],
|
58
|
-
question_name="bkfast_question",
|
59
|
-
)
|
60
|
-
results = q.by(m).run()
|
61
|
-
from rich import print
|
62
|
-
|
63
|
-
print(q)
|
64
|
-
results.select("answer.*", "model.model").print()
|
65
|
-
# results = m.execute_model_call("Why is Cape Cod a popular vacation spot?")
|
66
|
-
# print(m.parse_response(results))
|
@@ -1,8 +0,0 @@
|
|
1
|
-
from edsl.language_models.OpenAI import create_openai_model
|
2
|
-
from edsl.enums import LanguageModelType
|
3
|
-
|
4
|
-
model_name = LanguageModelType.GPT_4.value
|
5
|
-
|
6
|
-
LanguageModelOpenAIFour = create_openai_model(
|
7
|
-
model_name=model_name, model_class_name="LanguageModelOpenAIFour"
|
8
|
-
)
|
@@ -1,8 +0,0 @@
|
|
1
|
-
from edsl.language_models.OpenAI import create_openai_model
|
2
|
-
from edsl.enums import LanguageModelType
|
3
|
-
|
4
|
-
model_name = LanguageModelType.GPT_3_5_Turbo.value
|
5
|
-
|
6
|
-
LanguageModelOpenAIThreeFiveTurbo = create_openai_model(
|
7
|
-
model_name=model_name, model_class_name="LanguageModelOpenAIThreeFiveTurbo"
|
8
|
-
)
|
@@ -1,21 +0,0 @@
|
|
1
|
-
from edsl.language_models.DeepInfra import create_deep_infra_model
|
2
|
-
from edsl.enums import LanguageModelType
|
3
|
-
|
4
|
-
model_name = LanguageModelType.LLAMA_2_13B_CHAT_HF.value
|
5
|
-
url = "https://api.deepinfra.com/v1/inference/meta-llama/Llama-2-13b-chat-hf"
|
6
|
-
|
7
|
-
LlamaTwo13B = create_deep_infra_model(
|
8
|
-
model_name=model_name, url=url, model_class_name="LlamaTwo13B"
|
9
|
-
)
|
10
|
-
|
11
|
-
if __name__ == "__main__":
|
12
|
-
model = LlamaTwo13B(use_cache=False)
|
13
|
-
from edsl.questions import QuestionMultipleChoice
|
14
|
-
|
15
|
-
q = QuestionMultipleChoice(
|
16
|
-
question_text="Are pickled pigs feet a popular breakfast food in the US?",
|
17
|
-
question_options=["Yes", "No", "Unsure"],
|
18
|
-
question_name="bkfast_question",
|
19
|
-
)
|
20
|
-
results = q.by(model).run()
|
21
|
-
results.select("answer.*", "model.model").print()
|
@@ -1,21 +0,0 @@
|
|
1
|
-
from edsl.language_models.DeepInfra import create_deep_infra_model
|
2
|
-
from edsl.enums import LanguageModelType
|
3
|
-
|
4
|
-
model_name = LanguageModelType.LLAMA_2_70B_CHAT_HF.value
|
5
|
-
url = "https://api.deepinfra.com/v1/inference/meta-llama/Llama-2-70b-chat-hf"
|
6
|
-
|
7
|
-
LlamaTwo70B = create_deep_infra_model(
|
8
|
-
model_name=model_name, url=url, model_class_name="LlamaTwo70B"
|
9
|
-
)
|
10
|
-
|
11
|
-
if __name__ == "__main__":
|
12
|
-
model = LlamaTwo70B(use_cache=False)
|
13
|
-
from edsl.questions import QuestionMultipleChoice
|
14
|
-
|
15
|
-
q = QuestionMultipleChoice(
|
16
|
-
question_text="Are pickled pigs feet a popular breakfast food in the US?",
|
17
|
-
question_options=["Yes", "No", "Unsure"],
|
18
|
-
question_name="bkfast_question",
|
19
|
-
)
|
20
|
-
results = q.by(model).run()
|
21
|
-
results.select("answer.*", "model.model").print()
|
@@ -1,24 +0,0 @@
|
|
1
|
-
from edsl.enums import LanguageModelType
|
2
|
-
from edsl.language_models.DeepInfra import create_deep_infra_model
|
3
|
-
|
4
|
-
model_name = LanguageModelType.MIXTRAL_8x7B_INSTRUCT.value
|
5
|
-
url = "https://api.deepinfra.com/v1/inference/mistralai/Mixtral-8x7B-Instruct-v0.1"
|
6
|
-
|
7
|
-
Mixtral8x7B = create_deep_infra_model(
|
8
|
-
model_name=model_name, url=url, model_class_name="Mixtral8x7B"
|
9
|
-
)
|
10
|
-
|
11
|
-
if __name__ == "__main__":
|
12
|
-
from edsl.questions import QuestionMultipleChoice
|
13
|
-
|
14
|
-
m = Mixtral8x7B()
|
15
|
-
q = QuestionMultipleChoice(
|
16
|
-
question_text="Are pickled pigs feet a popular breakfast food in the US?",
|
17
|
-
question_options=["Yes", "No", "Unsure"],
|
18
|
-
question_name="bkfast_question",
|
19
|
-
)
|
20
|
-
results = q.by(m).run()
|
21
|
-
from rich import print
|
22
|
-
|
23
|
-
print(q)
|
24
|
-
results.select("answer.*", "model.model").print()
|
edsl/language_models/registry.py
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
import textwrap
|
2
|
-
|
3
|
-
DEFAULT_MODEL_CLASS = "edsl.language_models.LanguageModelOpenAIFour"
|
4
|
-
|
5
|
-
from edsl.language_models.LanguageModel import RegisterLanguageModelsMeta
|
6
|
-
import pkgutil
|
7
|
-
import importlib
|
8
|
-
import edsl.language_models.model_interfaces as model_interfaces
|
9
|
-
|
10
|
-
# Dynamically import all modules in the model_interfaces package
|
11
|
-
for loader, module_name, is_pkg in pkgutil.iter_modules(model_interfaces.__path__):
|
12
|
-
full_module_name = f"{model_interfaces.__name__}.{module_name}"
|
13
|
-
if not is_pkg:
|
14
|
-
module = importlib.import_module(full_module_name)
|
15
|
-
globals().update(
|
16
|
-
{
|
17
|
-
name: getattr(module, name)
|
18
|
-
for name in dir(module)
|
19
|
-
if not name.startswith("_")
|
20
|
-
}
|
21
|
-
)
|
22
|
-
|
23
|
-
meta_class_registry = RegisterLanguageModelsMeta.get_registered_classes()
|
24
|
-
|
25
|
-
# For compatibility with older versions of EDSL
|
26
|
-
get_model_class = (
|
27
|
-
lambda model_name: RegisterLanguageModelsMeta.model_names_to_classes().get(
|
28
|
-
model_name
|
29
|
-
)
|
30
|
-
)
|
31
|
-
|
32
|
-
|
33
|
-
class Meta(type):
|
34
|
-
def __repr__(cls):
|
35
|
-
return textwrap.dedent(
|
36
|
-
f"""\
|
37
|
-
Available models: {cls.available()}
|
38
|
-
|
39
|
-
To create an instance, you can do:
|
40
|
-
>>> m = Model('gpt-4-1106-preview', temperature=0.5, ...)
|
41
|
-
|
42
|
-
To get the default model, you can leave out the model name.
|
43
|
-
To see the available models, you can do:
|
44
|
-
>>> Model.available()
|
45
|
-
"""
|
46
|
-
)
|
47
|
-
|
48
|
-
|
49
|
-
class Model(metaclass=Meta):
|
50
|
-
default_model = "gpt-4-1106-preview"
|
51
|
-
|
52
|
-
def __new__(cls, model_name=None, *args, **kwargs):
|
53
|
-
# Map index to the respective subclass
|
54
|
-
get_model_classes = RegisterLanguageModelsMeta.model_names_to_classes()
|
55
|
-
|
56
|
-
if cls.default_model not in get_model_classes:
|
57
|
-
raise ValueError(f"Default model {cls.default_model} not found")
|
58
|
-
|
59
|
-
if model_name is None:
|
60
|
-
model_name = cls.default_model
|
61
|
-
print(f"No model name provided, using default model: {model_name}")
|
62
|
-
|
63
|
-
subclass = get_model_classes.get(model_name, None)
|
64
|
-
if subclass is None:
|
65
|
-
raise ValueError(f"No model registered with name {model_name}")
|
66
|
-
|
67
|
-
# Create an instance of the selected subclass
|
68
|
-
instance = object.__new__(subclass)
|
69
|
-
instance.__init__(*args, **kwargs)
|
70
|
-
return instance
|
71
|
-
|
72
|
-
@classmethod
|
73
|
-
def available(cls):
|
74
|
-
return list(RegisterLanguageModelsMeta.model_names_to_classes().keys())
|
75
|
-
|
76
|
-
|
77
|
-
if __name__ == "__main__":
|
78
|
-
available = Model.available()
|
79
|
-
m = Model("gpt-4-1106-preview")
|
80
|
-
results = m.execute_model_call("Hello world")
|
81
|
-
print(results)
|
edsl/language_models/schemas.py
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
# MODEL PRICES
|
2
|
-
model_prices = {
|
3
|
-
"gpt-3.5-turbo": {
|
4
|
-
"prompt_tokens": 0.001 / 1000,
|
5
|
-
"completion_tokens": 0.002 / 1000,
|
6
|
-
},
|
7
|
-
"gpt-4-1106-preview": {
|
8
|
-
"prompt_tokens": 0.01 / 1000,
|
9
|
-
"completion_tokens": 0.03 / 1000,
|
10
|
-
},
|
11
|
-
"llama2-70b-chat": {
|
12
|
-
"prompt_tokens": 0.03 / 1000,
|
13
|
-
"completion_tokens": 0.03 / 1000,
|
14
|
-
},
|
15
|
-
}
|
@@ -1,83 +0,0 @@
|
|
1
|
-
import asyncio
|
2
|
-
import aiohttp
|
3
|
-
import json
|
4
|
-
from typing import Any
|
5
|
-
|
6
|
-
from edsl import CONFIG
|
7
|
-
|
8
|
-
from edsl.language_models.LanguageModel import LanguageModel
|
9
|
-
|
10
|
-
|
11
|
-
def replicate_model_factory(model_name, base_url, api_token):
|
12
|
-
class ReplicateLanguageModelBase(LanguageModel):
|
13
|
-
_model_ = (
|
14
|
-
model_name # Example model name, replace with actual model name if needed
|
15
|
-
)
|
16
|
-
_parameters_ = {
|
17
|
-
"temperature": 0.1,
|
18
|
-
"topK": 50,
|
19
|
-
"topP": 0.9,
|
20
|
-
"max_new_tokens": 500,
|
21
|
-
"min_new_tokens": -1,
|
22
|
-
"repetition_penalty": 1.15,
|
23
|
-
# "version": "5fe0a3d7ac2852264a25279d1dfb798acbc4d49711d126646594e212cb821749",
|
24
|
-
"use_cache": True,
|
25
|
-
}
|
26
|
-
_api_token = api_token
|
27
|
-
_base_url = base_url
|
28
|
-
|
29
|
-
async def async_execute_model_call(
|
30
|
-
self, user_prompt: str, system_prompt: str = ""
|
31
|
-
) -> dict[str, Any]:
|
32
|
-
self.api_token = self._api_token
|
33
|
-
self.headers = {
|
34
|
-
"Authorization": f"Token {self.api_token}",
|
35
|
-
"Content-Type": "application/json",
|
36
|
-
}
|
37
|
-
# combined_prompt = f"{system_prompt} {user_prompt}".strip()
|
38
|
-
# print(f"Prompt: {combined_prompt}")
|
39
|
-
data = {
|
40
|
-
# "version": self._parameters_["version"],
|
41
|
-
"input": {
|
42
|
-
"debug": False,
|
43
|
-
"top_k": self._parameters_["topK"],
|
44
|
-
"top_p": self._parameters_["topP"],
|
45
|
-
"prompt": user_prompt,
|
46
|
-
"system_prompt": system_prompt,
|
47
|
-
"temperature": self._parameters_["temperature"],
|
48
|
-
"max_new_tokens": self._parameters_["max_new_tokens"],
|
49
|
-
"min_new_tokens": self._parameters_["min_new_tokens"],
|
50
|
-
"prompt_template": "{prompt}",
|
51
|
-
"repetition_penalty": self._parameters_["repetition_penalty"],
|
52
|
-
},
|
53
|
-
}
|
54
|
-
|
55
|
-
async with aiohttp.ClientSession() as session:
|
56
|
-
async with session.post(
|
57
|
-
self._base_url, headers=self.headers, data=json.dumps(data)
|
58
|
-
) as response:
|
59
|
-
raw_response_text = await response.text()
|
60
|
-
data = json.loads(raw_response_text)
|
61
|
-
print(f"This was the data returned by the model:{data}")
|
62
|
-
prediction_url = data["urls"]["get"]
|
63
|
-
|
64
|
-
while True:
|
65
|
-
async with session.get(
|
66
|
-
prediction_url, headers=self.headers
|
67
|
-
) as get_response:
|
68
|
-
if get_response.status != 200:
|
69
|
-
# Handle non-success status codes appropriately
|
70
|
-
return None
|
71
|
-
|
72
|
-
get_data = await get_response.text()
|
73
|
-
get_data = json.loads(get_data)
|
74
|
-
if get_data["status"] == "succeeded":
|
75
|
-
return get_data
|
76
|
-
await asyncio.sleep(1)
|
77
|
-
|
78
|
-
def parse_response(self, raw_response: dict[str, Any]) -> str:
|
79
|
-
data = "".join(raw_response["output"])
|
80
|
-
print(f"This is what the model returned: {data}")
|
81
|
-
return data
|
82
|
-
|
83
|
-
return ReplicateLanguageModelBase
|
@@ -1,29 +0,0 @@
|
|
1
|
-
import textwrap
|
2
|
-
|
3
|
-
from edsl.prompts.Prompt import PromptBase
|
4
|
-
from edsl.prompts.prompt_config import ComponentTypes
|
5
|
-
|
6
|
-
from edsl.enums import LanguageModelType
|
7
|
-
|
8
|
-
|
9
|
-
class AgentInstruction(PromptBase):
|
10
|
-
model = LanguageModelType.GPT_3_5_Turbo.value
|
11
|
-
component_type = ComponentTypes.AGENT_INSTRUCTIONS
|
12
|
-
default_instructions = textwrap.dedent(
|
13
|
-
"""\
|
14
|
-
You are playing the role of a human answering survey questions.
|
15
|
-
Do not break character.
|
16
|
-
"""
|
17
|
-
)
|
18
|
-
|
19
|
-
|
20
|
-
class AgentInstructionLlama(PromptBase):
|
21
|
-
model = LanguageModelType.LLAMA_2_70B_CHAT_HF.value
|
22
|
-
component_type = ComponentTypes.AGENT_INSTRUCTIONS
|
23
|
-
default_instructions = textwrap.dedent(
|
24
|
-
"""\
|
25
|
-
You are playing the role of a human answering questions.
|
26
|
-
Do not break character.
|
27
|
-
Only respond in JSON, with one answer formatted as specified.
|
28
|
-
"""
|
29
|
-
)
|
@@ -1,17 +0,0 @@
|
|
1
|
-
import textwrap
|
2
|
-
|
3
|
-
from edsl.prompts.Prompt import PromptBase
|
4
|
-
from edsl.prompts.prompt_config import ComponentTypes
|
5
|
-
|
6
|
-
from edsl.enums import LanguageModelType
|
7
|
-
|
8
|
-
|
9
|
-
class AgentPersona(PromptBase):
|
10
|
-
model = "gpt-4-1106-preview"
|
11
|
-
component_type = ComponentTypes.AGENT_PERSONA
|
12
|
-
default_instructions = textwrap.dedent(
|
13
|
-
"""\
|
14
|
-
You are an agent with the following persona:
|
15
|
-
{{ traits }}
|
16
|
-
"""
|
17
|
-
)
|
@@ -1,26 +0,0 @@
|
|
1
|
-
import textwrap
|
2
|
-
|
3
|
-
from edsl.prompts.QuestionInstructionsBase import QuestionInstuctionsBase
|
4
|
-
|
5
|
-
|
6
|
-
class Budget(QuestionInstuctionsBase):
|
7
|
-
question_type = "budget"
|
8
|
-
model = "gpt-4-1106-preview"
|
9
|
-
default_instructions = textwrap.dedent(
|
10
|
-
"""\
|
11
|
-
You are being asked the following question: {{question_text}}
|
12
|
-
The options are
|
13
|
-
{% for option in question_options %}
|
14
|
-
{{ loop.index0 }}: {{option}}
|
15
|
-
{% endfor %}
|
16
|
-
Return a valid JSON formatted as follows, with a dictionary for your "answer"
|
17
|
-
where the keys are the option numbers and the values are the amounts you want
|
18
|
-
to allocate to the options, and the sum of the values is {{budget_sum}}:
|
19
|
-
{"answer": {<put dict of option numbers and allocation amounts here>},
|
20
|
-
"comment": "<put explanation here>"}
|
21
|
-
Example response for a budget of 100 and 4 options:
|
22
|
-
{"answer": {"0": 25, "1": 25, "2": 25, "3": 25},
|
23
|
-
"comment": "I allocated 25 to each option."}
|
24
|
-
There must be an allocation listed for each item (including 0).
|
25
|
-
"""
|
26
|
-
)
|