forecasting-tools 0.2.91__tar.gz → 0.2.92__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 (191) hide show
  1. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/PKG-INFO +1 -1
  2. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/ai_congress_v2/congress_orchestrator.py +1 -1
  3. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/ai_congress_v2/data_models.py +1 -1
  4. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/ai_congress_v2/member_profiles.py +27 -23
  5. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/other/data_analyzer.py +2 -2
  6. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/agent_runner.py +1 -1
  7. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/data_models.py +1 -1
  8. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/intervention_testing/intervention_policy_agent.py +1 -1
  9. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/intervention_testing/intervention_runner.py +1 -1
  10. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/situation_generator.py +2 -2
  11. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/app_pages/chat_page.py +9 -6
  12. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/app_pages/congress_v2_page.py +4 -4
  13. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/app_pages/forecaster_page.py +91 -7
  14. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/helpers/asknews_searcher.py +6 -11
  15. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/pyproject.toml +1 -1
  16. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/LICENSE +0 -0
  17. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/README.md +0 -0
  18. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/__init__.py +0 -0
  19. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/__init__.py +0 -0
  20. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/ai_congress_v2/__init__.py +0 -0
  21. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/ai_congress_v2/congress_member_agent.py +0 -0
  22. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/ai_congress_v2/tools.py +0 -0
  23. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/base_rates/base_rate_researcher.py +0 -0
  24. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/base_rates/deduplicator.py +0 -0
  25. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/base_rates/estimator.py +0 -0
  26. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/base_rates/niche_list_researcher.py +0 -0
  27. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/deprecated/configured_llms.py +0 -0
  28. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/deprecated/general_researcher.py +0 -0
  29. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/deprecated/question_generator.py +0 -0
  30. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/deprecated/question_responder.py +0 -0
  31. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/deprecated/question_router.py +0 -0
  32. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/deprecated/research_coordinator.py +0 -0
  33. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/minor_tools.py +0 -0
  34. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/other/hosted_file.py +0 -0
  35. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/question_generators/generated_question.py +0 -0
  36. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/question_generators/harmful_question_identifier.py +0 -0
  37. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/question_generators/q3_q4_quarterly_questions.json +0 -0
  38. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/question_generators/question_decomposer.py +0 -0
  39. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/question_generators/question_operationalizer.py +0 -0
  40. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/question_generators/simple_question.py +0 -0
  41. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/question_generators/topic_generator.py +0 -0
  42. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/research/computer_use.py +0 -0
  43. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/research/find_a_dataset.py +0 -0
  44. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/research/key_factors_researcher.py +0 -0
  45. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/research/smart_searcher.py +0 -0
  46. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/__init__.py +0 -0
  47. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/effect_engine.py +0 -0
  48. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/example_situations/industrial_basin.json +0 -0
  49. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/example_situations/milbrook.json +0 -0
  50. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/example_situations/simple_business.json +0 -0
  51. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/example_situations/simple_dnd.json +0 -0
  52. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/example_situations/simple_election.json +0 -0
  53. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/example_situations/willowbrook.json +0 -0
  54. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/example_situations/z_broken_mafia.json +0 -0
  55. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/intervention_testing/__init__.py +0 -0
  56. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/intervention_testing/data_models.py +0 -0
  57. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/intervention_testing/forecast_resolver.py +0 -0
  58. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/intervention_testing/intervention_storage.py +0 -0
  59. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/agents_and_tools/situation_simulator/simulator.py +0 -0
  60. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/__init__.py +0 -0
  61. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/agent_wrappers.py +0 -0
  62. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/ai_utils/__init__.py +0 -0
  63. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/ai_utils/openai_utils.py +0 -0
  64. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/ai_utils/response_types.py +0 -0
  65. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/deprecated_model_classes/README.md +0 -0
  66. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/deprecated_model_classes/claude35sonnet.py +0 -0
  67. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/deprecated_model_classes/deepseek_r1.py +0 -0
  68. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/deprecated_model_classes/gpt4o.py +0 -0
  69. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/deprecated_model_classes/gpt4ovision.py +0 -0
  70. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/deprecated_model_classes/gpto1.py +0 -0
  71. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/deprecated_model_classes/gpto1preview.py +0 -0
  72. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/deprecated_model_classes/metaculus4o.py +0 -0
  73. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/deprecated_model_classes/perplexity.py +0 -0
  74. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/exa_searcher.py +0 -0
  75. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/general_llm.py +0 -0
  76. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/model_interfaces/__init__.py +0 -0
  77. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/model_interfaces/ai_model.py +0 -0
  78. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/model_interfaces/combined_llm_archetype.py +0 -0
  79. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/model_interfaces/incurs_cost.py +0 -0
  80. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/model_interfaces/named_model.py +0 -0
  81. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/model_interfaces/outputs_text.py +0 -0
  82. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/model_interfaces/priced_per_request.py +0 -0
  83. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/model_interfaces/request_limited_model.py +0 -0
  84. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/model_interfaces/retryable_model.py +0 -0
  85. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/model_interfaces/time_limited_model.py +0 -0
  86. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/model_interfaces/token_limited_model.py +0 -0
  87. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/model_interfaces/tokens_are_calculatable.py +0 -0
  88. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/model_interfaces/tokens_incur_cost.py +0 -0
  89. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/model_tracker.py +0 -0
  90. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/resource_managers/__init__.py +0 -0
  91. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/resource_managers/hard_limit_manager.py +0 -0
  92. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/resource_managers/monetary_cost_manager.py +0 -0
  93. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/ai_models/resource_managers/refreshing_bucket_rate_limiter.py +0 -0
  94. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/auto_optimizers/bot_evaluator.py +0 -0
  95. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/auto_optimizers/bot_optimizer.py +0 -0
  96. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/auto_optimizers/control_prompt.py +0 -0
  97. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/auto_optimizers/customizable_bot.py +0 -0
  98. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/auto_optimizers/prompt_data_models.py +0 -0
  99. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/auto_optimizers/prompt_optimizer.py +0 -0
  100. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/auto_optimizers/question_plus_research.py +0 -0
  101. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/calibration_adjustment/.gitignore +0 -0
  102. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/calibration_adjustment/__init__.py +0 -0
  103. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/calibration_adjustment/_training_data.py +0 -0
  104. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/calibration_adjustment/benchmark.ipynb +0 -0
  105. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/calibration_adjustment/calibration_adjuster.py +0 -0
  106. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/calibration_adjustment/constant_shift_adjuster.py +0 -0
  107. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/calibration_adjustment/decision_tree_adjuster.py +0 -0
  108. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/calibration_adjustment/k_means_adjuster.py +0 -0
  109. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/calibration_adjustment/logistic_recalibration_adjuster.py +0 -0
  110. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/calibration_adjustment/step_adjuster.py +0 -0
  111. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/cp_benchmarking/benchmark_displayer.py +0 -0
  112. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/cp_benchmarking/benchmark_for_bot.py +0 -0
  113. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/cp_benchmarking/benchmarker.py +0 -0
  114. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/data_models/__init__.py +0 -0
  115. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/data_models/binary_report.py +0 -0
  116. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/data_models/coherence_link.py +0 -0
  117. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/data_models/conditional_models.py +0 -0
  118. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/data_models/conditional_report.py +0 -0
  119. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/data_models/data_organizer.py +0 -0
  120. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/data_models/forecast_report.py +0 -0
  121. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/data_models/markdown_tree.py +0 -0
  122. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/data_models/multiple_choice_report.py +0 -0
  123. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/data_models/numeric_report.py +0 -0
  124. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/data_models/questions.py +0 -0
  125. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/data_models/timestamped_predictions.py +0 -0
  126. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/data_models/user_response.py +0 -0
  127. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/__init__.py +0 -0
  128. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/bot_lists.py +0 -0
  129. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/experiments/__init__.py +0 -0
  130. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/experiments/q1_veritas_bot.py +0 -0
  131. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/experiments/q1t_w_convert_to_binary.py +0 -0
  132. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/experiments/q1t_w_personas_and_exa.py +0 -0
  133. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/experiments/q2t_w_decomposition.py +0 -0
  134. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/experiments/q3t_w_asknews.py +0 -0
  135. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/experiments/q3t_w_exa.py +0 -0
  136. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/experiments/q3t_w_q4vbinary.py +0 -0
  137. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/experiments/q4_veritas_bot.py +0 -0
  138. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/experiments/q4v_w_exa.py +0 -0
  139. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/experiments/q4v_w_exa_and_dseekr1.py +0 -0
  140. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/experiments/q4v_w_exa_and_o1_preview.py +0 -0
  141. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/forecast_bot.py +0 -0
  142. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/main_bot.py +0 -0
  143. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/official_bots/__init__.py +0 -0
  144. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/official_bots/gpt_4_1_optimized_bot.py +0 -0
  145. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/official_bots/q1_template_bot.py +0 -0
  146. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/official_bots/q2_template_bot.py +0 -0
  147. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/official_bots/q3_template_bot.py +0 -0
  148. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/official_bots/q4_template_bot.py +0 -0
  149. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/official_bots/research_only_bot_2025_fall.py +0 -0
  150. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/official_bots/template_bot_2025_fall.py +0 -0
  151. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/official_bots/template_bot_2026_spring.py +0 -0
  152. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/official_bots/template_bot_2026_summer.py +0 -0
  153. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/official_bots/uniform_probability_bot.py +0 -0
  154. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/forecast_bots/template_bot.py +0 -0
  155. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/Home.py +0 -0
  156. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/app_pages/base_rate_page.py +0 -0
  157. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/app_pages/benchmark_page.py +0 -0
  158. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/app_pages/csv_agent.py +0 -0
  159. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/app_pages/estimator_page.py +0 -0
  160. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/app_pages/intervention_leaderboard_page.py +0 -0
  161. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/app_pages/key_factors_page.py +0 -0
  162. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/app_pages/niche_list_researcher_page.py +0 -0
  163. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/app_pages/simulator_page.py +0 -0
  164. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/example_outputs/base_rate_page_examples.json +0 -0
  165. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/example_outputs/congress_page_example.json +0 -0
  166. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/example_outputs/congress_v2_page_example.json +0 -0
  167. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/example_outputs/estimator_page_examples.json +0 -0
  168. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/example_outputs/forecast_page_examples.json +0 -0
  169. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/example_outputs/key_factors_page_examples.json +0 -0
  170. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/example_outputs/niche_list_page_examples.json +0 -0
  171. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/example_outputs/question_generator_page_examples.json +0 -0
  172. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/helpers/app_page.py +0 -0
  173. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/helpers/custom_auth.py +0 -0
  174. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/helpers/report_displayer.py +0 -0
  175. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/front_end/helpers/tool_page.py +0 -0
  176. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/helpers/__init__.py +0 -0
  177. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/helpers/asknews_cache.py +0 -0
  178. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/helpers/forecast_database_manager.py +0 -0
  179. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/helpers/metaculus_api.py +0 -0
  180. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/helpers/metaculus_client.py +0 -0
  181. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/helpers/prediction_extractor.py +0 -0
  182. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/helpers/structure_output.py +0 -0
  183. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/helpers/works_cited_creator.py +0 -0
  184. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/util/__init__.py +0 -0
  185. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/util/async_batching.py +0 -0
  186. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/util/coda_utils.py +0 -0
  187. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/util/custom_logger.py +0 -0
  188. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/util/file_manipulation.py +0 -0
  189. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/util/jsonable.py +0 -0
  190. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/forecasting_tools/util/misc.py +0 -0
  191. {forecasting_tools-0.2.91 → forecasting_tools-0.2.92}/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.91
3
+ Version: 0.2.92
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
@@ -32,7 +32,7 @@ LONG_TIMEOUT = 480
32
32
  class CongressOrchestrator:
33
33
  def __init__(
34
34
  self,
35
- aggregation_model: str = "openrouter/anthropic/claude-sonnet-4",
35
+ aggregation_model: str = "openrouter/anthropic/claude-sonnet-4.6",
36
36
  num_delphi_rounds: int = 1,
37
37
  ):
38
38
  self.aggregation_model = aggregation_model
@@ -23,7 +23,7 @@ class CongressMember(BaseModel, Jsonable):
23
23
  general_motivation: str
24
24
  expertise_areas: list[str]
25
25
  personality_traits: list[str]
26
- ai_model: str = "openrouter/anthropic/claude-sonnet-4"
26
+ ai_model: str = "openrouter/anthropic/claude-sonnet-4.6"
27
27
  search_model: str = "openrouter/perplexity/sonar-reasoning-pro"
28
28
 
29
29
  @property
@@ -1,11 +1,15 @@
1
1
  from forecasting_tools.agents_and_tools.ai_congress_v2.data_models import CongressMember
2
2
 
3
+ DEFAULT_POLITICAL_MODEL = "openrouter/anthropic/claude-sonnet-4.6"
4
+
3
5
  # =============================================================================
4
6
  # POLITICAL VALUE-BASED MEMBERS
7
+ # Note: All names below are intentionally fictional and do not refer to any real
8
+ # politician. They are archetypes selected to span a broad ideological space.
5
9
  # =============================================================================
6
10
 
7
11
  TRADITIONAL_CONSERVATIVE = CongressMember(
8
- name="Sen. Burke",
12
+ name="Sen. Thornbury",
9
13
  role="Traditional Conservative",
10
14
  political_leaning="traditional conservative",
11
15
  general_motivation=(
@@ -27,11 +31,11 @@ TRADITIONAL_CONSERVATIVE = CongressMember(
27
31
  "respects established institutions",
28
32
  "emphasizes personal responsibility",
29
33
  ],
30
- ai_model="openrouter/anthropic/claude-sonnet-4.5",
34
+ ai_model=DEFAULT_POLITICAL_MODEL,
31
35
  )
32
36
 
33
37
  PROGRESSIVE_REFORMER = CongressMember(
34
- name="Rep. Warren",
38
+ name="Rep. Hartwell",
35
39
  role="Progressive Reformer",
36
40
  political_leaning="progressive",
37
41
  general_motivation=(
@@ -53,11 +57,11 @@ PROGRESSIVE_REFORMER = CongressMember(
53
57
  "prioritizes workers and consumers",
54
58
  "impatient with incrementalism",
55
59
  ],
56
- ai_model="openrouter/anthropic/claude-sonnet-4.5",
60
+ ai_model=DEFAULT_POLITICAL_MODEL,
57
61
  )
58
62
 
59
63
  LIBERTARIAN = CongressMember(
60
- name="Rep. Paul",
64
+ name="Rep. Calloway",
61
65
  role="Libertarian",
62
66
  political_leaning="libertarian",
63
67
  general_motivation=(
@@ -79,11 +83,11 @@ LIBERTARIAN = CongressMember(
79
83
  "consistent across issues",
80
84
  "opposes paternalism",
81
85
  ],
82
- ai_model="openrouter/anthropic/claude-sonnet-4.5",
86
+ ai_model=DEFAULT_POLITICAL_MODEL,
83
87
  )
84
88
 
85
89
  POPULIST_NATIONALIST = CongressMember(
86
- name="Sen. Vance",
90
+ name="Sen. Marsden",
87
91
  role="Populist Nationalist",
88
92
  political_leaning="populist nationalist",
89
93
  general_motivation=(
@@ -105,11 +109,11 @@ POPULIST_NATIONALIST = CongressMember(
105
109
  "questions free trade orthodoxy",
106
110
  "focuses on forgotten communities",
107
111
  ],
108
- ai_model="openrouter/anthropic/claude-sonnet-4.5",
112
+ ai_model=DEFAULT_POLITICAL_MODEL,
109
113
  )
110
114
 
111
115
  NATIONAL_SECURITY_HAWK = CongressMember(
112
- name="Sen. McCain",
116
+ name="Sen. Ashford",
113
117
  role="National Security Hawk",
114
118
  political_leaning="hawkish internationalist",
115
119
  general_motivation=(
@@ -131,11 +135,11 @@ NATIONAL_SECURITY_HAWK = CongressMember(
131
135
  "willing to use force",
132
136
  "prioritizes deterrence",
133
137
  ],
134
- ai_model="openrouter/anthropic/claude-sonnet-4.5",
138
+ ai_model=DEFAULT_POLITICAL_MODEL,
135
139
  )
136
140
 
137
141
  ENVIRONMENTALIST = CongressMember(
138
- name="Rep. Ocasio",
142
+ name="Rep. Vellacott",
139
143
  role="Climate and Environmental Advocate",
140
144
  political_leaning="green progressive",
141
145
  general_motivation=(
@@ -157,11 +161,11 @@ ENVIRONMENTALIST = CongressMember(
157
161
  "intergenerational focus",
158
162
  "skeptical of fossil fuel industry",
159
163
  ],
160
- ai_model="openrouter/anthropic/claude-sonnet-4.5",
164
+ ai_model=DEFAULT_POLITICAL_MODEL,
161
165
  )
162
166
 
163
167
  DEMOCRATIC_SOCIALIST = CongressMember(
164
- name="Sen. Sanders",
168
+ name="Sen. Quill",
165
169
  role="Democratic Socialist",
166
170
  political_leaning="democratic socialist",
167
171
  general_motivation=(
@@ -183,11 +187,11 @@ DEMOCRATIC_SOCIALIST = CongressMember(
183
187
  "consistent ideology",
184
188
  "grassroots orientation",
185
189
  ],
186
- ai_model="openrouter/anthropic/claude-sonnet-4.5",
190
+ ai_model=DEFAULT_POLITICAL_MODEL,
187
191
  )
188
192
 
189
193
  TECHNOCRATIC_CENTRIST = CongressMember(
190
- name="Sec. Buttigieg",
194
+ name="Sec. Drummond",
191
195
  role="Technocratic Centrist",
192
196
  political_leaning="technocratic centrist",
193
197
  general_motivation=(
@@ -209,7 +213,7 @@ TECHNOCRATIC_CENTRIST = CongressMember(
209
213
  "values expertise",
210
214
  "incrementalist",
211
215
  ],
212
- ai_model="openrouter/anthropic/claude-sonnet-4.5",
216
+ ai_model=DEFAULT_POLITICAL_MODEL,
213
217
  )
214
218
 
215
219
  # =============================================================================
@@ -217,7 +221,7 @@ TECHNOCRATIC_CENTRIST = CongressMember(
217
221
  # =============================================================================
218
222
 
219
223
  CLAUDE_MEMBER = CongressMember(
220
- name="Opus 4.5 (Anthropic)",
224
+ name="Claude Opus 4.7 (Anthropic)",
221
225
  role="AI Policy Analyst",
222
226
  political_leaning="behaves as Claude naturally does",
223
227
  general_motivation=(
@@ -227,7 +231,7 @@ CLAUDE_MEMBER = CongressMember(
227
231
  ),
228
232
  expertise_areas=["general policy analysis"],
229
233
  personality_traits=["behaves naturally as Claude"],
230
- ai_model="openrouter/anthropic/claude-opus-4.5",
234
+ ai_model="openrouter/anthropic/claude-opus-4.7",
231
235
  )
232
236
 
233
237
  GPT_MEMBER = CongressMember(
@@ -245,7 +249,7 @@ GPT_MEMBER = CongressMember(
245
249
  )
246
250
 
247
251
  GEMINI_MEMBER = CongressMember(
248
- name="Gemini 3 Pro (Google)",
252
+ name="Gemini 3.1 Pro (Google)",
249
253
  role="AI Policy Analyst",
250
254
  political_leaning="behaves as Gemini naturally does",
251
255
  general_motivation=(
@@ -255,11 +259,11 @@ GEMINI_MEMBER = CongressMember(
255
259
  ),
256
260
  expertise_areas=["general policy analysis"],
257
261
  personality_traits=["behaves naturally as Gemini"],
258
- ai_model="openrouter/google/gemini-3-pro-preview",
262
+ ai_model="openrouter/google/gemini-3.1-pro-preview",
259
263
  )
260
264
 
261
265
  GROK_MEMBER = CongressMember(
262
- name="Grok 4 (xAI)",
266
+ name="Grok 4.20 (xAI)",
263
267
  role="AI Policy Analyst",
264
268
  political_leaning="behaves as Grok naturally does",
265
269
  general_motivation=(
@@ -269,7 +273,7 @@ GROK_MEMBER = CongressMember(
269
273
  ),
270
274
  expertise_areas=["general policy analysis"],
271
275
  personality_traits=["behaves naturally as Grok"],
272
- ai_model="openrouter/x-ai/grok-4",
276
+ ai_model="openrouter/x-ai/grok-4.20",
273
277
  )
274
278
 
275
279
  DEEPSEEK_MEMBER = CongressMember(
@@ -309,7 +313,7 @@ AI_MODEL_MEMBERS: list[CongressMember] = [
309
313
  DEEPSEEK_MEMBER,
310
314
  ]
311
315
 
312
- AVAILABLE_MEMBERS: list[CongressMember] = POLITICAL_MEMBERS + AI_MODEL_MEMBERS
316
+ AVAILABLE_MEMBERS: list[CongressMember] = AI_MODEL_MEMBERS + POLITICAL_MEMBERS
313
317
 
314
318
  MEMBER_BY_NAME: dict[str, CongressMember] = {m.name: m for m in AVAILABLE_MEMBERS}
315
319
 
@@ -98,7 +98,7 @@ class DataAnalyzer:
98
98
  def data_analysis_tool(
99
99
  instruction: str,
100
100
  additional_context: str | None = None,
101
- files: list | None = None,
101
+ files: list[AvailableFile] | None = None,
102
102
  ) -> str:
103
103
  """
104
104
  This tool attempts to use code to achieve the user's instructions.
@@ -109,7 +109,7 @@ class DataAnalyzer:
109
109
  Format files as a list of dicts with the following format: {"file_name": "string", "file_id": "string"}
110
110
  """
111
111
  data_analysis = DataAnalyzer()
112
- available_files = [AvailableFile(**file) for file in files] if files else []
112
+ available_files = list(files) if files else []
113
113
  return asyncio.run(
114
114
  data_analysis.run_data_analysis(
115
115
  instruction, additional_context, available_files
@@ -75,7 +75,7 @@ class LlmMessage(BaseModel, Jsonable):
75
75
  class SimulationAgentRunner:
76
76
  def __init__(
77
77
  self,
78
- default_model: str = "openrouter/anthropic/claude-sonnet-4.5",
78
+ default_model: str = "openrouter/anthropic/claude-sonnet-4.6",
79
79
  timeout: int = AGENT_TURN_TIMEOUT,
80
80
  ) -> None:
81
81
  self.default_model = default_model
@@ -78,7 +78,7 @@ class AgentDefinition(BaseModel, Jsonable):
78
78
  starting_inventory: dict[str, int] = Field(default_factory=dict)
79
79
  special_actions: list[ActionDefinition] = Field(default_factory=list)
80
80
  inventory_rules: list[InventoryRule] = Field(default_factory=list)
81
- ai_model: str = "openrouter/anthropic/claude-sonnet-4.5"
81
+ ai_model: str = "openrouter/anthropic/claude-sonnet-4.6"
82
82
 
83
83
 
84
84
  class Channel(BaseModel, Jsonable):
@@ -22,7 +22,7 @@ POLICY_AGENT_TIMEOUT = 300
22
22
  class InterventionPolicyAgent:
23
23
  def __init__(
24
24
  self,
25
- model_name: str = "openrouter/anthropic/claude-sonnet-4",
25
+ model_name: str = "openrouter/anthropic/claude-sonnet-4.6",
26
26
  timeout: int = POLICY_AGENT_TIMEOUT,
27
27
  structure_output_model: GeneralLlm | None = None,
28
28
  ) -> None:
@@ -41,7 +41,7 @@ INTERVENTION_ADVISOR_NAME = "Intervention Advisor"
41
41
  class InterventionRunner:
42
42
  def __init__(
43
43
  self,
44
- model_name: str = "openrouter/anthropic/claude-sonnet-4",
44
+ model_name: str = "openrouter/anthropic/claude-sonnet-4.6",
45
45
  cost_limit: float = 100.0,
46
46
  ) -> None:
47
47
  self.model_name = model_name
@@ -45,7 +45,7 @@ SITUATION_SCHEMA_GUIDE = clean_indents(
45
45
  "effects": [<Effect objects>]
46
46
  }
47
47
  ],
48
- "ai_model": "openrouter/anthropic/claude-sonnet-4.5"
48
+ "ai_model": "openrouter/anthropic/claude-sonnet-4.6"
49
49
  }
50
50
  ],
51
51
  "environment": {
@@ -186,7 +186,7 @@ SITUATION_DESIGN_GUIDE = clean_indents(
186
186
  class SituationGenerator:
187
187
  def __init__(
188
188
  self,
189
- model: str = "openrouter/anthropic/claude-sonnet-4.5",
189
+ model: str = "openrouter/anthropic/claude-sonnet-4.6",
190
190
  ) -> None:
191
191
  self.model = model
192
192
 
@@ -60,22 +60,25 @@ from forecasting_tools.util.misc import clean_indents
60
60
  logger = logging.getLogger(__name__)
61
61
 
62
62
 
63
- DEFAULT_MODEL: str = (
64
- "openrouter/google/gemini-2.5-pro" # "openrouter/anthropic/claude-sonnet-4.5.5"
65
- )
63
+ DEFAULT_MODEL: str = "openrouter/google/gemini-2.5-pro"
66
64
  MODEL_CHOICES: list[str] = [
67
65
  DEFAULT_MODEL,
66
+ "openrouter/anthropic/claude-sonnet-4.6",
67
+ "openrouter/anthropic/claude-opus-4.7",
68
+ "gemini/gemini-3.1-pro-preview",
69
+ "openai/gpt-5.2",
70
+ "xai/grok-4.20",
71
+ "openrouter/anthropic/claude-sonnet-4.5",
68
72
  "openai/gpt-5",
69
73
  "openrouter/x-ai/grok-4",
70
74
  "openrouter/anthropic/claude-opus-4.1",
71
75
  "openrouter/anthropic/claude-sonnet-4",
72
- "openrouter/anthropic/claude-sonnet-4.5",
73
76
  "openai/o3",
74
77
  "openai/o4-mini",
75
78
  "openai/gpt-4.1",
76
79
  "gpt-4o",
77
- "openrouter/google/gemini-2.5-pro-preview",
78
80
  "openrouter/google/gemini-3-pro-preview",
81
+ "openrouter/google/gemini-2.5-pro-preview",
79
82
  ]
80
83
 
81
84
 
@@ -502,7 +505,7 @@ class ChatPage(AppPage):
502
505
  output = message["output"]
503
506
  last_message["content"][0][
504
507
  "text"
505
- ] += f"\n\n---\n\nNOTICE: There is a bug in gemini tool calling in OpenAI agents SDK, here is the content. Consider using openrouter/anthropic/claude-sonnet-4:\n\n {output}."
508
+ ] += f"\n\n---\n\nNOTICE: There is a bug in gemini tool calling in OpenAI agents SDK, here is the content. Consider using openrouter/anthropic/claude-sonnet-4.6:\n\n {output}."
506
509
 
507
510
  @classmethod
508
511
  def clear_chat_history(cls) -> None:
@@ -38,7 +38,6 @@ SESSIONS_FOLDER = "temp/congress_v2_sessions"
38
38
  EXAMPLE_SESSION_PATH = (
39
39
  "forecasting_tools/front_end/example_outputs/congress_v2_page_example.json"
40
40
  )
41
- V2_PASSPHRASE = f"metac {CustomAuth.DEFAULT_PASSPHRASE}"
42
41
 
43
42
 
44
43
  class CongressV2Page(AppPage):
@@ -92,6 +91,7 @@ class CongressV2Page(AppPage):
92
91
  ]
93
92
 
94
93
  @classmethod
94
+ @CustomAuth.add_access_control()
95
95
  async def _async_main(cls) -> None:
96
96
  st.title("🏛️ AI Forecasting Congress V2")
97
97
  st.markdown(
@@ -215,10 +215,10 @@ class CongressV2Page(AppPage):
215
215
 
216
216
  member_names = [m.name for m in AVAILABLE_MEMBERS]
217
217
  default_members = [
218
- "Opus 4.5 (Anthropic)",
218
+ "Claude Opus 4.7 (Anthropic)",
219
219
  "GPT 5.2 (OpenAI)",
220
- "Gemini 3 Pro (Google)",
221
- "Grok 4 (xAI)",
220
+ "Gemini 3.1 Pro (Google)",
221
+ "Grok 4.20 (xAI)",
222
222
  "DeepSeek V3.2 (DeepSeek)",
223
223
  ]
224
224
  selected_members = st.multiselect(
@@ -1,3 +1,4 @@
1
+ import json
1
2
  import logging
2
3
  import re
3
4
 
@@ -7,6 +8,8 @@ from pydantic import BaseModel
7
8
 
8
9
  from forecasting_tools.data_models.binary_report import BinaryReport
9
10
  from forecasting_tools.data_models.questions import BinaryQuestion
11
+ from forecasting_tools.forecast_bots.bot_lists import get_all_important_bot_classes
12
+ from forecasting_tools.forecast_bots.forecast_bot import ForecastBot
10
13
  from forecasting_tools.forecast_bots.main_bot import MainBot
11
14
  from forecasting_tools.front_end.helpers.report_displayer import ReportDisplayer
12
15
  from forecasting_tools.front_end.helpers.tool_page import ToolPage
@@ -33,7 +36,6 @@ class ForecasterPage(ToolPage):
33
36
  "forecasting_tools/front_end/example_outputs/forecast_page_examples.json"
34
37
  )
35
38
 
36
- # Form input keys
37
39
  QUESTION_TEXT_BOX = "question_text_box"
38
40
  RESOLUTION_CRITERIA_BOX = "resolution_criteria_box"
39
41
  FINE_PRINT_BOX = "fine_print_box"
@@ -42,13 +44,91 @@ class ForecasterPage(ToolPage):
42
44
  NUM_BASE_RATE_QUESTIONS_BOX = "num_base_rate_questions_box"
43
45
  METACULUS_URL_INPUT = "metaculus_url_input"
44
46
  FETCH_BUTTON = "fetch_button"
47
+ BOT_CHOICE_KEY = "forecaster_bot_choice"
48
+ DEFAULT_BOT_NAME = MainBot.__name__
45
49
 
46
50
  @classmethod
47
51
  async def _display_intro_text(cls) -> None:
48
- # st.write(
49
- # "Enter the information for your question. Exa.ai is used to gather up to date information. Each citation attempts to link to a highlight of the a ~4 sentence quote found with Exa.ai. This project is in beta some inaccuracies are expected."
50
- # )
51
- pass
52
+ cls._display_bot_selector_and_config()
53
+
54
+ @classmethod
55
+ def _get_available_bot_classes(cls) -> list[type[ForecastBot]]:
56
+ bot_classes = get_all_important_bot_classes()
57
+ ordered: list[type[ForecastBot]] = []
58
+ for bot_class in bot_classes:
59
+ if bot_class is MainBot:
60
+ ordered.insert(0, bot_class)
61
+ elif bot_class not in ordered:
62
+ ordered.append(bot_class)
63
+ if MainBot not in ordered:
64
+ ordered.insert(0, MainBot)
65
+ return ordered
66
+
67
+ @classmethod
68
+ def _get_selected_bot_class(cls) -> type[ForecastBot]:
69
+ bot_classes = cls._get_available_bot_classes()
70
+ bot_class_by_name = {bot.__name__: bot for bot in bot_classes}
71
+ chosen_name = st.session_state.get(cls.BOT_CHOICE_KEY, cls.DEFAULT_BOT_NAME)
72
+ return bot_class_by_name.get(chosen_name, MainBot)
73
+
74
+ @classmethod
75
+ def _display_bot_selector_and_config(cls) -> None:
76
+ bot_classes = cls._get_available_bot_classes()
77
+ bot_names = [bot.__name__ for bot in bot_classes]
78
+ if cls.BOT_CHOICE_KEY not in st.session_state:
79
+ st.session_state[cls.BOT_CHOICE_KEY] = cls.DEFAULT_BOT_NAME
80
+
81
+ default_index = (
82
+ bot_names.index(st.session_state[cls.BOT_CHOICE_KEY])
83
+ if st.session_state[cls.BOT_CHOICE_KEY] in bot_names
84
+ else 0
85
+ )
86
+ st.selectbox(
87
+ "Forecasting Bot",
88
+ options=bot_names,
89
+ index=default_index,
90
+ key=cls.BOT_CHOICE_KEY,
91
+ help=(
92
+ "The bot used to forecast. "
93
+ f"`{cls.DEFAULT_BOT_NAME}` is the default and the verified "
94
+ "highest-accuracy bot."
95
+ ),
96
+ )
97
+
98
+ bot_class = cls._get_selected_bot_class()
99
+ with st.expander("Bot Configuration", expanded=False):
100
+ cls._render_bot_config(bot_class)
101
+
102
+ @classmethod
103
+ def _render_bot_config(cls, bot_class: type[ForecastBot]) -> None:
104
+ try:
105
+ bot_instance = bot_class(
106
+ research_reports_per_question=1,
107
+ predictions_per_research_report=5,
108
+ publish_reports_to_metaculus=False,
109
+ folder_to_save_reports_to=None,
110
+ )
111
+ except Exception as exception:
112
+ st.error(f"Could not instantiate {bot_class.__name__}: {exception}")
113
+ return
114
+
115
+ docstring = (bot_class.__doc__ or "").strip()
116
+ if docstring:
117
+ st.markdown(f"**Description:** {docstring}")
118
+ st.markdown(f"**Bot Class:** `{bot_class.__name__}`")
119
+ st.markdown(
120
+ f"**Research Reports per Question:** "
121
+ f"{bot_instance.research_reports_per_question}"
122
+ )
123
+ st.markdown(
124
+ f"**Predictions per Research Report:** "
125
+ f"{bot_instance.predictions_per_research_report}"
126
+ )
127
+ st.markdown("**LLM Configuration:**")
128
+ st.code(
129
+ json.dumps(bot_instance.make_llm_dict(), indent=2, default=str),
130
+ language="json",
131
+ )
52
132
 
53
133
  @classmethod
54
134
  async def _get_input(cls) -> ForecastInput | None:
@@ -87,8 +167,12 @@ class ForecasterPage(ToolPage):
87
167
 
88
168
  @classmethod
89
169
  async def _run_tool(cls, input: ForecastInput) -> BinaryReport:
90
- with st.spinner("Forecasting... This may take a minute or two..."):
91
- report = await MainBot(
170
+ bot_class = cls._get_selected_bot_class()
171
+ with st.spinner(
172
+ f"Forecasting with `{bot_class.__name__}`... "
173
+ "This may take a minute or two..."
174
+ ):
175
+ report = await bot_class(
92
176
  research_reports_per_question=1,
93
177
  predictions_per_research_report=5,
94
178
  publish_reports_to_metaculus=False,
@@ -53,23 +53,18 @@ class AskNewsSearcher:
53
53
  self.client_secret = client_secret or os.getenv("ASKNEWS_SECRET")
54
54
  self.api_key = api_key or os.getenv("ASKNEWS_API_KEY")
55
55
 
56
- # Check if both authentication methods are defined
57
56
  has_oauth = bool(self.client_id and self.client_secret)
58
57
  has_api_key = bool(self.api_key)
59
58
 
60
59
  if has_oauth and has_api_key:
61
- raise ValueError(
62
- "Cannot use both OAuth (client_id/client_secret) and API key authentication. "
63
- "Please provide either ASKNEWS_CLIENT_ID + ASKNEWS_SECRET or ASKNEWS_API_KEY, not both."
64
- )
65
-
66
- # Validate OAuth credentials
67
- if has_oauth and (not self.client_id or not self.client_secret):
68
- raise ValueError(
69
- "Incomplete OAuth credentials. Both ASKNEWS_CLIENT_ID and ASKNEWS_SECRET must be set."
60
+ logger.warning(
61
+ "Both AskNews OAuth (ASKNEWS_CLIENT_ID + ASKNEWS_SECRET) and "
62
+ "ASKNEWS_API_KEY were provided. Preferring OAuth and ignoring the "
63
+ "API key."
70
64
  )
65
+ self.api_key = None
66
+ has_api_key = False
71
67
 
72
- # Validate that at least one authentication method is provided
73
68
  if not has_oauth and not has_api_key:
74
69
  raise ValueError(
75
70
  "No authentication credentials provided. "
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "forecasting-tools"
3
- version = "0.2.91"
3
+ version = "0.2.92"
4
4
  description = "AI forecasting and research tools to help humans reason about and forecast the future"
5
5
  authors = ["Benjamin Wilson <ben@metaculus.com>"]
6
6
  license = "MIT"