opik 1.9.26__py3-none-any.whl → 1.9.41__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. opik/__init__.py +10 -3
  2. opik/api_objects/dataset/rest_operations.py +2 -0
  3. opik/api_objects/experiment/experiment.py +31 -5
  4. opik/api_objects/experiment/helpers.py +34 -10
  5. opik/api_objects/local_recording.py +8 -3
  6. opik/api_objects/opik_client.py +218 -46
  7. opik/api_objects/opik_query_language.py +9 -0
  8. opik/api_objects/prompt/__init__.py +11 -3
  9. opik/api_objects/prompt/base_prompt.py +69 -0
  10. opik/api_objects/prompt/base_prompt_template.py +29 -0
  11. opik/api_objects/prompt/chat/__init__.py +1 -0
  12. opik/api_objects/prompt/chat/chat_prompt.py +193 -0
  13. opik/api_objects/prompt/chat/chat_prompt_template.py +350 -0
  14. opik/api_objects/prompt/{chat_content_renderer_registry.py → chat/content_renderer_registry.py} +31 -34
  15. opik/api_objects/prompt/client.py +101 -30
  16. opik/api_objects/prompt/text/__init__.py +1 -0
  17. opik/api_objects/prompt/{prompt.py → text/prompt.py} +55 -32
  18. opik/api_objects/prompt/{prompt_template.py → text/prompt_template.py} +8 -5
  19. opik/cli/export.py +6 -2
  20. opik/config.py +0 -5
  21. opik/decorator/base_track_decorator.py +37 -40
  22. opik/evaluation/__init__.py +13 -2
  23. opik/evaluation/engine/engine.py +195 -223
  24. opik/evaluation/engine/helpers.py +8 -7
  25. opik/evaluation/engine/metrics_evaluator.py +237 -0
  26. opik/evaluation/evaluation_result.py +35 -1
  27. opik/evaluation/evaluator.py +309 -23
  28. opik/evaluation/models/litellm/util.py +78 -6
  29. opik/evaluation/report.py +14 -2
  30. opik/evaluation/rest_operations.py +6 -9
  31. opik/evaluation/test_case.py +2 -2
  32. opik/evaluation/types.py +9 -1
  33. opik/exceptions.py +17 -0
  34. opik/id_helpers.py +18 -0
  35. opik/integrations/adk/helpers.py +16 -7
  36. opik/integrations/adk/legacy_opik_tracer.py +7 -4
  37. opik/integrations/adk/opik_tracer.py +3 -1
  38. opik/integrations/adk/patchers/adk_otel_tracer/opik_adk_otel_tracer.py +7 -3
  39. opik/integrations/dspy/callback.py +1 -4
  40. opik/integrations/haystack/opik_connector.py +2 -2
  41. opik/integrations/haystack/opik_tracer.py +2 -4
  42. opik/integrations/langchain/opik_tracer.py +1 -4
  43. opik/integrations/llama_index/callback.py +2 -4
  44. opik/integrations/openai/agents/opik_tracing_processor.py +1 -2
  45. opik/integrations/openai/opik_tracker.py +1 -1
  46. opik/opik_context.py +7 -7
  47. opik/rest_api/__init__.py +127 -11
  48. opik/rest_api/dashboards/client.py +65 -2
  49. opik/rest_api/dashboards/raw_client.py +82 -0
  50. opik/rest_api/datasets/client.py +538 -2
  51. opik/rest_api/datasets/raw_client.py +1347 -441
  52. opik/rest_api/experiments/client.py +30 -2
  53. opik/rest_api/experiments/raw_client.py +26 -0
  54. opik/rest_api/optimizations/client.py +302 -0
  55. opik/rest_api/optimizations/raw_client.py +463 -0
  56. opik/rest_api/optimizations/types/optimization_update_status.py +3 -1
  57. opik/rest_api/prompts/__init__.py +2 -2
  58. opik/rest_api/prompts/client.py +34 -4
  59. opik/rest_api/prompts/raw_client.py +32 -2
  60. opik/rest_api/prompts/types/__init__.py +3 -1
  61. opik/rest_api/prompts/types/create_prompt_version_detail_template_structure.py +5 -0
  62. opik/rest_api/prompts/types/prompt_write_template_structure.py +5 -0
  63. opik/rest_api/traces/client.py +6 -6
  64. opik/rest_api/traces/raw_client.py +4 -4
  65. opik/rest_api/types/__init__.py +125 -11
  66. opik/rest_api/types/aggregation_data.py +1 -0
  67. opik/rest_api/types/automation_rule_evaluator.py +23 -1
  68. opik/rest_api/types/automation_rule_evaluator_llm_as_judge.py +2 -0
  69. opik/rest_api/types/automation_rule_evaluator_llm_as_judge_public.py +2 -0
  70. opik/rest_api/types/automation_rule_evaluator_llm_as_judge_write.py +2 -0
  71. opik/rest_api/types/{automation_rule_evaluator_object_public.py → automation_rule_evaluator_object_object_public.py} +32 -10
  72. opik/rest_api/types/automation_rule_evaluator_page_public.py +2 -2
  73. opik/rest_api/types/automation_rule_evaluator_public.py +23 -1
  74. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge.py +22 -0
  75. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge_public.py +22 -0
  76. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge_write.py +22 -0
  77. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge.py +2 -0
  78. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_public.py +2 -0
  79. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_write.py +2 -0
  80. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python.py +2 -0
  81. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_public.py +2 -0
  82. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_write.py +2 -0
  83. opik/rest_api/types/automation_rule_evaluator_update.py +23 -1
  84. opik/rest_api/types/automation_rule_evaluator_update_llm_as_judge.py +2 -0
  85. opik/rest_api/types/automation_rule_evaluator_update_span_llm_as_judge.py +22 -0
  86. opik/rest_api/types/automation_rule_evaluator_update_trace_thread_llm_as_judge.py +2 -0
  87. opik/rest_api/types/automation_rule_evaluator_update_trace_thread_user_defined_metric_python.py +2 -0
  88. opik/rest_api/types/automation_rule_evaluator_update_user_defined_metric_python.py +2 -0
  89. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python.py +2 -0
  90. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_public.py +2 -0
  91. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_write.py +2 -0
  92. opik/rest_api/types/automation_rule_evaluator_write.py +23 -1
  93. opik/rest_api/types/dashboard_page_public.py +1 -0
  94. opik/rest_api/types/dataset.py +4 -0
  95. opik/rest_api/types/dataset_item.py +1 -0
  96. opik/rest_api/types/dataset_item_compare.py +1 -0
  97. opik/rest_api/types/dataset_item_page_compare.py +1 -0
  98. opik/rest_api/types/dataset_item_page_public.py +1 -0
  99. opik/rest_api/types/dataset_item_public.py +1 -0
  100. opik/rest_api/types/dataset_public.py +4 -0
  101. opik/rest_api/types/dataset_public_status.py +5 -0
  102. opik/rest_api/types/dataset_status.py +5 -0
  103. opik/rest_api/types/dataset_version_diff.py +22 -0
  104. opik/rest_api/types/dataset_version_diff_stats.py +24 -0
  105. opik/rest_api/types/dataset_version_page_public.py +23 -0
  106. opik/rest_api/types/dataset_version_public.py +54 -0
  107. opik/rest_api/types/dataset_version_summary.py +41 -0
  108. opik/rest_api/types/dataset_version_summary_public.py +41 -0
  109. opik/rest_api/types/experiment.py +2 -0
  110. opik/rest_api/types/experiment_public.py +2 -0
  111. opik/rest_api/types/experiment_score.py +20 -0
  112. opik/rest_api/types/experiment_score_public.py +20 -0
  113. opik/rest_api/types/experiment_score_write.py +20 -0
  114. opik/rest_api/types/feedback_score_public.py +4 -0
  115. opik/rest_api/types/group_content_with_aggregations.py +1 -0
  116. opik/rest_api/types/optimization.py +2 -0
  117. opik/rest_api/types/optimization_public.py +2 -0
  118. opik/rest_api/types/optimization_public_status.py +3 -1
  119. opik/rest_api/types/optimization_status.py +3 -1
  120. opik/rest_api/types/optimization_studio_config.py +27 -0
  121. opik/rest_api/types/optimization_studio_config_public.py +27 -0
  122. opik/rest_api/types/optimization_studio_config_write.py +27 -0
  123. opik/rest_api/types/optimization_studio_log.py +22 -0
  124. opik/rest_api/types/optimization_write.py +2 -0
  125. opik/rest_api/types/optimization_write_status.py +3 -1
  126. opik/rest_api/types/prompt.py +6 -0
  127. opik/rest_api/types/prompt_detail.py +6 -0
  128. opik/rest_api/types/prompt_detail_template_structure.py +5 -0
  129. opik/rest_api/types/prompt_public.py +6 -0
  130. opik/rest_api/types/prompt_public_template_structure.py +5 -0
  131. opik/rest_api/types/prompt_template_structure.py +5 -0
  132. opik/rest_api/types/prompt_version.py +2 -0
  133. opik/rest_api/types/prompt_version_detail.py +2 -0
  134. opik/rest_api/types/prompt_version_detail_template_structure.py +5 -0
  135. opik/rest_api/types/prompt_version_public.py +2 -0
  136. opik/rest_api/types/prompt_version_public_template_structure.py +5 -0
  137. opik/rest_api/types/prompt_version_template_structure.py +5 -0
  138. opik/rest_api/types/score_name.py +1 -0
  139. opik/rest_api/types/service_toggles_config.py +5 -0
  140. opik/rest_api/types/span_filter.py +23 -0
  141. opik/rest_api/types/span_filter_operator.py +21 -0
  142. opik/rest_api/types/span_filter_write.py +23 -0
  143. opik/rest_api/types/span_filter_write_operator.py +21 -0
  144. opik/rest_api/types/span_llm_as_judge_code.py +27 -0
  145. opik/rest_api/types/span_llm_as_judge_code_public.py +27 -0
  146. opik/rest_api/types/span_llm_as_judge_code_write.py +27 -0
  147. opik/rest_api/types/studio_evaluation.py +20 -0
  148. opik/rest_api/types/studio_evaluation_public.py +20 -0
  149. opik/rest_api/types/studio_evaluation_write.py +20 -0
  150. opik/rest_api/types/studio_llm_model.py +21 -0
  151. opik/rest_api/types/studio_llm_model_public.py +21 -0
  152. opik/rest_api/types/studio_llm_model_write.py +21 -0
  153. opik/rest_api/types/studio_message.py +20 -0
  154. opik/rest_api/types/studio_message_public.py +20 -0
  155. opik/rest_api/types/studio_message_write.py +20 -0
  156. opik/rest_api/types/studio_metric.py +21 -0
  157. opik/rest_api/types/studio_metric_public.py +21 -0
  158. opik/rest_api/types/studio_metric_write.py +21 -0
  159. opik/rest_api/types/studio_optimizer.py +21 -0
  160. opik/rest_api/types/studio_optimizer_public.py +21 -0
  161. opik/rest_api/types/studio_optimizer_write.py +21 -0
  162. opik/rest_api/types/studio_prompt.py +20 -0
  163. opik/rest_api/types/studio_prompt_public.py +20 -0
  164. opik/rest_api/types/studio_prompt_write.py +20 -0
  165. opik/rest_api/types/trace.py +6 -0
  166. opik/rest_api/types/trace_public.py +6 -0
  167. opik/rest_api/types/trace_thread_filter_write.py +23 -0
  168. opik/rest_api/types/trace_thread_filter_write_operator.py +21 -0
  169. opik/rest_api/types/value_entry.py +2 -0
  170. opik/rest_api/types/value_entry_compare.py +2 -0
  171. opik/rest_api/types/value_entry_experiment_item_bulk_write_view.py +2 -0
  172. opik/rest_api/types/value_entry_public.py +2 -0
  173. opik/synchronization.py +5 -6
  174. opik/{decorator/tracing_runtime_config.py → tracing_runtime_config.py} +6 -7
  175. {opik-1.9.26.dist-info → opik-1.9.41.dist-info}/METADATA +4 -3
  176. {opik-1.9.26.dist-info → opik-1.9.41.dist-info}/RECORD +180 -120
  177. opik/api_objects/prompt/chat_prompt_template.py +0 -200
  178. {opik-1.9.26.dist-info → opik-1.9.41.dist-info}/WHEEL +0 -0
  179. {opik-1.9.26.dist-info → opik-1.9.41.dist-info}/entry_points.txt +0 -0
  180. {opik-1.9.26.dist-info → opik-1.9.41.dist-info}/licenses/LICENSE +0 -0
  181. {opik-1.9.26.dist-info → opik-1.9.41.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,41 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+
8
+
9
+ class DatasetVersionSummary(UniversalBaseModel):
10
+ """
11
+ Summary of the latest dataset version
12
+ """
13
+
14
+ id: typing.Optional[str] = pydantic.Field(default=None)
15
+ """
16
+ Unique identifier of the version
17
+ """
18
+
19
+ version_hash: typing.Optional[str] = pydantic.Field(default=None)
20
+ """
21
+ Hash of the version content
22
+ """
23
+
24
+ change_description: typing.Optional[str] = pydantic.Field(default=None)
25
+ """
26
+ Description of changes in this version
27
+ """
28
+
29
+ tags: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
30
+ """
31
+ Tags associated with this version
32
+ """
33
+
34
+ if IS_PYDANTIC_V2:
35
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
36
+ else:
37
+
38
+ class Config:
39
+ frozen = True
40
+ smart_union = True
41
+ extra = pydantic.Extra.allow
@@ -0,0 +1,41 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+
8
+
9
+ class DatasetVersionSummaryPublic(UniversalBaseModel):
10
+ """
11
+ Summary of the latest dataset version
12
+ """
13
+
14
+ id: typing.Optional[str] = pydantic.Field(default=None)
15
+ """
16
+ Unique identifier of the version
17
+ """
18
+
19
+ version_hash: typing.Optional[str] = pydantic.Field(default=None)
20
+ """
21
+ Hash of the version content
22
+ """
23
+
24
+ change_description: typing.Optional[str] = pydantic.Field(default=None)
25
+ """
26
+ Description of changes in this version
27
+ """
28
+
29
+ tags: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
30
+ """
31
+ Tags associated with this version
32
+ """
33
+
34
+ if IS_PYDANTIC_V2:
35
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
36
+ else:
37
+
38
+ class Config:
39
+ frozen = True
40
+ smart_union = True
41
+ extra = pydantic.Extra.allow
@@ -6,6 +6,7 @@ import typing
6
6
  import pydantic
7
7
  from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
8
8
  from .comment import Comment
9
+ from .experiment_score import ExperimentScore
9
10
  from .experiment_status import ExperimentStatus
10
11
  from .experiment_type import ExperimentType
11
12
  from .feedback_score_average import FeedbackScoreAverage
@@ -34,6 +35,7 @@ class Experiment(UniversalBaseModel):
34
35
  created_by: typing.Optional[str] = None
35
36
  last_updated_by: typing.Optional[str] = None
36
37
  status: typing.Optional[ExperimentStatus] = None
38
+ experiment_scores: typing.Optional[typing.List[ExperimentScore]] = None
37
39
  prompt_version: typing.Optional[PromptVersionLink] = None
38
40
  prompt_versions: typing.Optional[typing.List[PromptVersionLink]] = None
39
41
 
@@ -8,6 +8,7 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
8
8
  from .comment_public import CommentPublic
9
9
  from .experiment_public_status import ExperimentPublicStatus
10
10
  from .experiment_public_type import ExperimentPublicType
11
+ from .experiment_score_public import ExperimentScorePublic
11
12
  from .feedback_score_average_public import FeedbackScoreAveragePublic
12
13
  from .json_list_string_public import JsonListStringPublic
13
14
  from .percentage_values_public import PercentageValuesPublic
@@ -34,6 +35,7 @@ class ExperimentPublic(UniversalBaseModel):
34
35
  created_by: typing.Optional[str] = None
35
36
  last_updated_by: typing.Optional[str] = None
36
37
  status: typing.Optional[ExperimentPublicStatus] = None
38
+ experiment_scores: typing.Optional[typing.List[ExperimentScorePublic]] = None
37
39
  prompt_version: typing.Optional[PromptVersionLinkPublic] = None
38
40
  prompt_versions: typing.Optional[typing.List[PromptVersionLinkPublic]] = None
39
41
 
@@ -0,0 +1,20 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+
8
+
9
+ class ExperimentScore(UniversalBaseModel):
10
+ name: str
11
+ value: float
12
+
13
+ if IS_PYDANTIC_V2:
14
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
15
+ else:
16
+
17
+ class Config:
18
+ frozen = True
19
+ smart_union = True
20
+ extra = pydantic.Extra.allow
@@ -0,0 +1,20 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+
8
+
9
+ class ExperimentScorePublic(UniversalBaseModel):
10
+ name: str
11
+ value: float
12
+
13
+ if IS_PYDANTIC_V2:
14
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
15
+ else:
16
+
17
+ class Config:
18
+ frozen = True
19
+ smart_union = True
20
+ extra = pydantic.Extra.allow
@@ -0,0 +1,20 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+
8
+
9
+ class ExperimentScoreWrite(UniversalBaseModel):
10
+ name: str
11
+ value: float
12
+
13
+ if IS_PYDANTIC_V2:
14
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
15
+ else:
16
+
17
+ class Config:
18
+ frozen = True
19
+ smart_union = True
20
+ extra = pydantic.Extra.allow
@@ -10,6 +10,10 @@ from .value_entry_public import ValueEntryPublic
10
10
 
11
11
 
12
12
  class FeedbackScorePublic(UniversalBaseModel):
13
+ """
14
+ Aggregated feedback scores from all spans in this trace, averaged by score name
15
+ """
16
+
13
17
  name: str
14
18
  category_name: typing.Optional[str] = None
15
19
  value: float
@@ -8,6 +8,7 @@ from .aggregation_data import AggregationData
8
8
 
9
9
 
10
10
  class GroupContentWithAggregations(UniversalBaseModel):
11
+ label: typing.Optional[str] = None
11
12
  aggregations: typing.Optional[AggregationData] = None
12
13
 
13
14
  if IS_PYDANTIC_V2:
@@ -8,6 +8,7 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
8
8
  from .feedback_score_average import FeedbackScoreAverage
9
9
  from .json_list_string import JsonListString
10
10
  from .optimization_status import OptimizationStatus
11
+ from .optimization_studio_config import OptimizationStudioConfig
11
12
 
12
13
 
13
14
  class Optimization(UniversalBaseModel):
@@ -17,6 +18,7 @@ class Optimization(UniversalBaseModel):
17
18
  objective_name: str
18
19
  status: OptimizationStatus
19
20
  metadata: typing.Optional[JsonListString] = None
21
+ studio_config: typing.Optional[OptimizationStudioConfig] = None
20
22
  dataset_id: typing.Optional[str] = None
21
23
  num_trials: typing.Optional[int] = None
22
24
  feedback_scores: typing.Optional[typing.List[FeedbackScoreAverage]] = None
@@ -8,6 +8,7 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
8
8
  from .feedback_score_average_public import FeedbackScoreAveragePublic
9
9
  from .json_list_string_public import JsonListStringPublic
10
10
  from .optimization_public_status import OptimizationPublicStatus
11
+ from .optimization_studio_config_public import OptimizationStudioConfigPublic
11
12
 
12
13
 
13
14
  class OptimizationPublic(UniversalBaseModel):
@@ -17,6 +18,7 @@ class OptimizationPublic(UniversalBaseModel):
17
18
  objective_name: str
18
19
  status: OptimizationPublicStatus
19
20
  metadata: typing.Optional[JsonListStringPublic] = None
21
+ studio_config: typing.Optional[OptimizationStudioConfigPublic] = None
20
22
  dataset_id: typing.Optional[str] = None
21
23
  num_trials: typing.Optional[int] = None
22
24
  feedback_scores: typing.Optional[typing.List[FeedbackScoreAveragePublic]] = None
@@ -2,4 +2,6 @@
2
2
 
3
3
  import typing
4
4
 
5
- OptimizationPublicStatus = typing.Union[typing.Literal["running", "completed", "cancelled"], typing.Any]
5
+ OptimizationPublicStatus = typing.Union[
6
+ typing.Literal["running", "completed", "cancelled", "initialized", "error"], typing.Any
7
+ ]
@@ -2,4 +2,6 @@
2
2
 
3
3
  import typing
4
4
 
5
- OptimizationStatus = typing.Union[typing.Literal["running", "completed", "cancelled"], typing.Any]
5
+ OptimizationStatus = typing.Union[
6
+ typing.Literal["running", "completed", "cancelled", "initialized", "error"], typing.Any
7
+ ]
@@ -0,0 +1,27 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+ from .studio_evaluation import StudioEvaluation
8
+ from .studio_llm_model import StudioLlmModel
9
+ from .studio_optimizer import StudioOptimizer
10
+ from .studio_prompt import StudioPrompt
11
+
12
+
13
+ class OptimizationStudioConfig(UniversalBaseModel):
14
+ dataset_name: str
15
+ prompt: StudioPrompt
16
+ llm_model: StudioLlmModel
17
+ evaluation: StudioEvaluation
18
+ optimizer: StudioOptimizer
19
+
20
+ if IS_PYDANTIC_V2:
21
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
22
+ else:
23
+
24
+ class Config:
25
+ frozen = True
26
+ smart_union = True
27
+ extra = pydantic.Extra.allow
@@ -0,0 +1,27 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+ from .studio_evaluation_public import StudioEvaluationPublic
8
+ from .studio_llm_model_public import StudioLlmModelPublic
9
+ from .studio_optimizer_public import StudioOptimizerPublic
10
+ from .studio_prompt_public import StudioPromptPublic
11
+
12
+
13
+ class OptimizationStudioConfigPublic(UniversalBaseModel):
14
+ dataset_name: str
15
+ prompt: StudioPromptPublic
16
+ llm_model: StudioLlmModelPublic
17
+ evaluation: StudioEvaluationPublic
18
+ optimizer: StudioOptimizerPublic
19
+
20
+ if IS_PYDANTIC_V2:
21
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
22
+ else:
23
+
24
+ class Config:
25
+ frozen = True
26
+ smart_union = True
27
+ extra = pydantic.Extra.allow
@@ -0,0 +1,27 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+ from .studio_evaluation_write import StudioEvaluationWrite
8
+ from .studio_llm_model_write import StudioLlmModelWrite
9
+ from .studio_optimizer_write import StudioOptimizerWrite
10
+ from .studio_prompt_write import StudioPromptWrite
11
+
12
+
13
+ class OptimizationStudioConfigWrite(UniversalBaseModel):
14
+ dataset_name: str
15
+ prompt: StudioPromptWrite
16
+ llm_model: StudioLlmModelWrite
17
+ evaluation: StudioEvaluationWrite
18
+ optimizer: StudioOptimizerWrite
19
+
20
+ if IS_PYDANTIC_V2:
21
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
22
+ else:
23
+
24
+ class Config:
25
+ frozen = True
26
+ smart_union = True
27
+ extra = pydantic.Extra.allow
@@ -0,0 +1,22 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import datetime as dt
4
+ import typing
5
+
6
+ import pydantic
7
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
8
+
9
+
10
+ class OptimizationStudioLog(UniversalBaseModel):
11
+ url: typing.Optional[str] = None
12
+ last_modified: typing.Optional[dt.datetime] = None
13
+ expires_at: typing.Optional[dt.datetime] = None
14
+
15
+ if IS_PYDANTIC_V2:
16
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
17
+ else:
18
+
19
+ class Config:
20
+ frozen = True
21
+ smart_union = True
22
+ extra = pydantic.Extra.allow
@@ -6,6 +6,7 @@ import typing
6
6
  import pydantic
7
7
  from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
8
8
  from .json_list_string_write import JsonListStringWrite
9
+ from .optimization_studio_config_write import OptimizationStudioConfigWrite
9
10
  from .optimization_write_status import OptimizationWriteStatus
10
11
 
11
12
 
@@ -16,6 +17,7 @@ class OptimizationWrite(UniversalBaseModel):
16
17
  objective_name: str
17
18
  status: OptimizationWriteStatus
18
19
  metadata: typing.Optional[JsonListStringWrite] = None
20
+ studio_config: typing.Optional[OptimizationStudioConfigWrite] = None
19
21
  last_updated_at: typing.Optional[dt.datetime] = None
20
22
 
21
23
  if IS_PYDANTIC_V2:
@@ -2,4 +2,6 @@
2
2
 
3
3
  import typing
4
4
 
5
- OptimizationWriteStatus = typing.Union[typing.Literal["running", "completed", "cancelled"], typing.Any]
5
+ OptimizationWriteStatus = typing.Union[
6
+ typing.Literal["running", "completed", "cancelled", "initialized", "error"], typing.Any
7
+ ]
@@ -6,6 +6,7 @@ import typing
6
6
  import pydantic
7
7
  from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
8
8
  from .json_node import JsonNode
9
+ from .prompt_template_structure import PromptTemplateStructure
9
10
  from .prompt_type import PromptType
10
11
  from .prompt_version import PromptVersion
11
12
 
@@ -18,6 +19,11 @@ class Prompt(UniversalBaseModel):
18
19
  metadata: typing.Optional[JsonNode] = None
19
20
  change_description: typing.Optional[str] = None
20
21
  type: typing.Optional[PromptType] = None
22
+ template_structure: typing.Optional[PromptTemplateStructure] = pydantic.Field(default=None)
23
+ """
24
+ Template structure type: 'text' or 'chat'. Immutable after creation.
25
+ """
26
+
21
27
  tags: typing.Optional[typing.List[str]] = None
22
28
  created_at: typing.Optional[dt.datetime] = None
23
29
  created_by: typing.Optional[str] = None
@@ -5,6 +5,7 @@ import typing
5
5
 
6
6
  import pydantic
7
7
  from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
8
+ from .prompt_detail_template_structure import PromptDetailTemplateStructure
8
9
  from .prompt_version_detail import PromptVersionDetail
9
10
 
10
11
 
@@ -12,6 +13,11 @@ class PromptDetail(UniversalBaseModel):
12
13
  id: typing.Optional[str] = None
13
14
  name: str
14
15
  description: typing.Optional[str] = None
16
+ template_structure: typing.Optional[PromptDetailTemplateStructure] = pydantic.Field(default=None)
17
+ """
18
+ Template structure type: 'text' or 'chat'. Immutable after creation.
19
+ """
20
+
15
21
  tags: typing.Optional[typing.List[str]] = None
16
22
  created_at: typing.Optional[dt.datetime] = None
17
23
  created_by: typing.Optional[str] = None
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ PromptDetailTemplateStructure = typing.Union[typing.Literal["text", "chat"], typing.Any]
@@ -5,12 +5,18 @@ import typing
5
5
 
6
6
  import pydantic
7
7
  from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
8
+ from .prompt_public_template_structure import PromptPublicTemplateStructure
8
9
 
9
10
 
10
11
  class PromptPublic(UniversalBaseModel):
11
12
  id: typing.Optional[str] = None
12
13
  name: str
13
14
  description: typing.Optional[str] = None
15
+ template_structure: typing.Optional[PromptPublicTemplateStructure] = pydantic.Field(default=None)
16
+ """
17
+ Template structure type: 'text' or 'chat'. Immutable after creation.
18
+ """
19
+
14
20
  tags: typing.Optional[typing.List[str]] = None
15
21
  created_at: typing.Optional[dt.datetime] = None
16
22
  created_by: typing.Optional[str] = None
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ PromptPublicTemplateStructure = typing.Union[typing.Literal["text", "chat"], typing.Any]
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ PromptTemplateStructure = typing.Union[typing.Literal["text", "chat"], typing.Any]
@@ -6,6 +6,7 @@ import typing
6
6
  import pydantic
7
7
  from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
8
8
  from .json_node import JsonNode
9
+ from .prompt_version_template_structure import PromptVersionTemplateStructure
9
10
  from .prompt_version_type import PromptVersionType
10
11
 
11
12
 
@@ -26,6 +27,7 @@ class PromptVersion(UniversalBaseModel):
26
27
  type: typing.Optional[PromptVersionType] = None
27
28
  change_description: typing.Optional[str] = None
28
29
  variables: typing.Optional[typing.List[str]] = None
30
+ template_structure: typing.Optional[PromptVersionTemplateStructure] = None
29
31
  created_at: typing.Optional[dt.datetime] = None
30
32
  created_by: typing.Optional[str] = None
31
33
 
@@ -6,6 +6,7 @@ import typing
6
6
  import pydantic
7
7
  from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
8
8
  from .json_node_detail import JsonNodeDetail
9
+ from .prompt_version_detail_template_structure import PromptVersionDetailTemplateStructure
9
10
  from .prompt_version_detail_type import PromptVersionDetailType
10
11
 
11
12
 
@@ -26,6 +27,7 @@ class PromptVersionDetail(UniversalBaseModel):
26
27
  type: typing.Optional[PromptVersionDetailType] = None
27
28
  change_description: typing.Optional[str] = None
28
29
  variables: typing.Optional[typing.List[str]] = None
30
+ template_structure: typing.Optional[PromptVersionDetailTemplateStructure] = None
29
31
  created_at: typing.Optional[dt.datetime] = None
30
32
  created_by: typing.Optional[str] = None
31
33
 
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ PromptVersionDetailTemplateStructure = typing.Union[typing.Literal["text", "chat"], typing.Any]
@@ -6,6 +6,7 @@ import typing
6
6
  import pydantic
7
7
  from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
8
8
  from .json_node_public import JsonNodePublic
9
+ from .prompt_version_public_template_structure import PromptVersionPublicTemplateStructure
9
10
  from .prompt_version_public_type import PromptVersionPublicType
10
11
 
11
12
 
@@ -25,6 +26,7 @@ class PromptVersionPublic(UniversalBaseModel):
25
26
  metadata: typing.Optional[JsonNodePublic] = None
26
27
  type: typing.Optional[PromptVersionPublicType] = None
27
28
  change_description: typing.Optional[str] = None
29
+ template_structure: typing.Optional[PromptVersionPublicTemplateStructure] = None
28
30
  created_at: typing.Optional[dt.datetime] = None
29
31
  created_by: typing.Optional[str] = None
30
32
 
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ PromptVersionPublicTemplateStructure = typing.Union[typing.Literal["text", "chat"], typing.Any]
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ PromptVersionTemplateStructure = typing.Union[typing.Literal["text", "chat"], typing.Any]
@@ -8,6 +8,7 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
8
8
 
9
9
  class ScoreName(UniversalBaseModel):
10
10
  name: typing.Optional[str] = None
11
+ type: typing.Optional[str] = None
11
12
 
12
13
  if IS_PYDANTIC_V2:
13
14
  model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
@@ -13,11 +13,16 @@ class ServiceTogglesConfig(UniversalBaseModel):
13
13
  trace_thread_python_evaluator_enabled: typing_extensions.Annotated[
14
14
  bool, FieldMetadata(alias="traceThreadPythonEvaluatorEnabled")
15
15
  ]
16
+ span_llm_as_judge_enabled: typing_extensions.Annotated[bool, FieldMetadata(alias="spanLlmAsJudgeEnabled")]
16
17
  guardrails_enabled: typing_extensions.Annotated[bool, FieldMetadata(alias="guardrailsEnabled")]
17
18
  opik_ai_enabled: typing_extensions.Annotated[bool, FieldMetadata(alias="opikAIEnabled")]
18
19
  alerts_enabled: typing_extensions.Annotated[bool, FieldMetadata(alias="alertsEnabled")]
19
20
  welcome_wizard_enabled: typing_extensions.Annotated[bool, FieldMetadata(alias="welcomeWizardEnabled")]
20
21
  csv_upload_enabled: typing_extensions.Annotated[bool, FieldMetadata(alias="csvUploadEnabled")]
22
+ export_enabled: typing_extensions.Annotated[bool, FieldMetadata(alias="exportEnabled")]
23
+ optimization_studio_enabled: typing_extensions.Annotated[bool, FieldMetadata(alias="optimizationStudioEnabled")]
24
+ dashboards_enabled: typing_extensions.Annotated[bool, FieldMetadata(alias="dashboardsEnabled")]
25
+ dataset_versioning_enabled: typing_extensions.Annotated[bool, FieldMetadata(alias="datasetVersioningEnabled")]
21
26
 
22
27
  if IS_PYDANTIC_V2:
23
28
  model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
@@ -0,0 +1,23 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+ from .span_filter_operator import SpanFilterOperator
8
+
9
+
10
+ class SpanFilter(UniversalBaseModel):
11
+ field: typing.Optional[str] = None
12
+ operator: typing.Optional[SpanFilterOperator] = None
13
+ key: typing.Optional[str] = None
14
+ value: typing.Optional[str] = None
15
+
16
+ if IS_PYDANTIC_V2:
17
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
18
+ else:
19
+
20
+ class Config:
21
+ frozen = True
22
+ smart_union = True
23
+ extra = pydantic.Extra.allow
@@ -0,0 +1,21 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ SpanFilterOperator = typing.Union[
6
+ typing.Literal[
7
+ "contains",
8
+ "not_contains",
9
+ "starts_with",
10
+ "ends_with",
11
+ "=",
12
+ "!=",
13
+ ">",
14
+ ">=",
15
+ "<",
16
+ "<=",
17
+ "is_empty",
18
+ "is_not_empty",
19
+ ],
20
+ typing.Any,
21
+ ]
@@ -0,0 +1,23 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+ from .span_filter_write_operator import SpanFilterWriteOperator
8
+
9
+
10
+ class SpanFilterWrite(UniversalBaseModel):
11
+ field: typing.Optional[str] = None
12
+ operator: typing.Optional[SpanFilterWriteOperator] = None
13
+ key: typing.Optional[str] = None
14
+ value: typing.Optional[str] = None
15
+
16
+ if IS_PYDANTIC_V2:
17
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
18
+ else:
19
+
20
+ class Config:
21
+ frozen = True
22
+ smart_union = True
23
+ extra = pydantic.Extra.allow
@@ -0,0 +1,21 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ SpanFilterWriteOperator = typing.Union[
6
+ typing.Literal[
7
+ "contains",
8
+ "not_contains",
9
+ "starts_with",
10
+ "ends_with",
11
+ "=",
12
+ "!=",
13
+ ">",
14
+ ">=",
15
+ "<",
16
+ "<=",
17
+ "is_empty",
18
+ "is_not_empty",
19
+ ],
20
+ typing.Any,
21
+ ]