forecasting-tools 0.2.80__tar.gz → 0.2.81__tar.gz

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.
Files changed (150) hide show
  1. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/PKG-INFO +1 -1
  2. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/data_models/numeric_report.py +1 -1
  3. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/data_models/questions.py +9 -2
  4. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/official_bots/template_bot_2026_spring.py +6 -5
  5. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/helpers/metaculus_client.py +8 -6
  6. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/util/misc.py +4 -4
  7. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/pyproject.toml +1 -1
  8. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/LICENSE +0 -0
  9. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/README.md +0 -0
  10. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/__init__.py +0 -0
  11. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/__init__.py +0 -0
  12. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/base_rates/base_rate_researcher.py +0 -0
  13. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/base_rates/deduplicator.py +0 -0
  14. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/base_rates/estimator.py +0 -0
  15. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/base_rates/niche_list_researcher.py +0 -0
  16. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/deprecated/configured_llms.py +0 -0
  17. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/deprecated/general_researcher.py +0 -0
  18. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/deprecated/question_generator.py +0 -0
  19. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/deprecated/question_responder.py +0 -0
  20. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/deprecated/question_router.py +0 -0
  21. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/deprecated/research_coordinator.py +0 -0
  22. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/minor_tools.py +0 -0
  23. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/other/data_analyzer.py +0 -0
  24. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/other/hosted_file.py +0 -0
  25. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/question_generators/generated_question.py +0 -0
  26. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/question_generators/harmful_question_identifier.py +0 -0
  27. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/question_generators/q3_q4_quarterly_questions.json +0 -0
  28. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/question_generators/question_decomposer.py +0 -0
  29. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/question_generators/question_operationalizer.py +0 -0
  30. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/question_generators/simple_question.py +0 -0
  31. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/question_generators/topic_generator.py +0 -0
  32. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/research/computer_use.py +0 -0
  33. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/research/find_a_dataset.py +0 -0
  34. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/research/key_factors_researcher.py +0 -0
  35. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/agents_and_tools/research/smart_searcher.py +0 -0
  36. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/__init__.py +0 -0
  37. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/agent_wrappers.py +0 -0
  38. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/ai_utils/__init__.py +0 -0
  39. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/ai_utils/openai_utils.py +0 -0
  40. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/ai_utils/response_types.py +0 -0
  41. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/deprecated_model_classes/README.md +0 -0
  42. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/deprecated_model_classes/claude35sonnet.py +0 -0
  43. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/deprecated_model_classes/deepseek_r1.py +0 -0
  44. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/deprecated_model_classes/gpt4o.py +0 -0
  45. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/deprecated_model_classes/gpt4ovision.py +0 -0
  46. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/deprecated_model_classes/gpto1.py +0 -0
  47. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/deprecated_model_classes/gpto1preview.py +0 -0
  48. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/deprecated_model_classes/metaculus4o.py +0 -0
  49. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/deprecated_model_classes/perplexity.py +0 -0
  50. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/exa_searcher.py +0 -0
  51. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/general_llm.py +0 -0
  52. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/model_interfaces/__init__.py +0 -0
  53. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/model_interfaces/ai_model.py +0 -0
  54. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/model_interfaces/combined_llm_archetype.py +0 -0
  55. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/model_interfaces/incurs_cost.py +0 -0
  56. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/model_interfaces/named_model.py +0 -0
  57. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/model_interfaces/outputs_text.py +0 -0
  58. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/model_interfaces/priced_per_request.py +0 -0
  59. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/model_interfaces/request_limited_model.py +0 -0
  60. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/model_interfaces/retryable_model.py +0 -0
  61. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/model_interfaces/time_limited_model.py +0 -0
  62. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/model_interfaces/token_limited_model.py +0 -0
  63. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/model_interfaces/tokens_are_calculatable.py +0 -0
  64. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/model_interfaces/tokens_incur_cost.py +0 -0
  65. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/model_tracker.py +0 -0
  66. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/resource_managers/__init__.py +0 -0
  67. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/resource_managers/hard_limit_manager.py +0 -0
  68. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/resource_managers/monetary_cost_manager.py +0 -0
  69. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/ai_models/resource_managers/refreshing_bucket_rate_limiter.py +0 -0
  70. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/auto_optimizers/bot_evaluator.py +0 -0
  71. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/auto_optimizers/bot_optimizer.py +0 -0
  72. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/auto_optimizers/control_prompt.py +0 -0
  73. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/auto_optimizers/customizable_bot.py +0 -0
  74. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/auto_optimizers/prompt_data_models.py +0 -0
  75. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/auto_optimizers/prompt_optimizer.py +0 -0
  76. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/auto_optimizers/question_plus_research.py +0 -0
  77. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/cp_benchmarking/benchmark_displayer.py +0 -0
  78. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/cp_benchmarking/benchmark_for_bot.py +0 -0
  79. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/cp_benchmarking/benchmarker.py +0 -0
  80. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/data_models/__init__.py +0 -0
  81. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/data_models/binary_report.py +0 -0
  82. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/data_models/coherence_link.py +0 -0
  83. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/data_models/conditional_models.py +0 -0
  84. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/data_models/conditional_report.py +0 -0
  85. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/data_models/data_organizer.py +0 -0
  86. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/data_models/forecast_report.py +0 -0
  87. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/data_models/markdown_tree.py +0 -0
  88. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/data_models/multiple_choice_report.py +0 -0
  89. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/data_models/timestamped_predictions.py +0 -0
  90. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/__init__.py +0 -0
  91. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/bot_lists.py +0 -0
  92. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/experiments/__init__.py +0 -0
  93. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/experiments/q1_veritas_bot.py +0 -0
  94. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/experiments/q1t_w_convert_to_binary.py +0 -0
  95. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/experiments/q1t_w_personas_and_exa.py +0 -0
  96. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/experiments/q2t_w_decomposition.py +0 -0
  97. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/experiments/q3t_w_asknews.py +0 -0
  98. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/experiments/q3t_w_exa.py +0 -0
  99. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/experiments/q3t_w_q4vbinary.py +0 -0
  100. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/experiments/q4_veritas_bot.py +0 -0
  101. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/experiments/q4v_w_exa.py +0 -0
  102. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/experiments/q4v_w_exa_and_dseekr1.py +0 -0
  103. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/experiments/q4v_w_exa_and_o1_preview.py +0 -0
  104. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/forecast_bot.py +0 -0
  105. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/main_bot.py +0 -0
  106. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/official_bots/__init__.py +0 -0
  107. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/official_bots/gpt_4_1_optimized_bot.py +0 -0
  108. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/official_bots/q1_template_bot.py +0 -0
  109. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/official_bots/q2_template_bot.py +0 -0
  110. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/official_bots/q3_template_bot.py +0 -0
  111. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/official_bots/q4_template_bot.py +0 -0
  112. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/official_bots/research_only_bot_2025_fall.py +0 -0
  113. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/official_bots/template_bot_2025_fall.py +0 -0
  114. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/official_bots/uniform_probability_bot.py +0 -0
  115. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/forecast_bots/template_bot.py +0 -0
  116. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/Home.py +0 -0
  117. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/app_pages/base_rate_page.py +0 -0
  118. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/app_pages/benchmark_page.py +0 -0
  119. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/app_pages/chat_page.py +0 -0
  120. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/app_pages/csv_agent.py +0 -0
  121. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/app_pages/estimator_page.py +0 -0
  122. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/app_pages/forecaster_page.py +0 -0
  123. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/app_pages/key_factors_page.py +0 -0
  124. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/app_pages/niche_list_researcher_page.py +0 -0
  125. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/example_outputs/base_rate_page_examples.json +0 -0
  126. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/example_outputs/estimator_page_examples.json +0 -0
  127. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/example_outputs/forecast_page_examples.json +0 -0
  128. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/example_outputs/key_factors_page_examples.json +0 -0
  129. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/example_outputs/niche_list_page_examples.json +0 -0
  130. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/example_outputs/question_generator_page_examples.json +0 -0
  131. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/helpers/app_page.py +0 -0
  132. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/helpers/custom_auth.py +0 -0
  133. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/helpers/report_displayer.py +0 -0
  134. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/front_end/helpers/tool_page.py +0 -0
  135. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/helpers/__init__.py +0 -0
  136. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/helpers/adjacent_news_api.py +0 -0
  137. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/helpers/asknews_searcher.py +0 -0
  138. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/helpers/forecast_database_manager.py +0 -0
  139. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/helpers/metaculus_api.py +0 -0
  140. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/helpers/prediction_extractor.py +0 -0
  141. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/helpers/structure_output.py +0 -0
  142. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/helpers/works_cited_creator.py +0 -0
  143. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/util/__init__.py +0 -0
  144. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/util/async_batching.py +0 -0
  145. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/util/coda_utils.py +0 -0
  146. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/util/custom_logger.py +0 -0
  147. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/util/file_manipulation.py +0 -0
  148. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/util/jsonable.py +0 -0
  149. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/util/launch_utils.py +0 -0
  150. {forecasting_tools-0.2.80 → forecasting_tools-0.2.81}/forecasting_tools/util/stats.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: forecasting-tools
3
- Version: 0.2.80
3
+ Version: 0.2.81
4
4
  Summary: AI forecasting and research tools to help humans reason about and forecast the future
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -22,10 +22,10 @@ logger = logging.getLogger(__name__)
22
22
 
23
23
 
24
24
  class NumericDefaults:
25
- DEFAULT_INBOUND_OUTCOME_COUNT = 200
26
25
  DEFAULT_CDF_SIZE = (
27
26
  201 # Discrete questions have fewer points, Numeric will have 201 points
28
27
  )
28
+ DEFAULT_INBOUND_OUTCOME_COUNT = DEFAULT_CDF_SIZE - 1
29
29
  MAX_NUMERIC_PMF_VALUE = 0.2
30
30
 
31
31
  @classmethod
@@ -403,8 +403,15 @@ class BoundedQuestionMixin:
403
403
  lower_bound = api_json["question"]["scaling"]["range_min"]
404
404
  zero_point = api_json["question"]["scaling"]["zero_point"]
405
405
 
406
- assert isinstance(upper_bound, float), f"Upper bound is {upper_bound}"
407
- assert isinstance(lower_bound, float), f"Lower bound is {lower_bound}"
406
+ try:
407
+ upper_bound = float(upper_bound)
408
+ lower_bound = float(lower_bound)
409
+ except (TypeError, ValueError):
410
+ logger.error(
411
+ f"Error parsing bounds from API JSON. "
412
+ f"Upper bound: {upper_bound}, Lower bound: {lower_bound}"
413
+ )
414
+ raise
408
415
  return (
409
416
  open_upper_bound,
410
417
  open_lower_bound,
@@ -45,7 +45,7 @@ class SpringTemplateBot2026(ForecastBot):
45
45
  So far our track record has been 1 mentionable bug per season (affecting forecasts for 1-2% of total questions)
46
46
 
47
47
  Main changes since Fall:
48
- - Additional prompting has been added to numeric questions to emphasize putting pecentile values in the correct order.
48
+ - Additional prompting has been added to numeric questions to emphasize putting percentile values in the correct order.
49
49
  - Support for conditional and date questions has been added
50
50
  - Note: Spring AIB will not use date/conditional questions, so these are only for forecasting on the main site as you wish.
51
51
 
@@ -93,7 +93,7 @@ class SpringTemplateBot2026(ForecastBot):
93
93
 
94
94
  Then you can access the model in custom functions like this:
95
95
  ```python
96
- research_strategy = self.get_llm("researcher", "model_name"
96
+ research_strategy = self.get_llm("researcher", "model_name")
97
97
  if research_strategy == "asknews/news-summaries":
98
98
  ...
99
99
  # OR
@@ -265,7 +265,7 @@ class SpringTemplateBot2026(ForecastBot):
265
265
  Before answering you write:
266
266
  (a) The time left until the outcome to the question is known.
267
267
  (b) The status quo outcome if nothing changed.
268
- (c) A description of an scenario that results in an unexpected outcome.
268
+ (c) A description of a scenario that results in an unexpected outcome.
269
269
 
270
270
  {self._get_conditional_disclaimer_if_necessary(question)}
271
271
  You write your rationale remembering that (1) good forecasters put extra weight on the status quo outcome since the world changes slowly most of the time, and (2) good forecasters leave some moderate probability on most options to account for unexpected outcomes.
@@ -436,7 +436,7 @@ class SpringTemplateBot2026(ForecastBot):
436
436
 
437
437
  Formatting Instructions:
438
438
  - This is a date question, and as such, the answer must be expressed in terms of dates.
439
- - The dates must be written in the format of YYYY-MM-DD. If hours matter, please append the date with the hour in UTC and military time: YYYY-MM-DDTHH:MM:SSZ.No other formatting is allowed.
439
+ - The dates must be written in the format of YYYY-MM-DD. If hours matter, please append the date with the hour in UTC and military time: YYYY-MM-DDTHH:MM:SSZ. No other formatting is allowed.
440
440
  - Always start with a lower date chronologically and then increase from there.
441
441
  - Do NOT forget this. The dates must be written in chronological order starting at the earliest time at percentile 10 and increasing from there.
442
442
 
@@ -590,7 +590,7 @@ class SpringTemplateBot2026(ForecastBot):
590
590
  previous_forecast.timestamp_end is None
591
591
  or previous_forecast.timestamp_end > current_utc_time
592
592
  ):
593
- pretty_value = DataOrganizer.get_readable_prediction(previous_forecast) # type: ignore
593
+ pretty_value = DataOrganizer.get_readable_prediction(previous_forecast) # type: ignore
594
594
  prediction = ReasonedPrediction(
595
595
  prediction_value=PredictionAffirmed(),
596
596
  reasoning=f"Already existing forecast reaffirmed at {pretty_value}.",
@@ -673,6 +673,7 @@ if __name__ == "__main__":
673
673
  publish_reports_to_metaculus=True,
674
674
  folder_to_save_reports_to=None,
675
675
  skip_previously_forecasted_questions=True,
676
+ extra_metadata_in_explanation=True,
676
677
  # llms={ # choose your model names or GeneralLlm llms here, otherwise defaults will be chosen for you
677
678
  # "default": GeneralLlm(
678
679
  # model="openrouter/openai/gpt-4o", # "anthropic/claude-sonnet-4-20250514", etc (see docs for litellm)
@@ -38,6 +38,8 @@ from forecasting_tools.util.misc import (
38
38
 
39
39
  logger = logging.getLogger(__name__)
40
40
 
41
+ API_BASE_URL = os.getenv("METACULUS_API_BASE_URL", "https://www.metaculus.com/api")
42
+
41
43
  Q = TypeVar("Q", bound=MetaculusQuestion)
42
44
  T = TypeVar("T", bound=BaseModel)
43
45
 
@@ -140,14 +142,14 @@ class MetaculusClient:
140
142
 
141
143
  def __init__(
142
144
  self,
143
- base_url: str = "https://www.metaculus.com/api",
145
+ base_url: str = API_BASE_URL,
144
146
  timeout: int = 30,
145
- sleep_time_between_requests_min: float = 1.5,
146
- sleep_jitter_seconds: float = 0.5,
147
+ sleep_seconds_between_requests: float = 3.5,
148
+ sleep_jitter_seconds: float = 1,
147
149
  ):
148
150
  self.base_url = base_url
149
151
  self.timeout = timeout
150
- self.sleep_time_between_requests_min = sleep_time_between_requests_min
152
+ self.sleep_time_between_requests_min = sleep_seconds_between_requests
151
153
  self.sleep_jitter_seconds = sleep_jitter_seconds
152
154
 
153
155
  @retry_with_exponential_backoff()
@@ -398,7 +400,7 @@ class MetaculusClient:
398
400
  return questions
399
401
 
400
402
  @retry_with_exponential_backoff()
401
- def get_current_user_id(self):
403
+ def get_current_user_id(self) -> int:
402
404
  self._sleep_between_requests()
403
405
  response = requests.get(
404
406
  f"{self.base_url}/users/me",
@@ -406,7 +408,7 @@ class MetaculusClient:
406
408
  )
407
409
  raise_for_status_with_additional_info(response)
408
410
  content = json.loads(response.content)
409
- return content["id"]
411
+ return int(content["id"])
410
412
 
411
413
  @retry_with_exponential_backoff()
412
414
  def post_question_link(
@@ -39,10 +39,10 @@ def raise_for_status_with_additional_info(
39
39
 
40
40
  def retry_with_exponential_backoff(
41
41
  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,
46
46
  retry_on_exceptions: tuple[type[Exception], ...] = (
47
47
  requests.exceptions.RequestException,
48
48
  requests.exceptions.Timeout,
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "forecasting-tools"
3
- version = "0.2.80"
3
+ version = "0.2.81"
4
4
  description = "AI forecasting and research tools to help humans reason about and forecast the future"
5
5
  authors = ["Benjamin Wilson <mokoresearch@gmail.com>"]
6
6
  license = "MIT"