Skip to content

Commit 6347c61

Browse files
authored
Misc updates (#177)
* Misc updates * Updated backoff for client
1 parent e455a5e commit 6347c61

File tree

6 files changed

+41
-107
lines changed

6 files changed

+41
-107
lines changed

.github/scripts/pyproject.public-template-bot-2.toml

Lines changed: 0 additions & 28 deletions
This file was deleted.

.github/scripts/pyproject.public-template-bot.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ package-mode = false
1010
python = "^3.11"
1111
python-decouple = "^3.8"
1212
requests = "^2.32.3"
13-
asknews = "^0.9.1"
14-
numpy = "^1.26.0"
15-
openai = "^1.57.4"
13+
asknews = "^0.13.0"
14+
numpy = "^2.3.0"
15+
openai = "^2.0.0"
1616
python-dotenv = "^1.0.1"
17-
forecasting-tools = "^0.2.23"
17+
forecasting-tools = "^0.2.80"
1818

1919
[tool.poetry.group.dev.dependencies]
2020
ipykernel = "^6.29.5"

.github/workflows/public-template-bot-test-2.yaml

Lines changed: 0 additions & 48 deletions
This file was deleted.

code_tests/integration_tests/test_metaculus_api.py

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ def test_binary_resolved_question(self) -> None:
241241
assert question.typed_resolution == expected_resolution
242242
assert isinstance(question, BinaryQuestion)
243243
assert question.binary_resolution == expected_resolution
244+
assert question.id_of_post is not None
245+
assert_basic_question_attributes_not_none(question, question.id_of_post)
244246

245247
def test_numeric_resolved_question(self) -> None:
246248
question = MetaculusApi.get_question_by_post_id(
@@ -255,6 +257,7 @@ def test_numeric_resolved_question(self) -> None:
255257
assert question.typed_resolution == expected_resolution
256258
assert isinstance(question, NumericQuestion)
257259
assert question.numeric_resolution == expected_resolution
260+
assert_basic_question_attributes_not_none(question, question.id_of_post)
258261

259262
def test_multiple_choice_resolved_question(self) -> None:
260263
question = MetaculusApi.get_question_by_post_id(
@@ -268,6 +271,8 @@ def test_multiple_choice_resolved_question(self) -> None:
268271
assert question.typed_resolution == expected_resolution
269272
assert isinstance(question, MultipleChoiceQuestion)
270273
assert question.mc_resolution == expected_resolution
274+
assert question.id_of_post is not None
275+
assert_basic_question_attributes_not_none(question, question.id_of_post)
271276

272277
def test_date_resolved_question(self) -> None:
273278
question = MetaculusApi.get_question_by_post_id(
@@ -281,6 +286,8 @@ def test_date_resolved_question(self) -> None:
281286
assert question.typed_resolution == expected_resolution
282287
assert isinstance(question, DateQuestion)
283288
assert question.date_resolution == expected_resolution
289+
assert question.id_of_post is not None
290+
assert_basic_question_attributes_not_none(question, question.id_of_post)
284291

285292
def test_annulled_resolution(self) -> None:
286293
question = MetaculusApi.get_question_by_post_id(
@@ -294,6 +301,8 @@ def test_annulled_resolution(self) -> None:
294301
assert question.typed_resolution == expected_resolution
295302
assert isinstance(question, MultipleChoiceQuestion)
296303
assert question.mc_resolution == expected_resolution
304+
assert question.id_of_post is not None
305+
assert_basic_question_attributes_not_none(question, question.id_of_post)
297306

298307
def test_forecast_extreme_multiple_choice(self) -> None:
299308
url = "https://www.metaculus.com/questions/38601/year-openai-deepmind-or-anthropic-reach-valuation-of-1-trillion/"
@@ -463,7 +472,7 @@ async def test_group_question_field_in_filter(self) -> None:
463472
assert_basic_question_attributes_not_none(question, question.id_of_post)
464473

465474
def test_get_questions_from_tournament(self) -> None:
466-
questions = MetaculusClient.dev().get_all_open_questions_from_tournament(
475+
questions = MetaculusClient().get_all_open_questions_from_tournament(
467476
ForecastingTestManager.TOURN_WITH_OPENNESS_AND_TYPE_VARIATIONS
468477
)
469478
question_types = DataOrganizer.get_all_question_types()
@@ -477,7 +486,7 @@ def test_get_questions_from_tournament(self) -> None:
477486
assert_basic_attributes_at_percentage(questions, 0.8)
478487

479488
def test_get_conditional_questions_from_tournament(self) -> None:
480-
questions = MetaculusClient.dev().get_all_open_questions_from_tournament(
489+
questions = MetaculusClient().get_all_open_questions_from_tournament(
481490
"taiwan" # https://www.metaculus.com/tournament/taiwan/
482491
)
483492
conditional_questions = [
@@ -506,6 +515,7 @@ async def test_get_previous_forecast(self) -> None:
506515
assert questions
507516
assert all(question.previous_forecasts for question in questions)
508517

518+
@pytest.mark.skip(reason="Benchmark questions are not being used currently")
509519
def test_get_benchmark_questions(self) -> None:
510520
num_questions_to_get = 30
511521
questions = MetaculusApi.get_benchmark_questions(num_questions_to_get)
@@ -573,7 +583,7 @@ class TestNumericForecasts:
573583
def test_forecast_log_scale(self) -> None:
574584
url = "https://dev.metaculus.com/questions/6609/non-tesla-vehicles-w-tesla-software-by-2030/"
575585
# Question resolves 2030 so is decent test question
576-
question = MetaculusClient.dev().get_question_by_url(url)
586+
question = MetaculusClient().get_question_by_url(url)
577587
assert isinstance(question, NumericQuestion)
578588
percentiles = [
579589
Percentile(percentile=0.412, value=1),
@@ -588,7 +598,7 @@ def test_forecast_log_scale(self) -> None:
588598
)
589599
def test_forecast_log_scale_repeated_values(self) -> None:
590600
url = "https://dev.metaculus.com/questions/25402/" # Resolves Jan 1 2026
591-
question = MetaculusClient.dev().get_question_by_url(url)
601+
question = MetaculusClient().get_question_by_url(url)
592602
assert isinstance(question, NumericQuestion)
593603
percentiles = [
594604
Percentile(percentile=0.1, value=1.0), # Repeated value
@@ -613,7 +623,7 @@ def test_forecast_log_scale_repeated_values(self) -> None:
613623
def test_log_scale_all_repeated_values(self) -> None:
614624
# TODO: The distribution centers around 11.5 not 11, but still has very high probability for 11
615625
url = "https://dev.metaculus.com/questions/6609/non-tesla-vehicles-w-tesla-software-by-2030/"
616-
question = MetaculusClient.dev().get_question_by_url(url)
626+
question = MetaculusClient().get_question_by_url(url)
617627
assert isinstance(question, NumericQuestion)
618628
percentiles = [
619629
Percentile(value=11, percentile=0.1),
@@ -628,7 +638,7 @@ def test_log_scale_all_repeated_values(self) -> None:
628638
def test_log_scale_another_edge_case(self) -> None:
629639
# This test was able to replicate a floating point epsilon error at one point.
630640
url = "https://dev.metaculus.com/questions/7546"
631-
question = MetaculusClient.dev().get_question_by_url(url)
641+
question = MetaculusClient().get_question_by_url(url)
632642
assert isinstance(question, NumericQuestion)
633643
percentiles = [
634644
Percentile(value=22000, percentile=0.1),
@@ -645,7 +655,7 @@ def test_log_scale_another_edge_case(self) -> None:
645655
)
646656
def test_forecast_log_scaled_out_of_bounds(self) -> None:
647657
url = "https://dev.metaculus.com/questions/8936/us-workforce-as-it-specialists-in-2050/"
648-
question = MetaculusClient.dev().get_question_by_url(url)
658+
question = MetaculusClient().get_question_by_url(url)
649659
assert isinstance(question, NumericQuestion)
650660
percentiles = [
651661
Percentile(percentile=0.18, value=-10),
@@ -660,7 +670,7 @@ def test_forecast_log_scaled_out_of_bounds(self) -> None:
660670

661671
def test_forecast_discrete(self) -> None:
662672
url = "https://dev.metaculus.com/c/diffusion-community/38880/how-many-us-labor-strikes-due-to-ai-in-2029/"
663-
question = MetaculusClient.dev().get_question_by_url(url)
673+
question = MetaculusClient().get_question_by_url(url)
664674
assert isinstance(question, DiscreteQuestion)
665675
percentiles = [
666676
Percentile(percentile=0.25, value=2),
@@ -675,7 +685,7 @@ def test_forecast_discrete(self) -> None:
675685
def test_forecast_discrete_high_density(self) -> None:
676686
# TODO: The standardization does not work right here
677687
url = "https://dev.metaculus.com/c/diffusion-community/38880/how-many-us-labor-strikes-due-to-ai-in-2029/"
678-
question = MetaculusClient.dev().get_question_by_url(url)
688+
question = MetaculusClient().get_question_by_url(url)
679689
assert isinstance(question, DiscreteQuestion)
680690
percentiles = [
681691
Percentile(percentile=0.01, value=2.8999999),
@@ -699,7 +709,7 @@ def test_discrete_forecast_repeated_value(self) -> None:
699709
Percentile(value=4, percentile=0.8),
700710
Percentile(value=4, percentile=0.9),
701711
]
702-
question = MetaculusClient.dev().get_question_by_url(url)
712+
question = MetaculusClient().get_question_by_url(url)
703713
assert isinstance(question, DiscreteQuestion)
704714
self._check_cdf_processes_and_posts_correctly(
705715
percentiles, question, standardize_cdf=False
@@ -710,7 +720,7 @@ def test_discrete_forecast_repeated_value(self) -> None:
710720

711721
def test_forecast_regular_numeric(self) -> None:
712722
url = "https://dev.metaculus.com/questions/7093/australian-greenhouse-gas-emissions-in-2050/"
713-
question = MetaculusClient.dev().get_question_by_url(url)
723+
question = MetaculusClient().get_question_by_url(url)
714724
assert isinstance(question, NumericQuestion)
715725
percentiles = [
716726
Percentile(percentile=0.049, value=-50),
@@ -726,7 +736,7 @@ def test_forecast_regular_numeric(self) -> None:
726736

727737
def test_numeric_forecast_all_repeated_values(self) -> None:
728738
url = "https://dev.metaculus.com/questions/7093/australian-greenhouse-gas-emissions-in-2050/"
729-
question = MetaculusClient.dev().get_question_by_url(url)
739+
question = MetaculusClient().get_question_by_url(url)
730740
assert isinstance(question, NumericQuestion)
731741
valid_percentiles = [
732742
Percentile(value=11, percentile=0.1),
@@ -740,7 +750,7 @@ def test_numeric_forecast_all_repeated_values(self) -> None:
740750

741751
def test_numeric_fully_out_of_bounds(self) -> None:
742752
url = "https://dev.metaculus.com/questions/7093/australian-greenhouse-gas-emissions-in-2050/"
743-
question = MetaculusClient.dev().get_question_by_url(url)
753+
question = MetaculusClient().get_question_by_url(url)
744754
assert isinstance(question, NumericQuestion)
745755
percentiles = [
746756
Percentile(percentile=0.049, value=5000),
@@ -762,7 +772,7 @@ def test_numeric_fully_out_of_bounds(self) -> None:
762772

763773
def test_numeric_in_but_far_exceeding_bounds(self) -> None:
764774
url = "https://dev.metaculus.com/questions/7093/australian-greenhouse-gas-emissions-in-2050/"
765-
question = MetaculusClient.dev().get_question_by_url(url)
775+
question = MetaculusClient().get_question_by_url(url)
766776
assert isinstance(question, NumericQuestion)
767777
percentiles = [
768778
Percentile(percentile=0.25, value=100),
@@ -775,7 +785,7 @@ def test_numeric_in_but_far_exceeding_bounds(self) -> None:
775785

776786
def test_numeric_exceeding_bounds(self) -> None:
777787
url = "https://dev.metaculus.com/questions/7093/australian-greenhouse-gas-emissions-in-2050/"
778-
question = MetaculusClient.dev().get_question_by_url(url)
788+
question = MetaculusClient().get_question_by_url(url)
779789
assert isinstance(question, NumericQuestion)
780790
percentiles = [
781791
Percentile(percentile=0.25, value=100),
@@ -792,7 +802,7 @@ def test_numeric_exceeding_bounds(self) -> None:
792802

793803
def test_numeric_high_density_forecast_in_middle(self) -> None:
794804
url = "https://dev.metaculus.com/questions/7093/australian-greenhouse-gas-emissions-in-2050/"
795-
question = MetaculusClient.dev().get_question_by_url(url)
805+
question = MetaculusClient().get_question_by_url(url)
796806
assert isinstance(question, NumericQuestion)
797807
percentiles = [
798808
Percentile(percentile=0.1, value=249.999),
@@ -808,7 +818,7 @@ def test_numeric_high_density_forecast_in_middle(self) -> None:
808818

809819
def test_numeric_high_density_forecast_on_edge(self) -> None:
810820
url = "https://dev.metaculus.com/questions/7093/australian-greenhouse-gas-emissions-in-2050/"
811-
question = MetaculusClient.dev().get_question_by_url(url)
821+
question = MetaculusClient().get_question_by_url(url)
812822
assert isinstance(question, NumericQuestion)
813823
percentiles = [
814824
Percentile(percentile=0.01, value=-50.0001),
@@ -826,7 +836,7 @@ async def test_conditional_question(self) -> None:
826836
api_filter = ApiFilter(
827837
allowed_types=["conditional"], allowed_subquestion_types=["binary"]
828838
)
829-
questions = await MetaculusClient.dev().get_questions_matching_filter(
839+
questions = await MetaculusClient().get_questions_matching_filter(
830840
api_filter=api_filter,
831841
num_questions=20,
832842
)
@@ -856,12 +866,12 @@ def _check_cdf_processes_and_posts_correctly(
856866
percentiles, question, standardize_cdf=standardize_cdf
857867
)
858868
assert question.id_of_question is not None
859-
MetaculusClient.dev().post_numeric_question_prediction(
869+
MetaculusClient().post_numeric_question_prediction(
860870
question.id_of_question,
861871
[p.percentile for p in numeric_distribution.get_cdf()],
862872
)
863873
assert question.id_of_post is not None
864-
MetaculusClient.dev().post_question_comment(
874+
MetaculusClient().post_question_comment(
865875
question.id_of_post,
866876
f"Testing prediction edge cases. Declared percentiles: {percentiles}",
867877
)

forecasting_tools/helpers/metaculus_client.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,12 @@ def __init__(
144144
self,
145145
base_url: str = API_BASE_URL,
146146
timeout: int = 30,
147-
sleep_time_between_requests_min: float = 1.5,
148-
sleep_jitter_seconds: float = 0.5,
147+
sleep_seconds_between_requests: float = 3.5,
148+
sleep_jitter_seconds: float = 1,
149149
):
150150
self.base_url = base_url
151151
self.timeout = timeout
152-
self.sleep_time_between_requests_min = sleep_time_between_requests_min
152+
self.sleep_time_between_requests_min = sleep_seconds_between_requests
153153
self.sleep_jitter_seconds = sleep_jitter_seconds
154154

155155
@retry_with_exponential_backoff()

forecasting_tools/util/misc.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ def raise_for_status_with_additional_info(
3939

4040
def retry_with_exponential_backoff(
4141
max_retries: int = 3,
42-
initial_delay: float = 10.0,
43-
exponential_base: float = 2.0,
44-
jitter_factor: float = 2.0,
45-
max_delay: float = 60.0,
42+
initial_delay: float = 2.5,
43+
exponential_base: float = 3,
44+
jitter_factor: float = 8.0,
45+
max_delay: float = 75.0,
4646
retry_on_exceptions: tuple[type[Exception], ...] = (
4747
requests.exceptions.RequestException,
4848
requests.exceptions.Timeout,

0 commit comments

Comments
 (0)