edsl 0.1.36.dev5__py3-none-any.whl → 0.1.36.dev7__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 +48 -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 +298 -294
- edsl/agents/PromptConstructor.py +320 -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 +74 -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 +661 -651
- edsl/jobs/interviews/InterviewExceptionCollection.py +99 -99
- edsl/jobs/interviews/InterviewExceptionEntry.py +189 -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 +458 -443
- edsl/scenarios/Scenario.py +510 -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 +4 -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.dev7.dist-info}/LICENSE +21 -21
- {edsl-0.1.36.dev5.dist-info → edsl-0.1.36.dev7.dist-info}/METADATA +1 -1
- edsl-0.1.36.dev7.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.dev7.dist-info}/WHEEL +0 -0
@@ -1,61 +1,61 @@
|
|
1
|
-
import threading
|
2
|
-
import asyncio
|
3
|
-
from fastapi import FastAPI, Request
|
4
|
-
from fastapi.responses import JSONResponse
|
5
|
-
import uvicorn
|
6
|
-
import json
|
7
|
-
from typing import Any
|
8
|
-
|
9
|
-
app = FastAPI()
|
10
|
-
|
11
|
-
|
12
|
-
async def generate_response(question_number: int) -> dict:
|
13
|
-
# Simulate some asynchronous work
|
14
|
-
await asyncio.sleep(1)
|
15
|
-
return {
|
16
|
-
"id": "chatcmpl-123",
|
17
|
-
"object": "chat.completion",
|
18
|
-
"created": 1677652288,
|
19
|
-
"model": "gpt-3.5-turbo-0613",
|
20
|
-
"choices": [
|
21
|
-
{
|
22
|
-
"index": 0,
|
23
|
-
"message": {
|
24
|
-
"role": "assistant",
|
25
|
-
"content": json.dumps(
|
26
|
-
{"answer": f"SPAM for question {question_number}!"}
|
27
|
-
),
|
28
|
-
},
|
29
|
-
"finish_reason": "stop",
|
30
|
-
}
|
31
|
-
],
|
32
|
-
"usage": {"prompt_tokens": 9, "completion_tokens": 12, "total_tokens": 21},
|
33
|
-
}
|
34
|
-
|
35
|
-
|
36
|
-
@app.post("/v1/chat/completions")
|
37
|
-
async def chat_completions(request: Request):
|
38
|
-
body = await request.json()
|
39
|
-
user_prompt = body["messages"][-1]["content"]
|
40
|
-
question_number = int(user_prompt.split("XX")[1])
|
41
|
-
|
42
|
-
response = await generate_response(question_number)
|
43
|
-
return JSONResponse(content=response)
|
44
|
-
|
45
|
-
|
46
|
-
def run_server():
|
47
|
-
uvicorn.run(app, host="127.0.0.1", port=8000)
|
48
|
-
|
49
|
-
|
50
|
-
if __name__ == "__main__":
|
51
|
-
# Start the server in a separate thread
|
52
|
-
server_thread = threading.Thread(target=run_server)
|
53
|
-
server_thread.start()
|
54
|
-
|
55
|
-
# Your main code here
|
56
|
-
# ...
|
57
|
-
|
58
|
-
# To use this with the OpenAI SDK:
|
59
|
-
# from openai import AsyncOpenAI
|
60
|
-
# client = AsyncOpenAI(base_url="http://127.0.0.1:8000/v1", api_key="fake_key")
|
61
|
-
# response = await client.chat.completions.create(model="gpt-3.5-turbo", messages=[...])
|
1
|
+
import threading
|
2
|
+
import asyncio
|
3
|
+
from fastapi import FastAPI, Request
|
4
|
+
from fastapi.responses import JSONResponse
|
5
|
+
import uvicorn
|
6
|
+
import json
|
7
|
+
from typing import Any
|
8
|
+
|
9
|
+
app = FastAPI()
|
10
|
+
|
11
|
+
|
12
|
+
async def generate_response(question_number: int) -> dict:
|
13
|
+
# Simulate some asynchronous work
|
14
|
+
await asyncio.sleep(1)
|
15
|
+
return {
|
16
|
+
"id": "chatcmpl-123",
|
17
|
+
"object": "chat.completion",
|
18
|
+
"created": 1677652288,
|
19
|
+
"model": "gpt-3.5-turbo-0613",
|
20
|
+
"choices": [
|
21
|
+
{
|
22
|
+
"index": 0,
|
23
|
+
"message": {
|
24
|
+
"role": "assistant",
|
25
|
+
"content": json.dumps(
|
26
|
+
{"answer": f"SPAM for question {question_number}!"}
|
27
|
+
),
|
28
|
+
},
|
29
|
+
"finish_reason": "stop",
|
30
|
+
}
|
31
|
+
],
|
32
|
+
"usage": {"prompt_tokens": 9, "completion_tokens": 12, "total_tokens": 21},
|
33
|
+
}
|
34
|
+
|
35
|
+
|
36
|
+
@app.post("/v1/chat/completions")
|
37
|
+
async def chat_completions(request: Request):
|
38
|
+
body = await request.json()
|
39
|
+
user_prompt = body["messages"][-1]["content"]
|
40
|
+
question_number = int(user_prompt.split("XX")[1])
|
41
|
+
|
42
|
+
response = await generate_response(question_number)
|
43
|
+
return JSONResponse(content=response)
|
44
|
+
|
45
|
+
|
46
|
+
def run_server():
|
47
|
+
uvicorn.run(app, host="127.0.0.1", port=8000)
|
48
|
+
|
49
|
+
|
50
|
+
if __name__ == "__main__":
|
51
|
+
# Start the server in a separate thread
|
52
|
+
server_thread = threading.Thread(target=run_server)
|
53
|
+
server_thread.start()
|
54
|
+
|
55
|
+
# Your main code here
|
56
|
+
# ...
|
57
|
+
|
58
|
+
# To use this with the OpenAI SDK:
|
59
|
+
# from openai import AsyncOpenAI
|
60
|
+
# client = AsyncOpenAI(base_url="http://127.0.0.1:8000/v1", api_key="fake_key")
|
61
|
+
# response = await client.chat.completions.create(model="gpt-3.5-turbo", messages=[...])
|
edsl/language_models/registry.py
CHANGED
@@ -1,137 +1,137 @@
|
|
1
|
-
import textwrap
|
2
|
-
from random import random
|
3
|
-
from edsl.config import CONFIG
|
4
|
-
|
5
|
-
# if "EDSL_DEFAULT_MODEL" not in CONFIG:
|
6
|
-
# default_model = "test"
|
7
|
-
# else:
|
8
|
-
# default_model = CONFIG.get("EDSL_DEFAULT_MODEL")
|
9
|
-
|
10
|
-
|
11
|
-
def get_model_class(model_name, registry=None):
|
12
|
-
from edsl.inference_services.registry import default
|
13
|
-
|
14
|
-
registry = registry or default
|
15
|
-
factory = registry.create_model_factory(model_name)
|
16
|
-
return factory
|
17
|
-
|
18
|
-
|
19
|
-
class Meta(type):
|
20
|
-
def __repr__(cls):
|
21
|
-
return textwrap.dedent(
|
22
|
-
f"""\
|
23
|
-
Available models: {cls.available()}
|
24
|
-
|
25
|
-
To create an instance, you can do:
|
26
|
-
>>> m = Model('gpt-4-1106-preview', temperature=0.5, ...)
|
27
|
-
|
28
|
-
To get the default model, you can leave out the model name.
|
29
|
-
To see the available models, you can do:
|
30
|
-
>>> Model.available()
|
31
|
-
"""
|
32
|
-
)
|
33
|
-
|
34
|
-
|
35
|
-
class Model(metaclass=Meta):
|
36
|
-
default_model = CONFIG.get("EDSL_DEFAULT_MODEL")
|
37
|
-
|
38
|
-
def __new__(
|
39
|
-
cls, model_name=None, registry=None, service_name=None, *args, **kwargs
|
40
|
-
):
|
41
|
-
# Map index to the respective subclass
|
42
|
-
if model_name is None:
|
43
|
-
model_name = (
|
44
|
-
cls.default_model
|
45
|
-
) # when model_name is None, use the default model, set in the config file
|
46
|
-
from edsl.inference_services.registry import default
|
47
|
-
|
48
|
-
registry = registry or default
|
49
|
-
|
50
|
-
if isinstance(model_name, int): # can refer to a model by index
|
51
|
-
model_name = cls.available(name_only=True)[model_name]
|
52
|
-
|
53
|
-
factory = registry.create_model_factory(model_name, service_name=service_name)
|
54
|
-
return factory(*args, **kwargs)
|
55
|
-
|
56
|
-
@classmethod
|
57
|
-
def add_model(cls, service_name, model_name):
|
58
|
-
from edsl.inference_services.registry import default
|
59
|
-
|
60
|
-
registry = default
|
61
|
-
registry.add_model(service_name, model_name)
|
62
|
-
|
63
|
-
@classmethod
|
64
|
-
def services(cls, registry=None):
|
65
|
-
from edsl.inference_services.registry import default
|
66
|
-
|
67
|
-
registry = registry or default
|
68
|
-
return [r._inference_service_ for r in registry.services]
|
69
|
-
|
70
|
-
@classmethod
|
71
|
-
def available(cls, search_term=None, name_only=False, registry=None, service=None):
|
72
|
-
from edsl.inference_services.registry import default
|
73
|
-
|
74
|
-
registry = registry or default
|
75
|
-
full_list = registry.available()
|
76
|
-
|
77
|
-
if service is not None:
|
78
|
-
if service not in cls.services(registry=registry):
|
79
|
-
raise ValueError(f"Service {service} not found in available services.")
|
80
|
-
|
81
|
-
full_list = [m for m in full_list if m[1] == service]
|
82
|
-
|
83
|
-
if search_term is None:
|
84
|
-
if name_only:
|
85
|
-
return [m[0] for m in full_list]
|
86
|
-
else:
|
87
|
-
return full_list
|
88
|
-
else:
|
89
|
-
filtered_results = [
|
90
|
-
m for m in full_list if search_term in m[0] or search_term in m[1]
|
91
|
-
]
|
92
|
-
if name_only:
|
93
|
-
return [m[0] for m in filtered_results]
|
94
|
-
else:
|
95
|
-
return filtered_results
|
96
|
-
|
97
|
-
@classmethod
|
98
|
-
def check_models(cls, verbose=False):
|
99
|
-
print("Checking all available models...\n")
|
100
|
-
for model in cls.available(name_only=True):
|
101
|
-
print(f"Now checking: {model}")
|
102
|
-
try:
|
103
|
-
m = cls(model)
|
104
|
-
except Exception as e:
|
105
|
-
print(f"Error creating instance of {model}: {e}")
|
106
|
-
continue
|
107
|
-
try:
|
108
|
-
results = m.hello(verbose)
|
109
|
-
if verbose:
|
110
|
-
print(f"Results from model call: {results}")
|
111
|
-
except Exception as e:
|
112
|
-
print(f"Error calling 'hello' on {model}: {e}")
|
113
|
-
continue
|
114
|
-
print("OK!")
|
115
|
-
print("\n")
|
116
|
-
|
117
|
-
@classmethod
|
118
|
-
def example(cls, randomize: bool = False) -> "Model":
|
119
|
-
"""
|
120
|
-
Returns an example Model instance.
|
121
|
-
|
122
|
-
:param randomize: If True, the temperature is set to a random decimal between 0 and 1.
|
123
|
-
"""
|
124
|
-
temperature = 0.5 if not randomize else round(random(), 2)
|
125
|
-
model_name = cls.default_model
|
126
|
-
return cls(model_name, temperature=temperature)
|
127
|
-
|
128
|
-
|
129
|
-
if __name__ == "__main__":
|
130
|
-
import doctest
|
131
|
-
|
132
|
-
doctest.testmod(optionflags=doctest.ELLIPSIS)
|
133
|
-
|
134
|
-
available = Model.available()
|
135
|
-
m = Model("gpt-4-1106-preview")
|
136
|
-
results = m.execute_model_call("Hello world")
|
137
|
-
print(results)
|
1
|
+
import textwrap
|
2
|
+
from random import random
|
3
|
+
from edsl.config import CONFIG
|
4
|
+
|
5
|
+
# if "EDSL_DEFAULT_MODEL" not in CONFIG:
|
6
|
+
# default_model = "test"
|
7
|
+
# else:
|
8
|
+
# default_model = CONFIG.get("EDSL_DEFAULT_MODEL")
|
9
|
+
|
10
|
+
|
11
|
+
def get_model_class(model_name, registry=None):
|
12
|
+
from edsl.inference_services.registry import default
|
13
|
+
|
14
|
+
registry = registry or default
|
15
|
+
factory = registry.create_model_factory(model_name)
|
16
|
+
return factory
|
17
|
+
|
18
|
+
|
19
|
+
class Meta(type):
|
20
|
+
def __repr__(cls):
|
21
|
+
return textwrap.dedent(
|
22
|
+
f"""\
|
23
|
+
Available models: {cls.available()}
|
24
|
+
|
25
|
+
To create an instance, you can do:
|
26
|
+
>>> m = Model('gpt-4-1106-preview', temperature=0.5, ...)
|
27
|
+
|
28
|
+
To get the default model, you can leave out the model name.
|
29
|
+
To see the available models, you can do:
|
30
|
+
>>> Model.available()
|
31
|
+
"""
|
32
|
+
)
|
33
|
+
|
34
|
+
|
35
|
+
class Model(metaclass=Meta):
|
36
|
+
default_model = CONFIG.get("EDSL_DEFAULT_MODEL")
|
37
|
+
|
38
|
+
def __new__(
|
39
|
+
cls, model_name=None, registry=None, service_name=None, *args, **kwargs
|
40
|
+
):
|
41
|
+
# Map index to the respective subclass
|
42
|
+
if model_name is None:
|
43
|
+
model_name = (
|
44
|
+
cls.default_model
|
45
|
+
) # when model_name is None, use the default model, set in the config file
|
46
|
+
from edsl.inference_services.registry import default
|
47
|
+
|
48
|
+
registry = registry or default
|
49
|
+
|
50
|
+
if isinstance(model_name, int): # can refer to a model by index
|
51
|
+
model_name = cls.available(name_only=True)[model_name]
|
52
|
+
|
53
|
+
factory = registry.create_model_factory(model_name, service_name=service_name)
|
54
|
+
return factory(*args, **kwargs)
|
55
|
+
|
56
|
+
@classmethod
|
57
|
+
def add_model(cls, service_name, model_name):
|
58
|
+
from edsl.inference_services.registry import default
|
59
|
+
|
60
|
+
registry = default
|
61
|
+
registry.add_model(service_name, model_name)
|
62
|
+
|
63
|
+
@classmethod
|
64
|
+
def services(cls, registry=None):
|
65
|
+
from edsl.inference_services.registry import default
|
66
|
+
|
67
|
+
registry = registry or default
|
68
|
+
return [r._inference_service_ for r in registry.services]
|
69
|
+
|
70
|
+
@classmethod
|
71
|
+
def available(cls, search_term=None, name_only=False, registry=None, service=None):
|
72
|
+
from edsl.inference_services.registry import default
|
73
|
+
|
74
|
+
registry = registry or default
|
75
|
+
full_list = registry.available()
|
76
|
+
|
77
|
+
if service is not None:
|
78
|
+
if service not in cls.services(registry=registry):
|
79
|
+
raise ValueError(f"Service {service} not found in available services.")
|
80
|
+
|
81
|
+
full_list = [m for m in full_list if m[1] == service]
|
82
|
+
|
83
|
+
if search_term is None:
|
84
|
+
if name_only:
|
85
|
+
return [m[0] for m in full_list]
|
86
|
+
else:
|
87
|
+
return full_list
|
88
|
+
else:
|
89
|
+
filtered_results = [
|
90
|
+
m for m in full_list if search_term in m[0] or search_term in m[1]
|
91
|
+
]
|
92
|
+
if name_only:
|
93
|
+
return [m[0] for m in filtered_results]
|
94
|
+
else:
|
95
|
+
return filtered_results
|
96
|
+
|
97
|
+
@classmethod
|
98
|
+
def check_models(cls, verbose=False):
|
99
|
+
print("Checking all available models...\n")
|
100
|
+
for model in cls.available(name_only=True):
|
101
|
+
print(f"Now checking: {model}")
|
102
|
+
try:
|
103
|
+
m = cls(model)
|
104
|
+
except Exception as e:
|
105
|
+
print(f"Error creating instance of {model}: {e}")
|
106
|
+
continue
|
107
|
+
try:
|
108
|
+
results = m.hello(verbose)
|
109
|
+
if verbose:
|
110
|
+
print(f"Results from model call: {results}")
|
111
|
+
except Exception as e:
|
112
|
+
print(f"Error calling 'hello' on {model}: {e}")
|
113
|
+
continue
|
114
|
+
print("OK!")
|
115
|
+
print("\n")
|
116
|
+
|
117
|
+
@classmethod
|
118
|
+
def example(cls, randomize: bool = False) -> "Model":
|
119
|
+
"""
|
120
|
+
Returns an example Model instance.
|
121
|
+
|
122
|
+
:param randomize: If True, the temperature is set to a random decimal between 0 and 1.
|
123
|
+
"""
|
124
|
+
temperature = 0.5 if not randomize else round(random(), 2)
|
125
|
+
model_name = cls.default_model
|
126
|
+
return cls(model_name, temperature=temperature)
|
127
|
+
|
128
|
+
|
129
|
+
if __name__ == "__main__":
|
130
|
+
import doctest
|
131
|
+
|
132
|
+
doctest.testmod(optionflags=doctest.ELLIPSIS)
|
133
|
+
|
134
|
+
available = Model.available()
|
135
|
+
m = Model("gpt-4-1106-preview")
|
136
|
+
results = m.execute_model_call("Hello world")
|
137
|
+
print(results)
|