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.
- opik/__init__.py +10 -3
- opik/anonymizer/__init__.py +5 -0
- opik/anonymizer/anonymizer.py +12 -0
- opik/anonymizer/factory.py +80 -0
- opik/anonymizer/recursive_anonymizer.py +64 -0
- opik/anonymizer/rules.py +56 -0
- opik/anonymizer/rules_anonymizer.py +35 -0
- opik/api_objects/dataset/rest_operations.py +5 -0
- opik/api_objects/experiment/experiment.py +46 -49
- opik/api_objects/experiment/helpers.py +34 -10
- opik/api_objects/local_recording.py +8 -3
- opik/api_objects/opik_client.py +230 -48
- opik/api_objects/opik_query_language.py +9 -0
- opik/api_objects/prompt/__init__.py +11 -3
- opik/api_objects/prompt/base_prompt.py +69 -0
- opik/api_objects/prompt/base_prompt_template.py +29 -0
- opik/api_objects/prompt/chat/__init__.py +1 -0
- opik/api_objects/prompt/chat/chat_prompt.py +193 -0
- opik/api_objects/prompt/chat/chat_prompt_template.py +350 -0
- opik/api_objects/prompt/{chat_content_renderer_registry.py → chat/content_renderer_registry.py} +37 -35
- opik/api_objects/prompt/client.py +101 -30
- opik/api_objects/prompt/text/__init__.py +1 -0
- opik/api_objects/prompt/text/prompt.py +174 -0
- opik/api_objects/prompt/{prompt_template.py → text/prompt_template.py} +10 -6
- opik/api_objects/prompt/types.py +1 -1
- opik/cli/export.py +6 -2
- opik/cli/usage_report/charts.py +39 -10
- opik/cli/usage_report/cli.py +164 -45
- opik/cli/usage_report/pdf.py +14 -1
- opik/config.py +0 -5
- opik/decorator/base_track_decorator.py +37 -40
- opik/decorator/context_manager/span_context_manager.py +9 -0
- opik/decorator/context_manager/trace_context_manager.py +5 -0
- opik/dict_utils.py +3 -3
- opik/evaluation/__init__.py +13 -2
- opik/evaluation/engine/engine.py +195 -223
- opik/evaluation/engine/helpers.py +8 -7
- opik/evaluation/engine/metrics_evaluator.py +237 -0
- opik/evaluation/evaluation_result.py +35 -1
- opik/evaluation/evaluator.py +318 -30
- opik/evaluation/models/litellm/util.py +78 -6
- opik/evaluation/models/model_capabilities.py +33 -0
- opik/evaluation/report.py +14 -2
- opik/evaluation/rest_operations.py +36 -33
- opik/evaluation/test_case.py +2 -2
- opik/evaluation/types.py +9 -1
- opik/exceptions.py +17 -0
- opik/hooks/__init__.py +17 -1
- opik/hooks/anonymizer_hook.py +36 -0
- opik/id_helpers.py +18 -0
- opik/integrations/adk/helpers.py +16 -7
- opik/integrations/adk/legacy_opik_tracer.py +7 -4
- opik/integrations/adk/opik_tracer.py +3 -1
- opik/integrations/adk/patchers/adk_otel_tracer/opik_adk_otel_tracer.py +7 -3
- opik/integrations/adk/recursive_callback_injector.py +1 -6
- opik/integrations/dspy/callback.py +1 -4
- opik/integrations/haystack/opik_connector.py +2 -2
- opik/integrations/haystack/opik_tracer.py +2 -4
- opik/integrations/langchain/opik_tracer.py +273 -82
- opik/integrations/llama_index/callback.py +110 -108
- opik/integrations/openai/agents/opik_tracing_processor.py +1 -2
- opik/integrations/openai/opik_tracker.py +1 -1
- opik/message_processing/batching/batchers.py +11 -7
- opik/message_processing/encoder_helpers.py +79 -0
- opik/message_processing/messages.py +25 -1
- opik/message_processing/online_message_processor.py +23 -8
- opik/opik_context.py +7 -7
- opik/rest_api/__init__.py +188 -12
- opik/rest_api/client.py +3 -0
- opik/rest_api/dashboards/__init__.py +4 -0
- opik/rest_api/dashboards/client.py +462 -0
- opik/rest_api/dashboards/raw_client.py +648 -0
- opik/rest_api/datasets/client.py +893 -89
- opik/rest_api/datasets/raw_client.py +1328 -87
- opik/rest_api/experiments/client.py +30 -2
- opik/rest_api/experiments/raw_client.py +26 -0
- opik/rest_api/feedback_definitions/types/find_feedback_definitions_request_type.py +1 -1
- opik/rest_api/optimizations/client.py +302 -0
- opik/rest_api/optimizations/raw_client.py +463 -0
- opik/rest_api/optimizations/types/optimization_update_status.py +3 -1
- opik/rest_api/prompts/__init__.py +2 -2
- opik/rest_api/prompts/client.py +34 -4
- opik/rest_api/prompts/raw_client.py +32 -2
- opik/rest_api/prompts/types/__init__.py +3 -1
- opik/rest_api/prompts/types/create_prompt_version_detail_template_structure.py +5 -0
- opik/rest_api/prompts/types/prompt_write_template_structure.py +5 -0
- opik/rest_api/spans/__init__.py +0 -2
- opik/rest_api/spans/client.py +148 -64
- opik/rest_api/spans/raw_client.py +210 -83
- opik/rest_api/spans/types/__init__.py +0 -2
- opik/rest_api/traces/client.py +241 -73
- opik/rest_api/traces/raw_client.py +344 -90
- opik/rest_api/types/__init__.py +200 -15
- opik/rest_api/types/aggregation_data.py +1 -0
- opik/rest_api/types/alert_trigger_config_public_type.py +6 -1
- opik/rest_api/types/alert_trigger_config_type.py +6 -1
- opik/rest_api/types/alert_trigger_config_write_type.py +6 -1
- opik/rest_api/types/automation_rule_evaluator.py +23 -1
- opik/rest_api/types/automation_rule_evaluator_llm_as_judge.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_llm_as_judge_public.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_llm_as_judge_write.py +2 -0
- opik/rest_api/types/{automation_rule_evaluator_object_public.py → automation_rule_evaluator_object_object_public.py} +32 -10
- opik/rest_api/types/automation_rule_evaluator_page_public.py +2 -2
- opik/rest_api/types/automation_rule_evaluator_public.py +23 -1
- opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge_public.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge_write.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_public.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_write.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_public.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_write.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_update.py +23 -1
- opik/rest_api/types/automation_rule_evaluator_update_llm_as_judge.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_update_span_llm_as_judge.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_update_trace_thread_llm_as_judge.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_update_trace_thread_user_defined_metric_python.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_update_user_defined_metric_python.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_public.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_write.py +2 -0
- opik/rest_api/types/automation_rule_evaluator_write.py +23 -1
- opik/rest_api/types/boolean_feedback_definition.py +25 -0
- opik/rest_api/types/boolean_feedback_definition_create.py +20 -0
- opik/rest_api/types/boolean_feedback_definition_public.py +25 -0
- opik/rest_api/types/boolean_feedback_definition_update.py +20 -0
- opik/rest_api/types/boolean_feedback_detail.py +29 -0
- opik/rest_api/types/boolean_feedback_detail_create.py +29 -0
- opik/rest_api/types/boolean_feedback_detail_public.py +29 -0
- opik/rest_api/types/boolean_feedback_detail_update.py +29 -0
- opik/rest_api/types/dashboard_page_public.py +24 -0
- opik/rest_api/types/dashboard_public.py +30 -0
- opik/rest_api/types/dataset.py +2 -0
- opik/rest_api/types/dataset_item.py +2 -0
- opik/rest_api/types/dataset_item_compare.py +2 -0
- opik/rest_api/types/dataset_item_filter.py +23 -0
- opik/rest_api/types/dataset_item_filter_operator.py +21 -0
- opik/rest_api/types/dataset_item_page_compare.py +1 -0
- opik/rest_api/types/dataset_item_page_public.py +1 -0
- opik/rest_api/types/dataset_item_public.py +2 -0
- opik/rest_api/types/dataset_item_update.py +39 -0
- opik/rest_api/types/dataset_item_write.py +1 -0
- opik/rest_api/types/dataset_public.py +2 -0
- opik/rest_api/types/dataset_public_status.py +5 -0
- opik/rest_api/types/dataset_status.py +5 -0
- opik/rest_api/types/dataset_version_diff.py +22 -0
- opik/rest_api/types/dataset_version_diff_stats.py +24 -0
- opik/rest_api/types/dataset_version_page_public.py +23 -0
- opik/rest_api/types/dataset_version_public.py +49 -0
- opik/rest_api/types/experiment.py +2 -0
- opik/rest_api/types/experiment_public.py +2 -0
- opik/rest_api/types/experiment_score.py +20 -0
- opik/rest_api/types/experiment_score_public.py +20 -0
- opik/rest_api/types/experiment_score_write.py +20 -0
- opik/rest_api/types/feedback.py +20 -1
- opik/rest_api/types/feedback_create.py +16 -1
- opik/rest_api/types/feedback_object_public.py +22 -1
- opik/rest_api/types/feedback_public.py +20 -1
- opik/rest_api/types/feedback_score_public.py +4 -0
- opik/rest_api/types/feedback_update.py +16 -1
- opik/rest_api/types/image_url.py +20 -0
- opik/rest_api/types/image_url_public.py +20 -0
- opik/rest_api/types/image_url_write.py +20 -0
- opik/rest_api/types/llm_as_judge_message.py +5 -1
- opik/rest_api/types/llm_as_judge_message_content.py +24 -0
- opik/rest_api/types/llm_as_judge_message_content_public.py +24 -0
- opik/rest_api/types/llm_as_judge_message_content_write.py +24 -0
- opik/rest_api/types/llm_as_judge_message_public.py +5 -1
- opik/rest_api/types/llm_as_judge_message_write.py +5 -1
- opik/rest_api/types/llm_as_judge_model_parameters.py +2 -0
- opik/rest_api/types/llm_as_judge_model_parameters_public.py +2 -0
- opik/rest_api/types/llm_as_judge_model_parameters_write.py +2 -0
- opik/rest_api/types/optimization.py +2 -0
- opik/rest_api/types/optimization_public.py +2 -0
- opik/rest_api/types/optimization_public_status.py +3 -1
- opik/rest_api/types/optimization_status.py +3 -1
- opik/rest_api/types/optimization_studio_config.py +27 -0
- opik/rest_api/types/optimization_studio_config_public.py +27 -0
- opik/rest_api/types/optimization_studio_config_write.py +27 -0
- opik/rest_api/types/optimization_studio_log.py +22 -0
- opik/rest_api/types/optimization_write.py +2 -0
- opik/rest_api/types/optimization_write_status.py +3 -1
- opik/rest_api/types/prompt.py +6 -0
- opik/rest_api/types/prompt_detail.py +6 -0
- opik/rest_api/types/prompt_detail_template_structure.py +5 -0
- opik/rest_api/types/prompt_public.py +6 -0
- opik/rest_api/types/prompt_public_template_structure.py +5 -0
- opik/rest_api/types/prompt_template_structure.py +5 -0
- opik/rest_api/types/prompt_version.py +2 -0
- opik/rest_api/types/prompt_version_detail.py +2 -0
- opik/rest_api/types/prompt_version_detail_template_structure.py +5 -0
- opik/rest_api/types/prompt_version_public.py +2 -0
- opik/rest_api/types/prompt_version_public_template_structure.py +5 -0
- opik/rest_api/types/prompt_version_template_structure.py +5 -0
- opik/rest_api/types/score_name.py +1 -0
- opik/rest_api/types/service_toggles_config.py +6 -0
- opik/rest_api/types/span_enrichment_options.py +31 -0
- opik/rest_api/types/span_filter.py +23 -0
- opik/rest_api/types/span_filter_operator.py +21 -0
- opik/rest_api/types/span_filter_write.py +23 -0
- opik/rest_api/types/span_filter_write_operator.py +21 -0
- opik/rest_api/types/span_llm_as_judge_code.py +27 -0
- opik/rest_api/types/span_llm_as_judge_code_public.py +27 -0
- opik/rest_api/types/span_llm_as_judge_code_write.py +27 -0
- opik/rest_api/types/span_update.py +46 -0
- opik/rest_api/types/studio_evaluation.py +20 -0
- opik/rest_api/types/studio_evaluation_public.py +20 -0
- opik/rest_api/types/studio_evaluation_write.py +20 -0
- opik/rest_api/types/studio_llm_model.py +21 -0
- opik/rest_api/types/studio_llm_model_public.py +21 -0
- opik/rest_api/types/studio_llm_model_write.py +21 -0
- opik/rest_api/types/studio_message.py +20 -0
- opik/rest_api/types/studio_message_public.py +20 -0
- opik/rest_api/types/studio_message_write.py +20 -0
- opik/rest_api/types/studio_metric.py +21 -0
- opik/rest_api/types/studio_metric_public.py +21 -0
- opik/rest_api/types/studio_metric_write.py +21 -0
- opik/rest_api/types/studio_optimizer.py +21 -0
- opik/rest_api/types/studio_optimizer_public.py +21 -0
- opik/rest_api/types/studio_optimizer_write.py +21 -0
- opik/rest_api/types/studio_prompt.py +20 -0
- opik/rest_api/types/studio_prompt_public.py +20 -0
- opik/rest_api/types/studio_prompt_write.py +20 -0
- opik/rest_api/types/trace.py +6 -0
- opik/rest_api/types/trace_public.py +6 -0
- opik/rest_api/types/trace_thread_filter_write.py +23 -0
- opik/rest_api/types/trace_thread_filter_write_operator.py +21 -0
- opik/rest_api/types/trace_thread_update.py +19 -0
- opik/rest_api/types/trace_update.py +39 -0
- opik/rest_api/types/value_entry.py +2 -0
- opik/rest_api/types/value_entry_compare.py +2 -0
- opik/rest_api/types/value_entry_experiment_item_bulk_write_view.py +2 -0
- opik/rest_api/types/value_entry_public.py +2 -0
- opik/rest_api/types/video_url.py +19 -0
- opik/rest_api/types/video_url_public.py +19 -0
- opik/rest_api/types/video_url_write.py +19 -0
- opik/synchronization.py +5 -6
- opik/{decorator/tracing_runtime_config.py → tracing_runtime_config.py} +6 -7
- {opik-1.9.5.dist-info → opik-1.9.39.dist-info}/METADATA +5 -4
- {opik-1.9.5.dist-info → opik-1.9.39.dist-info}/RECORD +246 -151
- opik/api_objects/prompt/chat_prompt_template.py +0 -164
- opik/api_objects/prompt/prompt.py +0 -131
- /opik/rest_api/{spans/types → types}/span_update_type.py +0 -0
- {opik-1.9.5.dist-info → opik-1.9.39.dist-info}/WHEEL +0 -0
- {opik-1.9.5.dist-info → opik-1.9.39.dist-info}/entry_points.txt +0 -0
- {opik-1.9.5.dist-info → opik-1.9.39.dist-info}/licenses/LICENSE +0 -0
- {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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|