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,185 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import List, Optional
|
|
3
|
+
|
|
4
|
+
import opik
|
|
5
|
+
from opik.rest_api import TraceThread
|
|
6
|
+
from opik.types import BatchFeedbackScoreDict
|
|
7
|
+
|
|
8
|
+
from .. import helpers, rest_stream_parser, constants
|
|
9
|
+
from ... import config
|
|
10
|
+
from ...message_processing import messages
|
|
11
|
+
from ...message_processing.batching import sequence_splitter
|
|
12
|
+
from ...rest_api.types import trace_thread_filter
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
LOGGER = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ThreadsClient:
|
|
19
|
+
"""
|
|
20
|
+
Client for managing and interacting with conversational threads.
|
|
21
|
+
|
|
22
|
+
This class provides methods for searching threads and logging feedback scores
|
|
23
|
+
related to threads using an underlying client instance. It is intended to be
|
|
24
|
+
used in scenarios where thread management and feedback tracking are required.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
client: Instance of the underlying OPIK client.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(self, client: "opik.Opik"):
|
|
31
|
+
self._opik_client = client
|
|
32
|
+
|
|
33
|
+
def search_threads(
|
|
34
|
+
self,
|
|
35
|
+
project_name: Optional[str] = None,
|
|
36
|
+
filter_string: Optional[str] = None,
|
|
37
|
+
max_results: int = 1000,
|
|
38
|
+
truncate: bool = True,
|
|
39
|
+
) -> List[TraceThread]:
|
|
40
|
+
"""Search for threads in a given project based on specific criteria.
|
|
41
|
+
|
|
42
|
+
This method retrieves a list of TraceThread objects that match the specified
|
|
43
|
+
filter criteria. It takes an optional project name, a filter string to narrow
|
|
44
|
+
down the results, and a maximum number of threads to return.
|
|
45
|
+
|
|
46
|
+
The filter string should be a string that represents a filter condition in the
|
|
47
|
+
form of a string expression. For example, to search for threads with a specific
|
|
48
|
+
status, you could use the following filter string: `filter_string = 'status = "active"'`.
|
|
49
|
+
The filter string can include logical operators (AND) to combine
|
|
50
|
+
multiple conditions, for example, `filter_string = 'status = "active" and id = "{thread_id}"'`.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
project_name:
|
|
54
|
+
The name of the project to search the threads for. If None, the search
|
|
55
|
+
will include threads from all projects.
|
|
56
|
+
filter_string:
|
|
57
|
+
A filter string to narrow down the search using Opik Query Language (OQL).
|
|
58
|
+
The format is: "<COLUMN> <OPERATOR> <VALUE> [AND <COLUMN> <OPERATOR> <VALUE>]*"
|
|
59
|
+
|
|
60
|
+
Supported columns include:
|
|
61
|
+
- `id`, `name`, `created_by`, `thread_id`, `type`, `model`, `provider`: String fields with full operator support
|
|
62
|
+
- `status`: String field (=, contains, not_contains only)
|
|
63
|
+
- `start_time`, `end_time`: DateTime fields (use ISO 8601 format, e.g., "2024-01-01T00:00:00Z")
|
|
64
|
+
- `input`, `output`: String fields for content (=, contains, not_contains only)
|
|
65
|
+
- `metadata`: Dictionary field (use dot notation, e.g., "metadata.model")
|
|
66
|
+
- `feedback_scores`: Numeric field (use dot notation, e.g., "feedback_scores.accuracy")
|
|
67
|
+
- `tags`: List field (use "contains" operator only)
|
|
68
|
+
- `usage.total_tokens`, `usage.prompt_tokens`, `usage.completion_tokens`: Numeric usage fields
|
|
69
|
+
- `duration`, `number_of_messages`, `total_estimated_cost`: Numeric fields
|
|
70
|
+
|
|
71
|
+
Supported operators by column:
|
|
72
|
+
- `id`, `name`, `created_by`, `thread_id`, `type`, `model`, `provider`: =, !=, contains, not_contains, starts_with, ends_with, >, <
|
|
73
|
+
- `status`: =, contains, not_contains
|
|
74
|
+
- `start_time`, `end_time`: =, >, <, >=, <=
|
|
75
|
+
- `input`, `output`: =, contains, not_contains
|
|
76
|
+
- `metadata`: =, contains, >, <
|
|
77
|
+
- `feedback_scores`: =, >, <, >=, <=, is_empty, is_not_empty
|
|
78
|
+
- `tags`: contains (only)
|
|
79
|
+
- `usage.total_tokens`, `usage.prompt_tokens`, `usage.completion_tokens`, `duration`, `number_of_messages`, `total_estimated_cost`: =, !=, >, <, >=, <=
|
|
80
|
+
|
|
81
|
+
Examples:
|
|
82
|
+
- `status = "inactive"` - Filter by thread status
|
|
83
|
+
- `id = "thread_123"` - Filter by specific thread ID
|
|
84
|
+
- `duration > 300` - Filter by thread duration (seconds)
|
|
85
|
+
- `number_of_messages >= 5` - Filter by message count
|
|
86
|
+
- `feedback_scores.user_frustration > 0.5` - Filter by feedback score
|
|
87
|
+
- `feedback_scores.my_metric is_empty` - Filter threads with empty feedback score
|
|
88
|
+
- `feedback_scores.my_metric is_not_empty` - Filter threads with non-empty feedback score
|
|
89
|
+
- `tags contains "important"` - Filter by tag
|
|
90
|
+
|
|
91
|
+
If not provided, all threads in the project will be returned up to the limit.
|
|
92
|
+
max_results:
|
|
93
|
+
The maximum number of threads to retrieve. The default value is 1000
|
|
94
|
+
if not specified.
|
|
95
|
+
truncate:
|
|
96
|
+
Whether to truncate image data stored in input, output, or metadata
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
List[TraceThread]: A list of TraceThread objects that match the search
|
|
100
|
+
criteria.
|
|
101
|
+
|
|
102
|
+
Example:
|
|
103
|
+
>>> from opik import Opik
|
|
104
|
+
>>> client = Opik(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME")
|
|
105
|
+
>>> thread_id = "your_thread_id"
|
|
106
|
+
>>> threads = client.get_threads_client().search_threads(
|
|
107
|
+
>>> project_name="Demo Project",
|
|
108
|
+
>>> filter_string=f'id = "{thread_id}"',
|
|
109
|
+
>>> max_results=10)
|
|
110
|
+
"""
|
|
111
|
+
filters = helpers.parse_filter_expressions(
|
|
112
|
+
filter_string, parsed_item_class=trace_thread_filter.TraceThreadFilter
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
project_name = project_name or self._opik_client.project_name
|
|
116
|
+
|
|
117
|
+
threads = rest_stream_parser.read_and_parse_full_stream(
|
|
118
|
+
read_source=lambda current_batch_size,
|
|
119
|
+
last_retrieved_id: self._opik_client.rest_client.traces.search_trace_threads(
|
|
120
|
+
project_name=project_name,
|
|
121
|
+
filters=filters,
|
|
122
|
+
limit=current_batch_size,
|
|
123
|
+
truncate=truncate,
|
|
124
|
+
last_retrieved_thread_model_id=last_retrieved_id,
|
|
125
|
+
),
|
|
126
|
+
max_results=max_results,
|
|
127
|
+
parsed_item_class=TraceThread,
|
|
128
|
+
)
|
|
129
|
+
return threads
|
|
130
|
+
|
|
131
|
+
def log_threads_feedback_scores(
|
|
132
|
+
self, scores: List[BatchFeedbackScoreDict], project_name: Optional[str] = None
|
|
133
|
+
) -> None:
|
|
134
|
+
"""
|
|
135
|
+
Logs feedback scores for threads in a specific project. This method processes the given
|
|
136
|
+
feedback scores and associates them with the specified project if a project name is
|
|
137
|
+
provided. It is designed to handle multiple scores in a structured manner.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
scores: A list of dictionaries containing feedback scores
|
|
141
|
+
for threads to be logged. Specifying a thread id via `id` key for each score is mandatory.
|
|
142
|
+
project_name: The name of the project to associate with the logged
|
|
143
|
+
scores. If not provided, the project name configured in the Opik client will be used.
|
|
144
|
+
This parameter is used as a fallback if `project_name` is not specified in the score dictionary.
|
|
145
|
+
"""
|
|
146
|
+
project_name = project_name or self._opik_client.project_name
|
|
147
|
+
|
|
148
|
+
score_messages = helpers.parse_feedback_score_messages(
|
|
149
|
+
scores=scores,
|
|
150
|
+
project_name=project_name,
|
|
151
|
+
parsed_item_class=messages.ThreadsFeedbackScoreMessage,
|
|
152
|
+
logger=LOGGER,
|
|
153
|
+
)
|
|
154
|
+
if score_messages is None:
|
|
155
|
+
LOGGER.error(
|
|
156
|
+
f"No valid threads feedback scores to log from provided ones: {scores}"
|
|
157
|
+
)
|
|
158
|
+
return
|
|
159
|
+
|
|
160
|
+
for batch in sequence_splitter.split_into_batches(
|
|
161
|
+
score_messages,
|
|
162
|
+
max_payload_size_MB=config.MAX_BATCH_SIZE_MB,
|
|
163
|
+
max_length=constants.FEEDBACK_SCORES_MAX_BATCH_SIZE,
|
|
164
|
+
):
|
|
165
|
+
add_threads_feedback_scores_batch_message = (
|
|
166
|
+
messages.AddThreadsFeedbackScoresBatchMessage(batch=batch)
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
self._opik_client._streamer.put(add_threads_feedback_scores_batch_message)
|
|
170
|
+
|
|
171
|
+
def close_thread(self, thread_id: str, project_name: str) -> None:
|
|
172
|
+
"""
|
|
173
|
+
Closes a thread in a specific project.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
thread_id: The identifier of the thread to close.
|
|
177
|
+
project_name: The name of the project to close the thread in.
|
|
178
|
+
"""
|
|
179
|
+
self._opik_client.rest_client.traces.close_trace_thread(
|
|
180
|
+
thread_id=thread_id, project_name=project_name
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
@property
|
|
184
|
+
def opik_client(self) -> "opik.Opik":
|
|
185
|
+
return self._opik_client
|
|
@@ -2,11 +2,12 @@ import datetime
|
|
|
2
2
|
import logging
|
|
3
3
|
from typing import Any, Dict, List, Optional, Union
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
import opik.datetime_helpers as datetime_helpers
|
|
6
|
+
import opik.llm_usage as llm_usage
|
|
7
|
+
import opik.api_objects.attachment as attachment
|
|
7
8
|
from opik.message_processing import messages, streamer
|
|
8
9
|
from opik.types import ErrorInfoDict, SpanType, LLMProvider
|
|
9
|
-
from .. import constants, span
|
|
10
|
+
from .. import constants, span
|
|
10
11
|
|
|
11
12
|
LOGGER = logging.getLogger(__name__)
|
|
12
13
|
|
|
@@ -17,6 +18,7 @@ class Trace:
|
|
|
17
18
|
id: str,
|
|
18
19
|
message_streamer: streamer.Streamer,
|
|
19
20
|
project_name: str,
|
|
21
|
+
url_override: str,
|
|
20
22
|
):
|
|
21
23
|
"""
|
|
22
24
|
A Trace object. This object should not be created directly, instead use :meth:`opik.Opik.trace` to create a new trace.
|
|
@@ -24,6 +26,7 @@ class Trace:
|
|
|
24
26
|
self.id = id
|
|
25
27
|
self._streamer = message_streamer
|
|
26
28
|
self._project_name = project_name
|
|
29
|
+
self._url_override = url_override
|
|
27
30
|
|
|
28
31
|
def end(
|
|
29
32
|
self,
|
|
@@ -94,9 +97,10 @@ class Trace:
|
|
|
94
97
|
Returns:
|
|
95
98
|
None
|
|
96
99
|
"""
|
|
97
|
-
|
|
100
|
+
update_trace(
|
|
98
101
|
trace_id=self.id,
|
|
99
102
|
project_name=self._project_name,
|
|
103
|
+
message_streamer=self._streamer,
|
|
100
104
|
end_time=end_time,
|
|
101
105
|
metadata=metadata,
|
|
102
106
|
input=input,
|
|
@@ -105,7 +109,6 @@ class Trace:
|
|
|
105
109
|
error_info=error_info,
|
|
106
110
|
thread_id=thread_id,
|
|
107
111
|
)
|
|
108
|
-
self._streamer.put(update_trace_message)
|
|
109
112
|
|
|
110
113
|
def span(
|
|
111
114
|
self,
|
|
@@ -124,75 +127,58 @@ class Trace:
|
|
|
124
127
|
provider: Optional[Union[LLMProvider, str]] = None,
|
|
125
128
|
error_info: Optional[ErrorInfoDict] = None,
|
|
126
129
|
total_cost: Optional[float] = None,
|
|
130
|
+
attachments: Optional[List[attachment.Attachment]] = None,
|
|
127
131
|
) -> span.Span:
|
|
128
132
|
"""
|
|
129
133
|
Create a new span within the trace.
|
|
130
134
|
|
|
131
135
|
Args:
|
|
132
|
-
id: The ID of the span
|
|
136
|
+
id: The ID of the span should be in UUIDv7 format. If not provided, a new ID will be generated.
|
|
133
137
|
parent_span_id: The ID of the parent span, if any.
|
|
134
138
|
name: The name of the span.
|
|
135
139
|
type: The type of the span. Defaults to "general".
|
|
136
|
-
start_time: The start time of the span. If not provided, current time will be used.
|
|
140
|
+
start_time: The start time of the span. If not provided, the current time will be used.
|
|
137
141
|
end_time: The end time of the span.
|
|
138
142
|
metadata: Additional metadata to be associated with the span.
|
|
139
143
|
input: The input data for the span.
|
|
140
144
|
output: The output data for the span.
|
|
141
145
|
tags: A list of tags to be associated with the span.
|
|
142
146
|
usage: Usage data for the span. In order for input, output and total tokens to be visible in the UI,
|
|
143
|
-
the usage must contain OpenAI-formatted keys (they can be passed
|
|
147
|
+
the usage must contain OpenAI-formatted keys (they can be passed additionally to the original usage on the top level of the dict): prompt_tokens, completion_tokens and total_tokens.
|
|
144
148
|
If OpenAI-formatted keys were not found, Opik will try to calculate them automatically if the usage
|
|
145
149
|
format is recognized (you can see which provider's formats are recognized in opik.LLMProvider enum), but it is not guaranteed.
|
|
146
150
|
model: The name of LLM (in this case `type` parameter should be == `llm`)
|
|
147
151
|
provider: The provider of LLM. You can find providers officially supported by Opik for cost tracking
|
|
148
|
-
in `opik.LLMProvider` enum. If your provider is not here, please open an issue in our
|
|
149
|
-
If your provider not in the list, you can still specify it but the cost tracking will not be available
|
|
152
|
+
in `opik.LLMProvider` enum. If your provider is not here, please open an issue in our GitHub - https://github.com/comet-ml/opik.
|
|
153
|
+
If your provider is not in the list, you can still specify it, but the cost tracking will not be available
|
|
150
154
|
error_info: The dictionary with error information (typically used when the span function has failed).
|
|
151
155
|
total_cost: The cost of the span in USD. This value takes priority over the cost calculated by Opik from the usage.
|
|
156
|
+
attachments: The list of attachments to be uploaded to the span.
|
|
152
157
|
|
|
153
158
|
Returns:
|
|
154
159
|
span.Span: The created span object.
|
|
155
160
|
"""
|
|
156
|
-
|
|
157
|
-
start_time = (
|
|
158
|
-
start_time if start_time is not None else datetime_helpers.local_timestamp()
|
|
159
|
-
)
|
|
160
|
-
backend_compatible_usage = validation_helpers.validate_and_parse_usage(
|
|
161
|
-
usage=usage,
|
|
162
|
-
logger=LOGGER,
|
|
163
|
-
provider=provider,
|
|
164
|
-
)
|
|
165
|
-
|
|
166
|
-
if backend_compatible_usage is not None:
|
|
167
|
-
metadata = helpers.add_usage_to_metadata(usage=usage, metadata=metadata)
|
|
168
|
-
|
|
169
|
-
create_span_message = messages.CreateSpanMessage(
|
|
170
|
-
span_id=span_id,
|
|
161
|
+
return span.span_client.create_span(
|
|
171
162
|
trace_id=self.id,
|
|
172
163
|
project_name=self._project_name,
|
|
164
|
+
url_override=self._url_override,
|
|
165
|
+
message_streamer=self._streamer,
|
|
166
|
+
span_id=id,
|
|
173
167
|
parent_span_id=parent_span_id,
|
|
174
168
|
name=name,
|
|
175
169
|
type=type,
|
|
176
170
|
start_time=start_time,
|
|
177
171
|
end_time=end_time,
|
|
172
|
+
metadata=metadata,
|
|
178
173
|
input=input,
|
|
179
174
|
output=output,
|
|
180
|
-
metadata=metadata,
|
|
181
175
|
tags=tags,
|
|
182
|
-
usage=
|
|
176
|
+
usage=usage,
|
|
183
177
|
model=model,
|
|
184
178
|
provider=provider,
|
|
185
179
|
error_info=error_info,
|
|
186
180
|
total_cost=total_cost,
|
|
187
|
-
|
|
188
|
-
self._streamer.put(create_span_message)
|
|
189
|
-
|
|
190
|
-
return span.Span(
|
|
191
|
-
id=span_id,
|
|
192
|
-
parent_span_id=parent_span_id,
|
|
193
|
-
trace_id=self.id,
|
|
194
|
-
message_streamer=self._streamer,
|
|
195
|
-
project_name=self._project_name,
|
|
181
|
+
attachments=attachments,
|
|
196
182
|
)
|
|
197
183
|
|
|
198
184
|
def log_feedback_score(
|
|
@@ -229,3 +215,53 @@ class Trace:
|
|
|
229
215
|
)
|
|
230
216
|
|
|
231
217
|
self._streamer.put(add_trace_feedback_batch_message)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def update_trace(
|
|
221
|
+
trace_id: str,
|
|
222
|
+
project_name: str,
|
|
223
|
+
message_streamer: streamer.Streamer,
|
|
224
|
+
end_time: Optional[datetime.datetime] = None,
|
|
225
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
226
|
+
input: Optional[Dict[str, Any]] = None,
|
|
227
|
+
output: Optional[Dict[str, Any]] = None,
|
|
228
|
+
tags: Optional[List[Any]] = None,
|
|
229
|
+
error_info: Optional[ErrorInfoDict] = None,
|
|
230
|
+
thread_id: Optional[str] = None,
|
|
231
|
+
) -> None:
|
|
232
|
+
"""
|
|
233
|
+
Update an existing trace with new information.
|
|
234
|
+
This function sends an UpdateTraceMessage to the provided message_streamer,
|
|
235
|
+
allowing you to update various fields of a trace, such as its end time,
|
|
236
|
+
metadata, input, output, tags, error information and thread association.
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
trace_id: The unique identifier of the trace to update.
|
|
240
|
+
project_name: The name of the project associated with the trace.
|
|
241
|
+
message_streamer: The message streamer used to send the update.
|
|
242
|
+
end_time: The end time of the trace. Defaults to None.
|
|
243
|
+
metadata: Additional metadata for the trace. Defaults to None.
|
|
244
|
+
input: Input data associated with the trace. Defaults to None.
|
|
245
|
+
output: Output data associated with the trace. Defaults to None.
|
|
246
|
+
tags: List of tags to associate with the trace. Defaults to None.
|
|
247
|
+
error_info: Error information related to the trace. Defaults to None.
|
|
248
|
+
thread_id : The thread ID associated with the trace. Defaults to None.
|
|
249
|
+
Returns:
|
|
250
|
+
None
|
|
251
|
+
Usage Notes:
|
|
252
|
+
- This function does not return a value; it sends an update message to the message streamer.
|
|
253
|
+
- All parameters except trace_id, project_name and message_streamer are optional.
|
|
254
|
+
- Only the fields provided will be updated in the trace.
|
|
255
|
+
"""
|
|
256
|
+
update_trace_message = messages.UpdateTraceMessage(
|
|
257
|
+
trace_id=trace_id,
|
|
258
|
+
project_name=project_name,
|
|
259
|
+
end_time=end_time,
|
|
260
|
+
metadata=metadata,
|
|
261
|
+
input=input,
|
|
262
|
+
output=output,
|
|
263
|
+
tags=tags,
|
|
264
|
+
error_info=error_info,
|
|
265
|
+
thread_id=thread_id,
|
|
266
|
+
)
|
|
267
|
+
message_streamer.put(update_trace_message)
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import dataclasses
|
|
2
2
|
import datetime
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Any, Dict, List, Optional
|
|
4
|
+
from typing import Any, Dict, List, Optional, Union
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
import opik.api_objects.attachment as attachment
|
|
7
|
+
import opik.datetime_helpers as datetime_helpers
|
|
8
|
+
import opik.id_helpers as id_helpers
|
|
9
|
+
import opik.llm_usage as llm_usage
|
|
10
|
+
from opik.types import (
|
|
10
11
|
CreatedByType,
|
|
11
12
|
ErrorInfoDict,
|
|
12
13
|
FeedbackScoreDict,
|
|
14
|
+
LLMProvider,
|
|
15
|
+
SpanType,
|
|
13
16
|
)
|
|
17
|
+
from .. import span, data_helpers
|
|
14
18
|
|
|
15
19
|
LOGGER = logging.getLogger(__name__)
|
|
16
20
|
|
|
@@ -43,13 +47,56 @@ class TraceData:
|
|
|
43
47
|
created_by: Optional[CreatedByType] = None
|
|
44
48
|
error_info: Optional[ErrorInfoDict] = None
|
|
45
49
|
thread_id: Optional[str] = None
|
|
50
|
+
attachments: Optional[List[attachment.Attachment]] = None
|
|
51
|
+
|
|
52
|
+
def create_child_span_data(
|
|
53
|
+
self,
|
|
54
|
+
name: Optional[str] = None,
|
|
55
|
+
type: SpanType = "general",
|
|
56
|
+
start_time: Optional[datetime.datetime] = None,
|
|
57
|
+
end_time: Optional[datetime.datetime] = None,
|
|
58
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
59
|
+
input: Optional[Dict[str, Any]] = None,
|
|
60
|
+
output: Optional[Dict[str, Any]] = None,
|
|
61
|
+
tags: Optional[List[str]] = None,
|
|
62
|
+
usage: Optional[Union[Dict[str, Any], llm_usage.OpikUsage]] = None,
|
|
63
|
+
feedback_scores: Optional[List[FeedbackScoreDict]] = None,
|
|
64
|
+
model: Optional[str] = None,
|
|
65
|
+
provider: Optional[Union[str, LLMProvider]] = None,
|
|
66
|
+
error_info: Optional[ErrorInfoDict] = None,
|
|
67
|
+
total_cost: Optional[float] = None,
|
|
68
|
+
attachments: Optional[List[attachment.Attachment]] = None,
|
|
69
|
+
) -> span.SpanData:
|
|
70
|
+
start_time = (
|
|
71
|
+
start_time if start_time is not None else datetime_helpers.local_timestamp()
|
|
72
|
+
)
|
|
73
|
+
return span.SpanData(
|
|
74
|
+
trace_id=self.id,
|
|
75
|
+
parent_span_id=None,
|
|
76
|
+
project_name=self.project_name,
|
|
77
|
+
name=name,
|
|
78
|
+
type=type,
|
|
79
|
+
start_time=start_time,
|
|
80
|
+
end_time=end_time,
|
|
81
|
+
metadata=metadata,
|
|
82
|
+
input=input,
|
|
83
|
+
output=output,
|
|
84
|
+
tags=tags,
|
|
85
|
+
usage=usage,
|
|
86
|
+
feedback_scores=feedback_scores,
|
|
87
|
+
model=model,
|
|
88
|
+
provider=provider,
|
|
89
|
+
error_info=error_info,
|
|
90
|
+
total_cost=total_cost,
|
|
91
|
+
attachments=attachments,
|
|
92
|
+
)
|
|
46
93
|
|
|
47
94
|
def update(self, **new_data: Any) -> "TraceData":
|
|
48
95
|
for key, value in new_data.items():
|
|
49
96
|
if value is None:
|
|
50
97
|
continue
|
|
51
98
|
|
|
52
|
-
if key not in self.__dict__:
|
|
99
|
+
if key not in self.__dict__ and key != "prompts":
|
|
53
100
|
LOGGER.debug(
|
|
54
101
|
"An attempt to update span with parameter name it doesn't have: %s",
|
|
55
102
|
key,
|
|
@@ -57,37 +104,76 @@ class TraceData:
|
|
|
57
104
|
continue
|
|
58
105
|
|
|
59
106
|
if key == "metadata":
|
|
60
|
-
self.
|
|
107
|
+
self.metadata = data_helpers.merge_metadata(
|
|
108
|
+
self.metadata, new_metadata=value
|
|
109
|
+
)
|
|
61
110
|
continue
|
|
62
111
|
elif key == "output":
|
|
63
|
-
self.
|
|
112
|
+
self.output = data_helpers.merge_outputs(self.output, new_outputs=value)
|
|
64
113
|
continue
|
|
65
114
|
elif key == "input":
|
|
66
|
-
self.
|
|
115
|
+
self.input = data_helpers.merge_inputs(self.input, new_inputs=value)
|
|
116
|
+
continue
|
|
117
|
+
elif key == "attachments":
|
|
118
|
+
self._update_attachments(value)
|
|
119
|
+
continue
|
|
120
|
+
elif key == "tags":
|
|
121
|
+
self.tags = data_helpers.merge_tags(self.tags, new_tags=value)
|
|
122
|
+
continue
|
|
123
|
+
elif key == "prompts":
|
|
124
|
+
self.metadata = data_helpers.merge_metadata(
|
|
125
|
+
self.metadata, new_metadata=new_data.get("metadata"), prompts=value
|
|
126
|
+
)
|
|
67
127
|
continue
|
|
68
128
|
|
|
69
129
|
self.__dict__[key] = value
|
|
70
130
|
|
|
71
131
|
return self
|
|
72
132
|
|
|
73
|
-
def
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
else:
|
|
77
|
-
self.metadata = dict_utils.deepmerge(self.metadata, new_metadata)
|
|
133
|
+
def init_end_time(self) -> "TraceData":
|
|
134
|
+
self.end_time = datetime_helpers.local_timestamp()
|
|
135
|
+
return self
|
|
78
136
|
|
|
79
|
-
def
|
|
80
|
-
if self.
|
|
81
|
-
self.
|
|
137
|
+
def _update_attachments(self, attachments: List[attachment.Attachment]) -> None:
|
|
138
|
+
if self.attachments is None:
|
|
139
|
+
self.attachments = attachments
|
|
82
140
|
else:
|
|
83
|
-
self.
|
|
141
|
+
self.attachments.extend(attachments)
|
|
84
142
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
143
|
+
@property
|
|
144
|
+
def as_start_parameters(self) -> Dict[str, Any]:
|
|
145
|
+
"""Returns parameters of this trace to be sent to the server when starting a new trace."""
|
|
146
|
+
start_parameters: Dict[str, Any] = {
|
|
147
|
+
"id": self.id,
|
|
148
|
+
"start_time": self.start_time,
|
|
149
|
+
"project_name": self.project_name,
|
|
150
|
+
}
|
|
151
|
+
if self.name is not None:
|
|
152
|
+
start_parameters["name"] = self.name
|
|
153
|
+
if self.input is not None:
|
|
154
|
+
start_parameters["input"] = self.input
|
|
155
|
+
if self.metadata is not None:
|
|
156
|
+
start_parameters["metadata"] = self.metadata
|
|
157
|
+
if self.tags is not None:
|
|
158
|
+
start_parameters["tags"] = self.tags
|
|
90
159
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
160
|
+
return start_parameters
|
|
161
|
+
|
|
162
|
+
@property
|
|
163
|
+
def as_parameters(self) -> Dict[str, Any]:
|
|
164
|
+
"""Returns all parameters of this trace to be sent to the server."""
|
|
165
|
+
return {
|
|
166
|
+
"id": self.id,
|
|
167
|
+
"name": self.name,
|
|
168
|
+
"start_time": self.start_time,
|
|
169
|
+
"end_time": self.end_time,
|
|
170
|
+
"metadata": self.metadata,
|
|
171
|
+
"input": self.input,
|
|
172
|
+
"output": self.output,
|
|
173
|
+
"tags": self.tags,
|
|
174
|
+
"feedback_scores": self.feedback_scores,
|
|
175
|
+
"project_name": self.project_name,
|
|
176
|
+
"error_info": self.error_info,
|
|
177
|
+
"thread_id": self.thread_id,
|
|
178
|
+
"attachments": self.attachments,
|
|
179
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from typing import Any, Optional, cast, Union, Dict
|
|
3
3
|
|
|
4
|
-
from ..types import
|
|
4
|
+
from ..types import BatchFeedbackScoreDict
|
|
5
5
|
from ..validation import feedback_score as feedback_score_validator
|
|
6
6
|
from .. import logging_messages, llm_usage
|
|
7
7
|
from opik.types import LLMProvider
|
|
@@ -38,7 +38,7 @@ def validate_and_parse_usage(
|
|
|
38
38
|
|
|
39
39
|
def validate_feedback_score(
|
|
40
40
|
feedback_score: Any, logger: logging.Logger
|
|
41
|
-
) -> Optional[
|
|
41
|
+
) -> Optional[BatchFeedbackScoreDict]:
|
|
42
42
|
feedback_score_validator_ = feedback_score_validator.FeedbackScoreValidator(
|
|
43
43
|
feedback_score
|
|
44
44
|
)
|
|
@@ -51,4 +51,4 @@ def validate_feedback_score(
|
|
|
51
51
|
)
|
|
52
52
|
return None
|
|
53
53
|
|
|
54
|
-
return cast(
|
|
54
|
+
return cast(BatchFeedbackScoreDict, feedback_score)
|
opik/cli/__init__.py
ADDED
opik/cli/__main__.py
ADDED
opik/cli/configure.py
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Configure command for Opik CLI."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
import click
|
|
6
|
+
|
|
7
|
+
from opik.configurator import configure as opik_configure, interactive_helpers
|
|
8
|
+
|
|
9
|
+
LOGGER = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@click.command(context_settings={"ignore_unknown_options": True})
|
|
13
|
+
@click.option(
|
|
14
|
+
"--use_local",
|
|
15
|
+
"--use-local",
|
|
16
|
+
is_flag=True,
|
|
17
|
+
default=False,
|
|
18
|
+
help="Flag to configure the Opik Python SDK for local Opik deployments.",
|
|
19
|
+
)
|
|
20
|
+
@click.option(
|
|
21
|
+
"-y",
|
|
22
|
+
"--yes",
|
|
23
|
+
is_flag=True,
|
|
24
|
+
default=False,
|
|
25
|
+
help="Flag to automatically answer `yes` whenever a user approval might be required",
|
|
26
|
+
)
|
|
27
|
+
def configure(use_local: bool, yes: bool) -> None:
|
|
28
|
+
"""
|
|
29
|
+
Create a configuration file for the Opik Python SDK, if a configuration file already exists, it will be overwritten.
|
|
30
|
+
This is also available as a function in the Python SDK.
|
|
31
|
+
"""
|
|
32
|
+
automatic_approvals = yes
|
|
33
|
+
|
|
34
|
+
if use_local:
|
|
35
|
+
opik_configure.configure(
|
|
36
|
+
use_local=True, force=True, automatic_approvals=automatic_approvals
|
|
37
|
+
)
|
|
38
|
+
else:
|
|
39
|
+
deployment_type_choice = interactive_helpers.ask_user_for_deployment_type()
|
|
40
|
+
|
|
41
|
+
if deployment_type_choice == interactive_helpers.DeploymentType.CLOUD:
|
|
42
|
+
configurator = opik_configure.OpikConfigurator(
|
|
43
|
+
url=opik_configure.OPIK_BASE_URL_CLOUD,
|
|
44
|
+
use_local=False,
|
|
45
|
+
force=True,
|
|
46
|
+
self_hosted_comet=False,
|
|
47
|
+
automatic_approvals=automatic_approvals,
|
|
48
|
+
)
|
|
49
|
+
elif deployment_type_choice == interactive_helpers.DeploymentType.SELF_HOSTED:
|
|
50
|
+
configurator = opik_configure.OpikConfigurator(
|
|
51
|
+
use_local=False,
|
|
52
|
+
force=True,
|
|
53
|
+
self_hosted_comet=True,
|
|
54
|
+
automatic_approvals=automatic_approvals,
|
|
55
|
+
)
|
|
56
|
+
elif deployment_type_choice == interactive_helpers.DeploymentType.LOCAL:
|
|
57
|
+
configurator = opik_configure.OpikConfigurator(
|
|
58
|
+
use_local=True,
|
|
59
|
+
force=True,
|
|
60
|
+
self_hosted_comet=False,
|
|
61
|
+
automatic_approvals=automatic_approvals,
|
|
62
|
+
)
|
|
63
|
+
else:
|
|
64
|
+
raise click.ClickException("Unknown deployment type was selected. Exiting.")
|
|
65
|
+
|
|
66
|
+
configurator.configure()
|