edsl 0.1.43__py3-none-any.whl → 0.1.44__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 CHANGED
@@ -64,17 +64,26 @@ class PersistenceMixin:
64
64
  @classmethod
65
65
  def pull(
66
66
  cls,
67
- uuid: Optional[Union[str, UUID]] = None,
68
- url: Optional[str] = None,
69
- expected_parrot_url: Optional[str] = None,
67
+ url_or_uuid: Optional[Union[str, UUID]] = None,
68
+ #expected_parrot_url: Optional[str] = None,
70
69
  ):
71
- """Pull the object from coop."""
70
+ """Pull the object from coop.
71
+
72
+ Args:
73
+ url_or_uuid: Either a UUID string or a URL pointing to the object
74
+ expected_parrot_url: Optional URL for the Parrot server
75
+ """
72
76
  from edsl.coop import Coop
73
77
  from edsl.coop.utils import ObjectRegistry
74
78
 
75
79
  object_type = ObjectRegistry.get_object_type_by_edsl_class(cls)
76
- coop = Coop(url=expected_parrot_url)
77
- return coop.get(uuid, url, object_type)
80
+ coop = Coop()
81
+
82
+ # Determine if input is URL or UUID
83
+ if url_or_uuid and ("http://" in str(url_or_uuid) or "https://" in str(url_or_uuid)):
84
+ return coop.get(url=url_or_uuid, expected_object_type=object_type)
85
+ else:
86
+ return coop.get(uuid=url_or_uuid, expected_object_type=object_type)
78
87
 
79
88
  @classmethod
80
89
  def delete(cls, uuid: Optional[Union[str, UUID]] = None, url: Optional[str] = None):
edsl/__version__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.1.43"
1
+ __version__ = "0.1.44"
edsl/coop/coop.py CHANGED
@@ -4,10 +4,8 @@ import requests
4
4
 
5
5
  from typing import Any, Optional, Union, Literal, TypedDict
6
6
  from uuid import UUID
7
- from collections import UserDict, defaultdict
8
7
 
9
8
  import edsl
10
- from pathlib import Path
11
9
 
12
10
  from edsl.config import CONFIG
13
11
  from edsl.data.CacheEntry import CacheEntry
@@ -340,7 +338,7 @@ class Coop(CoopFunctionsMixin):
340
338
 
341
339
  try:
342
340
  response = self._send_server_request(
343
- uri="api/v0/edsl-settings", method="GET", timeout=5
341
+ uri="api/v0/edsl-settings", method="GET", timeout=20
344
342
  )
345
343
  self._resolve_server_response(response, check_api_key=False)
346
344
  return response.json()
@@ -866,6 +864,40 @@ class Coop(CoopFunctionsMixin):
866
864
  "usd": response_json.get("cost_in_usd"),
867
865
  }
868
866
 
867
+ ################
868
+ # PROJECTS
869
+ ################
870
+ def create_project(
871
+ self,
872
+ survey: Survey,
873
+ project_name: str,
874
+ survey_description: Optional[str] = None,
875
+ survey_alias: Optional[str] = None,
876
+ survey_visibility: Optional[VisibilityType] = "unlisted",
877
+ ):
878
+ """
879
+ Create a survey object on Coop, then create a project from the survey.
880
+ """
881
+ survey_details = self.create(
882
+ object=survey,
883
+ description=survey_description,
884
+ alias=survey_alias,
885
+ visibility=survey_visibility,
886
+ )
887
+ survey_uuid = survey_details.get("uuid")
888
+ response = self._send_server_request(
889
+ uri=f"api/v0/projects/create-from-survey",
890
+ method="POST",
891
+ payload={"project_name": project_name, "survey_uuid": str(survey_uuid)},
892
+ )
893
+ self._resolve_server_response(response)
894
+ response_json = response.json()
895
+ return {
896
+ "name": response_json.get("project_name"),
897
+ "uuid": response_json.get("uuid"),
898
+ "url": f"{self.url}/home/projects/{response_json.get('uuid')}",
899
+ }
900
+
869
901
  ################
870
902
  # DUNDER METHODS
871
903
  ################
edsl/enums.py CHANGED
@@ -67,6 +67,7 @@ class InferenceServiceType(EnumWithChecks):
67
67
  TOGETHER = "together"
68
68
  PERPLEXITY = "perplexity"
69
69
  DEEPSEEK = "deepseek"
70
+ GROK = "grok"
70
71
 
71
72
 
72
73
  # unavoidable violation of the DRY principle but it is necessary
@@ -86,6 +87,7 @@ InferenceServiceLiteral = Literal[
86
87
  "together",
87
88
  "perplexity",
88
89
  "deepseek",
90
+ "grok",
89
91
  ]
90
92
 
91
93
  available_models_urls = {
@@ -108,7 +110,8 @@ service_to_api_keyname = {
108
110
  InferenceServiceType.MISTRAL.value: "MISTRAL_API_KEY",
109
111
  InferenceServiceType.TOGETHER.value: "TOGETHER_API_KEY",
110
112
  InferenceServiceType.PERPLEXITY.value: "PERPLEXITY_API_KEY",
111
- InferenceServiceType.DEEPSEEK.value: "DEEPSEEK_API_KEY"
113
+ InferenceServiceType.DEEPSEEK.value: "DEEPSEEK_API_KEY",
114
+ InferenceServiceType.GROK.value: "XAI_API_KEY",
112
115
  }
113
116
 
114
117
 
@@ -17,6 +17,8 @@ class AnthropicService(InferenceServiceABC):
17
17
  output_token_name = "output_tokens"
18
18
  model_exclude_list = []
19
19
 
20
+ available_models_url = 'https://docs.anthropic.com/en/docs/about-claude/models'
21
+
20
22
  @classmethod
21
23
  def get_model_list(cls, api_key: str = None):
22
24
 
@@ -39,6 +39,8 @@ class GoogleService(InferenceServiceABC):
39
39
 
40
40
  model_exclude_list = []
41
41
 
42
+ available_models_url = 'https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models'
43
+
42
44
  @classmethod
43
45
  def get_model_list(cls):
44
46
  model_list = []
@@ -0,0 +1,11 @@
1
+ from typing import Any, List
2
+ from edsl.inference_services.OpenAIService import OpenAIService
3
+
4
+
5
+ class GrokService(OpenAIService):
6
+ """Openai service class."""
7
+
8
+ _inference_service_ = "grok"
9
+ _env_key_name_ = "XAI_API_KEY"
10
+ _base_url_ = "https://api.x.ai/v1"
11
+ _models_list_cache: List[str] = []
@@ -23,6 +23,7 @@ class InferenceServiceABC(ABC):
23
23
  "usage_sequence",
24
24
  "input_token_name",
25
25
  "output_token_name",
26
+ #"available_models_url",
26
27
  ]
27
28
  for attr in must_have_attributes:
28
29
  if not hasattr(cls, attr):
@@ -84,6 +84,7 @@ class OpenAIService(InferenceServiceABC):
84
84
 
85
85
  @classmethod
86
86
  def get_model_list(cls, api_key=None):
87
+ # breakpoint()
87
88
  if api_key is None:
88
89
  api_key = os.getenv(cls._env_key_name_)
89
90
  raw_list = cls.sync_client(api_key).models.list()
@@ -28,6 +28,7 @@ class TestService(InferenceServiceABC):
28
28
  model_exclude_list = []
29
29
  input_token_name = "prompt_tokens"
30
30
  output_token_name = "completion_tokens"
31
+ available_models_url = None
31
32
 
32
33
  @classmethod
33
34
  def available(cls) -> list[str]:
@@ -14,6 +14,7 @@ from edsl.inference_services.TestService import TestService
14
14
  from edsl.inference_services.TogetherAIService import TogetherAIService
15
15
  from edsl.inference_services.PerplexityService import PerplexityService
16
16
  from edsl.inference_services.DeepSeekService import DeepSeekService
17
+ from edsl.inference_services.GrokService import GrokService
17
18
 
18
19
  try:
19
20
  from edsl.inference_services.MistralAIService import MistralAIService
@@ -35,6 +36,7 @@ services = [
35
36
  TogetherAIService,
36
37
  PerplexityService,
37
38
  DeepSeekService,
39
+ GrokService,
38
40
  ]
39
41
 
40
42
  if mistral_available:
edsl/jobs/JobsChecks.py CHANGED
@@ -31,7 +31,7 @@ class JobsChecks:
31
31
  from edsl.language_models.model import Model
32
32
  from edsl.enums import service_to_api_keyname
33
33
 
34
- for model in self.jobs.models + [Model()]:
34
+ for model in self.jobs.models: # + [Model()]:
35
35
  if not model.has_valid_api_key():
36
36
  key_name = service_to_api_keyname.get(
37
37
  model._inference_service_, "NOT FOUND"
@@ -134,22 +134,22 @@ class JobsChecks:
134
134
 
135
135
  edsl_auth_token = secrets.token_urlsafe(16)
136
136
 
137
- print("You're missing some of the API keys needed to run this job:")
137
+ print("API keys are required to run surveys with language models. The following keys are needed to run this survey: ")
138
138
  for api_key in missing_api_keys:
139
139
  print(f" 🔑 {api_key}")
140
140
  print(
141
- "\nYou can either add the missing keys to your .env file, or use remote inference."
141
+ "\nYou can provide your own keys or use an Expected Parrot key to access all available models."
142
142
  )
143
- print("Remote inference allows you to run jobs on our server.")
143
+ print("Please see the documentation page to learn about options for managing keys: https://docs.expectedparrot.com/en/latest/api_keys.html")
144
144
 
145
145
  coop = Coop()
146
146
  coop._display_login_url(
147
147
  edsl_auth_token=edsl_auth_token,
148
- link_description="\n🚀 To use remote inference, sign up at the following link:",
148
+ link_description="\n➡️ Click the link below to create an account and get an Expected Parrot key:\n",
149
149
  )
150
150
 
151
151
  print(
152
- "\nOnce you log in, we will automatically retrieve your Expected Parrot API key and continue your job remotely."
152
+ "\nOnce you log in, your key will be stored on your computer and your survey will start running at the Expected Parrot server."
153
153
  )
154
154
 
155
155
  api_key = coop._poll_for_api_key(edsl_auth_token)
@@ -159,7 +159,7 @@ class JobsChecks:
159
159
  return
160
160
 
161
161
  path_to_env = write_api_key_to_env(api_key)
162
- print("\n✨ API key retrieved and written to .env file at the following path:")
162
+ print("\n✨ Your key has been stored at the following path: ")
163
163
  print(f" {path_to_env}")
164
164
 
165
165
  # Retrieve API key so we can continue running the job
edsl/jobs/JobsPrompts.py CHANGED
@@ -200,10 +200,10 @@ class JobsPrompts:
200
200
  import warnings
201
201
 
202
202
  warnings.warn(
203
- "Price data could not be retrieved. Using default estimates for input and output token prices. Input: $0.15 / 1M tokens; Output: $0.60 / 1M tokens"
203
+ "Price data could not be retrieved. Using default estimates for input and output token prices. Input: $1.00 / 1M tokens; Output: $1.00 / 1M tokens"
204
204
  )
205
- input_price_per_token = 0.00000015 # $0.15 / 1M tokens
206
- output_price_per_token = 0.00000060 # $0.60 / 1M tokens
205
+ input_price_per_token = 0.000001 # $1.00 / 1M tokens
206
+ output_price_per_token = 0.000001 # $1.00 / 1M tokens
207
207
 
208
208
  # Compute the number of characters (double if the question involves piping)
209
209
  user_prompt_chars = len(str(user_prompt)) * get_piping_multiplier(
@@ -518,7 +518,11 @@ class LanguageModel(
518
518
  """
519
519
  from edsl.language_models.model import get_model_class
520
520
 
521
- model_class = get_model_class(data["model"])
521
+ # breakpoint()
522
+
523
+ model_class = get_model_class(
524
+ data["model"], service_name=data.get("inference_service", None)
525
+ )
522
526
  return model_class(**data)
523
527
 
524
528
  def __repr__(self) -> str:
@@ -574,7 +578,6 @@ class LanguageModel(
574
578
  return Model(skip_api_key_check=True)
575
579
 
576
580
  def from_cache(self, cache: "Cache") -> LanguageModel:
577
-
578
581
  from copy import deepcopy
579
582
  from types import MethodType
580
583
  from edsl import Cache
@@ -1,6 +1,6 @@
1
1
  import textwrap
2
2
  from random import random
3
- from typing import Optional, TYPE_CHECKING, List
3
+ from typing import Optional, TYPE_CHECKING, List, Callable
4
4
 
5
5
  from edsl.utilities.PrettyList import PrettyList
6
6
  from edsl.config import CONFIG
@@ -11,17 +11,21 @@ from edsl.inference_services.InferenceServicesCollection import (
11
11
  from edsl.inference_services.data_structures import AvailableModels
12
12
  from edsl.inference_services.InferenceServiceABC import InferenceServiceABC
13
13
  from edsl.enums import InferenceServiceLiteral
14
+ from edsl.exceptions.inference_services import InferenceServiceError
14
15
 
15
16
  if TYPE_CHECKING:
16
17
  from edsl.results.Dataset import Dataset
17
18
 
18
19
 
19
- def get_model_class(model_name, registry: Optional[InferenceServicesCollection] = None):
20
+ def get_model_class(model_name, registry: Optional[InferenceServicesCollection] = None, service_name: Optional[InferenceServiceLiteral] = None):
20
21
  from edsl.inference_services.registry import default
21
22
 
22
23
  registry = registry or default
23
- factory = registry.create_model_factory(model_name)
24
- return factory
24
+ try:
25
+ factory = registry.create_model_factory(model_name, service_name=service_name)
26
+ return factory
27
+ except (InferenceServiceError, Exception) as e:
28
+ return Model._handle_model_error(model_name, e)
25
29
 
26
30
 
27
31
  class Meta(type):
@@ -58,6 +62,33 @@ class Model(metaclass=Meta):
58
62
  """Set a new registry"""
59
63
  cls._registry = registry
60
64
 
65
+ @classmethod
66
+ def _handle_model_error(cls, model_name: str, error: Exception):
67
+ """Handle errors from model creation and execution with notebook-aware behavior."""
68
+ if isinstance(error, InferenceServiceError):
69
+ services = [s._inference_service_ for s in cls.get_registry().services]
70
+ message = (
71
+ f"Model '{model_name}' not found in any services.\n"
72
+ "It is likely that our registry is just out of date.\n"
73
+ "Simply adding the service name to your model call should fix this.\n"
74
+ f"Available services are: {services}\n"
75
+ f"To specify a model with a service, use:\n"
76
+ f'Model("{model_name}", service_name="<service_name>")'
77
+ )
78
+ else:
79
+ message = f"An error occurred: {str(error)}"
80
+
81
+ # Check if we're in a notebook environment
82
+ try:
83
+ get_ipython()
84
+ print(message)
85
+ return None
86
+ except NameError:
87
+ # Not in a notebook, raise the exception
88
+ if isinstance(error, InferenceServiceError):
89
+ raise InferenceServiceError(message)
90
+ raise error
91
+
61
92
  def __new__(
62
93
  cls,
63
94
  model_name: Optional[str] = None,
@@ -69,9 +100,7 @@ class Model(metaclass=Meta):
69
100
  "Instantiate a new language model."
70
101
  # Map index to the respective subclass
71
102
  if model_name is None:
72
- model_name = (
73
- cls.default_model
74
- ) # when model_name is None, use the default model, set in the config file
103
+ model_name = cls.default_model
75
104
 
76
105
  if registry is not None:
77
106
  cls.set_registry(registry)
@@ -79,10 +108,13 @@ class Model(metaclass=Meta):
79
108
  if isinstance(model_name, int): # can refer to a model by index
80
109
  model_name = cls.available(name_only=True)[model_name]
81
110
 
82
- factory = cls.get_registry().create_model_factory(
83
- model_name, service_name=service_name
84
- )
85
- return factory(*args, **kwargs)
111
+ try:
112
+ factory = cls.get_registry().create_model_factory(
113
+ model_name, service_name=service_name
114
+ )
115
+ return factory(*args, **kwargs)
116
+ except (InferenceServiceError, Exception) as e:
117
+ return cls._handle_model_error(model_name, e)
86
118
 
87
119
  @classmethod
88
120
  def add_model(cls, service_name, model_name) -> None:
edsl/results/Results.py CHANGED
@@ -1326,7 +1326,7 @@ class Results(UserList, Mixins, Base):
1326
1326
  except Exception as e:
1327
1327
  raise ResultsError(f"Failed to fetch remote results: {str(e)}")
1328
1328
 
1329
- def fetch(self, polling_interval: float = 1.0) -> Results:
1329
+ def fetch(self, polling_interval: [float, int] = 1.0) -> Results:
1330
1330
  """
1331
1331
  Polls the server for job completion and updates this Results instance with the completed data.
1332
1332
 
@@ -1346,6 +1346,7 @@ class Results(UserList, Mixins, Base):
1346
1346
  remote_job_data = JobsRemoteInferenceHandler.check_status(self.job_info.job_uuid)
1347
1347
 
1348
1348
  while remote_job_data.get("status") not in ["completed", "failed"]:
1349
+ print("Waiting for remote job to complete...")
1349
1350
  import time
1350
1351
  time.sleep(polling_interval)
1351
1352
  remote_job_data = JobsRemoteInferenceHandler.check_status(self.job_info.job_uuid)
@@ -9,7 +9,8 @@ from edsl.scenarios.Scenario import Scenario
9
9
  from edsl.utilities.remove_edsl_version import remove_edsl_version
10
10
 
11
11
  from edsl.scenarios.file_methods import FileMethods
12
-
12
+ from typing import Union
13
+ from uuid import UUID
13
14
 
14
15
  class FileStore(Scenario):
15
16
  __documentation__ = "https://docs.expectedparrot.com/en/latest/filestore.html"
@@ -262,7 +263,12 @@ class FileStore(Scenario):
262
263
  # raise TypeError("No text method found for this file type.")
263
264
 
264
265
  def push(
265
- self, description: Optional[str] = None, visibility: str = "unlisted"
266
+ self,
267
+ description: Optional[str] = None,
268
+ alias: Optional[str] = None,
269
+ visibility: Optional[str] = "unlisted",
270
+ expected_parrot_url: Optional[str] = None,
271
+
266
272
  ) -> dict:
267
273
  """
268
274
  Push the object to Coop.
@@ -272,17 +278,22 @@ class FileStore(Scenario):
272
278
  scenario_version = Scenario.from_dict(self.to_dict())
273
279
  if description is None:
274
280
  description = "File: " + self.path
275
- info = scenario_version.push(description=description, visibility=visibility)
281
+ info = scenario_version.push(description=description, visibility=visibility, expected_parrot_url=expected_parrot_url, alias=alias)
276
282
  return info
277
283
 
278
284
  @classmethod
279
- def pull(cls, uuid: str, expected_parrot_url: Optional[str] = None) -> "FileStore":
285
+ def pull(cls, url_or_uuid: Union[str, UUID]) -> "FileStore":
280
286
  """
281
- :param uuid: The UUID of the object to pull.
282
- :param expected_parrot_url: The URL of the Parrot server to use.
283
- :return: The object pulled from the Parrot server.
287
+ Pull a FileStore object from Coop.
288
+
289
+ Args:
290
+ url_or_uuid: Either a UUID string or a URL pointing to the object
291
+ expected_parrot_url: Optional URL for the Parrot server
292
+
293
+ Returns:
294
+ FileStore: The pulled FileStore object
284
295
  """
285
- scenario_version = Scenario.pull(uuid, expected_parrot_url=expected_parrot_url)
296
+ scenario_version = Scenario.pull(url_or_uuid)
286
297
  return cls.from_dict(scenario_version.to_dict())
287
298
 
288
299
  @classmethod
edsl/surveys/Survey.py CHANGED
@@ -942,12 +942,11 @@ class Survey(SurveyExportMixin, Base):
942
942
  # TODO: temp fix by creating a cache
943
943
  if cache is None:
944
944
  from edsl.data import Cache
945
+
945
946
  c = Cache()
946
947
  else:
947
948
  c = cache
948
949
 
949
-
950
-
951
950
  jobs: "Jobs" = self.get_job(model=model, agent=agent, **kwargs).using(c)
952
951
  return await jobs.run_async(
953
952
  disable_remote_inference=disable_remote_inference,
@@ -1244,6 +1243,28 @@ class Survey(SurveyExportMixin, Base):
1244
1243
 
1245
1244
  return self.by(s).by(agent).by(model)
1246
1245
 
1246
+ ###################
1247
+ # COOP METHODS
1248
+ ###################
1249
+ def humanize(
1250
+ self,
1251
+ project_name: str,
1252
+ survey_description: Optional[str] = None,
1253
+ survey_alias: Optional[str] = None,
1254
+ survey_visibility: Optional["VisibilityType"] = "unlisted",
1255
+ ):
1256
+ """
1257
+ Create a survey object on Coop.
1258
+ Then, create a project on Coop so you can share the survey with humans.
1259
+ """
1260
+ from edsl.coop import Coop
1261
+
1262
+ c = Coop()
1263
+ project_details = c.create_project(
1264
+ self, project_name, survey_description, survey_alias, survey_visibility
1265
+ )
1266
+ return project_details
1267
+
1247
1268
 
1248
1269
  def main():
1249
1270
  """Run the example survey."""
@@ -1255,16 +1276,16 @@ def main():
1255
1276
  q0 = QuestionMultipleChoice(
1256
1277
  question_name="q0",
1257
1278
  question_text="What is the capital of France?",
1258
- question_options=["London", "Paris", "Rome", "Boston", "I don't know"]
1279
+ question_options=["London", "Paris", "Rome", "Boston", "I don't know"],
1259
1280
  )
1260
1281
  q1 = QuestionList(
1261
1282
  question_name="q1",
1262
1283
  question_text="Name some cities in France.",
1263
- max_list_items = 5
1284
+ max_list_items=5,
1264
1285
  )
1265
1286
  q2 = QuestionNumerical(
1266
1287
  question_name="q2",
1267
- question_text="What is the population of {{ q0.answer }}?"
1288
+ question_text="What is the population of {{ q0.answer }}?",
1268
1289
  )
1269
1290
  s = Survey(questions=[q0, q1, q2])
1270
1291
  s = s.add_rule(q0, "q0 == 'Paris'", q2)
@@ -1281,4 +1302,4 @@ if __name__ == "__main__":
1281
1302
  import doctest
1282
1303
 
1283
1304
  # doctest.testmod(optionflags=doctest.ELLIPSIS | doctest.SKIP)
1284
- doctest.testmod(optionflags=doctest.ELLIPSIS)
1305
+ doctest.testmod(optionflags=doctest.ELLIPSIS)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edsl
3
- Version: 0.1.43
3
+ Version: 0.1.44
4
4
  Summary: Create and analyze LLM-based surveys
5
5
  Home-page: https://www.expectedparrot.com/
6
6
  License: MIT
@@ -1,8 +1,8 @@
1
- edsl/Base.py,sha256=-U6ngLZJDqImrAwF-TSmYzMESre0CG5rq9ZFxFh31sY,12864
1
+ edsl/Base.py,sha256=Mozyr7Mao_WwBA1YynlJ9gqm8oymtZ5WSbwEIdPVjPY,13256
2
2
  edsl/BaseDiff.py,sha256=92BirXj2u3TEGHJWni9TBsvZjvq8wpb4wDL2vxX9Lb0,8253
3
3
  edsl/TemplateLoader.py,sha256=sDBlSMt7EfOduM7w3h6v03gvh_Rzn9hVrlS-iLSQdZA,849
4
4
  edsl/__init__.py,sha256=iB5q_P2pXDV6Wb5oHKsFDhi_rJXID0aaqio1I98dwXA,1936
5
- edsl/__version__.py,sha256=PwEipAcIgfEks4UpVgOERoR8Az-FCfCGocVnb0rkncM,23
5
+ edsl/__version__.py,sha256=AoJtnEXXv6E20uj57ChQUsGoLfKG8mvSQpdz97tcyis,23
6
6
  edsl/agents/Agent.py,sha256=lF7GD_bCvRLP4hrtm3w451AUfuJln5jZHGYBH84CMVE,40741
7
7
  edsl/agents/AgentList.py,sha256=iRfQfyUYtaJbJ3sRubPqPKRr77nKQgzhFEeZ0wcAEk0,18955
8
8
  edsl/agents/Invigilator.py,sha256=SObe7PC08XoWNpOubZMFlVKPN8nfZplYBwY9LXJou8c,12084
@@ -36,7 +36,7 @@ edsl/coop/CoopFunctionsMixin.py,sha256=RS79ADEbYUK-frf_WY-YnozVbM3ZaBufv1jxjF96G
36
36
  edsl/coop/ExpectedParrotKeyHandler.py,sha256=1lriainznM1FfQ7GEvTiI1EW8uNi8Sms3Vt5UDxso3U,4456
37
37
  edsl/coop/PriceFetcher.py,sha256=J5EaM-bPqnd2B0ZBVVqXJ-UQK-D4SdjmddYepnN7jz4,1777
38
38
  edsl/coop/__init__.py,sha256=4iZCwJSzJVyjBYk8ggGxY2kZjq9dXVT1jhyPDNyew4I,115
39
- edsl/coop/coop.py,sha256=-O07b4zhhjfPGF_XjX8uiv1Cdc41R121Y1h-5kJEEkw,42631
39
+ edsl/coop/coop.py,sha256=4hDQocQ5CTK2BKWg-ToqJVNXMzTR_qQknkGUB3axyNI,43736
40
40
  edsl/coop/utils.py,sha256=SBV76sk5_2rhP3RKGkJsOkrx9Qr-jD0puqYhVR_MgSY,3900
41
41
  edsl/data/Cache.py,sha256=ryMWLowyXa8VwWKru-0pF43JHh2UVyL5Zezst-26J6c,18510
42
42
  edsl/data/CacheEntry.py,sha256=mTc-WG_dWc4s9s3MrOl3yUqao2Q_igCerNcluM4XCSQ,7376
@@ -46,7 +46,7 @@ edsl/data/SQLiteDict.py,sha256=V5Nfnxctgh4Iblqcw1KmbnkjtfmWrrombROSQ3mvg6A,8979
46
46
  edsl/data/__init__.py,sha256=i_bbYBc-vrdASBpDMcpIcfhbLKYOkvqA57R3ysBcQ6o,177
47
47
  edsl/data/orm.py,sha256=Jz6rvw5SrlxwysTL0QI9r68EflKxeEBmf6j6himHDS8,238
48
48
  edsl/data_transfer_models.py,sha256=r7Nl2ZyR0FZhzqQg8tz2jxonTVBboK9W3qMicts69qc,1960
49
- edsl/enums.py,sha256=3K-4xpOfORWOn-BzQVlMQyneSbORklaP39HB05YnXxY,6098
49
+ edsl/enums.py,sha256=tq0iAW3Z6zuWCldzBVY1jKSJeD4GvLe0b2GQewVQubQ,6181
50
50
  edsl/exceptions/BaseException.py,sha256=eP30DOYtssbKt0qarfDkNOKDW-aG0DLaHtx42bp5dVQ,811
51
51
  edsl/exceptions/__init__.py,sha256=guZX0w_IGt-fYBuK_xVKACfJfQU6AYXM2kscbPp8Yrw,1532
52
52
  edsl/exceptions/agents.py,sha256=E_r9bHUQEPWTjy5D-CmDvFMgFe34aPtwo4ApYN71mDg,1626
@@ -63,29 +63,30 @@ edsl/exceptions/questions.py,sha256=8UGm6uo0sCfes1AXQzoGwcwKgzgmY7Bx6gyPzc0TxqY,
63
63
  edsl/exceptions/results.py,sha256=NfY-IWroZsEKpprAipIxjJ2hxJKWgBS-Qa-zubDhAoE,509
64
64
  edsl/exceptions/scenarios.py,sha256=j4OE9xrSrLKdRMwmr3webIRHBwBgvx0DL0uDThRW7yY,855
65
65
  edsl/exceptions/surveys.py,sha256=BJUKFVkj6nrsq3TyvaZfEE-zjy3BCAM-s1lsdcrv_MM,677
66
- edsl/inference_services/AnthropicService.py,sha256=Xr1MQmBYYKKaMd9IRBYvK357i7vrxUm73nxxNZGCCCQ,3761
66
+ edsl/inference_services/AnthropicService.py,sha256=fXeYPszlfjyEjMy57toPnR34qnNWXxZOOuPTjiRaSyA,3846
67
67
  edsl/inference_services/AvailableModelCacheHandler.py,sha256=9zGT1Huz0VTOZyN5GpakcMAe6pZyYmZcdSzuqPUZ09g,6179
68
68
  edsl/inference_services/AvailableModelFetcher.py,sha256=2RjYftpSVbdxC_lE3U8G1Pn4m2UwY6WbxBHrrujMAFI,7894
69
69
  edsl/inference_services/AwsBedrock.py,sha256=aOJ7n_05cdh2EkTWfd9mhOJiPdaqEtmBJBHKmT_Ds5A,4001
70
70
  edsl/inference_services/AzureAI.py,sha256=8ymXCAWqa4NkYEGi6_AvcSRN1WLPXueAWk-W8w_T6AI,8817
71
71
  edsl/inference_services/DeepInfraService.py,sha256=fWlH5sCNxf8eHPHxPPxJMEVWpCM9sDenkC8IZYqtXfA,515
72
72
  edsl/inference_services/DeepSeekService.py,sha256=eRGrXb0ux3AtbJLJCEb6hgADdVIWMXkll-OnvSL_D-k,499
73
- edsl/inference_services/GoogleService.py,sha256=SZYEGZXsEcCgvGpc59vFVL382_MeCee9ZnFhJwg4kSo,4945
73
+ edsl/inference_services/GoogleService.py,sha256=nSBtcKBBrnwgCePEXk0g73QgQ5kJV6hpj8Eshy1Bq84,5042
74
+ edsl/inference_services/GrokService.py,sha256=K0IXun5poCLuut81QevasENSxVOyONA2yCmPQyyJEHI,308
74
75
  edsl/inference_services/GroqService.py,sha256=eDMq8d7YAlJ2689ywaoaPGvMgFfOiX1KYlF_vr97N6I,510
75
- edsl/inference_services/InferenceServiceABC.py,sha256=tbdaJgPeKIe3n4RGhifBFTpyKHxJnccn-YpHGyafgpE,2019
76
+ edsl/inference_services/InferenceServiceABC.py,sha256=9DVmYqPfXuR0N9PPOy9Wp94eEBdymlJAwlUU4eKEc64,2056
76
77
  edsl/inference_services/InferenceServicesCollection.py,sha256=cgGuixJopkwEb8QU6F_zUiTD8Nxcd6SKUUg05epuNuk,5051
77
78
  edsl/inference_services/MistralAIService.py,sha256=_cgcWKHcvTPyjYgvjsrPkwGro7zhi9YljDTN7ENDIdw,3805
78
79
  edsl/inference_services/OllamaService.py,sha256=oro9CRl8IUE2Ro-zE69Cr4Zaf6Gdw29XW5CFU-46E0k,498
79
- edsl/inference_services/OpenAIService.py,sha256=56DitvQVi7aD7MelP_r_hrg73_yaOIr8cxl2mVehAEQ,8250
80
+ edsl/inference_services/OpenAIService.py,sha256=IVYAxChdoe8k1SwUDtB71tfo78bjNcy5DNNVD0nSOGo,8273
80
81
  edsl/inference_services/PerplexityService.py,sha256=PWe8R0dT9aMOtrgBg_qIycVeqQCDlEmniGFhWBYi4U0,5657
81
82
  edsl/inference_services/ServiceAvailability.py,sha256=z2GaZ7Qt2qILcRTVl1X7zZVlPFOP3THntB5WSgbbesQ,4741
82
- edsl/inference_services/TestService.py,sha256=wfRQ3VfRG-yiT-laZ71OTGMji22hEpNxN3UEDvty3Fk,2954
83
+ edsl/inference_services/TestService.py,sha256=sLme9cgQsR0Nzdew3GyDpdfTeEEByxeak4YiodSZKvI,2986
83
84
  edsl/inference_services/TogetherAIService.py,sha256=fe349fdJQw-9OHz5mDGa5qxdC9Nccz0MtkisNIZjBkI,6360
84
85
  edsl/inference_services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
86
  edsl/inference_services/data_structures.py,sha256=IqxATICnHYE5csSUQl6qbzz3KcUask5pZk78-gijms4,3850
86
87
  edsl/inference_services/models_available_cache.py,sha256=bOvevfRn2HlmBcHalaDkjFLxiw0JJhsXVUHZo_OhgjA,4061
87
88
  edsl/inference_services/rate_limits_cache.py,sha256=HYslviz7mxF9U4CUTPAkoyBsiXjSju-YCp4HHir6e34,1398
88
- edsl/inference_services/registry.py,sha256=P0tkpr16WcYX7FAqo-_PnKPpzyI6GNs_dsMRdClBoRk,1424
89
+ edsl/inference_services/registry.py,sha256=s3R0nI8w93aoxueTYx5ZGzS7AKqr2qRhqV255X0O5cU,1501
89
90
  edsl/inference_services/write_available.py,sha256=NNwhATlaMp8IYY635MSx-oYxt5X15acjAfaqYCo_I1Y,285
90
91
  edsl/jobs/AnswerQuestionFunctionConstructor.py,sha256=wNM2HNhEQLYO8BRCfzqPGpJrqmtw0FBkGPa_VUe9emQ,7977
91
92
  edsl/jobs/Answers.py,sha256=lZpbGAqYqMQw7MUsmpivqMZkHjHHOmCY32s9Km284pQ,1445
@@ -93,9 +94,9 @@ edsl/jobs/FetchInvigilator.py,sha256=83tbrqY_1qK0biNF1x51N0sFx49FFmuOi3o5HmFuCIY
93
94
  edsl/jobs/InterviewTaskManager.py,sha256=I1GShC2CrBFnGOcWn3q2YUU0SJbesmeLrrM2_nkuhZo,3748
94
95
  edsl/jobs/InterviewsConstructor.py,sha256=MyRgygmi4318PgERjhhZZXlNUju2lB1CBu8LJJjYNSs,1853
95
96
  edsl/jobs/Jobs.py,sha256=-UNknyXlO-3L06ljxukpZBay6IIQqHdCYNKHToiJftw,30776
96
- edsl/jobs/JobsChecks.py,sha256=v1sgdjKQTYMoZu-uobM9USn1KaF6QBoOfNSGH7ueZjU,5403
97
+ edsl/jobs/JobsChecks.py,sha256=gdunjLzpTzhmuhwi19d3Iu1UbNrKYwicbbVX8EqBhqw,5565
97
98
  edsl/jobs/JobsComponentConstructor.py,sha256=yzjBFQx1oK8CN2taniB82kpXo6W712dIG1E9ouwkujg,6969
98
- edsl/jobs/JobsPrompts.py,sha256=szbNRda8uewU1QrLynIxUIefK94dSMR2MBkTCb9H4hI,12835
99
+ edsl/jobs/JobsPrompts.py,sha256=XA52HydVoIWZqmVMnfpTrM1M1vMutNYZR3bUqhilBUk,12831
99
100
  edsl/jobs/JobsRemoteInferenceHandler.py,sha256=UC5LM7bedT9WabqspfdFo2HW6CRNJFNkjh-pSJqu3nU,11464
100
101
  edsl/jobs/JobsRemoteInferenceLogger.py,sha256=rUaImMQWVZO24i8cXBeDpd4rMu3fUSbolfqBNbrG1ms,9265
101
102
  edsl/jobs/RequestTokenEstimator.py,sha256=IF2sb1Tt_exzNyWnuvd8mm81gfyZsv-rUP-GUHBX32E,1183
@@ -132,7 +133,7 @@ edsl/jobs/tasks/task_status_enum.py,sha256=FLmfSgHSbB921UyC-mvKpBLg5HLRf_NbHKXF4
132
133
  edsl/jobs/tokens/InterviewTokenUsage.py,sha256=u_6-IHpGFwZ6qMEXr24-jyLVUSSp4dSs_4iAZsBv7O4,1100
133
134
  edsl/jobs/tokens/TokenUsage.py,sha256=odj2-wDNEbHl9noyFAQ0DSKV0D9cv3aDOpmXufKZ8O4,1323
134
135
  edsl/language_models/ComputeCost.py,sha256=SLP_tQiZwMonlIVAsOseWpN4Gd3zVirSxN2WJsO5kzs,2310
135
- edsl/language_models/LanguageModel.py,sha256=847NvhGQqz0mpqvsM5gnWEhllKG66Vl7WD1sFs_0Qxk,21811
136
+ edsl/language_models/LanguageModel.py,sha256=vW0A_oQSRfmSdM1wnbZBzo0fYmxWD9CNKQBSzBvTmqE,21906
136
137
  edsl/language_models/ModelList.py,sha256=n8OWnPBeKT66XsXvbG5xWqvrs7MHBiuuFWp82gVQD0o,4731
137
138
  edsl/language_models/PriceManager.py,sha256=4dN8L1qn8KEhqqHVy_50yLAahrJKlesAm6jtE3pzMcw,4432
138
139
  edsl/language_models/RawResponseHandler.py,sha256=4ekXsNlDUOb_cfzmfJLS-KIjQXjf6xGgGdDgloqANxI,3904
@@ -146,7 +147,7 @@ edsl/language_models/key_management/KeyLookupBuilder.py,sha256=HV21uTSYOuSKBIIoG
146
147
  edsl/language_models/key_management/KeyLookupCollection.py,sha256=OU6jPZoJ54fAtkTfxwsD2lw_ZVha92G_T0LpCq1r-js,1205
147
148
  edsl/language_models/key_management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
149
  edsl/language_models/key_management/models.py,sha256=Rs7fjzFjPHXv4sKU9E-FnwZj2ul69sWDwhdIMhjjElE,2753
149
- edsl/language_models/model.py,sha256=yWt3t3e1s0pt3zKJu450RFzhLfV7nA6CZYYzrrq7nyo,10389
150
+ edsl/language_models/model.py,sha256=ZVJHsPhBUsMeCyjQj8GYnezPw6NWSjGmsa2zuWabu5k,11910
150
151
  edsl/language_models/repair.py,sha256=TnYY6-rTQFeZaeGOymT0UkIjfZrxs4JK0v2h9UY4m48,5401
151
152
  edsl/language_models/utilities.py,sha256=0dXHl74OlGKf1224fo5wYsawdBvxqMAB87nY_tJ0VYY,2295
152
153
  edsl/notebooks/Notebook.py,sha256=j1W_sGp5Oa6tY4FlR2KthOU_ZzCFlRShkHYcpciIt94,8217
@@ -248,7 +249,7 @@ edsl/results/DatasetTree.py,sha256=nvNCF9psLcQ65qsxze7qkrhLn-U-N8OJ327Nf-sFskQ,1
248
249
  edsl/results/MarkdownToDocx.py,sha256=e8kdDPoqS6Zvd8OTldP9AXbjtmr8BZnro7f0-g1ENi4,4123
249
250
  edsl/results/MarkdownToPDF.py,sha256=RgQ8V86AD_h0HlohUiTWcbL8zOpI8xFC4FK-aOh26HE,3608
250
251
  edsl/results/Result.py,sha256=EQ2klw1vwFv3oih1I38AAJEOYOd7PKEk_oGwA3HTc4A,21404
251
- edsl/results/Results.py,sha256=NmUq0162WpDlmDjR5xi5uJcBTu69XC2Zywvva5a-rho,48363
252
+ edsl/results/Results.py,sha256=0MCLps4_M9OJlBN_Hp9rxtXJNG8rYjdNFXqJOz-HOy0,48433
252
253
  edsl/results/ResultsExportMixin.py,sha256=v9N4pUMrycmKIDzdWn1grmx7F8lxIPAOjfV6OScYSwc,1379
253
254
  edsl/results/ResultsGGMixin.py,sha256=-E4vhljp53LSSdoURAZnkAb9ekoV4yF0ASv3S4tgnr8,6530
254
255
  edsl/results/TableDisplay.py,sha256=xGJcotgUqWrmCkQLeD9YIwLrNv7su4VDce3EnllfrLQ,3725
@@ -266,7 +267,7 @@ edsl/results/tree_explore.py,sha256=hQjiO4E71rIOPDgEHgK8T8ukxqoNdgX_tvyiDlG4_9U,
266
267
  edsl/scenarios/ConstructDownloadLink.py,sha256=DGfF6hoCUovpTQ_GWiEndc--fXe9St6UdiaPhj7ZJZw,3529
267
268
  edsl/scenarios/DocumentChunker.py,sha256=LZXh_yx507LMNQ-i2VnSHZiPpRI0XQUECO8e3xAKAjI,3545
268
269
  edsl/scenarios/DocxScenario.py,sha256=ul3nkX826m_T6LFptswqtnH5czP_yxMlLWgbTmFIZI4,482
269
- edsl/scenarios/FileStore.py,sha256=onFZAqkdqzyQeQ9_2zn1qGY40SqmRG9X8DvtcbXW39o,17418
270
+ edsl/scenarios/FileStore.py,sha256=F878ks-ijeKnA14pIRvO4A9RERa5JuykBrgzz5-vKqE,17683
270
271
  edsl/scenarios/PdfExtractor.py,sha256=AMTwEZY0pFzSqe3CYVWhijQDfj3qlZq0CoaHaYDnapM,1196
271
272
  edsl/scenarios/Scenario.py,sha256=9eP78TrIsxkvXYq7-aQCcqcW37v2M4MSh7EIk8l018E,18303
272
273
  edsl/scenarios/ScenarioHtmlMixin.py,sha256=5H8MnPPWqlGZ0_Ojv1WjkFaNNRrr-JpCRwlABDBfPXs,2111
@@ -309,7 +310,7 @@ edsl/surveys/Rule.py,sha256=Hou5_sSpvIfBdZNQk8tHFf-q4JT0wrV_kPMGbmLBfgA,12403
309
310
  edsl/surveys/RuleCollection.py,sha256=UC300EOPhjrMc-88eWt5kKBg1pVvKzzwgda2hjHW_sk,14790
310
311
  edsl/surveys/RuleManager.py,sha256=8k1XfTWaJbgjLLJsryBxVSiZ2_YuJPqE750jZEEtVwI,6216
311
312
  edsl/surveys/Simulator.py,sha256=I4_vHNnwe43SAbw7CK1xa45tahAKHfNRbRxGTRXdHuA,2586
312
- edsl/surveys/Survey.py,sha256=30ttDhOGW39e3spWFFtUlmfpBaelxvGeih91oJN561g,47992
313
+ edsl/surveys/Survey.py,sha256=tdjtmbyYS-fmSTMSk6Of6A3AnJsUMx85KarS9_FjzgM,48649
313
314
  edsl/surveys/SurveyCSS.py,sha256=fIdiLuXTUq6KuoXXAU_LTHTTe6RchnCmZpj3j7qnt5Y,8796
314
315
  edsl/surveys/SurveyExportMixin.py,sha256=Kvkd2ku2Kemsn2Nw-Yt8GTnGFcUqfEiKznmisAeO7ck,8339
315
316
  edsl/surveys/SurveyFlowVisualization.py,sha256=OLdVZstVuzR_DFulTosRBhpUa9wQ6XJjKbOpvTUCgJw,6467
@@ -358,7 +359,7 @@ edsl/utilities/remove_edsl_version.py,sha256=3n2RoXvZ4pH3k-_lc7B-vkeUyHXHX6vKHQS
358
359
  edsl/utilities/repair_functions.py,sha256=tftmklAqam6LOQQu_-9U44N-llycffhW8LfO63vBmNw,929
359
360
  edsl/utilities/restricted_python.py,sha256=5-_zUhrNbos7pLhDl9nr8d24auRlquR6w-vKkmNjPiA,2060
360
361
  edsl/utilities/utilities.py,sha256=FbI9QYGD4eaHrwZ6ePx51jjpatZqwSPHJhimx-h6HyA,12660
361
- edsl-0.1.43.dist-info/LICENSE,sha256=_qszBDs8KHShVYcYzdMz3HNMtH-fKN_p5zjoVAVumFc,1111
362
- edsl-0.1.43.dist-info/METADATA,sha256=GZMhoOS8tgU-eC7KkTr_kAM5nriLA7tCl3JzfpUvGhk,4719
363
- edsl-0.1.43.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
364
- edsl-0.1.43.dist-info/RECORD,,
362
+ edsl-0.1.44.dist-info/LICENSE,sha256=_qszBDs8KHShVYcYzdMz3HNMtH-fKN_p5zjoVAVumFc,1111
363
+ edsl-0.1.44.dist-info/METADATA,sha256=zRvHZT8Xrlpgfu6VXIsPbWMvaPhvVloiF4HoJlu1CZU,4719
364
+ edsl-0.1.44.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
365
+ edsl-0.1.44.dist-info/RECORD,,
File without changes
File without changes