palimpzest 1.3.2__tar.gz → 1.3.4__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 (101) hide show
  1. {palimpzest-1.3.2/src/palimpzest.egg-info → palimpzest-1.3.4}/PKG-INFO +1 -1
  2. {palimpzest-1.3.2 → palimpzest-1.3.4}/pyproject.toml +1 -1
  3. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/constants.py +2 -2
  4. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/generators/generators.py +4 -2
  5. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/aggregate.py +1 -1
  6. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/convert.py +1 -1
  7. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/filter.py +1 -1
  8. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/join.py +1 -1
  9. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/optimizer/optimizer.py +1 -1
  10. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/optimizer/rules.py +42 -38
  11. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/processor/config.py +1 -1
  12. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/utils/model_helpers.py +20 -17
  13. {palimpzest-1.3.2 → palimpzest-1.3.4/src/palimpzest.egg-info}/PKG-INFO +1 -1
  14. {palimpzest-1.3.2 → palimpzest-1.3.4}/LICENSE +0 -0
  15. {palimpzest-1.3.2 → palimpzest-1.3.4}/README.md +0 -0
  16. {palimpzest-1.3.2 → palimpzest-1.3.4}/setup.cfg +0 -0
  17. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/__init__.py +0 -0
  18. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/agents/__init__.py +0 -0
  19. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/agents/compute_agents.py +0 -0
  20. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/agents/search_agents.py +0 -0
  21. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/core/__init__.py +0 -0
  22. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/core/data/__init__.py +0 -0
  23. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/core/data/context.py +0 -0
  24. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/core/data/context_manager.py +0 -0
  25. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/core/data/dataset.py +0 -0
  26. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/core/data/index_dataset.py +0 -0
  27. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/core/data/iter_dataset.py +0 -0
  28. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/core/elements/__init__.py +0 -0
  29. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/core/elements/filters.py +0 -0
  30. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/core/elements/groupbysig.py +0 -0
  31. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/core/elements/records.py +0 -0
  32. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/core/lib/__init__.py +0 -0
  33. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/core/lib/schemas.py +0 -0
  34. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/core/models.py +0 -0
  35. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/policy.py +0 -0
  36. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/__init__.py +0 -0
  37. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/agent_prompts.py +0 -0
  38. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/aggregate_prompts.py +0 -0
  39. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/context_search.py +0 -0
  40. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/convert_prompts.py +0 -0
  41. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/critique_and_refine_prompts.py +0 -0
  42. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/filter_prompts.py +0 -0
  43. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/join_prompts.py +0 -0
  44. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/moa_aggregator_prompts.py +0 -0
  45. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/moa_proposer_prompts.py +0 -0
  46. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/prompt_factory.py +0 -0
  47. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/split_merge_prompts.py +0 -0
  48. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/split_proposer_prompts.py +0 -0
  49. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/utils.py +0 -0
  50. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/prompts/validator.py +0 -0
  51. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/__init__.py +0 -0
  52. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/execution/__init__.py +0 -0
  53. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/execution/all_sample_execution_strategy.py +0 -0
  54. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/execution/execution_strategy.py +0 -0
  55. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/execution/execution_strategy_type.py +0 -0
  56. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/execution/mab_execution_strategy.py +0 -0
  57. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/execution/parallel_execution_strategy.py +0 -0
  58. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/execution/single_threaded_execution_strategy.py +0 -0
  59. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/generators/__init__.py +0 -0
  60. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/__init__.py +0 -0
  61. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/compute.py +0 -0
  62. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/critique_and_refine.py +0 -0
  63. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/distinct.py +0 -0
  64. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/limit.py +0 -0
  65. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/logical.py +0 -0
  66. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/mixture_of_agents.py +0 -0
  67. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/physical.py +0 -0
  68. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/project.py +0 -0
  69. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/rag.py +0 -0
  70. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/scan.py +0 -0
  71. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/search.py +0 -0
  72. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/split.py +0 -0
  73. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/operators/topk.py +0 -0
  74. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/optimizer/__init__.py +0 -0
  75. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/optimizer/cost_model.py +0 -0
  76. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/optimizer/optimizer_strategy.py +0 -0
  77. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/optimizer/optimizer_strategy_type.py +0 -0
  78. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/optimizer/plan.py +0 -0
  79. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/optimizer/primitives.py +0 -0
  80. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/optimizer/tasks.py +0 -0
  81. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/processor/__init__.py +0 -0
  82. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/processor/query_processor.py +0 -0
  83. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/query/processor/query_processor_factory.py +0 -0
  84. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/schemabuilder/__init__.py +0 -0
  85. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/schemabuilder/schema_builder.py +0 -0
  86. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/tools/README.md +0 -0
  87. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/tools/__init__.py +0 -0
  88. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/tools/allenpdf.py +0 -0
  89. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/tools/pdfparser.py +0 -0
  90. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/tools/skema_tools.py +0 -0
  91. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/utils/__init__.py +0 -0
  92. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/utils/env_helpers.py +0 -0
  93. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/utils/hash_helpers.py +0 -0
  94. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/utils/progress.py +0 -0
  95. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/utils/udfs.py +0 -0
  96. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/validator/__init__.py +0 -0
  97. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest/validator/validator.py +0 -0
  98. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest.egg-info/SOURCES.txt +0 -0
  99. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest.egg-info/dependency_links.txt +0 -0
  100. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest.egg-info/requires.txt +0 -0
  101. {palimpzest-1.3.2 → palimpzest-1.3.4}/src/palimpzest.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: palimpzest
3
- Version: 1.3.2
3
+ Version: 1.3.4
4
4
  Summary: Palimpzest is a system which enables anyone to process AI-powered analytical queries simply by defining them in a declarative language
5
5
  Author-email: MIT DSG Semantic Management Lab <michjc@csail.mit.edu>
6
6
  Project-URL: homepage, https://palimpzest.org
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "palimpzest"
3
- version = "1.3.2"
3
+ version = "1.3.4"
4
4
  description = "Palimpzest is a system which enables anyone to process AI-powered analytical queries simply by defining them in a declarative language"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -25,7 +25,7 @@ class Model(str, Enum):
25
25
  GPT_5_MINI = "openai/gpt-5-mini-2025-08-07"
26
26
  GPT_5_NANO = "openai/gpt-5-nano-2025-08-07"
27
27
  o4_MINI = "openai/o4-mini-2025-04-16" # noqa: N815
28
- CLAUDE_3_5_SONNET = "anthropic/claude-3-5-sonnet-20241022"
28
+ # CLAUDE_3_5_SONNET = "anthropic/claude-3-5-sonnet-20241022"
29
29
  CLAUDE_3_7_SONNET = "anthropic/claude-3-7-sonnet-20250219"
30
30
  CLAUDE_3_5_HAIKU = "anthropic/claude-3-5-haiku-20241022"
31
31
  GEMINI_2_0_FLASH = "vertex_ai/gemini-2.0-flash"
@@ -621,7 +621,7 @@ MODEL_CARDS = {
621
621
  # Model.o1.value: o1_MODEL_CARD,
622
622
  Model.TEXT_EMBEDDING_3_SMALL.value: TEXT_EMBEDDING_3_SMALL_MODEL_CARD,
623
623
  Model.CLIP_VIT_B_32.value: CLIP_VIT_B_32_MODEL_CARD,
624
- Model.CLAUDE_3_5_SONNET.value: CLAUDE_3_5_SONNET_MODEL_CARD,
624
+ # Model.CLAUDE_3_5_SONNET.value: CLAUDE_3_5_SONNET_MODEL_CARD,
625
625
  Model.CLAUDE_3_7_SONNET.value: CLAUDE_3_7_SONNET_MODEL_CARD,
626
626
  Model.CLAUDE_3_5_HAIKU.value: CLAUDE_3_5_HAIKU_MODEL_CARD,
627
627
  Model.GEMINI_2_0_FLASH.value: GEMINI_2_0_FLASH_MODEL_CARD,
@@ -26,6 +26,7 @@ from palimpzest.constants import (
26
26
  from palimpzest.core.elements.records import DataRecord
27
27
  from palimpzest.core.models import GenerationStats
28
28
  from palimpzest.prompts import PromptFactory
29
+ from palimpzest.utils.model_helpers import resolve_reasoning_effort
29
30
 
30
31
  # DEFINITIONS
31
32
  GenerationOutput = tuple[dict, str | None, GenerationStats, list[dict]]
@@ -108,7 +109,7 @@ class Generator(Generic[ContextType, InputType]):
108
109
  self,
109
110
  model: Model,
110
111
  prompt_strategy: PromptStrategy,
111
- reasoning_effort: str | None,
112
+ reasoning_effort: str,
112
113
  api_base: str | None = None,
113
114
  cardinality: Cardinality = Cardinality.ONE_TO_ONE,
114
115
  desc: str | None = None,
@@ -325,7 +326,8 @@ class Generator(Generic[ContextType, InputType]):
325
326
  if is_audio_op:
326
327
  completion_kwargs = {"modalities": ["text"], **completion_kwargs}
327
328
  if self.model.is_reasoning_model():
328
- completion_kwargs = {"reasoning_effort": self.reasoning_effort, **completion_kwargs}
329
+ reasoning_effort = resolve_reasoning_effort(self.model, self.reasoning_effort)
330
+ completion_kwargs = {"reasoning_effort": reasoning_effort, **completion_kwargs}
329
331
  if self.model.is_vllm_model():
330
332
  completion_kwargs = {"api_base": self.api_base, "api_key": os.environ.get("VLLM_API_KEY", "fake-api-key"), **completion_kwargs}
331
333
  completion = litellm.completion(model=self.model_name, messages=messages, **completion_kwargs)
@@ -531,7 +531,7 @@ class MaxAggregateOp(AggregateOp):
531
531
 
532
532
  class SemanticAggregate(AggregateOp):
533
533
 
534
- def __init__(self, agg_str: str, model: Model, prompt_strategy: PromptStrategy = PromptStrategy.AGG, reasoning_effort: str | None = None, *args, **kwargs):
534
+ def __init__(self, agg_str: str, model: Model, prompt_strategy: PromptStrategy = PromptStrategy.AGG, reasoning_effort: str = "default", *args, **kwargs):
535
535
  # call parent constructor
536
536
  super().__init__(*args, **kwargs)
537
537
  self.agg_str = agg_str
@@ -268,7 +268,7 @@ class LLMConvert(ConvertOp):
268
268
  self,
269
269
  model: Model,
270
270
  prompt_strategy: PromptStrategy = PromptStrategy.MAP,
271
- reasoning_effort: str | None = None,
271
+ reasoning_effort: str = "default",
272
272
  *args,
273
273
  **kwargs,
274
274
  ):
@@ -167,7 +167,7 @@ class LLMFilter(FilterOp):
167
167
  self,
168
168
  model: Model,
169
169
  prompt_strategy: PromptStrategy = PromptStrategy.FILTER,
170
- reasoning_effort: str | None = None,
170
+ reasoning_effort: str = "default",
171
171
  *args,
172
172
  **kwargs,
173
173
  ):
@@ -293,7 +293,7 @@ class LLMJoin(JoinOp):
293
293
  self,
294
294
  model: Model,
295
295
  prompt_strategy: PromptStrategy = PromptStrategy.JOIN,
296
- reasoning_effort: str | None = None,
296
+ reasoning_effort: str = "default",
297
297
  *args,
298
298
  **kwargs,
299
299
  ):
@@ -75,7 +75,7 @@ class Optimizer:
75
75
  cost_model: BaseCostModel,
76
76
  available_models: list[Model],
77
77
  join_parallelism: int = 64,
78
- reasoning_effort: str | None = "default",
78
+ reasoning_effort: str = "default",
79
79
  api_base: str | None = None,
80
80
  verbose: bool = False,
81
81
  allow_bonded_query: bool = True,
@@ -54,7 +54,7 @@ from palimpzest.query.operators.search import (
54
54
  from palimpzest.query.operators.split import SplitConvert, SplitFilter
55
55
  from palimpzest.query.operators.topk import TopKOp
56
56
  from palimpzest.query.optimizer.primitives import Expression, Group, LogicalExpression, PhysicalExpression
57
- from palimpzest.utils.model_helpers import resolve_reasoning_settings
57
+ from palimpzest.utils.model_helpers import use_reasoning_prompt
58
58
 
59
59
  logger = logging.getLogger(__name__)
60
60
 
@@ -631,13 +631,13 @@ class LLMConvertBondedRule(ImplementationRule):
631
631
  models = [model for model in runtime_kwargs["available_models"] if cls._model_matches_input(model, logical_expression)]
632
632
  variable_op_kwargs = []
633
633
  for model in models:
634
- use_reasoning_prompt, reasoning_effort = resolve_reasoning_settings(model, runtime_kwargs["reasoning_effort"])
635
- prompt_strategy = PromptStrategy.MAP if use_reasoning_prompt else PromptStrategy.MAP_NO_REASONING
634
+ reasoning_prompt_strategy = use_reasoning_prompt(runtime_kwargs["reasoning_effort"])
635
+ prompt_strategy = PromptStrategy.MAP if reasoning_prompt_strategy else PromptStrategy.MAP_NO_REASONING
636
636
  variable_op_kwargs.append(
637
637
  {
638
638
  "model": model,
639
639
  "prompt_strategy": prompt_strategy,
640
- "reasoning_effort": reasoning_effort,
640
+ "reasoning_effort": runtime_kwargs["reasoning_effort"],
641
641
  }
642
642
  )
643
643
 
@@ -670,25 +670,28 @@ class RAGRule(ImplementationRule):
670
670
  models = [model for model in runtime_kwargs["available_models"] if cls._model_matches_input(model, logical_expression)]
671
671
  variable_op_kwargs = []
672
672
  for model in models:
673
- use_reasoning_prompt, reasoning_effort = resolve_reasoning_settings(model, runtime_kwargs["reasoning_effort"])
674
- prompt_strategy = (
675
- PromptStrategy.MAP if use_reasoning_prompt else PromptStrategy.MAP_NO_REASONING
676
- if phys_op_cls is RAGConvert
677
- else PromptStrategy.FILTER if use_reasoning_prompt else PromptStrategy.FILTER_NO_REASONING
678
- )
679
- variable_op_kwargs.extend(
680
- [
673
+ reasoning_prompt_strategy = use_reasoning_prompt(runtime_kwargs["reasoning_effort"])
674
+ if phys_op_cls is RAGConvert:
675
+ reasoning = PromptStrategy.MAP
676
+ no_reasoning = PromptStrategy.MAP_NO_REASONING
677
+ elif phys_op_cls is RAGFilter:
678
+ reasoning = PromptStrategy.FILTER
679
+ no_reasoning = PromptStrategy.FILTER_NO_REASONING
680
+
681
+ prompt_strategy = reasoning if reasoning_prompt_strategy else no_reasoning
682
+ variable_op_kwargs.extend(
683
+ [
681
684
  {
682
685
  "model": model,
683
686
  "prompt_strategy": prompt_strategy,
684
687
  "num_chunks_per_field": num_chunks_per_field,
685
688
  "chunk_size": chunk_size,
686
- "reasoning_effort": reasoning_effort,
689
+ "reasoning_effort": runtime_kwargs["reasoning_effort"],
687
690
  }
688
691
  for num_chunks_per_field in cls.num_chunks_per_fields
689
692
  for chunk_size in cls.chunk_sizes
690
- ]
691
- )
693
+ ]
694
+ )
692
695
 
693
696
  return cls._perform_substitution(logical_expression, phys_op_cls, runtime_kwargs, variable_op_kwargs)
694
697
 
@@ -716,7 +719,6 @@ class MixtureOfAgentsRule(ImplementationRule):
716
719
  phys_op_cls = MixtureOfAgentsConvert if isinstance(logical_expression.operator, ConvertScan) else MixtureOfAgentsFilter
717
720
 
718
721
  # create variable physical operator kwargs for each model which can implement this logical_expression
719
- _, reasoning_effort = resolve_reasoning_settings(None, runtime_kwargs["reasoning_effort"])
720
722
  proposer_model_set = {model for model in runtime_kwargs["available_models"] if cls._model_matches_input(model, logical_expression)}
721
723
  aggregator_model_set = {model for model in runtime_kwargs["available_models"] if model.is_text_model()}
722
724
  variable_op_kwargs = [
@@ -724,7 +726,7 @@ class MixtureOfAgentsRule(ImplementationRule):
724
726
  "proposer_models": list(proposer_models),
725
727
  "temperatures": [temp] * len(proposer_models),
726
728
  "aggregator_model": aggregator_model,
727
- "reasoning_effort": reasoning_effort,
729
+ "reasoning_effort": runtime_kwargs["reasoning_effort"],
728
730
  }
729
731
  for k in cls.num_proposer_models
730
732
  for temp in cls.temperatures
@@ -758,12 +760,15 @@ class CritiqueAndRefineRule(ImplementationRule):
758
760
  models = [model for model in runtime_kwargs["available_models"] if cls._model_matches_input(model, logical_expression)]
759
761
  variable_op_kwargs = []
760
762
  for model in models:
761
- use_reasoning_prompt, reasoning_effort = resolve_reasoning_settings(model, runtime_kwargs["reasoning_effort"])
762
- prompt_strategy = (
763
- PromptStrategy.MAP if use_reasoning_prompt else PromptStrategy.MAP_NO_REASONING
764
- if phys_op_cls is CritiqueAndRefineConvert
765
- else PromptStrategy.FILTER if use_reasoning_prompt else PromptStrategy.FILTER_NO_REASONING
766
- )
763
+ reasoning_prompt_strategy = use_reasoning_prompt(runtime_kwargs["reasoning_effort"])
764
+ if phys_op_cls is CritiqueAndRefineConvert:
765
+ reasoning = PromptStrategy.MAP
766
+ no_reasoning = PromptStrategy.MAP_NO_REASONING
767
+ elif phys_op_cls is CritiqueAndRefineFilter:
768
+ reasoning = PromptStrategy.FILTER
769
+ no_reasoning = PromptStrategy.FILTER_NO_REASONING
770
+
771
+ prompt_strategy = reasoning if reasoning_prompt_strategy else no_reasoning
767
772
  variable_op_kwargs.extend(
768
773
  [
769
774
  {
@@ -771,7 +776,7 @@ class CritiqueAndRefineRule(ImplementationRule):
771
776
  "critic_model": critic_model,
772
777
  "refine_model": refine_model,
773
778
  "prompt_strategy": prompt_strategy,
774
- "reasoning_effort": reasoning_effort,
779
+ "reasoning_effort": runtime_kwargs["reasoning_effort"],
775
780
  }
776
781
  for critic_model in models
777
782
  for refine_model in models
@@ -804,13 +809,12 @@ class SplitRule(ImplementationRule):
804
809
 
805
810
  # create variable physical operator kwargs for each model which can implement this logical_expression
806
811
  models = [model for model in runtime_kwargs["available_models"] if cls._model_matches_input(model, logical_expression)]
807
- _, reasoning_effort = resolve_reasoning_settings(None, runtime_kwargs["reasoning_effort"])
808
812
  variable_op_kwargs = [
809
813
  {
810
814
  "model": model,
811
815
  "min_size_to_chunk": min_size_to_chunk,
812
816
  "num_chunks": num_chunks,
813
- "reasoning_effort": reasoning_effort,
817
+ "reasoning_effort": runtime_kwargs["reasoning_effort"],
814
818
  }
815
819
  for model in models
816
820
  for min_size_to_chunk in cls.min_size_to_chunk
@@ -880,13 +884,13 @@ class LLMFilterRule(ImplementationRule):
880
884
  models = [model for model in runtime_kwargs["available_models"] if cls._model_matches_input(model, logical_expression)]
881
885
  variable_op_kwargs = []
882
886
  for model in models:
883
- use_reasoning_prompt, reasoning_effort = resolve_reasoning_settings(model, runtime_kwargs["reasoning_effort"])
884
- prompt_strategy = PromptStrategy.FILTER if use_reasoning_prompt else PromptStrategy.FILTER_NO_REASONING
887
+ reasoning_prompt_strategy = use_reasoning_prompt(runtime_kwargs["reasoning_effort"])
888
+ prompt_strategy = PromptStrategy.FILTER if reasoning_prompt_strategy else PromptStrategy.FILTER_NO_REASONING
885
889
  variable_op_kwargs.append(
886
890
  {
887
891
  "model": model,
888
892
  "prompt_strategy": prompt_strategy,
889
- "reasoning_effort": reasoning_effort,
893
+ "reasoning_effort": runtime_kwargs["reasoning_effort"],
890
894
  }
891
895
  )
892
896
 
@@ -929,14 +933,14 @@ class NestedLoopsJoinRule(ImplementationRule):
929
933
  models = [model for model in runtime_kwargs["available_models"] if cls._model_matches_input(model, logical_expression)]
930
934
  variable_op_kwargs = []
931
935
  for model in models:
932
- use_reasoning_prompt, reasoning_effort = resolve_reasoning_settings(model, runtime_kwargs["reasoning_effort"])
933
- prompt_strategy = PromptStrategy.JOIN if use_reasoning_prompt else PromptStrategy.JOIN_NO_REASONING
936
+ reasoning_prompt_strategy = use_reasoning_prompt(runtime_kwargs["reasoning_effort"])
937
+ prompt_strategy = PromptStrategy.JOIN if reasoning_prompt_strategy else PromptStrategy.JOIN_NO_REASONING
934
938
  variable_op_kwargs.append(
935
939
  {
936
940
  "model": model,
937
941
  "prompt_strategy": prompt_strategy,
938
942
  "join_parallelism": runtime_kwargs["join_parallelism"],
939
- "reasoning_effort": reasoning_effort,
943
+ "reasoning_effort": runtime_kwargs["reasoning_effort"],
940
944
  "retain_inputs": not runtime_kwargs["is_validation"],
941
945
  }
942
946
  )
@@ -963,14 +967,14 @@ class EmbeddingJoinRule(ImplementationRule):
963
967
  models = [model for model in runtime_kwargs["available_models"] if cls._model_matches_input(model, logical_expression)]
964
968
  variable_op_kwargs = []
965
969
  for model in models:
966
- use_reasoning_prompt, reasoning_effort = resolve_reasoning_settings(model, runtime_kwargs["reasoning_effort"])
967
- prompt_strategy = PromptStrategy.JOIN if use_reasoning_prompt else PromptStrategy.JOIN_NO_REASONING
970
+ reasoning_prompt_strategy = use_reasoning_prompt(runtime_kwargs["reasoning_effort"])
971
+ prompt_strategy = PromptStrategy.JOIN if reasoning_prompt_strategy else PromptStrategy.JOIN_NO_REASONING
968
972
  variable_op_kwargs.append(
969
973
  {
970
974
  "model": model,
971
975
  "prompt_strategy": prompt_strategy,
972
976
  "join_parallelism": runtime_kwargs["join_parallelism"],
973
- "reasoning_effort": reasoning_effort,
977
+ "reasoning_effort": runtime_kwargs["reasoning_effort"],
974
978
  "retain_inputs": not runtime_kwargs["is_validation"],
975
979
  "num_samples": 10, # TODO: iterate over different choices of num_samples
976
980
  }
@@ -997,13 +1001,13 @@ class SemanticAggregateRule(ImplementationRule):
997
1001
  models = [model for model in runtime_kwargs["available_models"] if cls._model_matches_input(model, logical_expression) and not model.is_llama_model()]
998
1002
  variable_op_kwargs = []
999
1003
  for model in models:
1000
- use_reasoning_prompt, reasoning_effort = resolve_reasoning_settings(model, runtime_kwargs["reasoning_effort"])
1001
- prompt_strategy = PromptStrategy.AGG if use_reasoning_prompt else PromptStrategy.AGG_NO_REASONING
1004
+ reasoning_prompt_strategy = use_reasoning_prompt(runtime_kwargs["reasoning_effort"])
1005
+ prompt_strategy = PromptStrategy.AGG if reasoning_prompt_strategy else PromptStrategy.AGG_NO_REASONING
1002
1006
  variable_op_kwargs.append(
1003
1007
  {
1004
1008
  "model": model,
1005
1009
  "prompt_strategy": prompt_strategy,
1006
- "reasoning_effort": reasoning_effort,
1010
+ "reasoning_effort": runtime_kwargs["reasoning_effort"],
1007
1011
  }
1008
1012
  )
1009
1013
 
@@ -28,7 +28,7 @@ class QueryProcessorConfig(BaseModel):
28
28
  max_workers: int | None = Field(default=64)
29
29
  join_parallelism: int = Field(default=64)
30
30
  batch_size: int | None = Field(default=None)
31
- reasoning_effort: str | None = Field(default="default") # Gemini: "disable", "low", "medium", "high"
31
+ reasoning_effort: str = Field(default="default") # Gemini: "disable", "low", "medium", "high"
32
32
  use_vertex: bool = Field(default=False) # Whether to use Vertex models for Gemini or Google models
33
33
  gemini_credentials_path: str | None = Field(default=None) # Path to Gemini credentials file
34
34
  api_base: str | None = Field(default=None) # API base URL for vLLM
@@ -60,29 +60,32 @@ def get_models(include_embedding: bool = False, use_vertex: bool = False, gemini
60
60
  return models
61
61
 
62
62
 
63
- def resolve_reasoning_settings(model: Model | None, reasoning_effort: str | None) -> tuple[bool, str]:
63
+ def use_reasoning_prompt(reasoning_effort: str) -> bool:
64
64
  """
65
- Resolve the reasoning settings based on the model and provided reasoning effort.
66
- Returns a tuple indicating whether reasoning prompt should be used and the reasoning effort level.
67
- By default, we use the reasoning prompt everywhere while setting the model reasoning effort to None (or minimal).
68
- If a user explicitly provides a reasoning_effort, we pass that through to the model.
69
- If the user explicitly disables reasoning_effort, we disable the reasoning prompt as well.
65
+ Determine whether to use the reasoning prompt based on the provided reasoning effort.
66
+ By default, we use the reasoning prompt everywhere unless the reasoning_effort is in [None, "disable", "minimal", "low"].
70
67
  """
71
- # turn off reasoning prompt if reasoning_effort is in [None, "disable", "minimal", "low"]
72
- use_reasoning_prompt = reasoning_effort not in [None, "disable", "minimal", "low"]
68
+ return reasoning_effort not in ["disable", "minimal", "low"]
69
+
70
+
71
+ def resolve_reasoning_effort(model: Model, reasoning_effort: str) -> str | None:
72
+ """
73
+ Resolve the reasoning effort setting based on the model and provided reasoning effort.
74
+ """
75
+ # check that model is a reasoning model, throw an assertion error otherwise
76
+ assert model.is_reasoning_model(), f"Model {model} is not a reasoning model. Should only use resolve_reasoning_effort with reasoning models."
73
77
 
74
78
  # if reasoning_effort is set to "default", set it to None to use model defaults
75
79
  if reasoning_effort == "default":
76
80
  reasoning_effort = None
77
81
 
78
82
  # translate reasoning_effort into model-specific settings
79
- if model is not None and model.is_reasoning_model():
80
- if model.is_vertex_model() or model.is_google_ai_studio_model():
81
- if reasoning_effort is None and model in [Model.GEMINI_2_5_PRO, Model.GOOGLE_GEMINI_2_5_PRO]:
82
- reasoning_effort = "low"
83
- elif reasoning_effort is None:
84
- reasoning_effort = "disable"
85
- elif model.is_openai_model():
86
- reasoning_effort = "minimal" if reasoning_effort in [None, "disable", "minimal", "low"] else reasoning_effort
83
+ if model.is_vertex_model() or model.is_google_ai_studio_model():
84
+ if reasoning_effort is None and model in [Model.GEMINI_2_5_PRO, Model.GOOGLE_GEMINI_2_5_PRO]:
85
+ reasoning_effort = "low"
86
+ elif reasoning_effort is None:
87
+ reasoning_effort = "disable"
88
+ elif model.is_openai_model():
89
+ reasoning_effort = "low" if reasoning_effort in [None, "disable", "minimal", "low"] else reasoning_effort
87
90
 
88
- return use_reasoning_prompt, reasoning_effort
91
+ return reasoning_effort
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: palimpzest
3
- Version: 1.3.2
3
+ Version: 1.3.4
4
4
  Summary: Palimpzest is a system which enables anyone to process AI-powered analytical queries simply by defining them in a declarative language
5
5
  Author-email: MIT DSG Semantic Management Lab <michjc@csail.mit.edu>
6
6
  Project-URL: homepage, https://palimpzest.org
File without changes
File without changes
File without changes