edsl 0.1.34.dev1__py3-none-any.whl → 0.1.35__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/__version__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.1.34.dev1"
1
+ __version__ = "0.1.35"
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
  from typing import Dict, Any, Optional, Set
3
3
  from collections import UserList
4
- import enum
4
+ import pdb
5
5
 
6
6
  from jinja2 import Environment, meta
7
7
 
@@ -172,7 +172,6 @@ class PromptConstructor:
172
172
  """
173
173
  # The user might have passed a custom prompt, which would be stored in _question_instructions_prompt
174
174
  if not hasattr(self, "_question_instructions_prompt"):
175
-
176
175
  # Gets the instructions for the question - this is how the question should be answered
177
176
  question_prompt = self.question.get_instructions(model=self.model.model)
178
177
 
@@ -198,14 +197,15 @@ class PromptConstructor:
198
197
  self.question.question_options = question_options
199
198
 
200
199
  # might be getting it from the prior answers
201
- if isinstance(
202
- question_options := self.prior_answers_dict()
203
- .get(question_option_key)
204
- .answer,
205
- list,
206
- ):
207
- question_data["question_options"] = question_options
208
- self.question.question_options = question_options
200
+ if self.prior_answers_dict().get(question_option_key) is not None:
201
+ if isinstance(
202
+ question_options := self.prior_answers_dict()
203
+ .get(question_option_key)
204
+ .answer,
205
+ list,
206
+ ):
207
+ question_data["question_options"] = question_options
208
+ self.question.question_options = question_options
209
209
 
210
210
  replacement_dict = (
211
211
  {key: f"<see file {key}>" for key in self.scenario_file_keys}
@@ -241,10 +241,13 @@ class PromptConstructor:
241
241
  )
242
242
 
243
243
  if undefined_template_variables:
244
- # breakpoint()
245
- raise QuestionScenarioRenderError(
246
- f"Question instructions still has variables: {undefined_template_variables}."
247
- )
244
+ msg = f"Question instructions still has variables: {undefined_template_variables}."
245
+ import warnings
246
+
247
+ warnings.warn(msg)
248
+ # raise QuestionScenarioRenderError(
249
+ # f"Question instructions still has variables: {undefined_template_variables}."
250
+ # )
248
251
 
249
252
  ####################################
250
253
  # Check if question has instructions - these are instructions in a Survey that can apply to multiple follow-on questions
@@ -188,12 +188,16 @@ class OpenAIService(InferenceServiceABC):
188
188
  else:
189
189
  content = user_prompt
190
190
  client = self.async_client()
191
+
191
192
  messages = [
192
193
  {"role": "system", "content": system_prompt},
193
194
  {"role": "user", "content": content},
194
195
  ]
195
- if system_prompt == "" and self.omit_system_prompt_if_empty:
196
+ if (
197
+ system_prompt == "" and self.omit_system_prompt_if_empty
198
+ ) or "o1" in self.model:
196
199
  messages = messages[1:]
200
+
197
201
  params = {
198
202
  "model": self.model,
199
203
  "messages": messages,
@@ -205,7 +209,14 @@ class OpenAIService(InferenceServiceABC):
205
209
  "logprobs": self.logprobs,
206
210
  "top_logprobs": self.top_logprobs if self.logprobs else None,
207
211
  }
208
- response = await client.chat.completions.create(**params)
212
+ if "o1" in self.model:
213
+ params.pop("max_tokens")
214
+ params["max_completion_tokens"] = self.max_tokens
215
+ params["temperature"] = 1
216
+ try:
217
+ response = await client.chat.completions.create(**params)
218
+ except Exception as e:
219
+ print(e)
209
220
  return response.model_dump()
210
221
 
211
222
  LLM.__name__ = "LanguageModel"
edsl/jobs/Jobs.py CHANGED
@@ -145,14 +145,21 @@ class Jobs(Base):
145
145
  >>> Jobs.example().prompts()
146
146
  Dataset(...)
147
147
  """
148
+ from edsl import Coop
149
+
150
+ c = Coop()
151
+ price_lookup = c.fetch_prices()
148
152
 
149
153
  interviews = self.interviews()
150
154
  # data = []
151
155
  interview_indices = []
152
- question_indices = []
156
+ question_names = []
153
157
  user_prompts = []
154
158
  system_prompts = []
155
159
  scenario_indices = []
160
+ agent_indices = []
161
+ models = []
162
+ costs = []
156
163
  from edsl.results.Dataset import Dataset
157
164
 
158
165
  for interview_index, interview in enumerate(interviews):
@@ -160,23 +167,97 @@ class Jobs(Base):
160
167
  interview._get_invigilator(question)
161
168
  for question in self.survey.questions
162
169
  ]
163
- # list(interview._build_invigilators(debug=False))
164
170
  for _, invigilator in enumerate(invigilators):
165
171
  prompts = invigilator.get_prompts()
166
- user_prompts.append(prompts["user_prompt"])
167
- system_prompts.append(prompts["system_prompt"])
172
+ user_prompt = prompts["user_prompt"]
173
+ system_prompt = prompts["system_prompt"]
174
+ user_prompts.append(user_prompt)
175
+ system_prompts.append(system_prompt)
176
+ agent_index = self.agents.index(invigilator.agent)
177
+ agent_indices.append(agent_index)
168
178
  interview_indices.append(interview_index)
169
- scenario_indices.append(invigilator.scenario)
170
- question_indices.append(invigilator.question.question_name)
171
- return Dataset(
179
+ scenario_index = self.scenarios.index(invigilator.scenario)
180
+ scenario_indices.append(scenario_index)
181
+ models.append(invigilator.model.model)
182
+ question_names.append(invigilator.question.question_name)
183
+ # cost calculation
184
+ key = (invigilator.model._inference_service_, invigilator.model.model)
185
+ relevant_prices = price_lookup[key]
186
+ inverse_output_price = relevant_prices["output"]["one_usd_buys"]
187
+ inverse_input_price = relevant_prices["input"]["one_usd_buys"]
188
+ input_tokens = len(str(user_prompt) + str(system_prompt)) // 4
189
+ output_tokens = len(str(user_prompt) + str(system_prompt)) // 4
190
+ cost = input_tokens / float(
191
+ inverse_input_price
192
+ ) + output_tokens / float(inverse_output_price)
193
+ costs.append(cost)
194
+
195
+ d = Dataset(
172
196
  [
173
- {"interview_index": interview_indices},
174
- {"question_index": question_indices},
175
197
  {"user_prompt": user_prompts},
176
- {"scenario_index": scenario_indices},
177
198
  {"system_prompt": system_prompts},
199
+ {"interview_index": interview_indices},
200
+ {"question_name": question_names},
201
+ {"scenario_index": scenario_indices},
202
+ {"agent_index": agent_indices},
203
+ {"model": models},
204
+ {"estimated_cost": costs},
178
205
  ]
179
206
  )
207
+ return d
208
+ # if table:
209
+ # d.to_scenario_list().print(format="rich")
210
+ # else:
211
+ # return d
212
+
213
+ def show_prompts(self) -> None:
214
+ """Print the prompts."""
215
+ self.prompts().to_scenario_list().print(format="rich")
216
+
217
+ def estimate_job_cost(self):
218
+ from edsl import Coop
219
+
220
+ c = Coop()
221
+ price_lookup = c.fetch_prices()
222
+
223
+ prompts = self.prompts()
224
+
225
+ text_len = 0
226
+ for prompt in prompts:
227
+ text_len += len(str(prompt))
228
+
229
+ input_token_aproximations = text_len // 4
230
+
231
+ aproximation_cost = {}
232
+ total_cost = 0
233
+ for model in self.models:
234
+ key = (model._inference_service_, model.model)
235
+ relevant_prices = price_lookup[key]
236
+ inverse_output_price = relevant_prices["output"]["one_usd_buys"]
237
+ inverse_input_price = relevant_prices["input"]["one_usd_buys"]
238
+
239
+ aproximation_cost[key] = {
240
+ "input": input_token_aproximations / float(inverse_input_price),
241
+ "output": input_token_aproximations / float(inverse_output_price),
242
+ }
243
+ ##TODO curenlty we approximate the number of output tokens with the number
244
+ # of input tokens. A better solution will be to compute the quesiton answer options length and sum them
245
+ # to compute the output tokens
246
+
247
+ total_cost += input_token_aproximations / float(inverse_input_price)
248
+ total_cost += input_token_aproximations / float(inverse_output_price)
249
+
250
+ # multiply_factor = len(self.agents or [1]) * len(self.scenarios or [1])
251
+ multiply_factor = 1
252
+ out = {
253
+ "input_token_aproximations": input_token_aproximations,
254
+ "models_costs": aproximation_cost,
255
+ "estimated_total_cost": total_cost * multiply_factor,
256
+ "multiply_factor": multiply_factor,
257
+ "single_config_cost": total_cost,
258
+ }
259
+
260
+ return out
180
261
 
181
262
  @staticmethod
182
263
  def _get_container_class(object):
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
  import asyncio
5
5
  from typing import Any, Type, List, Generator, Optional, Union
6
+ import copy
6
7
 
7
8
  from tenacity import (
8
9
  retry,
@@ -99,15 +100,17 @@ class Interview(InterviewStatusMixin):
99
100
 
100
101
  """
101
102
  self.agent = agent
102
- self.survey = survey
103
+ # what I would like to do
104
+ self.survey = copy.deepcopy(survey) # survey copy.deepcopy(survey)
105
+ # self.survey = survey
103
106
  self.scenario = scenario
104
107
  self.model = model
105
108
  self.debug = debug
106
109
  self.iteration = iteration
107
110
  self.cache = cache
108
- self.answers: dict[str, str] = (
109
- Answers()
110
- ) # will get filled in as interview progresses
111
+ self.answers: dict[
112
+ str, str
113
+ ] = Answers() # will get filled in as interview progresses
111
114
  self.sidecar_model = sidecar_model
112
115
 
113
116
  # self.stop_on_exception = False
@@ -428,11 +431,11 @@ class Interview(InterviewStatusMixin):
428
431
  """
429
432
  current_question_index: int = self.to_index[current_question.question_name]
430
433
 
431
- next_question: Union[int, EndOfSurvey] = (
432
- self.survey.rule_collection.next_question(
433
- q_now=current_question_index,
434
- answers=self.answers | self.scenario | self.agent["traits"],
435
- )
434
+ next_question: Union[
435
+ int, EndOfSurvey
436
+ ] = self.survey.rule_collection.next_question(
437
+ q_now=current_question_index,
438
+ answers=self.answers | self.scenario | self.agent["traits"],
436
439
  )
437
440
 
438
441
  next_question_index = next_question.next_q
@@ -173,19 +173,19 @@ class JobsRunnerAsyncio:
173
173
 
174
174
  prompt_dictionary = {}
175
175
  for answer_key_name in answer_key_names:
176
- prompt_dictionary[answer_key_name + "_user_prompt"] = (
177
- question_name_to_prompts[answer_key_name]["user_prompt"]
178
- )
179
- prompt_dictionary[answer_key_name + "_system_prompt"] = (
180
- question_name_to_prompts[answer_key_name]["system_prompt"]
181
- )
176
+ prompt_dictionary[
177
+ answer_key_name + "_user_prompt"
178
+ ] = question_name_to_prompts[answer_key_name]["user_prompt"]
179
+ prompt_dictionary[
180
+ answer_key_name + "_system_prompt"
181
+ ] = question_name_to_prompts[answer_key_name]["system_prompt"]
182
182
 
183
183
  raw_model_results_dictionary = {}
184
184
  for result in valid_results:
185
185
  question_name = result.question_name
186
- raw_model_results_dictionary[question_name + "_raw_model_response"] = (
187
- result.raw_model_response
188
- )
186
+ raw_model_results_dictionary[
187
+ question_name + "_raw_model_response"
188
+ ] = result.raw_model_response
189
189
  raw_model_results_dictionary[question_name + "_cost"] = result.cost
190
190
  one_use_buys = (
191
191
  "NA"
@@ -490,7 +490,7 @@ class LanguageModel(
490
490
  "user_prompt": user_prompt,
491
491
  "system_prompt": system_prompt,
492
492
  "files_list": files_list
493
- #**({"encoded_image": encoded_image} if encoded_image else {}),
493
+ # **({"encoded_image": encoded_image} if encoded_image else {}),
494
494
  }
495
495
  # response = await f(**params)
496
496
  response = await asyncio.wait_for(f(**params), timeout=TIMEOUT)
@@ -534,7 +534,7 @@ class LanguageModel(
534
534
  system_prompt: str,
535
535
  cache: "Cache",
536
536
  iteration: int = 1,
537
- files_list: Optional[List['File']] = None,
537
+ files_list: Optional[List["File"]] = None,
538
538
  ) -> dict:
539
539
  """Get response, parse, and return as string.
540
540
 
@@ -40,8 +40,10 @@ def create_language_model(
40
40
  _tpm = 1000000000000
41
41
 
42
42
  async def async_execute_model_call(
43
- self, user_prompt: str, system_prompt: str,
44
- files_list: Optional[List[Any]] = None
43
+ self,
44
+ user_prompt: str,
45
+ system_prompt: str,
46
+ files_list: Optional[List[Any]] = None,
45
47
  ) -> dict[str, Any]:
46
48
  question_number = int(
47
49
  user_prompt.split("XX")[1]
@@ -82,7 +82,8 @@ class QuestionBase(
82
82
  if not hasattr(self, "_fake_data_factory"):
83
83
  from polyfactory.factories.pydantic_factory import ModelFactory
84
84
 
85
- class FakeData(ModelFactory[self.response_model]): ...
85
+ class FakeData(ModelFactory[self.response_model]):
86
+ ...
86
87
 
87
88
  self._fake_data_factory = FakeData
88
89
  return self._fake_data_factory
@@ -120,9 +120,9 @@ class QuestionMultipleChoice(QuestionBase):
120
120
 
121
121
  question_type = "multiple_choice"
122
122
  purpose = "When options are known and limited"
123
- question_options: Union[list[str], list[list], list[float], list[int]] = (
124
- QuestionOptionsDescriptor()
125
- )
123
+ question_options: Union[
124
+ list[str], list[list], list[float], list[int]
125
+ ] = QuestionOptionsDescriptor()
126
126
  _response_model = None
127
127
  response_validator_class = MultipleChoiceResponseValidator
128
128
 
@@ -1,7 +1,6 @@
1
1
  This question requires a numerical response in the form of an integer or decimal (e.g., -12, 0, 1, 2, 3.45, ...).
2
2
  Respond with just your number on a single line.
3
3
  If your response is equivalent to zero, report '0'
4
- If you cannot determine the answer, report 'None'
5
4
 
6
5
  {% if include_comment %}
7
6
  After the answer, put a comment explaining your choice on the next line.
@@ -263,7 +263,6 @@ class FileStore(Scenario):
263
263
 
264
264
 
265
265
  class CSVFileStore(FileStore):
266
-
267
266
  @classmethod
268
267
  def example(cls):
269
268
  from edsl.results.Results import Results
@@ -282,7 +281,6 @@ class CSVFileStore(FileStore):
282
281
 
283
282
 
284
283
  class PDFFileStore(FileStore):
285
-
286
284
  def view(self):
287
285
  pdf_path = self.to_tempfile()
288
286
  print(f"PDF path: {pdf_path}") # Print the path to ensure it exists
@@ -358,7 +356,6 @@ class PDFFileStore(FileStore):
358
356
 
359
357
 
360
358
  class PNGFileStore(FileStore):
361
-
362
359
  @classmethod
363
360
  def example(cls):
364
361
  import textwrap
@@ -382,7 +379,6 @@ class PNGFileStore(FileStore):
382
379
 
383
380
 
384
381
  class SQLiteFileStore(FileStore):
385
-
386
382
  @classmethod
387
383
  def example(cls):
388
384
  import sqlite3
@@ -405,7 +401,6 @@ class SQLiteFileStore(FileStore):
405
401
 
406
402
 
407
403
  class HTMLFileStore(FileStore):
408
-
409
404
  @classmethod
410
405
  def example(cls):
411
406
  import tempfile
@@ -39,6 +39,15 @@ class ScenarioList(Base, UserList, ScenarioListMixin):
39
39
  super().__init__([])
40
40
  self.codebook = codebook or {}
41
41
 
42
+ def unique(self) -> ScenarioList:
43
+ """Return a list of unique scenarios.
44
+
45
+ >>> s = ScenarioList([Scenario({'a': 1}), Scenario({'a': 1}), Scenario({'a': 2})])
46
+ >>> s.unique()
47
+ ScenarioList([Scenario({'a': 1}), Scenario({'a': 2})])
48
+ """
49
+ return ScenarioList(list(set(self)))
50
+
42
51
  @property
43
52
  def has_jinja_braces(self) -> bool:
44
53
  """Check if the ScenarioList has Jinja braces."""
edsl/surveys/base.py CHANGED
@@ -36,6 +36,10 @@ class EndOfSurveyParent:
36
36
  """
37
37
  return self
38
38
 
39
+ def __deepcopy__(self, memo):
40
+ # Return the same instance when deepcopy is called
41
+ return self
42
+
39
43
  def __radd__(self, other):
40
44
  """Add the object to another object.
41
45
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: edsl
3
- Version: 0.1.34.dev1
3
+ Version: 0.1.35
4
4
  Summary: Create and analyze LLM-based surveys
5
5
  Home-page: https://www.expectedparrot.com/
6
6
  License: MIT
@@ -2,12 +2,12 @@ edsl/Base.py,sha256=wdFpHWlQlGNL4XfOmYA0AK9YupMDxK3G7mDHCQp60o4,9295
2
2
  edsl/BaseDiff.py,sha256=RoVEh52UJs22yMa7k7jv8se01G62jJNWnBzaZngo-Ug,8260
3
3
  edsl/TemplateLoader.py,sha256=sDBlSMt7EfOduM7w3h6v03gvh_Rzn9hVrlS-iLSQdZA,849
4
4
  edsl/__init__.py,sha256=UZcx9RHSi3Dslh2lWvCOeppdMW9Xzw_YLs-kFaNW1MU,1770
5
- edsl/__version__.py,sha256=XhBgcCdTjSpYn65HiKUqna67rnO8Ic__tIbjoMBXW6g,28
5
+ edsl/__version__.py,sha256=ABqgofsnbWf7823vTBbZNQ81eKQbWwrVToAU6T3z-6s,23
6
6
  edsl/agents/Agent.py,sha256=ww6DK177eHQUlYkzgnt1b-MBDKXCdhVx3HezAZZ7TKk,28473
7
7
  edsl/agents/AgentList.py,sha256=qo8VK3Ov0YOSbsBcHmlwLZBH81CcDfy5IEcx9AVH78M,10963
8
8
  edsl/agents/Invigilator.py,sha256=6xd4sJ6Jzxld8LZDWZuSCZLL_MfaSux4LJCAm_RLEOM,9077
9
9
  edsl/agents/InvigilatorBase.py,sha256=qIdAiriXAbnJH_SN9w2UAXHcDgQvk8Ar3QerKFjtPwM,10341
10
- edsl/agents/PromptConstructor.py,sha256=BmScHm5y67vnPKMgo-Diq4p_nyVf_G7MB9IHFY7rml8,14599
10
+ edsl/agents/PromptConstructor.py,sha256=qVCfRyYR-vKcpGJ_It2SOUvBfHtF8M6qYcf9ZCsHBl8,14855
11
11
  edsl/agents/__init__.py,sha256=B1dWfV4QWOo8cc2KeuetdFGeNhZ8XHc0Q8YhQW9k7BE,136
12
12
  edsl/agents/descriptors.py,sha256=m8ND3-2-JbgNX1HGakBNLIeemwsgYa1mQxYO9GW33hw,2934
13
13
  edsl/agents/prompt_helpers.py,sha256=rHUxM_F0kCOkJmnhCyK-amFKViAYvpRRLD8LHFLGqQw,5023
@@ -78,7 +78,7 @@ edsl/inference_services/InferenceServiceABC.py,sha256=rXqorwbKqzlwui2cxum8_TRrBc
78
78
  edsl/inference_services/InferenceServicesCollection.py,sha256=EDyxnoSjGXhWob_ost7U8WUYjn1jgL_noB0-VlXBnOo,2810
79
79
  edsl/inference_services/MistralAIService.py,sha256=7mUsBEZdEWIjfh4qMNemTT2xYMq7k0yuMLGtDTdfp4Y,3878
80
80
  edsl/inference_services/OllamaService.py,sha256=oro9CRl8IUE2Ro-zE69Cr4Zaf6Gdw29XW5CFU-46E0k,498
81
- edsl/inference_services/OpenAIService.py,sha256=2rGW0iGD_hnM1NHBJQCDI59Ti-9wFQu7gh8hDB95Cr4,7264
81
+ edsl/inference_services/OpenAIService.py,sha256=wraTu62bZojmgAXHNG6pJMMPZiyO1pSDfY73LVaBR_I,7621
82
82
  edsl/inference_services/TestService.py,sha256=-jTXkl_qLt1k8gJjRb0SMgTb9EY-XMTP-ZUL9AJcUCA,3009
83
83
  edsl/inference_services/TogetherAIService.py,sha256=p_31ccrfN25kZF2xlAlUkb7w1EL4lGjmkSv-5qZ7TtY,6301
84
84
  edsl/inference_services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -88,12 +88,12 @@ edsl/inference_services/registry.py,sha256=CwdaQ-A5PTb5lFKMQdOfl8IqCw2SVJ8HlC-_2
88
88
  edsl/inference_services/write_available.py,sha256=NNwhATlaMp8IYY635MSx-oYxt5X15acjAfaqYCo_I1Y,285
89
89
  edsl/jobs/Answers.py,sha256=c4LpigQjdnMr7iJu8571C4FggGPVudfT7hbJgmgKW40,1821
90
90
  edsl/jobs/FailedQuestion.py,sha256=3D5Vcmv1t2_dzBWbkUUIia3_jXHdzQDdyg-4TEIWU2Q,2701
91
- edsl/jobs/Jobs.py,sha256=a2Y-goWT9vGi00OqW7t9L8Oi6SXXiSllymd3s1frX1g,34035
91
+ edsl/jobs/Jobs.py,sha256=oryxhrBuXs9Ba8mt5BSIjX3gT37hdzothL5xH0ygrkU,37227
92
92
  edsl/jobs/__init__.py,sha256=aKuAyd_GoalGj-k7djOoVwEbFUE2XLPlikXaA1_8yAg,32
93
93
  edsl/jobs/buckets/BucketCollection.py,sha256=11CRisE1WAPcAlI3YJK3DVvu0AqSvv8KskXo4Q1waSk,2286
94
94
  edsl/jobs/buckets/ModelBuckets.py,sha256=hxw_tzc0V42CiB7mh5jIxlgwDVJ-zFZhlLtKrHEg8ho,2419
95
95
  edsl/jobs/buckets/TokenBucket.py,sha256=7fG4omzTcj5xC2iJLO9bfBkdAGs6Y3weXzlA3BgPr0E,9090
96
- edsl/jobs/interviews/Interview.py,sha256=Vt5-6zNazBnp8EZRTA552hy3MyaFxMPkLGgAaIhikzI,23774
96
+ edsl/jobs/interviews/Interview.py,sha256=iw0thEGwENOl8uzHRJ88zjYHEDSlM_X96Fyse9wZCwM,23883
97
97
  edsl/jobs/interviews/InterviewExceptionCollection.py,sha256=Ez8BCZUD3odqoY9h-gzYKKM8yaHynQ-eYw2uMDh7t98,3279
98
98
  edsl/jobs/interviews/InterviewExceptionEntry.py,sha256=BGGjj0sb1wJJ0QmYklt1DyEYKD8mUGygllGfN2WXKbY,4903
99
99
  edsl/jobs/interviews/InterviewStatistic.py,sha256=hY5d2EkIJ96NilPpZAvZZzZoxLXM7ss3xx5MIcKtTPs,1856
@@ -103,7 +103,7 @@ edsl/jobs/interviews/InterviewStatusLog.py,sha256=6u0F8gf5tha39VQL-IK_QPkCsQAYVO
103
103
  edsl/jobs/interviews/InterviewStatusMixin.py,sha256=VV0Pel-crUsLoGpTifeIIkXsLGj0bfuO--UtpRnH-dU,1251
104
104
  edsl/jobs/interviews/ReportErrors.py,sha256=RSzDU2rWwtjfztj7sqaMab0quCiY-X2bG3AEOxhTim8,1745
105
105
  edsl/jobs/interviews/interview_status_enum.py,sha256=KJ-1yLAHdX-p8TiFnM0M3v1tnBwkq4aMCuBX6-ytrI8,229
106
- edsl/jobs/runners/JobsRunnerAsyncio.py,sha256=CxO93PO7UGtr9yzrIWDlBjHdq1uAaKoaevsJsYV_3zA,12856
106
+ edsl/jobs/runners/JobsRunnerAsyncio.py,sha256=SXWFTgTYQzqIaBjPQ2mRrxR3aGFMQyw2eD9wX8tZNkQ,12850
107
107
  edsl/jobs/runners/JobsRunnerStatus.py,sha256=4eCh9sRpswGdKeSMW9pCGCAjJZa-OrWUPI7tsxIy_g4,12112
108
108
  edsl/jobs/runners/JobsRunnerStatusData.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
109
  edsl/jobs/tasks/QuestionTaskCreator.py,sha256=f26rokFVXVdyKR2M8of_jlZqP6TPcTAINk9tEvb35pw,10122
@@ -114,7 +114,7 @@ edsl/jobs/tasks/task_management.py,sha256=KMToZuXzMlnHRHUF_VHL0-lHMTGhklf2GHVuwE
114
114
  edsl/jobs/tasks/task_status_enum.py,sha256=DOyrz61YlIS8R1W7izJNphcLrJ7I_ReUlfdRmk23h0Q,5333
115
115
  edsl/jobs/tokens/InterviewTokenUsage.py,sha256=u_6-IHpGFwZ6qMEXr24-jyLVUSSp4dSs_4iAZsBv7O4,1100
116
116
  edsl/jobs/tokens/TokenUsage.py,sha256=odj2-wDNEbHl9noyFAQ0DSKV0D9cv3aDOpmXufKZ8O4,1323
117
- edsl/language_models/LanguageModel.py,sha256=_f3Gv-1n4ttKWs7aSJG13xRklzxL-wOAn2Gl1jrWh5M,25193
117
+ edsl/language_models/LanguageModel.py,sha256=lGmflHSq0vLt4zBzYSKxH5dFccfA4Mhj4NM-XhTNZxY,25194
118
118
  edsl/language_models/ModelList.py,sha256=GhjRV7y1jRvP_Yjgwv6fxksTVb8sFPBiiRRfdqW-hgg,2852
119
119
  edsl/language_models/RegisterLanguageModelsMeta.py,sha256=eMtBSAnlRnC4c-0_o2QkSNyzv-uAce4BEGMXq2PLj2E,7523
120
120
  edsl/language_models/__init__.py,sha256=bvY7Gy6VkX1gSbNkRbGPS-M1kUnb0EohL0FSagaEaTs,109
@@ -123,7 +123,7 @@ edsl/language_models/fake_openai_service.py,sha256=2AAsAinELbMZRqiepwBkWhWcLuMe5
123
123
  edsl/language_models/registry.py,sha256=hfOlKbTkXrXGpZHQQPKE9uyyUCgOxoUyyIaKL2kf53U,4369
124
124
  edsl/language_models/repair.py,sha256=d0i2S3kJfX7JtuCYhlIyT0QP8hcZkRPLanC09lOW_xo,5353
125
125
  edsl/language_models/unused/ReplicateBase.py,sha256=J1oqf7mEyyKhRwNUomnptVqAsVFYCbS3iTW0EXpKtXo,3331
126
- edsl/language_models/utilities.py,sha256=ZEwldu1n4M0YRxcQ1s5q6SOkgc7ld4SLuFMq6hjiHIk,2256
126
+ edsl/language_models/utilities.py,sha256=GWON2ahCpB-_-hhqmQ5Yi7_rKB4cd8GlucWuq6EnGZQ,2280
127
127
  edsl/notebooks/Notebook.py,sha256=xi9xkxmkQ6-DwhqbjjMLpYKB0VJV20AtwEonJ6mnqjo,7739
128
128
  edsl/notebooks/__init__.py,sha256=VNUA3nNq04slWNbYaNrzOhQJu3AZANpvBniyCJSzJ7U,45
129
129
  edsl/prompts/Prompt.py,sha256=KsIz0tZnIqZlnbzNWO57C3MwJ0OCcUrZPmu7DBApc4s,11887
@@ -143,7 +143,7 @@ edsl/prompts/library/question_rank.py,sha256=WDgXyph0EKWJrSgsW2eqcx3xdU-WA1LEvB2
143
143
  edsl/prompts/prompt_config.py,sha256=O3Y5EvBsCeKs9m9IjXiRXOcHWlWvQV0yqsNb2oSR1ow,974
144
144
  edsl/prompts/registry.py,sha256=XOsqGsvNOmIG83jqoszqI72yNZkkszKR4FrEhwSzj_Q,8093
145
145
  edsl/questions/AnswerValidatorMixin.py,sha256=t_ABep50KP02GSc48Y8VAEjp35drVOngfrWXU5aVhgk,11505
146
- edsl/questions/QuestionBase.py,sha256=NY1M1QT3v2ToZJMbzsER4zejOPmczPzxEA_LKmdbsPk,21153
146
+ edsl/questions/QuestionBase.py,sha256=QsdYFHnWYh04JpCdx3o3WGgohBfE5X_7idQRRYrx_SA,21169
147
147
  edsl/questions/QuestionBaseGenMixin.py,sha256=CPxjWZjrxuSO8YWelz6dbp7fm788gN7-T8z7jXStboQ,6017
148
148
  edsl/questions/QuestionBasePromptsMixin.py,sha256=Km1P6PpkVJ9O3dS8pJZHNJ6aQABhYGLwdef4Z2vSrqk,9516
149
149
  edsl/questions/QuestionBudget.py,sha256=TJgPsyqafJdJw5if0zVxh7zHloourINUqUWfWIlRq9Y,8131
@@ -152,7 +152,7 @@ edsl/questions/QuestionExtract.py,sha256=PlXwMeZgPAFBXIHSXpFMYTToag-HwA9C7u6-Z3b
152
152
  edsl/questions/QuestionFreeText.py,sha256=uXJxrrAGCq0-J6WpO6TBNFBNOC2ztoEVa-2UMXuwlak,3384
153
153
  edsl/questions/QuestionFunctional.py,sha256=yZQFLQAxfNsAIETffFoBr-Ltb2oFPeywu-nhm9qjYRc,5133
154
154
  edsl/questions/QuestionList.py,sha256=vs2AE8OnbwVsly-sorb9dfIibdF1BpOaCRYyvwXYSzY,7209
155
- edsl/questions/QuestionMultipleChoice.py,sha256=SrvT8vS9KOCBogcABOFBhO1gb5Lr0vvmOfoxUkSw-h0,10294
155
+ edsl/questions/QuestionMultipleChoice.py,sha256=Yj94-6fwFqDI9UvjwSCOfKnp4gBB86XMmCsL7lbX-t4,10292
156
156
  edsl/questions/QuestionNumerical.py,sha256=_jMZ28DZHYAv_g3Y3vCnmzerMs995on0Ng6j4pDcfHo,4959
157
157
  edsl/questions/QuestionRank.py,sha256=kYHTYXU88X2Uv-zeCiI9w5aEFYTxvg2p7DoGaaER4ik,11596
158
158
  edsl/questions/Quick.py,sha256=h6h4fEvIkLIFJX2JiqfOUEXzku9azWxEpI5o2A4RmVs,1731
@@ -205,7 +205,7 @@ edsl/questions/templates/multiple_choice/answering_instructions.jinja,sha256=eSc
205
205
  edsl/questions/templates/multiple_choice/html.jinja,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
206
206
  edsl/questions/templates/multiple_choice/question_presentation.jinja,sha256=hoEVj4GQD3EYnR2AStXkMFOJeqISNoEVzBd8-cx2yWg,273
207
207
  edsl/questions/templates/numerical/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
208
- edsl/questions/templates/numerical/answering_instructions.jinja,sha256=BfGAeKFJWEzzvB91x8DrpRUERSvDv6kXf3Y0szL27LY,373
208
+ edsl/questions/templates/numerical/answering_instructions.jinja,sha256=70CnuIbdRKGiYJk7316-FFloRh3Oeg_RvUu4tthNKqs,323
209
209
  edsl/questions/templates/numerical/question_presentation.jinja,sha256=8lMUWtEPHD4XOAyVEfCmWSwRFrdUa3lo8sxzogDyzWE,183
210
210
  edsl/questions/templates/rank/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
211
211
  edsl/questions/templates/rank/answering_instructions.jinja,sha256=-LWrhVJ0ZwQW_DXhARh5GweqlarWbhZzoqwr6tE-33s,433
@@ -229,10 +229,10 @@ edsl/results/ResultsToolsMixin.py,sha256=mseEFxJCf9sjXdIxpjITt_UZBwdXxw2o2VLg5jM
229
229
  edsl/results/Selector.py,sha256=4AsFD71FKTFY1a0_AImsYWcYKx-RXPG6RgwsAvuNW3k,4403
230
230
  edsl/results/__init__.py,sha256=2YcyiVtXi-3vIV0ZzOy1PqBLm2gaziufJVi4fdNrAt8,80
231
231
  edsl/results/tree_explore.py,sha256=hQjiO4E71rIOPDgEHgK8T8ukxqoNdgX_tvyiDlG4_9U,4624
232
- edsl/scenarios/FileStore.py,sha256=mk8jVl2vvP31ufWPruS5ULT4TmbmMWd7NgQbtRIrJE0,13934
232
+ edsl/scenarios/FileStore.py,sha256=V_zn2RmVclcBQTvqghotnTO97YHWUXqeVfN7eMfpfUM,13929
233
233
  edsl/scenarios/Scenario.py,sha256=ZG1x4_MmWP9j0gakLwsxOZ7ESMy3ifwBMhgQlHvsYo8,16809
234
234
  edsl/scenarios/ScenarioHtmlMixin.py,sha256=EmugmbPJYW5eZS30rM6pDMDQD9yrrvHjmgZWB1qBfq4,1882
235
- edsl/scenarios/ScenarioList.py,sha256=v5zmM3AOxbVFN9kez6h8GVbFFAxDlykycXqREDc2h8c,40622
235
+ edsl/scenarios/ScenarioList.py,sha256=1zbwDICXbvtUGA5bDlhThNp9pfhBGIHIqhK2cX-th50,40942
236
236
  edsl/scenarios/ScenarioListExportMixin.py,sha256=wfffY9xy_1QyIM-1xnisr64izSLjmyuotUYY5iDLodc,1681
237
237
  edsl/scenarios/ScenarioListPdfMixin.py,sha256=z_H2sZn5SCSq6nRLSU5jefaOlh4sqJLyOY_Ld0XCR18,8332
238
238
  edsl/scenarios/__init__.py,sha256=KRwZCLf2R0qyJvv1NGbd8M51Bt6Ia6Iylg-Xq_2Fa6M,98
@@ -253,7 +253,7 @@ edsl/surveys/SurveyExportMixin.py,sha256=Kvkd2ku2Kemsn2Nw-Yt8GTnGFcUqfEiKznmisAe
253
253
  edsl/surveys/SurveyFlowVisualizationMixin.py,sha256=dEG_f-L0ZAyWU5Ta584IX5GZurjVt1tbIISo5z61Jvg,4004
254
254
  edsl/surveys/SurveyQualtricsImport.py,sha256=SSZv53D1zVhQSfSw-X0_cte0QnkWhE9v922wLn6RMkI,9771
255
255
  edsl/surveys/__init__.py,sha256=vjMYVlP95fHVqqw2FfKXRuYbTArZkZr1nK4FnXzZWzs,129
256
- edsl/surveys/base.py,sha256=n5PBx0BF0powzBXCsufpUekfNK_9huf3rohtU1mMCq0,1001
256
+ edsl/surveys/base.py,sha256=XJHGEbbsH6hlYYkmI4isVLD8guLz8BdhR-eQRL78mc4,1115
257
257
  edsl/surveys/descriptors.py,sha256=3B-hBVvGpLlVBCyOnPuxkLjesvpr0QIuATbggp_MJ7o,2076
258
258
  edsl/surveys/instructions/ChangeInstruction.py,sha256=XDLuI5nVI60iJz1w1kLaKmYryAYE0XIyRbElBtNjVVM,1265
259
259
  edsl/surveys/instructions/Instruction.py,sha256=WaTGihAQ6lCtm5W4vknTamkPzDp-eIAirdtGV37fdbc,925
@@ -289,7 +289,7 @@ edsl/utilities/interface.py,sha256=AaKpWiwWBwP2swNXmnFlIf3ZFsjfsR5bjXQAW47tD-8,1
289
289
  edsl/utilities/repair_functions.py,sha256=tftmklAqam6LOQQu_-9U44N-llycffhW8LfO63vBmNw,929
290
290
  edsl/utilities/restricted_python.py,sha256=5-_zUhrNbos7pLhDl9nr8d24auRlquR6w-vKkmNjPiA,2060
291
291
  edsl/utilities/utilities.py,sha256=gqMtWWNEZkWLiRR9vHW-VRNy2bStEPlJ-I2aK9CwFiQ,11367
292
- edsl-0.1.34.dev1.dist-info/LICENSE,sha256=_qszBDs8KHShVYcYzdMz3HNMtH-fKN_p5zjoVAVumFc,1111
293
- edsl-0.1.34.dev1.dist-info/METADATA,sha256=S-k9GEY61HYIUZ60rtZxkPBP0g9V2lb6YfG70P41PFk,4476
294
- edsl-0.1.34.dev1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
295
- edsl-0.1.34.dev1.dist-info/RECORD,,
292
+ edsl-0.1.35.dist-info/LICENSE,sha256=_qszBDs8KHShVYcYzdMz3HNMtH-fKN_p5zjoVAVumFc,1111
293
+ edsl-0.1.35.dist-info/METADATA,sha256=eyPEBXgJt4VgO_f7yPO8rIjvRDT2_RFjbCzF3bvVftk,4471
294
+ edsl-0.1.35.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
295
+ edsl-0.1.35.dist-info/RECORD,,