opik 1.9.5__py3-none-any.whl → 1.9.39__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 (248) hide show
  1. opik/__init__.py +10 -3
  2. opik/anonymizer/__init__.py +5 -0
  3. opik/anonymizer/anonymizer.py +12 -0
  4. opik/anonymizer/factory.py +80 -0
  5. opik/anonymizer/recursive_anonymizer.py +64 -0
  6. opik/anonymizer/rules.py +56 -0
  7. opik/anonymizer/rules_anonymizer.py +35 -0
  8. opik/api_objects/dataset/rest_operations.py +5 -0
  9. opik/api_objects/experiment/experiment.py +46 -49
  10. opik/api_objects/experiment/helpers.py +34 -10
  11. opik/api_objects/local_recording.py +8 -3
  12. opik/api_objects/opik_client.py +230 -48
  13. opik/api_objects/opik_query_language.py +9 -0
  14. opik/api_objects/prompt/__init__.py +11 -3
  15. opik/api_objects/prompt/base_prompt.py +69 -0
  16. opik/api_objects/prompt/base_prompt_template.py +29 -0
  17. opik/api_objects/prompt/chat/__init__.py +1 -0
  18. opik/api_objects/prompt/chat/chat_prompt.py +193 -0
  19. opik/api_objects/prompt/chat/chat_prompt_template.py +350 -0
  20. opik/api_objects/prompt/{chat_content_renderer_registry.py → chat/content_renderer_registry.py} +37 -35
  21. opik/api_objects/prompt/client.py +101 -30
  22. opik/api_objects/prompt/text/__init__.py +1 -0
  23. opik/api_objects/prompt/text/prompt.py +174 -0
  24. opik/api_objects/prompt/{prompt_template.py → text/prompt_template.py} +10 -6
  25. opik/api_objects/prompt/types.py +1 -1
  26. opik/cli/export.py +6 -2
  27. opik/cli/usage_report/charts.py +39 -10
  28. opik/cli/usage_report/cli.py +164 -45
  29. opik/cli/usage_report/pdf.py +14 -1
  30. opik/config.py +0 -5
  31. opik/decorator/base_track_decorator.py +37 -40
  32. opik/decorator/context_manager/span_context_manager.py +9 -0
  33. opik/decorator/context_manager/trace_context_manager.py +5 -0
  34. opik/dict_utils.py +3 -3
  35. opik/evaluation/__init__.py +13 -2
  36. opik/evaluation/engine/engine.py +195 -223
  37. opik/evaluation/engine/helpers.py +8 -7
  38. opik/evaluation/engine/metrics_evaluator.py +237 -0
  39. opik/evaluation/evaluation_result.py +35 -1
  40. opik/evaluation/evaluator.py +318 -30
  41. opik/evaluation/models/litellm/util.py +78 -6
  42. opik/evaluation/models/model_capabilities.py +33 -0
  43. opik/evaluation/report.py +14 -2
  44. opik/evaluation/rest_operations.py +36 -33
  45. opik/evaluation/test_case.py +2 -2
  46. opik/evaluation/types.py +9 -1
  47. opik/exceptions.py +17 -0
  48. opik/hooks/__init__.py +17 -1
  49. opik/hooks/anonymizer_hook.py +36 -0
  50. opik/id_helpers.py +18 -0
  51. opik/integrations/adk/helpers.py +16 -7
  52. opik/integrations/adk/legacy_opik_tracer.py +7 -4
  53. opik/integrations/adk/opik_tracer.py +3 -1
  54. opik/integrations/adk/patchers/adk_otel_tracer/opik_adk_otel_tracer.py +7 -3
  55. opik/integrations/adk/recursive_callback_injector.py +1 -6
  56. opik/integrations/dspy/callback.py +1 -4
  57. opik/integrations/haystack/opik_connector.py +2 -2
  58. opik/integrations/haystack/opik_tracer.py +2 -4
  59. opik/integrations/langchain/opik_tracer.py +273 -82
  60. opik/integrations/llama_index/callback.py +110 -108
  61. opik/integrations/openai/agents/opik_tracing_processor.py +1 -2
  62. opik/integrations/openai/opik_tracker.py +1 -1
  63. opik/message_processing/batching/batchers.py +11 -7
  64. opik/message_processing/encoder_helpers.py +79 -0
  65. opik/message_processing/messages.py +25 -1
  66. opik/message_processing/online_message_processor.py +23 -8
  67. opik/opik_context.py +7 -7
  68. opik/rest_api/__init__.py +188 -12
  69. opik/rest_api/client.py +3 -0
  70. opik/rest_api/dashboards/__init__.py +4 -0
  71. opik/rest_api/dashboards/client.py +462 -0
  72. opik/rest_api/dashboards/raw_client.py +648 -0
  73. opik/rest_api/datasets/client.py +893 -89
  74. opik/rest_api/datasets/raw_client.py +1328 -87
  75. opik/rest_api/experiments/client.py +30 -2
  76. opik/rest_api/experiments/raw_client.py +26 -0
  77. opik/rest_api/feedback_definitions/types/find_feedback_definitions_request_type.py +1 -1
  78. opik/rest_api/optimizations/client.py +302 -0
  79. opik/rest_api/optimizations/raw_client.py +463 -0
  80. opik/rest_api/optimizations/types/optimization_update_status.py +3 -1
  81. opik/rest_api/prompts/__init__.py +2 -2
  82. opik/rest_api/prompts/client.py +34 -4
  83. opik/rest_api/prompts/raw_client.py +32 -2
  84. opik/rest_api/prompts/types/__init__.py +3 -1
  85. opik/rest_api/prompts/types/create_prompt_version_detail_template_structure.py +5 -0
  86. opik/rest_api/prompts/types/prompt_write_template_structure.py +5 -0
  87. opik/rest_api/spans/__init__.py +0 -2
  88. opik/rest_api/spans/client.py +148 -64
  89. opik/rest_api/spans/raw_client.py +210 -83
  90. opik/rest_api/spans/types/__init__.py +0 -2
  91. opik/rest_api/traces/client.py +241 -73
  92. opik/rest_api/traces/raw_client.py +344 -90
  93. opik/rest_api/types/__init__.py +200 -15
  94. opik/rest_api/types/aggregation_data.py +1 -0
  95. opik/rest_api/types/alert_trigger_config_public_type.py +6 -1
  96. opik/rest_api/types/alert_trigger_config_type.py +6 -1
  97. opik/rest_api/types/alert_trigger_config_write_type.py +6 -1
  98. opik/rest_api/types/automation_rule_evaluator.py +23 -1
  99. opik/rest_api/types/automation_rule_evaluator_llm_as_judge.py +2 -0
  100. opik/rest_api/types/automation_rule_evaluator_llm_as_judge_public.py +2 -0
  101. opik/rest_api/types/automation_rule_evaluator_llm_as_judge_write.py +2 -0
  102. opik/rest_api/types/{automation_rule_evaluator_object_public.py → automation_rule_evaluator_object_object_public.py} +32 -10
  103. opik/rest_api/types/automation_rule_evaluator_page_public.py +2 -2
  104. opik/rest_api/types/automation_rule_evaluator_public.py +23 -1
  105. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge.py +22 -0
  106. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge_public.py +22 -0
  107. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge_write.py +22 -0
  108. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge.py +2 -0
  109. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_public.py +2 -0
  110. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_write.py +2 -0
  111. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python.py +2 -0
  112. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_public.py +2 -0
  113. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_write.py +2 -0
  114. opik/rest_api/types/automation_rule_evaluator_update.py +23 -1
  115. opik/rest_api/types/automation_rule_evaluator_update_llm_as_judge.py +2 -0
  116. opik/rest_api/types/automation_rule_evaluator_update_span_llm_as_judge.py +22 -0
  117. opik/rest_api/types/automation_rule_evaluator_update_trace_thread_llm_as_judge.py +2 -0
  118. opik/rest_api/types/automation_rule_evaluator_update_trace_thread_user_defined_metric_python.py +2 -0
  119. opik/rest_api/types/automation_rule_evaluator_update_user_defined_metric_python.py +2 -0
  120. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python.py +2 -0
  121. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_public.py +2 -0
  122. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_write.py +2 -0
  123. opik/rest_api/types/automation_rule_evaluator_write.py +23 -1
  124. opik/rest_api/types/boolean_feedback_definition.py +25 -0
  125. opik/rest_api/types/boolean_feedback_definition_create.py +20 -0
  126. opik/rest_api/types/boolean_feedback_definition_public.py +25 -0
  127. opik/rest_api/types/boolean_feedback_definition_update.py +20 -0
  128. opik/rest_api/types/boolean_feedback_detail.py +29 -0
  129. opik/rest_api/types/boolean_feedback_detail_create.py +29 -0
  130. opik/rest_api/types/boolean_feedback_detail_public.py +29 -0
  131. opik/rest_api/types/boolean_feedback_detail_update.py +29 -0
  132. opik/rest_api/types/dashboard_page_public.py +24 -0
  133. opik/rest_api/types/dashboard_public.py +30 -0
  134. opik/rest_api/types/dataset.py +2 -0
  135. opik/rest_api/types/dataset_item.py +2 -0
  136. opik/rest_api/types/dataset_item_compare.py +2 -0
  137. opik/rest_api/types/dataset_item_filter.py +23 -0
  138. opik/rest_api/types/dataset_item_filter_operator.py +21 -0
  139. opik/rest_api/types/dataset_item_page_compare.py +1 -0
  140. opik/rest_api/types/dataset_item_page_public.py +1 -0
  141. opik/rest_api/types/dataset_item_public.py +2 -0
  142. opik/rest_api/types/dataset_item_update.py +39 -0
  143. opik/rest_api/types/dataset_item_write.py +1 -0
  144. opik/rest_api/types/dataset_public.py +2 -0
  145. opik/rest_api/types/dataset_public_status.py +5 -0
  146. opik/rest_api/types/dataset_status.py +5 -0
  147. opik/rest_api/types/dataset_version_diff.py +22 -0
  148. opik/rest_api/types/dataset_version_diff_stats.py +24 -0
  149. opik/rest_api/types/dataset_version_page_public.py +23 -0
  150. opik/rest_api/types/dataset_version_public.py +49 -0
  151. opik/rest_api/types/experiment.py +2 -0
  152. opik/rest_api/types/experiment_public.py +2 -0
  153. opik/rest_api/types/experiment_score.py +20 -0
  154. opik/rest_api/types/experiment_score_public.py +20 -0
  155. opik/rest_api/types/experiment_score_write.py +20 -0
  156. opik/rest_api/types/feedback.py +20 -1
  157. opik/rest_api/types/feedback_create.py +16 -1
  158. opik/rest_api/types/feedback_object_public.py +22 -1
  159. opik/rest_api/types/feedback_public.py +20 -1
  160. opik/rest_api/types/feedback_score_public.py +4 -0
  161. opik/rest_api/types/feedback_update.py +16 -1
  162. opik/rest_api/types/image_url.py +20 -0
  163. opik/rest_api/types/image_url_public.py +20 -0
  164. opik/rest_api/types/image_url_write.py +20 -0
  165. opik/rest_api/types/llm_as_judge_message.py +5 -1
  166. opik/rest_api/types/llm_as_judge_message_content.py +24 -0
  167. opik/rest_api/types/llm_as_judge_message_content_public.py +24 -0
  168. opik/rest_api/types/llm_as_judge_message_content_write.py +24 -0
  169. opik/rest_api/types/llm_as_judge_message_public.py +5 -1
  170. opik/rest_api/types/llm_as_judge_message_write.py +5 -1
  171. opik/rest_api/types/llm_as_judge_model_parameters.py +2 -0
  172. opik/rest_api/types/llm_as_judge_model_parameters_public.py +2 -0
  173. opik/rest_api/types/llm_as_judge_model_parameters_write.py +2 -0
  174. opik/rest_api/types/optimization.py +2 -0
  175. opik/rest_api/types/optimization_public.py +2 -0
  176. opik/rest_api/types/optimization_public_status.py +3 -1
  177. opik/rest_api/types/optimization_status.py +3 -1
  178. opik/rest_api/types/optimization_studio_config.py +27 -0
  179. opik/rest_api/types/optimization_studio_config_public.py +27 -0
  180. opik/rest_api/types/optimization_studio_config_write.py +27 -0
  181. opik/rest_api/types/optimization_studio_log.py +22 -0
  182. opik/rest_api/types/optimization_write.py +2 -0
  183. opik/rest_api/types/optimization_write_status.py +3 -1
  184. opik/rest_api/types/prompt.py +6 -0
  185. opik/rest_api/types/prompt_detail.py +6 -0
  186. opik/rest_api/types/prompt_detail_template_structure.py +5 -0
  187. opik/rest_api/types/prompt_public.py +6 -0
  188. opik/rest_api/types/prompt_public_template_structure.py +5 -0
  189. opik/rest_api/types/prompt_template_structure.py +5 -0
  190. opik/rest_api/types/prompt_version.py +2 -0
  191. opik/rest_api/types/prompt_version_detail.py +2 -0
  192. opik/rest_api/types/prompt_version_detail_template_structure.py +5 -0
  193. opik/rest_api/types/prompt_version_public.py +2 -0
  194. opik/rest_api/types/prompt_version_public_template_structure.py +5 -0
  195. opik/rest_api/types/prompt_version_template_structure.py +5 -0
  196. opik/rest_api/types/score_name.py +1 -0
  197. opik/rest_api/types/service_toggles_config.py +6 -0
  198. opik/rest_api/types/span_enrichment_options.py +31 -0
  199. opik/rest_api/types/span_filter.py +23 -0
  200. opik/rest_api/types/span_filter_operator.py +21 -0
  201. opik/rest_api/types/span_filter_write.py +23 -0
  202. opik/rest_api/types/span_filter_write_operator.py +21 -0
  203. opik/rest_api/types/span_llm_as_judge_code.py +27 -0
  204. opik/rest_api/types/span_llm_as_judge_code_public.py +27 -0
  205. opik/rest_api/types/span_llm_as_judge_code_write.py +27 -0
  206. opik/rest_api/types/span_update.py +46 -0
  207. opik/rest_api/types/studio_evaluation.py +20 -0
  208. opik/rest_api/types/studio_evaluation_public.py +20 -0
  209. opik/rest_api/types/studio_evaluation_write.py +20 -0
  210. opik/rest_api/types/studio_llm_model.py +21 -0
  211. opik/rest_api/types/studio_llm_model_public.py +21 -0
  212. opik/rest_api/types/studio_llm_model_write.py +21 -0
  213. opik/rest_api/types/studio_message.py +20 -0
  214. opik/rest_api/types/studio_message_public.py +20 -0
  215. opik/rest_api/types/studio_message_write.py +20 -0
  216. opik/rest_api/types/studio_metric.py +21 -0
  217. opik/rest_api/types/studio_metric_public.py +21 -0
  218. opik/rest_api/types/studio_metric_write.py +21 -0
  219. opik/rest_api/types/studio_optimizer.py +21 -0
  220. opik/rest_api/types/studio_optimizer_public.py +21 -0
  221. opik/rest_api/types/studio_optimizer_write.py +21 -0
  222. opik/rest_api/types/studio_prompt.py +20 -0
  223. opik/rest_api/types/studio_prompt_public.py +20 -0
  224. opik/rest_api/types/studio_prompt_write.py +20 -0
  225. opik/rest_api/types/trace.py +6 -0
  226. opik/rest_api/types/trace_public.py +6 -0
  227. opik/rest_api/types/trace_thread_filter_write.py +23 -0
  228. opik/rest_api/types/trace_thread_filter_write_operator.py +21 -0
  229. opik/rest_api/types/trace_thread_update.py +19 -0
  230. opik/rest_api/types/trace_update.py +39 -0
  231. opik/rest_api/types/value_entry.py +2 -0
  232. opik/rest_api/types/value_entry_compare.py +2 -0
  233. opik/rest_api/types/value_entry_experiment_item_bulk_write_view.py +2 -0
  234. opik/rest_api/types/value_entry_public.py +2 -0
  235. opik/rest_api/types/video_url.py +19 -0
  236. opik/rest_api/types/video_url_public.py +19 -0
  237. opik/rest_api/types/video_url_write.py +19 -0
  238. opik/synchronization.py +5 -6
  239. opik/{decorator/tracing_runtime_config.py → tracing_runtime_config.py} +6 -7
  240. {opik-1.9.5.dist-info → opik-1.9.39.dist-info}/METADATA +5 -4
  241. {opik-1.9.5.dist-info → opik-1.9.39.dist-info}/RECORD +246 -151
  242. opik/api_objects/prompt/chat_prompt_template.py +0 -164
  243. opik/api_objects/prompt/prompt.py +0 -131
  244. /opik/rest_api/{spans/types → types}/span_update_type.py +0 -0
  245. {opik-1.9.5.dist-info → opik-1.9.39.dist-info}/WHEEL +0 -0
  246. {opik-1.9.5.dist-info → opik-1.9.39.dist-info}/entry_points.txt +0 -0
  247. {opik-1.9.5.dist-info → opik-1.9.39.dist-info}/licenses/LICENSE +0 -0
  248. {opik-1.9.5.dist-info → opik-1.9.39.dist-info}/top_level.txt +0 -0
@@ -1,164 +0,0 @@
1
- """
2
- Tools for rendering chat-style prompts with multimodal content.
3
-
4
- The template mirrors :class:`PromptTemplate` but works on a list of OpenAI-like
5
- messages. Rendering is handled by a registry of part renderers so additional
6
- modalities can be plugged in without changing the core implementation.
7
- """
8
-
9
- from __future__ import annotations
10
-
11
- from typing import Any, Dict, List, Optional, Union, cast
12
-
13
- from .prompt_template import PromptTemplate
14
- from .types import (
15
- PromptType,
16
- MessageContent,
17
- ContentPart,
18
- SupportedModalities,
19
- ModalitySet,
20
- )
21
- from .chat_content_renderer_registry import (
22
- ChatContentRendererRegistry,
23
- DEFAULT_CHAT_RENDERER_REGISTRY,
24
- register_default_chat_part_renderer,
25
- )
26
-
27
-
28
- class ChatPromptTemplate:
29
- """
30
- Prompt template for chat-style prompts with multimodal content.
31
- """
32
-
33
- def __init__(
34
- self,
35
- messages: List[Dict[str, MessageContent]],
36
- template_type: PromptType = PromptType.MUSTACHE,
37
- *,
38
- registry: Optional[ChatContentRendererRegistry] = None,
39
- ) -> None:
40
- self._messages = messages
41
- self._template_type = template_type
42
- self._registry = registry or DEFAULT_CHAT_RENDERER_REGISTRY
43
-
44
- @property
45
- def messages(self) -> List[Dict[str, MessageContent]]:
46
- return self._messages
47
-
48
- def required_modalities(self) -> ModalitySet:
49
- """
50
- Return the union of modalities referenced across all template messages.
51
- """
52
- required: ModalitySet = set()
53
- for message in self._messages:
54
- content = cast(MessageContent, message.get("content", ""))
55
- required.update(self._registry.infer_modalities(content))
56
- return required
57
-
58
- def format(
59
- self,
60
- variables: Dict[str, Any],
61
- supported_modalities: Optional[SupportedModalities] = None,
62
- *,
63
- template_type: Optional[Union[str, PromptType]] = None,
64
- ) -> List[Dict[str, MessageContent]]:
65
- """
66
- Render the template messages with the provided variables.
67
-
68
- When a part declares a modality that is not supported, the registry replaces
69
- it with the configured placeholder pair (for example ``<<<image>>>``) so
70
- downstream consumers receive a textual anchor while unsupported structured
71
- content is gracefully elided.
72
- """
73
- resolved_template_type = self._registry.normalize_template_type(
74
- template_type or self._template_type
75
- )
76
- rendered_messages: List[Dict[str, MessageContent]] = []
77
-
78
- for message in self._messages:
79
- role = message.get("role")
80
- if role is None:
81
- continue
82
-
83
- content = cast(MessageContent, message.get("content", ""))
84
- rendered_content: MessageContent
85
- if isinstance(content, str):
86
- rendered_content = _render_template_string(
87
- content, variables, resolved_template_type
88
- )
89
- else:
90
- rendered_content = self._registry.render_content(
91
- content=cast(MessageContent, content),
92
- variables=variables,
93
- template_type=resolved_template_type,
94
- supported_modalities=supported_modalities,
95
- )
96
- rendered_messages.append(
97
- {
98
- "role": role,
99
- "content": rendered_content,
100
- }
101
- )
102
-
103
- return rendered_messages
104
-
105
-
106
- def _render_template_string(
107
- template: str,
108
- variables: Dict[str, Any],
109
- template_type: PromptType,
110
- ) -> str:
111
- if not template:
112
- return ""
113
-
114
- try:
115
- return PromptTemplate(
116
- template,
117
- validate_placeholders=False,
118
- type=template_type,
119
- ).format(**variables)
120
- except Exception:
121
- # Fall back to the raw template if formatting fails so evaluation keeps running.
122
- return template
123
-
124
-
125
- def render_text_part(
126
- part: ContentPart, variables: Dict[str, Any], template_type: PromptType
127
- ) -> Optional[ContentPart]:
128
- text_template = part.get("text", "")
129
- rendered_text = _render_template_string(text_template, variables, template_type)
130
- return {"type": "text", "text": rendered_text}
131
-
132
-
133
- def render_image_url_part(
134
- part: ContentPart, variables: Dict[str, Any], template_type: PromptType
135
- ) -> Optional[ContentPart]:
136
- image_dict = part.get("image_url", {})
137
- if not isinstance(image_dict, dict):
138
- return None
139
-
140
- url_template = image_dict.get("url", "")
141
- rendered_url = _render_template_string(url_template, variables, template_type)
142
- if not rendered_url:
143
- return None
144
-
145
- rendered_image: Dict[str, Any] = {"url": rendered_url}
146
- if "detail" in image_dict:
147
- rendered_image["detail"] = image_dict["detail"]
148
-
149
- return {"type": "image_url", "image_url": rendered_image}
150
-
151
-
152
- register_default_chat_part_renderer("text", render_text_part)
153
- register_default_chat_part_renderer(
154
- "image_url",
155
- render_image_url_part,
156
- modality="vision",
157
- placeholder=("<<<image>>>", "<<</image>>>"),
158
- )
159
-
160
-
161
- __all__ = [
162
- "ChatPromptTemplate",
163
- "register_default_chat_part_renderer",
164
- ]
@@ -1,131 +0,0 @@
1
- import copy
2
- from typing import Any, Dict, Optional
3
-
4
- from opik.rest_api.types import PromptVersionDetail
5
- from .prompt_template import PromptTemplate
6
- from .types import PromptType
7
- from opik.api_objects.prompt import client as prompt_client
8
-
9
-
10
- class Prompt:
11
- """
12
- Prompt class represents a prompt with a name, prompt text/template and commit hash.
13
- """
14
-
15
- def __init__(
16
- self,
17
- name: str,
18
- prompt: str,
19
- metadata: Optional[Dict[str, Any]] = None,
20
- type: PromptType = PromptType.MUSTACHE,
21
- ) -> None:
22
- """
23
- Initializes a new instance of the class with the given parameters.
24
- Creates a new prompt using the opik client and sets the initial state of the instance attributes based on the created prompt.
25
-
26
- Parameters:
27
- name: The name for the prompt.
28
- prompt: The template for the prompt.
29
- """
30
-
31
- self._template = PromptTemplate(template=prompt, type=type)
32
- self._name = name
33
- self._metadata = metadata
34
- self._type = type
35
-
36
- self._sync_with_backend()
37
-
38
- def _sync_with_backend(self) -> None:
39
- from opik.api_objects import opik_client
40
-
41
- opik_client_ = opik_client.get_client_cached()
42
- prompt_client_ = prompt_client.PromptClient(opik_client_.rest_client)
43
- prompt_version = prompt_client_.create_prompt(
44
- name=self._name,
45
- prompt=self._template.text,
46
- metadata=self._metadata,
47
- type=self._type,
48
- )
49
-
50
- self._commit = prompt_version.commit
51
- self.__internal_api__prompt_id__ = prompt_version.prompt_id
52
- self.__internal_api__version_id__ = prompt_version.id
53
-
54
- @property
55
- def name(self) -> str:
56
- """The name of the prompt."""
57
- return self._name
58
-
59
- @property
60
- def prompt(self) -> str:
61
- """The latest template of the prompt."""
62
- return str(self._template)
63
-
64
- @property
65
- def commit(self) -> Optional[str]:
66
- """The commit hash of the prompt."""
67
- return self._commit
68
-
69
- @property
70
- def metadata(self) -> Optional[Dict[str, Any]]:
71
- """The metadata dictionary associated with the prompt"""
72
- return copy.deepcopy(self._metadata)
73
-
74
- @property
75
- def type(self) -> PromptType:
76
- """The prompt type of the prompt."""
77
- return self._type
78
-
79
- def format(self, **kwargs: Any) -> str:
80
- """
81
- Replaces placeholders in the template with provided keyword arguments.
82
-
83
- Args:
84
- **kwargs: Arbitrary keyword arguments where the key represents the placeholder
85
- in the template and the value is the value to replace the placeholder with.
86
-
87
- Returns:
88
- A string with all placeholders replaced by their corresponding values from kwargs.
89
- """
90
- return self._template.format(**kwargs)
91
-
92
- @classmethod
93
- def from_fern_prompt_version(
94
- cls,
95
- name: str,
96
- prompt_version: PromptVersionDetail,
97
- ) -> "Prompt":
98
- # will not call __init__ to avoid API calls, create new instance with __new__
99
- prompt = cls.__new__(cls)
100
-
101
- prompt.__internal_api__version_id__ = prompt_version.id
102
- prompt.__internal_api__prompt_id__ = prompt_version.prompt_id
103
-
104
- prompt._name = name
105
- prompt._template = PromptTemplate(
106
- template=prompt_version.template,
107
- type=PromptType(prompt_version.type) or PromptType.MUSTACHE,
108
- )
109
- prompt._commit = prompt_version.commit
110
- prompt._metadata = prompt_version.metadata
111
- prompt._type = prompt_version.type
112
- return prompt
113
-
114
-
115
- def to_info_dict(prompt: Prompt) -> Dict[str, Any]:
116
- info_dict: Dict[str, Any] = {
117
- "name": prompt.name,
118
- "version": {
119
- "template": prompt.prompt,
120
- },
121
- }
122
- if prompt.__internal_api__prompt_id__ is not None:
123
- info_dict["id"] = prompt.__internal_api__prompt_id__
124
-
125
- if prompt.commit is not None:
126
- info_dict["version"]["commit"] = prompt.commit
127
-
128
- if prompt.__internal_api__version_id__ is not None:
129
- info_dict["version"]["id"] = prompt.__internal_api__version_id__
130
-
131
- return info_dict
File without changes