opik 1.6.4__py3-none-any.whl → 1.9.71__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 +33 -2
- 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/attachment/__init__.py +5 -0
- opik/api_objects/attachment/attachment.py +20 -0
- opik/api_objects/attachment/attachment_context.py +36 -0
- opik/api_objects/attachment/attachments_extractor.py +153 -0
- opik/api_objects/attachment/client.py +220 -0
- opik/api_objects/attachment/converters.py +51 -0
- opik/api_objects/attachment/decoder.py +18 -0
- opik/api_objects/attachment/decoder_base64.py +83 -0
- opik/api_objects/attachment/decoder_helpers.py +137 -0
- opik/api_objects/conversation/__init__.py +0 -0
- opik/api_objects/conversation/conversation_factory.py +43 -0
- opik/api_objects/conversation/conversation_thread.py +49 -0
- opik/api_objects/data_helpers.py +79 -0
- opik/api_objects/dataset/dataset.py +107 -45
- opik/api_objects/dataset/rest_operations.py +12 -3
- opik/api_objects/experiment/experiment.py +81 -45
- opik/api_objects/experiment/experiment_item.py +2 -1
- opik/api_objects/experiment/experiments_client.py +64 -0
- opik/api_objects/experiment/helpers.py +35 -11
- opik/api_objects/experiment/rest_operations.py +88 -19
- opik/api_objects/helpers.py +104 -7
- opik/api_objects/local_recording.py +81 -0
- opik/api_objects/opik_client.py +872 -174
- opik/api_objects/opik_query_language.py +136 -18
- opik/api_objects/optimization/__init__.py +3 -0
- opik/api_objects/optimization/optimization.py +39 -0
- opik/api_objects/prompt/__init__.py +13 -1
- 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 +210 -0
- opik/api_objects/prompt/chat/chat_prompt_template.py +350 -0
- opik/api_objects/prompt/chat/content_renderer_registry.py +203 -0
- opik/api_objects/prompt/client.py +193 -41
- opik/api_objects/prompt/text/__init__.py +1 -0
- opik/api_objects/prompt/text/prompt.py +174 -0
- opik/api_objects/prompt/text/prompt_template.py +55 -0
- opik/api_objects/prompt/types.py +29 -0
- opik/api_objects/rest_stream_parser.py +98 -0
- opik/api_objects/search_helpers.py +89 -0
- opik/api_objects/span/span_client.py +165 -45
- opik/api_objects/span/span_data.py +136 -25
- opik/api_objects/threads/__init__.py +0 -0
- opik/api_objects/threads/threads_client.py +185 -0
- opik/api_objects/trace/trace_client.py +72 -36
- opik/api_objects/trace/trace_data.py +112 -26
- opik/api_objects/validation_helpers.py +3 -3
- opik/cli/__init__.py +5 -0
- opik/cli/__main__.py +6 -0
- opik/cli/configure.py +66 -0
- opik/cli/exports/__init__.py +131 -0
- opik/cli/exports/dataset.py +278 -0
- opik/cli/exports/experiment.py +784 -0
- opik/cli/exports/project.py +685 -0
- opik/cli/exports/prompt.py +578 -0
- opik/cli/exports/utils.py +406 -0
- opik/cli/harbor.py +39 -0
- opik/cli/healthcheck.py +21 -0
- opik/cli/imports/__init__.py +439 -0
- opik/cli/imports/dataset.py +143 -0
- opik/cli/imports/experiment.py +1192 -0
- opik/cli/imports/project.py +262 -0
- opik/cli/imports/prompt.py +177 -0
- opik/cli/imports/utils.py +280 -0
- opik/cli/main.py +49 -0
- opik/cli/proxy.py +93 -0
- opik/cli/usage_report/__init__.py +16 -0
- opik/cli/usage_report/charts.py +783 -0
- opik/cli/usage_report/cli.py +274 -0
- opik/cli/usage_report/constants.py +9 -0
- opik/cli/usage_report/extraction.py +749 -0
- opik/cli/usage_report/pdf.py +244 -0
- opik/cli/usage_report/statistics.py +78 -0
- opik/cli/usage_report/utils.py +235 -0
- opik/config.py +62 -4
- opik/configurator/configure.py +45 -6
- opik/configurator/opik_rest_helpers.py +4 -1
- opik/context_storage.py +164 -65
- opik/datetime_helpers.py +12 -0
- opik/decorator/arguments_helpers.py +9 -1
- opik/decorator/base_track_decorator.py +298 -146
- opik/decorator/context_manager/__init__.py +0 -0
- opik/decorator/context_manager/span_context_manager.py +123 -0
- opik/decorator/context_manager/trace_context_manager.py +84 -0
- opik/decorator/generator_wrappers.py +3 -2
- opik/decorator/inspect_helpers.py +11 -0
- opik/decorator/opik_args/__init__.py +13 -0
- opik/decorator/opik_args/api_classes.py +71 -0
- opik/decorator/opik_args/helpers.py +120 -0
- opik/decorator/span_creation_handler.py +49 -21
- opik/decorator/tracker.py +9 -1
- opik/dict_utils.py +3 -3
- opik/environment.py +13 -1
- opik/error_tracking/api.py +1 -1
- opik/error_tracking/before_send.py +6 -5
- opik/error_tracking/environment_details.py +29 -7
- opik/error_tracking/error_filtering/filter_by_response_status_code.py +42 -0
- opik/error_tracking/error_filtering/filter_chain_builder.py +14 -3
- opik/evaluation/__init__.py +14 -2
- opik/evaluation/engine/engine.py +280 -82
- opik/evaluation/engine/evaluation_tasks_executor.py +15 -10
- opik/evaluation/engine/helpers.py +34 -9
- opik/evaluation/engine/metrics_evaluator.py +237 -0
- opik/evaluation/engine/types.py +5 -4
- opik/evaluation/evaluation_result.py +169 -2
- opik/evaluation/evaluator.py +659 -58
- opik/evaluation/metrics/__init__.py +121 -6
- opik/evaluation/metrics/aggregated_metric.py +92 -0
- opik/evaluation/metrics/arguments_helpers.py +15 -21
- opik/evaluation/metrics/arguments_validator.py +38 -0
- opik/evaluation/metrics/base_metric.py +20 -10
- opik/evaluation/metrics/conversation/__init__.py +48 -0
- opik/evaluation/metrics/conversation/conversation_thread_metric.py +79 -0
- opik/evaluation/metrics/conversation/conversation_turns_factory.py +39 -0
- opik/evaluation/metrics/conversation/g_eval_wrappers.py +19 -0
- opik/evaluation/metrics/conversation/helpers.py +84 -0
- opik/evaluation/metrics/conversation/heuristics/__init__.py +14 -0
- opik/evaluation/metrics/conversation/heuristics/degeneration/__init__.py +3 -0
- opik/evaluation/metrics/conversation/heuristics/degeneration/metric.py +189 -0
- opik/evaluation/metrics/conversation/heuristics/degeneration/phrases.py +12 -0
- opik/evaluation/metrics/conversation/heuristics/knowledge_retention/__init__.py +3 -0
- opik/evaluation/metrics/conversation/heuristics/knowledge_retention/metric.py +172 -0
- opik/evaluation/metrics/conversation/llm_judges/__init__.py +32 -0
- opik/evaluation/metrics/conversation/llm_judges/conversational_coherence/__init__.py +0 -0
- opik/evaluation/metrics/conversation/llm_judges/conversational_coherence/metric.py +274 -0
- opik/evaluation/metrics/conversation/llm_judges/conversational_coherence/schema.py +16 -0
- opik/evaluation/metrics/conversation/llm_judges/conversational_coherence/templates.py +95 -0
- opik/evaluation/metrics/conversation/llm_judges/g_eval_wrappers.py +442 -0
- opik/evaluation/metrics/conversation/llm_judges/session_completeness/__init__.py +0 -0
- opik/evaluation/metrics/conversation/llm_judges/session_completeness/metric.py +295 -0
- opik/evaluation/metrics/conversation/llm_judges/session_completeness/schema.py +22 -0
- opik/evaluation/metrics/conversation/llm_judges/session_completeness/templates.py +139 -0
- opik/evaluation/metrics/conversation/llm_judges/user_frustration/__init__.py +0 -0
- opik/evaluation/metrics/conversation/llm_judges/user_frustration/metric.py +277 -0
- opik/evaluation/metrics/conversation/llm_judges/user_frustration/schema.py +16 -0
- opik/evaluation/metrics/conversation/llm_judges/user_frustration/templates.py +135 -0
- opik/evaluation/metrics/conversation/types.py +34 -0
- opik/evaluation/metrics/conversation_types.py +9 -0
- opik/evaluation/metrics/heuristics/bertscore.py +107 -0
- opik/evaluation/metrics/heuristics/bleu.py +43 -16
- opik/evaluation/metrics/heuristics/chrf.py +127 -0
- opik/evaluation/metrics/heuristics/contains.py +50 -11
- opik/evaluation/metrics/heuristics/distribution_metrics.py +331 -0
- opik/evaluation/metrics/heuristics/equals.py +4 -1
- opik/evaluation/metrics/heuristics/gleu.py +113 -0
- opik/evaluation/metrics/heuristics/is_json.py +9 -3
- opik/evaluation/metrics/heuristics/language_adherence.py +123 -0
- opik/evaluation/metrics/heuristics/levenshtein_ratio.py +6 -5
- opik/evaluation/metrics/heuristics/meteor.py +119 -0
- opik/evaluation/metrics/heuristics/prompt_injection.py +150 -0
- opik/evaluation/metrics/heuristics/readability.py +129 -0
- opik/evaluation/metrics/heuristics/regex_match.py +4 -1
- opik/evaluation/metrics/heuristics/rouge.py +148 -0
- opik/evaluation/metrics/heuristics/sentiment.py +98 -0
- opik/evaluation/metrics/heuristics/spearman.py +88 -0
- opik/evaluation/metrics/heuristics/tone.py +155 -0
- opik/evaluation/metrics/heuristics/vader_sentiment.py +77 -0
- opik/evaluation/metrics/llm_judges/answer_relevance/metric.py +27 -30
- opik/evaluation/metrics/llm_judges/answer_relevance/parser.py +27 -0
- opik/evaluation/metrics/llm_judges/answer_relevance/templates.py +10 -10
- opik/evaluation/metrics/llm_judges/context_precision/metric.py +28 -31
- opik/evaluation/metrics/llm_judges/context_precision/parser.py +27 -0
- opik/evaluation/metrics/llm_judges/context_precision/template.py +7 -7
- opik/evaluation/metrics/llm_judges/context_recall/metric.py +27 -31
- opik/evaluation/metrics/llm_judges/context_recall/parser.py +27 -0
- opik/evaluation/metrics/llm_judges/context_recall/template.py +7 -7
- opik/evaluation/metrics/llm_judges/factuality/metric.py +7 -26
- opik/evaluation/metrics/llm_judges/factuality/parser.py +35 -0
- opik/evaluation/metrics/llm_judges/factuality/template.py +1 -1
- opik/evaluation/metrics/llm_judges/g_eval/__init__.py +5 -0
- opik/evaluation/metrics/llm_judges/g_eval/metric.py +244 -113
- opik/evaluation/metrics/llm_judges/g_eval/parser.py +161 -0
- opik/evaluation/metrics/llm_judges/g_eval/presets.py +209 -0
- opik/evaluation/metrics/llm_judges/g_eval_presets/__init__.py +36 -0
- opik/evaluation/metrics/llm_judges/g_eval_presets/agent_assessment.py +77 -0
- opik/evaluation/metrics/llm_judges/g_eval_presets/bias_classifier.py +181 -0
- opik/evaluation/metrics/llm_judges/g_eval_presets/compliance_risk.py +41 -0
- opik/evaluation/metrics/llm_judges/g_eval_presets/prompt_uncertainty.py +41 -0
- opik/evaluation/metrics/llm_judges/g_eval_presets/qa_suite.py +146 -0
- opik/evaluation/metrics/llm_judges/hallucination/metric.py +23 -27
- opik/evaluation/metrics/llm_judges/hallucination/parser.py +29 -0
- opik/evaluation/metrics/llm_judges/hallucination/template.py +2 -4
- opik/evaluation/metrics/llm_judges/llm_juries/__init__.py +3 -0
- opik/evaluation/metrics/llm_judges/llm_juries/metric.py +76 -0
- opik/evaluation/metrics/llm_judges/moderation/metric.py +23 -28
- opik/evaluation/metrics/llm_judges/moderation/parser.py +27 -0
- opik/evaluation/metrics/llm_judges/moderation/template.py +2 -2
- opik/evaluation/metrics/llm_judges/parsing_helpers.py +26 -0
- opik/evaluation/metrics/llm_judges/structure_output_compliance/__init__.py +0 -0
- opik/evaluation/metrics/llm_judges/structure_output_compliance/metric.py +144 -0
- opik/evaluation/metrics/llm_judges/structure_output_compliance/parser.py +79 -0
- opik/evaluation/metrics/llm_judges/structure_output_compliance/schema.py +15 -0
- opik/evaluation/metrics/llm_judges/structure_output_compliance/template.py +50 -0
- opik/evaluation/metrics/llm_judges/syc_eval/__init__.py +0 -0
- opik/evaluation/metrics/llm_judges/syc_eval/metric.py +252 -0
- opik/evaluation/metrics/llm_judges/syc_eval/parser.py +82 -0
- opik/evaluation/metrics/llm_judges/syc_eval/template.py +155 -0
- opik/evaluation/metrics/llm_judges/trajectory_accuracy/__init__.py +3 -0
- opik/evaluation/metrics/llm_judges/trajectory_accuracy/metric.py +171 -0
- opik/evaluation/metrics/llm_judges/trajectory_accuracy/parser.py +38 -0
- opik/evaluation/metrics/llm_judges/trajectory_accuracy/templates.py +65 -0
- opik/evaluation/metrics/llm_judges/usefulness/metric.py +23 -32
- opik/evaluation/metrics/llm_judges/usefulness/parser.py +28 -0
- opik/evaluation/metrics/ragas_metric.py +112 -0
- opik/evaluation/models/__init__.py +10 -0
- opik/evaluation/models/base_model.py +140 -18
- opik/evaluation/models/langchain/__init__.py +3 -0
- opik/evaluation/models/langchain/langchain_chat_model.py +166 -0
- opik/evaluation/models/langchain/message_converters.py +106 -0
- opik/evaluation/models/langchain/opik_monitoring.py +23 -0
- opik/evaluation/models/litellm/litellm_chat_model.py +186 -40
- opik/evaluation/models/litellm/opik_monitor.py +24 -21
- opik/evaluation/models/litellm/util.py +125 -0
- opik/evaluation/models/litellm/warning_filters.py +16 -4
- opik/evaluation/models/model_capabilities.py +187 -0
- opik/evaluation/models/models_factory.py +25 -3
- opik/evaluation/preprocessing.py +92 -0
- opik/evaluation/report.py +70 -12
- opik/evaluation/rest_operations.py +49 -45
- opik/evaluation/samplers/__init__.py +4 -0
- opik/evaluation/samplers/base_dataset_sampler.py +40 -0
- opik/evaluation/samplers/random_dataset_sampler.py +48 -0
- opik/evaluation/score_statistics.py +66 -0
- opik/evaluation/scorers/__init__.py +4 -0
- opik/evaluation/scorers/scorer_function.py +55 -0
- opik/evaluation/scorers/scorer_wrapper_metric.py +130 -0
- opik/evaluation/test_case.py +3 -2
- opik/evaluation/test_result.py +1 -0
- opik/evaluation/threads/__init__.py +0 -0
- opik/evaluation/threads/context_helper.py +32 -0
- opik/evaluation/threads/evaluation_engine.py +181 -0
- opik/evaluation/threads/evaluation_result.py +18 -0
- opik/evaluation/threads/evaluator.py +120 -0
- opik/evaluation/threads/helpers.py +51 -0
- opik/evaluation/types.py +9 -1
- opik/exceptions.py +116 -3
- opik/file_upload/__init__.py +0 -0
- opik/file_upload/base_upload_manager.py +39 -0
- opik/file_upload/file_upload_monitor.py +14 -0
- opik/file_upload/file_uploader.py +141 -0
- opik/file_upload/mime_type.py +9 -0
- opik/file_upload/s3_multipart_upload/__init__.py +0 -0
- opik/file_upload/s3_multipart_upload/file_parts_strategy.py +89 -0
- opik/file_upload/s3_multipart_upload/s3_file_uploader.py +86 -0
- opik/file_upload/s3_multipart_upload/s3_upload_error.py +29 -0
- opik/file_upload/thread_pool.py +17 -0
- opik/file_upload/upload_client.py +114 -0
- opik/file_upload/upload_manager.py +255 -0
- opik/file_upload/upload_options.py +37 -0
- opik/format_helpers.py +17 -0
- opik/guardrails/__init__.py +4 -0
- opik/guardrails/guardrail.py +157 -0
- opik/guardrails/guards/__init__.py +5 -0
- opik/guardrails/guards/guard.py +17 -0
- opik/guardrails/guards/pii.py +47 -0
- opik/guardrails/guards/topic.py +76 -0
- opik/guardrails/rest_api_client.py +34 -0
- opik/guardrails/schemas.py +24 -0
- opik/guardrails/tracing.py +61 -0
- opik/healthcheck/__init__.py +2 -1
- opik/healthcheck/checks.py +2 -2
- opik/healthcheck/rich_representation.py +1 -1
- opik/hooks/__init__.py +23 -0
- opik/hooks/anonymizer_hook.py +36 -0
- opik/hooks/httpx_client_hook.py +112 -0
- opik/httpx_client.py +75 -4
- opik/id_helpers.py +18 -0
- opik/integrations/adk/__init__.py +14 -0
- opik/integrations/adk/callback_context_info_extractors.py +32 -0
- opik/integrations/adk/graph/__init__.py +0 -0
- opik/integrations/adk/graph/mermaid_graph_builder.py +128 -0
- opik/integrations/adk/graph/nodes.py +101 -0
- opik/integrations/adk/graph/subgraph_edges_builders.py +41 -0
- opik/integrations/adk/helpers.py +48 -0
- opik/integrations/adk/legacy_opik_tracer.py +381 -0
- opik/integrations/adk/opik_tracer.py +370 -0
- opik/integrations/adk/patchers/__init__.py +4 -0
- opik/integrations/adk/patchers/adk_otel_tracer/__init__.py +0 -0
- opik/integrations/adk/patchers/adk_otel_tracer/llm_span_helpers.py +30 -0
- opik/integrations/adk/patchers/adk_otel_tracer/opik_adk_otel_tracer.py +201 -0
- opik/integrations/adk/patchers/litellm_wrappers.py +91 -0
- opik/integrations/adk/patchers/llm_response_wrapper.py +105 -0
- opik/integrations/adk/patchers/patchers.py +64 -0
- opik/integrations/adk/recursive_callback_injector.py +126 -0
- opik/integrations/aisuite/aisuite_decorator.py +8 -3
- opik/integrations/aisuite/opik_tracker.py +1 -0
- opik/integrations/anthropic/messages_create_decorator.py +8 -3
- opik/integrations/anthropic/opik_tracker.py +0 -1
- opik/integrations/bedrock/converse/__init__.py +0 -0
- opik/integrations/bedrock/converse/chunks_aggregator.py +188 -0
- opik/integrations/bedrock/{converse_decorator.py → converse/converse_decorator.py} +18 -8
- opik/integrations/bedrock/invoke_agent_decorator.py +12 -7
- opik/integrations/bedrock/invoke_model/__init__.py +0 -0
- opik/integrations/bedrock/invoke_model/chunks_aggregator/__init__.py +78 -0
- opik/integrations/bedrock/invoke_model/chunks_aggregator/api.py +45 -0
- opik/integrations/bedrock/invoke_model/chunks_aggregator/base.py +23 -0
- opik/integrations/bedrock/invoke_model/chunks_aggregator/claude.py +121 -0
- opik/integrations/bedrock/invoke_model/chunks_aggregator/format_detector.py +107 -0
- opik/integrations/bedrock/invoke_model/chunks_aggregator/llama.py +108 -0
- opik/integrations/bedrock/invoke_model/chunks_aggregator/mistral.py +118 -0
- opik/integrations/bedrock/invoke_model/chunks_aggregator/nova.py +99 -0
- opik/integrations/bedrock/invoke_model/invoke_model_decorator.py +178 -0
- opik/integrations/bedrock/invoke_model/response_types.py +34 -0
- opik/integrations/bedrock/invoke_model/stream_wrappers.py +122 -0
- opik/integrations/bedrock/invoke_model/usage_converters.py +87 -0
- opik/integrations/bedrock/invoke_model/usage_extraction.py +108 -0
- opik/integrations/bedrock/opik_tracker.py +43 -4
- opik/integrations/bedrock/types.py +19 -0
- opik/integrations/crewai/crewai_decorator.py +34 -56
- opik/integrations/crewai/opik_tracker.py +31 -10
- opik/integrations/crewai/patchers/__init__.py +5 -0
- opik/integrations/crewai/patchers/flow.py +118 -0
- opik/integrations/crewai/patchers/litellm_completion.py +30 -0
- opik/integrations/crewai/patchers/llm_client.py +207 -0
- opik/integrations/dspy/callback.py +246 -84
- opik/integrations/dspy/graph.py +88 -0
- opik/integrations/dspy/parsers.py +168 -0
- opik/integrations/genai/encoder_extension.py +2 -6
- opik/integrations/genai/generate_content_decorator.py +20 -13
- opik/integrations/guardrails/guardrails_decorator.py +4 -0
- opik/integrations/harbor/__init__.py +17 -0
- opik/integrations/harbor/experiment_service.py +269 -0
- opik/integrations/harbor/opik_tracker.py +528 -0
- opik/integrations/haystack/constants.py +35 -0
- opik/integrations/haystack/converters.py +1 -2
- opik/integrations/haystack/opik_connector.py +28 -6
- opik/integrations/haystack/opik_span_bridge.py +284 -0
- opik/integrations/haystack/opik_tracer.py +124 -222
- opik/integrations/langchain/__init__.py +3 -1
- opik/integrations/langchain/helpers.py +96 -0
- opik/integrations/langchain/langgraph_async_context_bridge.py +131 -0
- opik/integrations/langchain/langgraph_tracer_injector.py +88 -0
- opik/integrations/langchain/opik_encoder_extension.py +2 -2
- opik/integrations/langchain/opik_tracer.py +641 -206
- opik/integrations/langchain/provider_usage_extractors/__init__.py +5 -0
- opik/integrations/langchain/provider_usage_extractors/anthropic_usage_extractor.py +101 -0
- opik/integrations/langchain/provider_usage_extractors/anthropic_vertexai_usage_extractor.py +67 -0
- opik/integrations/langchain/provider_usage_extractors/bedrock_usage_extractor.py +94 -0
- opik/integrations/langchain/provider_usage_extractors/google_generative_ai_usage_extractor.py +109 -0
- opik/integrations/langchain/provider_usage_extractors/groq_usage_extractor.py +92 -0
- opik/integrations/langchain/provider_usage_extractors/langchain_run_helpers/__init__.py +15 -0
- opik/integrations/langchain/provider_usage_extractors/langchain_run_helpers/helpers.py +134 -0
- opik/integrations/langchain/provider_usage_extractors/langchain_run_helpers/langchain_usage.py +163 -0
- opik/integrations/langchain/provider_usage_extractors/openai_usage_extractor.py +124 -0
- opik/integrations/langchain/provider_usage_extractors/provider_usage_extractor_protocol.py +29 -0
- opik/integrations/langchain/provider_usage_extractors/usage_extractor.py +48 -0
- opik/integrations/langchain/provider_usage_extractors/vertexai_usage_extractor.py +109 -0
- opik/integrations/litellm/__init__.py +5 -0
- opik/integrations/litellm/completion_chunks_aggregator.py +115 -0
- opik/integrations/litellm/litellm_completion_decorator.py +242 -0
- opik/integrations/litellm/opik_tracker.py +43 -0
- opik/integrations/litellm/stream_patchers.py +151 -0
- opik/integrations/llama_index/callback.py +179 -78
- opik/integrations/llama_index/event_parsing_utils.py +29 -9
- opik/integrations/openai/agents/opik_tracing_processor.py +204 -32
- opik/integrations/openai/agents/span_data_parsers.py +15 -6
- opik/integrations/openai/chat_completion_chunks_aggregator.py +1 -1
- opik/integrations/openai/{openai_decorator.py → openai_chat_completions_decorator.py} +45 -35
- opik/integrations/openai/openai_responses_decorator.py +158 -0
- opik/integrations/openai/opik_tracker.py +94 -13
- opik/integrations/openai/response_events_aggregator.py +36 -0
- opik/integrations/openai/stream_patchers.py +125 -15
- opik/integrations/sagemaker/auth.py +5 -1
- opik/jsonable_encoder.py +29 -1
- opik/llm_usage/base_original_provider_usage.py +15 -8
- opik/llm_usage/bedrock_usage.py +8 -2
- opik/llm_usage/google_usage.py +6 -1
- opik/llm_usage/llm_usage_info.py +6 -0
- opik/llm_usage/{openai_usage.py → openai_chat_completions_usage.py} +2 -12
- opik/llm_usage/{openai_agent_usage.py → openai_responses_usage.py} +7 -15
- opik/llm_usage/opik_usage.py +36 -10
- opik/llm_usage/opik_usage_factory.py +35 -19
- opik/logging_messages.py +19 -7
- opik/message_processing/arguments_utils.py +22 -0
- opik/message_processing/batching/base_batcher.py +45 -17
- opik/message_processing/batching/batch_manager.py +22 -10
- opik/message_processing/batching/batch_manager_constuctors.py +36 -11
- opik/message_processing/batching/batchers.py +167 -44
- opik/message_processing/batching/flushing_thread.py +0 -3
- opik/message_processing/batching/sequence_splitter.py +50 -5
- opik/message_processing/emulation/__init__.py +0 -0
- opik/message_processing/emulation/emulator_message_processor.py +578 -0
- opik/message_processing/emulation/local_emulator_message_processor.py +140 -0
- opik/message_processing/emulation/models.py +162 -0
- opik/message_processing/encoder_helpers.py +79 -0
- opik/message_processing/message_queue.py +79 -0
- opik/message_processing/messages.py +154 -12
- opik/message_processing/preprocessing/__init__.py +0 -0
- opik/message_processing/preprocessing/attachments_preprocessor.py +70 -0
- opik/message_processing/preprocessing/batching_preprocessor.py +53 -0
- opik/message_processing/preprocessing/constants.py +1 -0
- opik/message_processing/preprocessing/file_upload_preprocessor.py +38 -0
- opik/message_processing/preprocessing/preprocessor.py +36 -0
- opik/message_processing/processors/__init__.py +0 -0
- opik/message_processing/processors/attachments_extraction_processor.py +146 -0
- opik/message_processing/processors/message_processors.py +92 -0
- opik/message_processing/processors/message_processors_chain.py +96 -0
- opik/message_processing/processors/online_message_processor.py +324 -0
- opik/message_processing/queue_consumer.py +61 -13
- opik/message_processing/streamer.py +102 -31
- opik/message_processing/streamer_constructors.py +67 -12
- opik/opik_context.py +103 -11
- opik/plugins/pytest/decorator.py +2 -2
- opik/plugins/pytest/experiment_runner.py +3 -2
- opik/plugins/pytest/hooks.py +6 -4
- opik/rate_limit/__init__.py +0 -0
- opik/rate_limit/rate_limit.py +25 -0
- opik/rest_api/__init__.py +643 -11
- opik/rest_api/alerts/__init__.py +7 -0
- opik/rest_api/alerts/client.py +667 -0
- opik/rest_api/alerts/raw_client.py +1015 -0
- opik/rest_api/alerts/types/__init__.py +7 -0
- opik/rest_api/alerts/types/get_webhook_examples_request_alert_type.py +5 -0
- opik/rest_api/annotation_queues/__init__.py +4 -0
- opik/rest_api/annotation_queues/client.py +668 -0
- opik/rest_api/annotation_queues/raw_client.py +1019 -0
- opik/rest_api/attachments/__init__.py +17 -0
- opik/rest_api/attachments/client.py +752 -0
- opik/rest_api/attachments/raw_client.py +1125 -0
- opik/rest_api/attachments/types/__init__.py +15 -0
- opik/rest_api/attachments/types/attachment_list_request_entity_type.py +5 -0
- opik/rest_api/attachments/types/download_attachment_request_entity_type.py +5 -0
- opik/rest_api/attachments/types/start_multipart_upload_request_entity_type.py +5 -0
- opik/rest_api/attachments/types/upload_attachment_request_entity_type.py +5 -0
- opik/rest_api/automation_rule_evaluators/__init__.py +2 -0
- opik/rest_api/automation_rule_evaluators/client.py +182 -1162
- opik/rest_api/automation_rule_evaluators/raw_client.py +598 -0
- opik/rest_api/chat_completions/__init__.py +2 -0
- opik/rest_api/chat_completions/client.py +115 -149
- opik/rest_api/chat_completions/raw_client.py +339 -0
- opik/rest_api/check/__init__.py +2 -0
- opik/rest_api/check/client.py +88 -106
- opik/rest_api/check/raw_client.py +258 -0
- opik/rest_api/client.py +112 -212
- opik/rest_api/core/__init__.py +5 -0
- opik/rest_api/core/api_error.py +12 -6
- opik/rest_api/core/client_wrapper.py +4 -14
- opik/rest_api/core/datetime_utils.py +1 -3
- opik/rest_api/core/file.py +2 -5
- opik/rest_api/core/http_client.py +42 -120
- opik/rest_api/core/http_response.py +55 -0
- opik/rest_api/core/jsonable_encoder.py +1 -4
- opik/rest_api/core/pydantic_utilities.py +79 -147
- opik/rest_api/core/query_encoder.py +1 -3
- opik/rest_api/core/serialization.py +10 -10
- 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/__init__.py +5 -0
- opik/rest_api/datasets/client.py +1638 -1091
- opik/rest_api/datasets/raw_client.py +3389 -0
- opik/rest_api/datasets/types/__init__.py +8 -0
- opik/rest_api/datasets/types/dataset_update_visibility.py +5 -0
- opik/rest_api/datasets/types/dataset_write_visibility.py +5 -0
- opik/rest_api/errors/__init__.py +2 -0
- opik/rest_api/errors/bad_request_error.py +4 -3
- opik/rest_api/errors/conflict_error.py +4 -3
- opik/rest_api/errors/forbidden_error.py +4 -2
- opik/rest_api/errors/not_found_error.py +4 -3
- opik/rest_api/errors/not_implemented_error.py +4 -3
- opik/rest_api/errors/unauthorized_error.py +4 -3
- opik/rest_api/errors/unprocessable_entity_error.py +4 -3
- opik/rest_api/experiments/__init__.py +5 -0
- opik/rest_api/experiments/client.py +676 -752
- opik/rest_api/experiments/raw_client.py +1872 -0
- opik/rest_api/experiments/types/__init__.py +10 -0
- opik/rest_api/experiments/types/experiment_update_status.py +5 -0
- opik/rest_api/experiments/types/experiment_update_type.py +5 -0
- opik/rest_api/experiments/types/experiment_write_status.py +5 -0
- opik/rest_api/experiments/types/experiment_write_type.py +5 -0
- opik/rest_api/feedback_definitions/__init__.py +2 -0
- opik/rest_api/feedback_definitions/client.py +96 -370
- opik/rest_api/feedback_definitions/raw_client.py +541 -0
- opik/rest_api/feedback_definitions/types/__init__.py +2 -0
- opik/rest_api/feedback_definitions/types/find_feedback_definitions_request_type.py +1 -3
- opik/rest_api/guardrails/__init__.py +4 -0
- opik/rest_api/guardrails/client.py +104 -0
- opik/rest_api/guardrails/raw_client.py +102 -0
- opik/rest_api/llm_provider_key/__init__.py +2 -0
- opik/rest_api/llm_provider_key/client.py +166 -440
- opik/rest_api/llm_provider_key/raw_client.py +643 -0
- opik/rest_api/llm_provider_key/types/__init__.py +2 -0
- opik/rest_api/llm_provider_key/types/provider_api_key_write_provider.py +1 -1
- opik/rest_api/manual_evaluation/__init__.py +4 -0
- opik/rest_api/manual_evaluation/client.py +347 -0
- opik/rest_api/manual_evaluation/raw_client.py +543 -0
- opik/rest_api/open_telemetry_ingestion/__init__.py +2 -0
- opik/rest_api/open_telemetry_ingestion/client.py +38 -63
- opik/rest_api/open_telemetry_ingestion/raw_client.py +88 -0
- opik/rest_api/optimizations/__init__.py +7 -0
- opik/rest_api/optimizations/client.py +704 -0
- opik/rest_api/optimizations/raw_client.py +920 -0
- opik/rest_api/optimizations/types/__init__.py +7 -0
- opik/rest_api/optimizations/types/optimization_update_status.py +7 -0
- opik/rest_api/projects/__init__.py +10 -1
- opik/rest_api/projects/client.py +180 -855
- opik/rest_api/projects/raw_client.py +1216 -0
- opik/rest_api/projects/types/__init__.py +11 -4
- opik/rest_api/projects/types/project_metric_request_public_interval.py +1 -3
- opik/rest_api/projects/types/project_metric_request_public_metric_type.py +11 -1
- opik/rest_api/projects/types/project_update_visibility.py +5 -0
- opik/rest_api/projects/types/project_write_visibility.py +5 -0
- opik/rest_api/prompts/__init__.py +4 -2
- opik/rest_api/prompts/client.py +381 -970
- opik/rest_api/prompts/raw_client.py +1634 -0
- opik/rest_api/prompts/types/__init__.py +5 -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/raw_client.py +156 -0
- opik/rest_api/redirect/__init__.py +4 -0
- opik/rest_api/redirect/client.py +375 -0
- opik/rest_api/redirect/raw_client.py +566 -0
- opik/rest_api/service_toggles/__init__.py +4 -0
- opik/rest_api/service_toggles/client.py +91 -0
- opik/rest_api/service_toggles/raw_client.py +93 -0
- opik/rest_api/spans/__init__.py +2 -0
- opik/rest_api/spans/client.py +659 -1354
- opik/rest_api/spans/raw_client.py +2383 -0
- opik/rest_api/spans/types/__init__.py +2 -0
- opik/rest_api/spans/types/find_feedback_score_names_1_request_type.py +1 -3
- opik/rest_api/spans/types/get_span_stats_request_type.py +1 -3
- opik/rest_api/spans/types/get_spans_by_project_request_type.py +1 -3
- opik/rest_api/spans/types/span_search_stream_request_public_type.py +1 -3
- opik/rest_api/system_usage/__init__.py +2 -0
- opik/rest_api/system_usage/client.py +157 -216
- opik/rest_api/system_usage/raw_client.py +455 -0
- opik/rest_api/traces/__init__.py +2 -0
- opik/rest_api/traces/client.py +2102 -1625
- opik/rest_api/traces/raw_client.py +4144 -0
- opik/rest_api/types/__init__.py +629 -24
- opik/rest_api/types/aggregation_data.py +27 -0
- opik/rest_api/types/alert.py +33 -0
- opik/rest_api/types/alert_alert_type.py +5 -0
- opik/rest_api/types/alert_page_public.py +24 -0
- opik/rest_api/types/alert_public.py +33 -0
- opik/rest_api/types/alert_public_alert_type.py +5 -0
- opik/rest_api/types/alert_trigger.py +27 -0
- opik/rest_api/types/alert_trigger_config.py +28 -0
- opik/rest_api/types/alert_trigger_config_public.py +28 -0
- opik/rest_api/types/alert_trigger_config_public_type.py +10 -0
- opik/rest_api/types/alert_trigger_config_type.py +10 -0
- opik/rest_api/types/alert_trigger_config_write.py +22 -0
- opik/rest_api/types/alert_trigger_config_write_type.py +10 -0
- opik/rest_api/types/alert_trigger_event_type.py +19 -0
- opik/rest_api/types/alert_trigger_public.py +27 -0
- opik/rest_api/types/alert_trigger_public_event_type.py +19 -0
- opik/rest_api/types/alert_trigger_write.py +23 -0
- opik/rest_api/types/alert_trigger_write_event_type.py +19 -0
- opik/rest_api/types/alert_write.py +28 -0
- opik/rest_api/types/alert_write_alert_type.py +5 -0
- opik/rest_api/types/annotation_queue.py +42 -0
- opik/rest_api/types/annotation_queue_batch.py +27 -0
- opik/rest_api/types/{json_schema_element.py → annotation_queue_item_ids.py} +5 -7
- opik/rest_api/types/annotation_queue_page_public.py +28 -0
- opik/rest_api/types/annotation_queue_public.py +38 -0
- opik/rest_api/types/annotation_queue_public_scope.py +5 -0
- opik/rest_api/types/{workspace_metadata.py → annotation_queue_reviewer.py} +6 -7
- opik/rest_api/types/annotation_queue_reviewer_public.py +20 -0
- opik/rest_api/types/annotation_queue_scope.py +5 -0
- opik/rest_api/types/annotation_queue_write.py +31 -0
- opik/rest_api/types/annotation_queue_write_scope.py +5 -0
- opik/rest_api/types/assistant_message.py +7 -8
- opik/rest_api/types/assistant_message_role.py +1 -3
- opik/rest_api/types/attachment.py +22 -0
- opik/rest_api/types/attachment_page.py +28 -0
- opik/rest_api/types/audio_url.py +19 -0
- opik/rest_api/types/audio_url_public.py +19 -0
- opik/rest_api/types/audio_url_write.py +19 -0
- opik/rest_api/types/automation_rule_evaluator.py +160 -0
- opik/rest_api/types/automation_rule_evaluator_llm_as_judge.py +6 -6
- opik/rest_api/types/automation_rule_evaluator_llm_as_judge_public.py +6 -6
- opik/rest_api/types/automation_rule_evaluator_llm_as_judge_write.py +6 -6
- opik/rest_api/types/automation_rule_evaluator_object_object_public.py +155 -0
- opik/rest_api/types/automation_rule_evaluator_page_public.py +6 -6
- opik/rest_api/types/automation_rule_evaluator_public.py +155 -0
- 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_span_user_defined_metric_python.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_span_user_defined_metric_python_public.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_span_user_defined_metric_python_write.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_public.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_write.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_public.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_write.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_update.py +143 -0
- opik/rest_api/types/automation_rule_evaluator_update_llm_as_judge.py +6 -6
- opik/rest_api/types/automation_rule_evaluator_update_span_llm_as_judge.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_update_span_user_defined_metric_python.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_update_trace_thread_llm_as_judge.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_update_trace_thread_user_defined_metric_python.py +22 -0
- opik/rest_api/types/automation_rule_evaluator_update_user_defined_metric_python.py +6 -6
- opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python.py +6 -6
- opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_public.py +6 -6
- opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_write.py +6 -6
- opik/rest_api/types/automation_rule_evaluator_write.py +143 -0
- opik/rest_api/types/avg_value_stat_public.py +3 -5
- opik/rest_api/types/batch_delete.py +3 -5
- opik/rest_api/types/batch_delete_by_project.py +20 -0
- opik/rest_api/types/bi_information.py +3 -5
- opik/rest_api/types/bi_information_response.py +4 -6
- 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/categorical_feedback_definition.py +5 -7
- opik/rest_api/types/categorical_feedback_definition_create.py +4 -6
- opik/rest_api/types/categorical_feedback_definition_public.py +5 -7
- opik/rest_api/types/categorical_feedback_definition_update.py +4 -6
- opik/rest_api/types/categorical_feedback_detail.py +3 -5
- opik/rest_api/types/categorical_feedback_detail_create.py +3 -5
- opik/rest_api/types/categorical_feedback_detail_public.py +3 -5
- opik/rest_api/types/categorical_feedback_detail_update.py +3 -5
- opik/rest_api/types/chat_completion_choice.py +4 -6
- opik/rest_api/types/chat_completion_response.py +5 -6
- opik/rest_api/types/check.py +22 -0
- opik/rest_api/types/{json_node_compare.py → check_name.py} +1 -1
- opik/rest_api/types/check_public.py +22 -0
- opik/rest_api/types/check_public_name.py +5 -0
- opik/rest_api/types/check_public_result.py +5 -0
- opik/rest_api/types/check_result.py +5 -0
- opik/rest_api/types/chunked_output_json_node.py +4 -6
- opik/rest_api/types/chunked_output_json_node_public.py +4 -6
- opik/rest_api/types/chunked_output_json_node_public_type.py +6 -10
- opik/rest_api/types/chunked_output_json_node_type.py +6 -10
- opik/rest_api/types/column.py +8 -10
- opik/rest_api/types/column_compare.py +8 -10
- opik/rest_api/types/column_public.py +8 -10
- opik/rest_api/types/column_types_item.py +1 -3
- opik/rest_api/types/comment.py +4 -6
- opik/rest_api/types/comment_compare.py +4 -6
- opik/rest_api/types/comment_public.py +4 -6
- opik/rest_api/types/complete_multipart_upload_request.py +33 -0
- opik/rest_api/types/complete_multipart_upload_request_entity_type.py +5 -0
- opik/rest_api/types/completion_tokens_details.py +3 -5
- opik/rest_api/types/count_value_stat_public.py +3 -5
- opik/rest_api/types/dashboard_page_public.py +24 -0
- opik/rest_api/types/dashboard_public.py +30 -0
- opik/rest_api/types/data_point_double.py +21 -0
- opik/rest_api/types/data_point_number_public.py +3 -5
- opik/rest_api/types/dataset.py +14 -6
- opik/rest_api/types/dataset_expansion.py +42 -0
- opik/rest_api/types/dataset_expansion_response.py +39 -0
- opik/rest_api/types/dataset_item.py +9 -8
- opik/rest_api/types/dataset_item_batch.py +3 -5
- opik/rest_api/types/dataset_item_changes_public.py +5 -0
- opik/rest_api/types/dataset_item_compare.py +9 -8
- opik/rest_api/types/dataset_item_compare_source.py +1 -3
- opik/rest_api/types/dataset_item_filter.py +27 -0
- opik/rest_api/types/dataset_item_filter_operator.py +21 -0
- opik/rest_api/types/dataset_item_page_compare.py +10 -7
- opik/rest_api/types/dataset_item_page_public.py +10 -7
- opik/rest_api/types/dataset_item_public.py +9 -8
- opik/rest_api/types/dataset_item_public_source.py +1 -3
- opik/rest_api/types/dataset_item_source.py +1 -3
- opik/rest_api/types/dataset_item_update.py +39 -0
- opik/rest_api/types/dataset_item_write.py +5 -6
- opik/rest_api/types/dataset_item_write_source.py +1 -3
- opik/rest_api/types/dataset_page_public.py +9 -6
- opik/rest_api/types/dataset_public.py +14 -6
- opik/rest_api/types/dataset_public_status.py +5 -0
- opik/rest_api/types/dataset_public_visibility.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 +59 -0
- opik/rest_api/types/dataset_version_summary.py +46 -0
- opik/rest_api/types/dataset_version_summary_public.py +46 -0
- opik/rest_api/types/dataset_visibility.py +5 -0
- opik/rest_api/types/delete_attachments_request.py +23 -0
- opik/rest_api/types/delete_attachments_request_entity_type.py +5 -0
- opik/rest_api/types/delete_feedback_score.py +4 -5
- opik/rest_api/types/delete_ids_holder.py +19 -0
- opik/rest_api/types/delta.py +7 -9
- opik/rest_api/types/error_count_with_deviation.py +21 -0
- opik/rest_api/types/error_count_with_deviation_detailed.py +21 -0
- opik/rest_api/types/error_info.py +3 -5
- opik/rest_api/types/error_info_experiment_item_bulk_write_view.py +21 -0
- opik/rest_api/types/error_info_public.py +3 -5
- opik/rest_api/types/error_info_write.py +3 -5
- opik/rest_api/types/error_message.py +3 -5
- opik/rest_api/types/error_message_detail.py +3 -5
- opik/rest_api/types/error_message_detailed.py +3 -5
- opik/rest_api/types/error_message_public.py +3 -5
- opik/rest_api/types/experiment.py +21 -10
- opik/rest_api/types/experiment_group_aggregations_response.py +20 -0
- opik/rest_api/types/experiment_group_response.py +22 -0
- opik/rest_api/types/experiment_item.py +14 -11
- opik/rest_api/types/experiment_item_bulk_record.py +27 -0
- opik/rest_api/types/experiment_item_bulk_record_experiment_item_bulk_write_view.py +27 -0
- opik/rest_api/types/experiment_item_bulk_upload.py +27 -0
- opik/rest_api/types/experiment_item_compare.py +14 -11
- opik/rest_api/types/experiment_item_compare_trace_visibility_mode.py +5 -0
- opik/rest_api/types/experiment_item_public.py +6 -6
- opik/rest_api/types/experiment_item_public_trace_visibility_mode.py +5 -0
- opik/rest_api/types/experiment_item_trace_visibility_mode.py +5 -0
- opik/rest_api/types/experiment_page_public.py +9 -6
- opik/rest_api/types/experiment_public.py +21 -10
- opik/rest_api/types/experiment_public_status.py +5 -0
- opik/rest_api/types/experiment_public_type.py +5 -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/experiment_status.py +5 -0
- opik/rest_api/types/experiment_type.py +5 -0
- opik/rest_api/types/export_trace_service_request.py +5 -0
- opik/rest_api/types/feedback.py +40 -27
- opik/rest_api/types/feedback_create.py +27 -13
- opik/rest_api/types/feedback_definition_page_public.py +4 -6
- opik/rest_api/types/feedback_object_public.py +40 -27
- opik/rest_api/types/feedback_public.py +40 -27
- opik/rest_api/types/feedback_score.py +7 -7
- opik/rest_api/types/feedback_score_average.py +3 -5
- opik/rest_api/types/feedback_score_average_detailed.py +3 -5
- opik/rest_api/types/feedback_score_average_public.py +3 -5
- opik/rest_api/types/feedback_score_batch.py +4 -6
- opik/rest_api/types/feedback_score_batch_item.py +6 -6
- opik/rest_api/types/feedback_score_batch_item_source.py +1 -3
- opik/rest_api/types/feedback_score_batch_item_thread.py +32 -0
- opik/rest_api/types/feedback_score_batch_item_thread_source.py +5 -0
- opik/rest_api/types/feedback_score_compare.py +7 -7
- opik/rest_api/types/feedback_score_compare_source.py +1 -3
- opik/rest_api/types/feedback_score_experiment_item_bulk_write_view.py +31 -0
- opik/rest_api/types/feedback_score_experiment_item_bulk_write_view_source.py +5 -0
- opik/rest_api/types/feedback_score_names.py +4 -6
- opik/rest_api/types/feedback_score_public.py +11 -7
- opik/rest_api/types/feedback_score_public_source.py +1 -3
- opik/rest_api/types/feedback_score_source.py +1 -3
- opik/rest_api/types/feedback_update.py +27 -13
- opik/rest_api/types/function.py +4 -7
- opik/rest_api/types/function_call.py +3 -5
- opik/rest_api/types/group_content.py +19 -0
- opik/rest_api/types/group_content_with_aggregations.py +21 -0
- opik/rest_api/types/group_detail.py +19 -0
- opik/rest_api/types/group_details.py +20 -0
- opik/rest_api/types/guardrail.py +34 -0
- opik/rest_api/types/guardrail_batch.py +20 -0
- opik/rest_api/types/guardrail_name.py +5 -0
- opik/rest_api/types/guardrail_result.py +5 -0
- opik/rest_api/types/guardrail_write.py +33 -0
- opik/rest_api/types/guardrail_write_name.py +5 -0
- opik/rest_api/types/guardrail_write_result.py +5 -0
- opik/rest_api/types/guardrails_validation.py +21 -0
- opik/rest_api/types/guardrails_validation_public.py +21 -0
- opik/rest_api/types/ids_holder.py +19 -0
- 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/json_list_string.py +7 -0
- opik/rest_api/types/json_list_string_compare.py +7 -0
- opik/rest_api/types/json_list_string_experiment_item_bulk_write_view.py +7 -0
- opik/rest_api/types/json_list_string_public.py +7 -0
- opik/rest_api/types/json_list_string_write.py +7 -0
- opik/rest_api/types/json_schema.py +5 -8
- opik/rest_api/types/llm_as_judge_code.py +8 -12
- opik/rest_api/types/llm_as_judge_code_public.py +8 -12
- opik/rest_api/types/llm_as_judge_code_write.py +8 -12
- opik/rest_api/types/llm_as_judge_message.py +9 -7
- opik/rest_api/types/llm_as_judge_message_content.py +26 -0
- opik/rest_api/types/llm_as_judge_message_content_public.py +26 -0
- opik/rest_api/types/llm_as_judge_message_content_write.py +26 -0
- opik/rest_api/types/llm_as_judge_message_public.py +9 -7
- opik/rest_api/types/llm_as_judge_message_public_role.py +1 -1
- opik/rest_api/types/llm_as_judge_message_role.py +1 -1
- opik/rest_api/types/llm_as_judge_message_write.py +9 -7
- opik/rest_api/types/llm_as_judge_message_write_role.py +1 -1
- opik/rest_api/types/llm_as_judge_model_parameters.py +6 -5
- opik/rest_api/types/llm_as_judge_model_parameters_public.py +6 -5
- opik/rest_api/types/llm_as_judge_model_parameters_write.py +6 -5
- opik/rest_api/types/llm_as_judge_output_schema.py +4 -6
- opik/rest_api/types/llm_as_judge_output_schema_public.py +4 -6
- opik/rest_api/types/llm_as_judge_output_schema_public_type.py +1 -3
- opik/rest_api/types/llm_as_judge_output_schema_type.py +1 -3
- opik/rest_api/types/llm_as_judge_output_schema_write.py +4 -6
- opik/rest_api/types/llm_as_judge_output_schema_write_type.py +1 -3
- opik/rest_api/types/log_item.py +5 -7
- opik/rest_api/types/log_item_level.py +1 -3
- opik/rest_api/types/log_page.py +4 -6
- opik/rest_api/types/manual_evaluation_request.py +38 -0
- opik/rest_api/types/manual_evaluation_request_entity_type.py +5 -0
- opik/rest_api/types/manual_evaluation_response.py +27 -0
- opik/rest_api/types/multipart_upload_part.py +20 -0
- opik/rest_api/types/numerical_feedback_definition.py +5 -7
- opik/rest_api/types/numerical_feedback_definition_create.py +4 -6
- opik/rest_api/types/numerical_feedback_definition_public.py +5 -7
- opik/rest_api/types/numerical_feedback_definition_update.py +4 -6
- opik/rest_api/types/numerical_feedback_detail.py +3 -5
- opik/rest_api/types/numerical_feedback_detail_create.py +3 -5
- opik/rest_api/types/numerical_feedback_detail_public.py +3 -5
- opik/rest_api/types/numerical_feedback_detail_update.py +3 -5
- opik/rest_api/types/optimization.py +37 -0
- opik/rest_api/types/optimization_page_public.py +28 -0
- opik/rest_api/types/optimization_public.py +37 -0
- opik/rest_api/types/optimization_public_status.py +7 -0
- opik/rest_api/types/optimization_status.py +7 -0
- 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 +30 -0
- opik/rest_api/types/optimization_write_status.py +7 -0
- opik/rest_api/types/page_columns.py +4 -6
- opik/rest_api/types/percentage_value_stat_public.py +4 -6
- opik/rest_api/types/percentage_values.py +8 -16
- opik/rest_api/types/percentage_values_detailed.py +8 -16
- opik/rest_api/types/percentage_values_public.py +8 -16
- opik/rest_api/types/project.py +12 -7
- opik/rest_api/types/project_detailed.py +12 -7
- opik/rest_api/types/project_detailed_visibility.py +5 -0
- opik/rest_api/types/project_metric_response_public.py +5 -9
- opik/rest_api/types/project_metric_response_public_interval.py +1 -3
- opik/rest_api/types/project_metric_response_public_metric_type.py +11 -1
- opik/rest_api/types/project_page_public.py +8 -10
- opik/rest_api/types/project_public.py +6 -6
- opik/rest_api/types/project_public_visibility.py +5 -0
- opik/rest_api/types/project_reference.py +31 -0
- opik/rest_api/types/project_reference_public.py +31 -0
- opik/rest_api/types/project_stat_item_object_public.py +8 -17
- opik/rest_api/types/project_stats_public.py +4 -6
- opik/rest_api/types/project_stats_summary.py +4 -6
- opik/rest_api/types/project_stats_summary_item.py +9 -6
- opik/rest_api/types/project_visibility.py +5 -0
- opik/rest_api/types/prompt.py +12 -7
- opik/rest_api/types/prompt_detail.py +12 -7
- opik/rest_api/types/prompt_detail_template_structure.py +5 -0
- opik/rest_api/types/prompt_page_public.py +9 -6
- opik/rest_api/types/prompt_public.py +11 -6
- 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_tokens_details.py +19 -0
- opik/rest_api/types/prompt_version.py +7 -6
- opik/rest_api/types/prompt_version_detail.py +7 -6
- opik/rest_api/types/prompt_version_detail_template_structure.py +5 -0
- opik/rest_api/types/prompt_version_link.py +4 -5
- opik/rest_api/types/prompt_version_link_public.py +4 -5
- opik/rest_api/types/prompt_version_link_write.py +3 -5
- opik/rest_api/types/prompt_version_page_public.py +9 -6
- opik/rest_api/types/prompt_version_public.py +7 -6
- 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/prompt_version_update.py +33 -0
- opik/rest_api/types/provider_api_key.py +18 -8
- opik/rest_api/types/provider_api_key_page_public.py +27 -0
- opik/rest_api/types/provider_api_key_provider.py +1 -1
- opik/rest_api/types/provider_api_key_public.py +18 -8
- opik/rest_api/types/provider_api_key_public_provider.py +1 -1
- opik/rest_api/types/response_format.py +5 -7
- opik/rest_api/types/response_format_type.py +1 -3
- opik/rest_api/types/result.py +21 -0
- opik/rest_api/types/results_number_public.py +4 -6
- opik/rest_api/types/score_name.py +4 -5
- opik/rest_api/types/service_toggles_config.py +44 -0
- opik/rest_api/types/span.py +13 -15
- opik/rest_api/types/span_batch.py +4 -6
- opik/rest_api/types/span_enrichment_options.py +31 -0
- opik/rest_api/types/span_experiment_item_bulk_write_view.py +39 -0
- opik/rest_api/types/span_experiment_item_bulk_write_view_type.py +5 -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_public.py +4 -6
- opik/rest_api/types/span_filter_public_operator.py +2 -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_page_public.py +9 -6
- opik/rest_api/types/span_public.py +19 -16
- opik/rest_api/types/span_public_type.py +1 -1
- opik/rest_api/types/span_type.py +1 -1
- opik/rest_api/types/span_update.py +46 -0
- opik/rest_api/types/span_update_type.py +5 -0
- opik/rest_api/types/span_user_defined_metric_python_code.py +20 -0
- opik/rest_api/types/span_user_defined_metric_python_code_public.py +20 -0
- opik/rest_api/types/span_user_defined_metric_python_code_write.py +20 -0
- opik/rest_api/types/span_write.py +13 -14
- opik/rest_api/types/span_write_type.py +1 -1
- opik/rest_api/types/spans_count_response.py +20 -0
- opik/rest_api/types/start_multipart_upload_response.py +20 -0
- opik/rest_api/types/stream_options.py +3 -5
- 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/tool.py +4 -6
- opik/rest_api/types/tool_call.py +4 -6
- opik/rest_api/types/trace.py +26 -12
- opik/rest_api/types/trace_batch.py +4 -6
- opik/rest_api/types/trace_count_response.py +4 -6
- opik/rest_api/types/trace_enrichment_options.py +32 -0
- opik/rest_api/types/trace_experiment_item_bulk_write_view.py +41 -0
- opik/rest_api/types/trace_filter.py +23 -0
- opik/rest_api/types/trace_filter_operator.py +21 -0
- opik/rest_api/types/trace_filter_public.py +23 -0
- opik/rest_api/types/trace_filter_public_operator.py +21 -0
- opik/rest_api/types/trace_filter_write.py +23 -0
- opik/rest_api/types/trace_filter_write_operator.py +21 -0
- opik/rest_api/types/trace_page_public.py +8 -10
- opik/rest_api/types/trace_public.py +27 -13
- opik/rest_api/types/trace_public_visibility_mode.py +5 -0
- opik/rest_api/types/trace_thread.py +18 -9
- opik/rest_api/types/trace_thread_filter.py +23 -0
- opik/rest_api/types/trace_thread_filter_operator.py +21 -0
- opik/rest_api/types/trace_thread_filter_public.py +23 -0
- opik/rest_api/types/trace_thread_filter_public_operator.py +21 -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_identifier.py +22 -0
- opik/rest_api/types/trace_thread_llm_as_judge_code.py +26 -0
- opik/rest_api/types/trace_thread_llm_as_judge_code_public.py +26 -0
- opik/rest_api/types/trace_thread_llm_as_judge_code_write.py +26 -0
- opik/rest_api/types/trace_thread_page.py +9 -6
- opik/rest_api/types/trace_thread_status.py +5 -0
- opik/rest_api/types/trace_thread_update.py +19 -0
- opik/rest_api/types/trace_thread_user_defined_metric_python_code.py +19 -0
- opik/rest_api/types/trace_thread_user_defined_metric_python_code_public.py +19 -0
- opik/rest_api/types/trace_thread_user_defined_metric_python_code_write.py +19 -0
- opik/rest_api/types/trace_update.py +39 -0
- opik/rest_api/types/trace_visibility_mode.py +5 -0
- opik/rest_api/types/trace_write.py +10 -11
- opik/rest_api/types/usage.py +6 -6
- opik/rest_api/types/user_defined_metric_python_code.py +3 -5
- opik/rest_api/types/user_defined_metric_python_code_public.py +3 -5
- opik/rest_api/types/user_defined_metric_python_code_write.py +3 -5
- opik/rest_api/types/value_entry.py +27 -0
- opik/rest_api/types/value_entry_compare.py +27 -0
- opik/rest_api/types/value_entry_compare_source.py +5 -0
- opik/rest_api/types/value_entry_experiment_item_bulk_write_view.py +27 -0
- opik/rest_api/types/value_entry_experiment_item_bulk_write_view_source.py +5 -0
- opik/rest_api/types/value_entry_public.py +27 -0
- opik/rest_api/types/value_entry_public_source.py +5 -0
- opik/rest_api/types/value_entry_source.py +5 -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/rest_api/types/webhook.py +28 -0
- opik/rest_api/types/webhook_examples.py +19 -0
- opik/rest_api/types/webhook_public.py +28 -0
- opik/rest_api/types/webhook_test_result.py +23 -0
- opik/rest_api/types/webhook_test_result_status.py +5 -0
- opik/rest_api/types/webhook_write.py +23 -0
- opik/rest_api/types/welcome_wizard_tracking.py +22 -0
- opik/rest_api/types/workspace_configuration.py +27 -0
- opik/rest_api/types/workspace_metric_request.py +24 -0
- opik/rest_api/types/workspace_metric_response.py +20 -0
- opik/rest_api/types/workspace_metrics_summary_request.py +23 -0
- opik/rest_api/types/workspace_metrics_summary_response.py +20 -0
- opik/rest_api/types/workspace_name_holder.py +19 -0
- opik/rest_api/types/workspace_spans_count.py +20 -0
- opik/rest_api/types/workspace_trace_count.py +3 -5
- opik/rest_api/welcome_wizard/__init__.py +4 -0
- opik/rest_api/welcome_wizard/client.py +195 -0
- opik/rest_api/welcome_wizard/raw_client.py +208 -0
- opik/rest_api/workspaces/__init__.py +2 -0
- opik/rest_api/workspaces/client.py +550 -77
- opik/rest_api/workspaces/raw_client.py +923 -0
- opik/rest_client_configurator/api.py +1 -0
- opik/rest_client_configurator/retry_decorator.py +1 -0
- opik/s3_httpx_client.py +67 -0
- opik/simulation/__init__.py +6 -0
- opik/simulation/simulated_user.py +99 -0
- opik/simulation/simulator.py +108 -0
- opik/synchronization.py +11 -24
- opik/tracing_runtime_config.py +48 -0
- opik/types.py +48 -2
- opik/url_helpers.py +13 -3
- opik/validation/chat_prompt_messages.py +241 -0
- opik/validation/feedback_score.py +4 -5
- opik/validation/parameter.py +122 -0
- opik/validation/parameters_validator.py +175 -0
- opik/validation/validator.py +30 -2
- opik/validation/validator_helpers.py +147 -0
- opik-1.9.71.dist-info/METADATA +370 -0
- opik-1.9.71.dist-info/RECORD +1110 -0
- {opik-1.6.4.dist-info → opik-1.9.71.dist-info}/WHEEL +1 -1
- opik-1.9.71.dist-info/licenses/LICENSE +203 -0
- opik/api_objects/prompt/prompt.py +0 -107
- opik/api_objects/prompt/prompt_template.py +0 -35
- opik/cli.py +0 -193
- opik/evaluation/metrics/models.py +0 -8
- opik/hooks.py +0 -13
- opik/integrations/bedrock/chunks_aggregator.py +0 -55
- opik/integrations/bedrock/helpers.py +0 -8
- opik/integrations/langchain/google_run_helpers.py +0 -75
- opik/integrations/langchain/openai_run_helpers.py +0 -122
- opik/message_processing/message_processors.py +0 -203
- opik/rest_api/types/delta_role.py +0 -7
- opik/rest_api/types/json_object_schema.py +0 -34
- opik-1.6.4.dist-info/METADATA +0 -270
- opik-1.6.4.dist-info/RECORD +0 -507
- /opik/integrations/bedrock/{stream_wrappers.py → converse/stream_wrappers.py} +0 -0
- {opik-1.6.4.dist-info → opik-1.9.71.dist-info}/entry_points.txt +0 -0
- {opik-1.6.4.dist-info → opik-1.9.71.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from contextlib import contextmanager
|
|
3
|
+
from typing import Optional, Dict, Any, List, Generator
|
|
4
|
+
|
|
5
|
+
from opik.api_objects import span, opik_client
|
|
6
|
+
from opik.types import SpanType
|
|
7
|
+
from opik import context_storage
|
|
8
|
+
from .. import arguments_helpers, base_track_decorator, error_info_collector
|
|
9
|
+
|
|
10
|
+
LOGGER = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@contextmanager
|
|
14
|
+
def start_as_current_span(
|
|
15
|
+
name: str,
|
|
16
|
+
type: SpanType = "general",
|
|
17
|
+
input: Optional[Dict[str, Any]] = None,
|
|
18
|
+
output: Optional[Dict[str, Any]] = None,
|
|
19
|
+
tags: Optional[List[str]] = None,
|
|
20
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
21
|
+
project_name: Optional[str] = None,
|
|
22
|
+
model: Optional[str] = None,
|
|
23
|
+
provider: Optional[str] = None,
|
|
24
|
+
flush: bool = False,
|
|
25
|
+
**kwargs: Dict[str, Any],
|
|
26
|
+
) -> Generator[span.SpanData, Any, None]:
|
|
27
|
+
"""
|
|
28
|
+
A context manager for starting and managing a span and parent trace.
|
|
29
|
+
|
|
30
|
+
This function creates a span and parent trace (if missing) with input parameters, processes outputs,
|
|
31
|
+
handles errors, and ensures the span/trace data is saved and flushed at the end of its lifecycle.
|
|
32
|
+
It integrates distributed tracing headers and allows additional metadata, tags, and other
|
|
33
|
+
contextual information to be provided.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
name: The name of the span to create.
|
|
37
|
+
type: The type of the span. Defaults to "general".
|
|
38
|
+
input: A dictionary representing the input data associated with the span.
|
|
39
|
+
output: A dictionary for providing the output associated with the span.
|
|
40
|
+
tags: A list of tags to associate with the span.
|
|
41
|
+
metadata: A dictionary of additional metadata to attach to the span or trace.
|
|
42
|
+
project_name: The name of the project associated with this span.
|
|
43
|
+
model: The model name related to the span or trace.
|
|
44
|
+
provider: The provider responsible for the span or trace.
|
|
45
|
+
flush: Whether to flush the client data after the span is created and processed.
|
|
46
|
+
**kwargs (Dict[str, Any]): Additional parameters that may be passed to the
|
|
47
|
+
context manager.
|
|
48
|
+
|
|
49
|
+
Yields:
|
|
50
|
+
An iterator that provides the span data within the context of the span manager lifecycle.
|
|
51
|
+
"""
|
|
52
|
+
start_span_parameters = arguments_helpers.StartSpanParameters(
|
|
53
|
+
name=name,
|
|
54
|
+
input=input,
|
|
55
|
+
type=type,
|
|
56
|
+
project_name=project_name,
|
|
57
|
+
model=model,
|
|
58
|
+
provider=provider,
|
|
59
|
+
)
|
|
60
|
+
distributed_headers = arguments_helpers.extract_distributed_trace_headers(kwargs)
|
|
61
|
+
|
|
62
|
+
# create span/trace with input parameters
|
|
63
|
+
span_creation_result = base_track_decorator.add_start_candidates(
|
|
64
|
+
start_span_parameters=start_span_parameters,
|
|
65
|
+
opik_distributed_trace_headers=distributed_headers,
|
|
66
|
+
opik_args_data=None,
|
|
67
|
+
tracing_active=True,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
end_arguments = arguments_helpers.EndSpanParameters(
|
|
71
|
+
input=span_creation_result.span_data.input or input,
|
|
72
|
+
output=span_creation_result.span_data.output or output,
|
|
73
|
+
tags=span_creation_result.span_data.tags or tags,
|
|
74
|
+
metadata=span_creation_result.span_data.metadata or metadata,
|
|
75
|
+
provider=span_creation_result.span_data.provider or provider,
|
|
76
|
+
model=span_creation_result.span_data.model or model,
|
|
77
|
+
)
|
|
78
|
+
try:
|
|
79
|
+
yield span_creation_result.span_data
|
|
80
|
+
|
|
81
|
+
# update end arguments
|
|
82
|
+
end_arguments.input = span_creation_result.span_data.input or input
|
|
83
|
+
end_arguments.output = span_creation_result.span_data.output or output
|
|
84
|
+
end_arguments.tags = span_creation_result.span_data.tags or tags
|
|
85
|
+
end_arguments.metadata = span_creation_result.span_data.metadata or metadata
|
|
86
|
+
end_arguments.provider = span_creation_result.span_data.provider or provider
|
|
87
|
+
end_arguments.model = span_creation_result.span_data.model or model
|
|
88
|
+
except Exception as exception:
|
|
89
|
+
LOGGER.error(
|
|
90
|
+
"Error in user's script while executing span context manager: %s",
|
|
91
|
+
str(exception),
|
|
92
|
+
exc_info=True,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
# collect error info
|
|
96
|
+
end_arguments.error_info = error_info_collector.collect(exception)
|
|
97
|
+
end_arguments.output = None
|
|
98
|
+
raise
|
|
99
|
+
finally:
|
|
100
|
+
# save span/trace data at the end of the context manager
|
|
101
|
+
client = opik_client.get_client_cached()
|
|
102
|
+
|
|
103
|
+
span_creation_result.span_data.init_end_time().update(
|
|
104
|
+
**end_arguments.to_kwargs(),
|
|
105
|
+
)
|
|
106
|
+
client.span(**span_creation_result.span_data.as_parameters)
|
|
107
|
+
|
|
108
|
+
if span_creation_result.trace_data is not None:
|
|
109
|
+
span_creation_result.trace_data.init_end_time().update(
|
|
110
|
+
**end_arguments.to_kwargs(ignore_keys=["usage", "model", "provider"]),
|
|
111
|
+
)
|
|
112
|
+
client.trace(**span_creation_result.trace_data.as_parameters)
|
|
113
|
+
|
|
114
|
+
# Clean up span and trace from context
|
|
115
|
+
opik_context_storage = context_storage.get_current_context_instance()
|
|
116
|
+
opik_context_storage.pop_span_data(ensure_id=span_creation_result.span_data.id)
|
|
117
|
+
if span_creation_result.trace_data is not None:
|
|
118
|
+
opik_context_storage.pop_trace_data(
|
|
119
|
+
ensure_id=span_creation_result.trace_data.id
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
if flush:
|
|
123
|
+
client.flush()
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from contextlib import contextmanager
|
|
3
|
+
from typing import Any, Generator, Optional, Dict, List
|
|
4
|
+
|
|
5
|
+
from opik import datetime_helpers
|
|
6
|
+
from opik.api_objects import trace, opik_client, helpers
|
|
7
|
+
from opik import context_storage
|
|
8
|
+
from .. import base_track_decorator, error_info_collector
|
|
9
|
+
|
|
10
|
+
LOGGER = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@contextmanager
|
|
14
|
+
def start_as_current_trace(
|
|
15
|
+
name: str,
|
|
16
|
+
input: Optional[Dict[str, Any]] = None,
|
|
17
|
+
output: Optional[Dict[str, Any]] = None,
|
|
18
|
+
tags: Optional[List[str]] = None,
|
|
19
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
20
|
+
project_name: Optional[str] = None,
|
|
21
|
+
thread_id: Optional[str] = None,
|
|
22
|
+
flush: bool = False,
|
|
23
|
+
) -> Generator[trace.TraceData, Any, None]:
|
|
24
|
+
"""
|
|
25
|
+
Starts a trace context manager to collect and manage tracing data during the
|
|
26
|
+
execution of a code block. This function initializes a trace, allows for
|
|
27
|
+
modifications within the context, and finishes the trace, sending data to the
|
|
28
|
+
Opik tracing infrastructure.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
name: The name of the trace for identification purposes.
|
|
32
|
+
input: Optional input data associated with the trace.
|
|
33
|
+
output: Optional output data expected or associated with the trace.
|
|
34
|
+
tags: Optional list of string tags for labeling or describing the trace.
|
|
35
|
+
metadata: Optional dictionary containing additional information about the
|
|
36
|
+
trace.
|
|
37
|
+
project_name: Optional name of the project under which the trace belongs.
|
|
38
|
+
thread_id: Optional thread identifier to associate the trace with a
|
|
39
|
+
specific thread.
|
|
40
|
+
flush: A boolean indicating whether to flush the trace data immediately
|
|
41
|
+
after finishing the trace context.
|
|
42
|
+
|
|
43
|
+
Yields:
|
|
44
|
+
Provides the initialized trace data for manipulation during execution in the context.
|
|
45
|
+
"""
|
|
46
|
+
trace_data = trace.TraceData(
|
|
47
|
+
id=helpers.generate_id(),
|
|
48
|
+
start_time=datetime_helpers.local_timestamp(),
|
|
49
|
+
name=name,
|
|
50
|
+
input=input,
|
|
51
|
+
output=output,
|
|
52
|
+
metadata=metadata,
|
|
53
|
+
tags=tags,
|
|
54
|
+
project_name=project_name,
|
|
55
|
+
thread_id=thread_id,
|
|
56
|
+
)
|
|
57
|
+
base_track_decorator.add_start_trace_candidate(
|
|
58
|
+
trace_data=trace_data,
|
|
59
|
+
opik_args_data=None,
|
|
60
|
+
tracing_active=True,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
yield trace_data
|
|
65
|
+
except Exception as exception:
|
|
66
|
+
LOGGER.error(
|
|
67
|
+
"Error in user's script while executing trace context manager: %s",
|
|
68
|
+
str(exception),
|
|
69
|
+
exc_info=True,
|
|
70
|
+
)
|
|
71
|
+
trace_data.error_info = error_info_collector.collect(exception)
|
|
72
|
+
trace_data.output = None
|
|
73
|
+
raise
|
|
74
|
+
finally:
|
|
75
|
+
# save trace data at the end of the context manager
|
|
76
|
+
client = opik_client.get_client_cached()
|
|
77
|
+
client.trace(**trace_data.init_end_time().as_parameters)
|
|
78
|
+
|
|
79
|
+
# Clean up trace from context
|
|
80
|
+
opik_context_storage = context_storage.get_current_context_instance()
|
|
81
|
+
opik_context_storage.pop_trace_data(ensure_id=trace_data.id)
|
|
82
|
+
|
|
83
|
+
if flush:
|
|
84
|
+
client.flush()
|
|
@@ -11,7 +11,8 @@ from typing import (
|
|
|
11
11
|
Generic,
|
|
12
12
|
)
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
import opik.context_storage as context_storage
|
|
15
|
+
import opik.logging_messages as logging_messages
|
|
15
16
|
from opik.api_objects import span, trace
|
|
16
17
|
from opik.types import DistributedTraceHeadersDict, ErrorInfoDict
|
|
17
18
|
|
|
@@ -58,7 +59,7 @@ class BaseTrackedGenerator(Generic[YieldType]):
|
|
|
58
59
|
return
|
|
59
60
|
|
|
60
61
|
self._created_trace_data, self._created_span_data = (
|
|
61
|
-
span_creation_handler.
|
|
62
|
+
span_creation_handler.create_span_respecting_context(
|
|
62
63
|
self._start_span_arguments, self._opik_distributed_trace_headers
|
|
63
64
|
)
|
|
64
65
|
)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import inspect
|
|
2
|
+
import functools
|
|
2
3
|
|
|
3
4
|
from typing import Callable, Tuple, Any, Dict
|
|
4
5
|
|
|
@@ -44,3 +45,13 @@ def is_async(func: Callable) -> bool:
|
|
|
44
45
|
return True
|
|
45
46
|
|
|
46
47
|
return False
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def get_function_name(func: Callable) -> str:
|
|
51
|
+
"""Safely get the name of a function, handling functools.partial objects."""
|
|
52
|
+
if isinstance(func, functools.partial):
|
|
53
|
+
# For partial objects, get the name from the underlying function
|
|
54
|
+
return getattr(func.func, "__name__", "<unknown>")
|
|
55
|
+
|
|
56
|
+
# For regular functions and other callables
|
|
57
|
+
return getattr(func, "__name__", "<unknown>")
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from .api_classes import OpikArgs
|
|
2
|
+
from .helpers import (
|
|
3
|
+
extract_opik_args,
|
|
4
|
+
apply_opik_args_to_start_span_params,
|
|
5
|
+
apply_opik_args_to_trace,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"OpikArgs",
|
|
10
|
+
"extract_opik_args",
|
|
11
|
+
"apply_opik_args_to_start_span_params",
|
|
12
|
+
"apply_opik_args_to_trace",
|
|
13
|
+
]
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Any, Dict, List, Optional
|
|
3
|
+
|
|
4
|
+
import pydantic
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
LOGGER = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class OpikArgsSpan(pydantic.BaseModel):
|
|
11
|
+
"""
|
|
12
|
+
Configuration for span updates passed via opik_args parameter.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
tags: Optional[List[str]] = None
|
|
16
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class OpikArgsTrace(pydantic.BaseModel):
|
|
20
|
+
"""
|
|
21
|
+
Configuration for trace updates passed via opik_args parameter.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
thread_id: Optional[str] = None
|
|
25
|
+
tags: Optional[List[str]] = None
|
|
26
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class OpikArgs(pydantic.BaseModel):
|
|
30
|
+
"""
|
|
31
|
+
Configuration structure for special opik arguments passed to tracked functions.
|
|
32
|
+
|
|
33
|
+
This allows users to specify span and trace updates without modifying function bodies.
|
|
34
|
+
Tags and metadata are merged (not overwritten) with existing values.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
span_args: Optional[OpikArgsSpan] = None
|
|
38
|
+
trace_args: Optional[OpikArgsTrace] = None
|
|
39
|
+
|
|
40
|
+
@classmethod
|
|
41
|
+
def from_dict(cls, config_dict: Optional[Dict[str, Any]]) -> Optional["OpikArgs"]:
|
|
42
|
+
"""Create OpikArgs from dictionary, with validation."""
|
|
43
|
+
if not isinstance(config_dict, dict):
|
|
44
|
+
LOGGER.warning("opik_args must be a dictionary, got %s", type(config_dict))
|
|
45
|
+
return None
|
|
46
|
+
|
|
47
|
+
span_args = None
|
|
48
|
+
trace_args = None
|
|
49
|
+
|
|
50
|
+
if "span" in config_dict:
|
|
51
|
+
span_data = config_dict["span"]
|
|
52
|
+
if isinstance(span_data, dict):
|
|
53
|
+
span_args = OpikArgsSpan(
|
|
54
|
+
tags=span_data.get("tags"),
|
|
55
|
+
metadata=span_data.get("metadata"),
|
|
56
|
+
)
|
|
57
|
+
else:
|
|
58
|
+
LOGGER.warning("opik_args['span'] must be a dictionary")
|
|
59
|
+
|
|
60
|
+
if "trace" in config_dict:
|
|
61
|
+
trace_data = config_dict["trace"]
|
|
62
|
+
if isinstance(trace_data, dict):
|
|
63
|
+
trace_args = OpikArgsTrace(
|
|
64
|
+
thread_id=trace_data.get("thread_id"),
|
|
65
|
+
tags=trace_data.get("tags"),
|
|
66
|
+
metadata=trace_data.get("metadata"),
|
|
67
|
+
)
|
|
68
|
+
else:
|
|
69
|
+
LOGGER.warning("opik_args['trace'] must be a dictionary")
|
|
70
|
+
|
|
71
|
+
return cls(span_args=span_args, trace_args=trace_args)
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import inspect
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Any, Dict, Optional, Callable
|
|
4
|
+
|
|
5
|
+
from .. import arguments_helpers
|
|
6
|
+
from ...api_objects import trace, data_helpers
|
|
7
|
+
from . import api_classes
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
LOGGER = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def extract_opik_args(
|
|
14
|
+
kwargs: Dict[str, Any], func: Callable
|
|
15
|
+
) -> Optional[api_classes.OpikArgs]:
|
|
16
|
+
"""
|
|
17
|
+
Extracts opik_args from kwargs and returns the parsed OpikArgs or None.
|
|
18
|
+
|
|
19
|
+
Mutates kwargs in place by removing "opik_args" if the function does not explicitly
|
|
20
|
+
declare opik_args as a parameter.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
kwargs: Function keyword arguments
|
|
24
|
+
func: The function being decorated
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
opik_args if found, otherwise None.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
# Check if a function has opik_args in its signature
|
|
31
|
+
try:
|
|
32
|
+
sig = inspect.signature(func)
|
|
33
|
+
has_opik_args_param = "opik_args" in sig.parameters
|
|
34
|
+
except (ValueError, TypeError):
|
|
35
|
+
# If we can't inspect the signature, assume no opik_args parameter
|
|
36
|
+
has_opik_args_param = False
|
|
37
|
+
|
|
38
|
+
# If function explicitly has opik_args parameter, just get it without popping
|
|
39
|
+
if has_opik_args_param:
|
|
40
|
+
opik_args_dict = kwargs.get("opik_args", None)
|
|
41
|
+
else:
|
|
42
|
+
# If function doesn't have opik_args parameter, pop it from kwargs
|
|
43
|
+
opik_args_dict = kwargs.pop("opik_args", None)
|
|
44
|
+
|
|
45
|
+
if opik_args_dict is None:
|
|
46
|
+
return None
|
|
47
|
+
|
|
48
|
+
return api_classes.OpikArgs.from_dict(opik_args_dict)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def apply_opik_args_to_trace(
|
|
52
|
+
opik_args: Optional[api_classes.OpikArgs],
|
|
53
|
+
trace_data: Optional[trace.TraceData],
|
|
54
|
+
) -> None:
|
|
55
|
+
"""
|
|
56
|
+
Apply opik_args to the trace data, including thread_id, tags, and metadata.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
opik_args: The configuration extracted from function arguments
|
|
60
|
+
trace_data: The current trace data to modify
|
|
61
|
+
"""
|
|
62
|
+
if opik_args is None or opik_args.trace_args is None or trace_data is None:
|
|
63
|
+
return
|
|
64
|
+
|
|
65
|
+
# Handle thread_id
|
|
66
|
+
if opik_args.trace_args.thread_id is not None:
|
|
67
|
+
# Check for thread_id conflict
|
|
68
|
+
if (
|
|
69
|
+
trace_data.thread_id is not None
|
|
70
|
+
and trace_data.thread_id != opik_args.trace_args.thread_id
|
|
71
|
+
):
|
|
72
|
+
LOGGER.warning(
|
|
73
|
+
"Trace already has thread_id='%s', but opik_args specifies thread_id='%s'. Keeping existing thread_id.",
|
|
74
|
+
trace_data.thread_id,
|
|
75
|
+
opik_args.trace_args.thread_id,
|
|
76
|
+
)
|
|
77
|
+
else:
|
|
78
|
+
# Apply thread_id to trace
|
|
79
|
+
trace_data.thread_id = opik_args.trace_args.thread_id
|
|
80
|
+
|
|
81
|
+
# Apply trace tags if specified
|
|
82
|
+
if opik_args.trace_args.tags:
|
|
83
|
+
existing_tags = trace_data.tags or []
|
|
84
|
+
merged_tags = data_helpers.merge_tags(existing_tags, opik_args.trace_args.tags)
|
|
85
|
+
trace_data.tags = merged_tags
|
|
86
|
+
|
|
87
|
+
# Apply trace metadata if specified
|
|
88
|
+
if opik_args.trace_args.metadata:
|
|
89
|
+
existing_metadata = trace_data.metadata or {}
|
|
90
|
+
merged_metadata = data_helpers.merge_metadata(
|
|
91
|
+
existing_metadata, opik_args.trace_args.metadata
|
|
92
|
+
)
|
|
93
|
+
trace_data.metadata = merged_metadata
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def apply_opik_args_to_start_span_params(
|
|
97
|
+
params: arguments_helpers.StartSpanParameters,
|
|
98
|
+
opik_args: Optional[api_classes.OpikArgs],
|
|
99
|
+
) -> arguments_helpers.StartSpanParameters:
|
|
100
|
+
"""Apply opik_args to StartSpanParameters, merging tags and metadata."""
|
|
101
|
+
if opik_args is None or opik_args.span_args is None:
|
|
102
|
+
return params
|
|
103
|
+
|
|
104
|
+
span_config = opik_args.span_args
|
|
105
|
+
|
|
106
|
+
# Merge tags and metadata
|
|
107
|
+
merged_tags = data_helpers.merge_tags(params.tags, span_config.tags)
|
|
108
|
+
merged_metadata = data_helpers.merge_metadata(params.metadata, span_config.metadata)
|
|
109
|
+
|
|
110
|
+
# Create updated parameters
|
|
111
|
+
return arguments_helpers.StartSpanParameters(
|
|
112
|
+
type=params.type,
|
|
113
|
+
name=params.name,
|
|
114
|
+
tags=merged_tags,
|
|
115
|
+
metadata=merged_metadata,
|
|
116
|
+
input=params.input,
|
|
117
|
+
project_name=params.project_name,
|
|
118
|
+
model=params.model,
|
|
119
|
+
provider=params.provider,
|
|
120
|
+
)
|
|
@@ -1,24 +1,45 @@
|
|
|
1
1
|
from typing import (
|
|
2
2
|
Optional,
|
|
3
|
-
|
|
3
|
+
NamedTuple,
|
|
4
4
|
)
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
import opik.context_storage as context_storage
|
|
7
|
+
import opik.datetime_helpers as datetime_helpers
|
|
7
8
|
from opik.api_objects import helpers, span, trace
|
|
8
9
|
from opik.types import DistributedTraceHeadersDict
|
|
9
10
|
|
|
10
11
|
from . import arguments_helpers
|
|
11
12
|
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
class SpanCreationResult(NamedTuple):
|
|
15
|
+
"""
|
|
16
|
+
Represents the result of a span creation process.
|
|
17
|
+
|
|
18
|
+
This class encapsulates the data resulting from the creation of a new
|
|
19
|
+
span, including trace information and span-specific details.
|
|
20
|
+
|
|
21
|
+
Attributes:
|
|
22
|
+
trace_data: Trace-related data associated
|
|
23
|
+
with the span if a new trace was created. Can be None if no new trace was created.
|
|
24
|
+
span_data : Data specific to the created span, containing
|
|
25
|
+
information such as span identifiers and timestamps.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
trace_data: Optional[trace.TraceData]
|
|
29
|
+
span_data: span.SpanData
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def create_span_respecting_context(
|
|
14
33
|
start_span_arguments: arguments_helpers.StartSpanParameters,
|
|
15
34
|
distributed_trace_headers: Optional[DistributedTraceHeadersDict],
|
|
16
|
-
|
|
35
|
+
opik_context_storage: Optional[context_storage.OpikContextStorage] = None,
|
|
36
|
+
) -> SpanCreationResult:
|
|
17
37
|
"""
|
|
18
38
|
Handles different span creation flows.
|
|
19
39
|
"""
|
|
20
|
-
|
|
21
|
-
|
|
40
|
+
|
|
41
|
+
if opik_context_storage is None:
|
|
42
|
+
opik_context_storage = context_storage.get_current_context_instance()
|
|
22
43
|
|
|
23
44
|
if distributed_trace_headers:
|
|
24
45
|
span_data = arguments_helpers.create_span_data(
|
|
@@ -27,20 +48,26 @@ def create_span_for_current_context(
|
|
|
27
48
|
trace_id=distributed_trace_headers["opik_trace_id"],
|
|
28
49
|
)
|
|
29
50
|
|
|
30
|
-
return None, span_data
|
|
51
|
+
return SpanCreationResult(None, span_data)
|
|
31
52
|
|
|
32
|
-
current_span_data =
|
|
33
|
-
current_trace_data =
|
|
53
|
+
current_span_data = opik_context_storage.top_span_data()
|
|
54
|
+
current_trace_data = opik_context_storage.get_trace_data()
|
|
34
55
|
|
|
35
56
|
if current_span_data is not None:
|
|
36
|
-
# There is already at least one span in current context.
|
|
37
|
-
#
|
|
38
|
-
|
|
57
|
+
# There is already at least one span in the current context - attach a new span to it.
|
|
58
|
+
#
|
|
59
|
+
# NOTE: We can have a situation when span data is in context, but there is no trace data
|
|
60
|
+
# because we are in a distributed environment and trace data was created in another thread.
|
|
61
|
+
# See: https://github.com/comet-ml/opik/pull/2244
|
|
62
|
+
if current_trace_data is None:
|
|
63
|
+
show_warning = False
|
|
64
|
+
else:
|
|
65
|
+
show_warning = current_trace_data.created_by != "evaluation"
|
|
39
66
|
|
|
40
67
|
project_name = helpers.resolve_child_span_project_name(
|
|
41
68
|
parent_project_name=current_span_data.project_name,
|
|
42
69
|
child_project_name=start_span_arguments.project_name,
|
|
43
|
-
show_warning=
|
|
70
|
+
show_warning=show_warning,
|
|
44
71
|
)
|
|
45
72
|
|
|
46
73
|
start_span_arguments.project_name = project_name
|
|
@@ -51,13 +78,13 @@ def create_span_for_current_context(
|
|
|
51
78
|
trace_id=current_span_data.trace_id,
|
|
52
79
|
)
|
|
53
80
|
|
|
54
|
-
return None, span_data
|
|
81
|
+
return SpanCreationResult(None, span_data)
|
|
55
82
|
|
|
56
83
|
if current_trace_data is not None and current_span_data is None:
|
|
57
84
|
# By default, we expect trace to be created with a span.
|
|
58
85
|
# But there can be cases when trace was created and added
|
|
59
86
|
# to context manually (not via decorator).
|
|
60
|
-
# In that case decorator should just create a span for the existing trace.
|
|
87
|
+
# In that case the decorator should just create a span for the existing trace.
|
|
61
88
|
|
|
62
89
|
project_name = helpers.resolve_child_span_project_name(
|
|
63
90
|
parent_project_name=current_trace_data.project_name,
|
|
@@ -73,12 +100,12 @@ def create_span_for_current_context(
|
|
|
73
100
|
trace_id=current_trace_data.id,
|
|
74
101
|
)
|
|
75
102
|
|
|
76
|
-
return None, span_data
|
|
103
|
+
return SpanCreationResult(None, span_data)
|
|
77
104
|
|
|
78
105
|
if current_span_data is None and current_trace_data is None:
|
|
79
106
|
# Create a trace and root span because it is
|
|
80
|
-
# the first decorated function run in current context.
|
|
81
|
-
|
|
107
|
+
# the first decorated function run in the current context.
|
|
108
|
+
current_trace_data = trace.TraceData(
|
|
82
109
|
id=helpers.generate_id(),
|
|
83
110
|
start_time=datetime_helpers.local_timestamp(),
|
|
84
111
|
name=start_span_arguments.name,
|
|
@@ -86,12 +113,13 @@ def create_span_for_current_context(
|
|
|
86
113
|
metadata=start_span_arguments.metadata,
|
|
87
114
|
tags=start_span_arguments.tags,
|
|
88
115
|
project_name=start_span_arguments.project_name,
|
|
116
|
+
thread_id=start_span_arguments.thread_id,
|
|
89
117
|
)
|
|
90
118
|
|
|
91
|
-
|
|
119
|
+
current_span_data = arguments_helpers.create_span_data(
|
|
92
120
|
start_span_arguments=start_span_arguments,
|
|
93
121
|
parent_span_id=None,
|
|
94
|
-
trace_id=
|
|
122
|
+
trace_id=current_trace_data.id,
|
|
95
123
|
)
|
|
96
124
|
|
|
97
|
-
|
|
125
|
+
return SpanCreationResult(current_trace_data, current_span_data)
|
opik/decorator/tracker.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from typing import Any, Callable, Dict, List, Optional, Tuple
|
|
3
|
+
from typing_extensions import override
|
|
3
4
|
|
|
4
5
|
from ..api_objects import opik_client, span
|
|
5
6
|
from . import arguments_helpers, base_track_decorator, inspect_helpers
|
|
@@ -12,6 +13,7 @@ class OpikTrackDecorator(base_track_decorator.BaseTrackDecorator):
|
|
|
12
13
|
Default implementation of BaseTrackDecorator
|
|
13
14
|
"""
|
|
14
15
|
|
|
16
|
+
@override
|
|
15
17
|
def _start_span_inputs_preprocessor(
|
|
16
18
|
self,
|
|
17
19
|
func: Callable,
|
|
@@ -29,7 +31,11 @@ class OpikTrackDecorator(base_track_decorator.BaseTrackDecorator):
|
|
|
29
31
|
for argument in track_options.ignore_arguments:
|
|
30
32
|
input.pop(argument, None)
|
|
31
33
|
|
|
32
|
-
name =
|
|
34
|
+
name = (
|
|
35
|
+
track_options.name
|
|
36
|
+
if track_options.name is not None
|
|
37
|
+
else inspect_helpers.get_function_name(func)
|
|
38
|
+
)
|
|
33
39
|
|
|
34
40
|
result = arguments_helpers.StartSpanParameters(
|
|
35
41
|
name=name,
|
|
@@ -42,6 +48,7 @@ class OpikTrackDecorator(base_track_decorator.BaseTrackDecorator):
|
|
|
42
48
|
|
|
43
49
|
return result
|
|
44
50
|
|
|
51
|
+
@override
|
|
45
52
|
def _end_span_inputs_preprocessor(
|
|
46
53
|
self,
|
|
47
54
|
output: Any,
|
|
@@ -57,6 +64,7 @@ class OpikTrackDecorator(base_track_decorator.BaseTrackDecorator):
|
|
|
57
64
|
|
|
58
65
|
return result
|
|
59
66
|
|
|
67
|
+
@override
|
|
60
68
|
def _streams_handler(
|
|
61
69
|
self,
|
|
62
70
|
output: Any,
|
opik/dict_utils.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import copy
|
|
2
2
|
import logging
|
|
3
|
-
from typing import Any, Dict,
|
|
3
|
+
from typing import Any, Dict, Optional, List, Tuple, TypeVar, Type
|
|
4
4
|
|
|
5
5
|
from . import logging_messages
|
|
6
6
|
|
|
@@ -11,7 +11,7 @@ def flatten_dict(
|
|
|
11
11
|
d: Dict[str, Any], parent_key: str, delim: str = "."
|
|
12
12
|
) -> Dict[str, Any]:
|
|
13
13
|
"""
|
|
14
|
-
|
|
14
|
+
The current implementation does not have max depth restrictions or cyclic references handling!
|
|
15
15
|
"""
|
|
16
16
|
items = [] # type: ignore
|
|
17
17
|
|
|
@@ -60,7 +60,7 @@ def deepmerge(
|
|
|
60
60
|
return merged
|
|
61
61
|
|
|
62
62
|
|
|
63
|
-
def remove_none_from_dict(original:
|
|
63
|
+
def remove_none_from_dict(original: Dict[str, Optional[Any]]) -> Dict[str, Any]:
|
|
64
64
|
new: Dict[str, Any] = {}
|
|
65
65
|
|
|
66
66
|
for key, value in original.items():
|
opik/environment.py
CHANGED
|
@@ -7,9 +7,11 @@ import socket
|
|
|
7
7
|
import sys
|
|
8
8
|
from importlib import metadata
|
|
9
9
|
from typing import Dict, Literal
|
|
10
|
+
import tqdm
|
|
11
|
+
from tqdm.utils import Comparable
|
|
10
12
|
|
|
11
13
|
import opik.config
|
|
12
|
-
|
|
14
|
+
import opik.url_helpers as url_helpers
|
|
13
15
|
|
|
14
16
|
LOGGER = logging.getLogger(__name__)
|
|
15
17
|
|
|
@@ -140,3 +142,13 @@ def get_installed_packages() -> Dict[str, str]:
|
|
|
140
142
|
pkg.metadata["Name"]: pkg.version for pkg in metadata.distributions()
|
|
141
143
|
}
|
|
142
144
|
return installed_packages
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def get_tqdm_for_current_environment() -> Comparable:
|
|
148
|
+
"""
|
|
149
|
+
Get a tqdm progress bar for your environment.
|
|
150
|
+
"""
|
|
151
|
+
if in_jupyter() or in_colab():
|
|
152
|
+
return tqdm.tqdm_notebook
|
|
153
|
+
else:
|
|
154
|
+
return tqdm.tqdm
|