scale-gp-beta 0.1.0a26__tar.gz → 0.1.0a28__tar.gz
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.
- scale_gp_beta-0.1.0a28/.release-please-manifest.json +3 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/CHANGELOG.md +26 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/PKG-INFO +4 -3
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/README.md +2 -1
- scale_gp_beta-0.1.0a28/examples/tracing/3_openai_agent_tracing.py +51 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/pyproject.toml +2 -2
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_base_client.py +9 -2
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_version.py +1 -1
- scale_gp_beta-0.1.0a28/src/scale_gp_beta/lib/tracing/integrations/__init__.py +5 -0
- scale_gp_beta-0.1.0a28/src/scale_gp_beta/lib/tracing/integrations/openai/openai_span_type_map.py +29 -0
- scale_gp_beta-0.1.0a28/src/scale_gp_beta/lib/tracing/integrations/openai/openai_tracing_sgp_processor.py +144 -0
- scale_gp_beta-0.1.0a28/src/scale_gp_beta/lib/tracing/integrations/openai/utils.py +68 -0
- scale_gp_beta-0.1.0a28/src/scale_gp_beta/py.typed +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/spans.py +12 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/span.py +1 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/span_batch_params.py +1 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/span_create_params.py +1 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/span_search_params.py +4 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/span_upsert_batch_params.py +1 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/test_spans.py +2 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/test_client.py +2 -2
- scale_gp_beta-0.1.0a26/.release-please-manifest.json +0 -3
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/.gitignore +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/CONTRIBUTING.md +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/LICENSE +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/SECURITY.md +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/api.md +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/bin/check-release-environment +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/bin/publish-pypi +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/examples/.keep +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/examples/tracing/0_primitives_fibonacci.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/examples/tracing/1_explicit_use_case.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/examples/tracing/2_direct_upload.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/mypy.ini +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/noxfile.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/release-please-config.json +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/requirements-dev.lock +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/requirements.lock +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp/lib/.keep +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/__init__.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_client.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_compat.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_constants.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_exceptions.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_files.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_models.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_qs.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_resource.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_response.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_streaming.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_types.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_utils/__init__.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_utils/_logs.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_utils/_proxy.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_utils/_reflection.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_utils/_resources_proxy.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_utils/_streams.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_utils/_sync.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_utils/_transform.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_utils/_typing.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/_utils/_utils.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/lib/.keep +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/lib/tracing/__init__.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/lib/tracing/exceptions.py +0 -0
- /scale_gp_beta-0.1.0a26/src/scale_gp_beta/py.typed → /scale_gp_beta-0.1.0a28/src/scale_gp_beta/lib/tracing/integrations/openai/__init__.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/lib/tracing/scope.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/lib/tracing/span.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/lib/tracing/trace.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/lib/tracing/trace_exporter.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/lib/tracing/trace_queue_manager.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/lib/tracing/tracing.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/lib/tracing/types.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/lib/tracing/util.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/pagination.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/__init__.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/chat/__init__.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/chat/chat.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/chat/completions.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/completions.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/dataset_items.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/datasets.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/evaluation_items.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/evaluations.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/files/__init__.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/files/content.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/files/files.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/inference.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/models.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/resources/questions.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/__init__.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/chat/__init__.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/chat/chat_completion.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/chat/chat_completion_chunk.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/chat/completion_create_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/chat/completion_create_response.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/chat/completion_models_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/chat/completion_models_response.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/chat/model_definition.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/completion.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/completion_create_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/component.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/component_param.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/container.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/container_param.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/dataset.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/dataset_create_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/dataset_delete_response.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/dataset_item.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/dataset_item_batch_create_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/dataset_item_batch_create_response.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/dataset_item_delete_response.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/dataset_item_list_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/dataset_item_retrieve_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/dataset_item_update_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/dataset_list_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/dataset_retrieve_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/dataset_update_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/evaluation.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/evaluation_create_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/evaluation_delete_response.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/evaluation_item.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/evaluation_item_list_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/evaluation_item_retrieve_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/evaluation_list_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/evaluation_retrieve_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/evaluation_task.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/evaluation_task_param.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/evaluation_update_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/file.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/file_create_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/file_delete_response.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/file_list.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/file_list_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/file_update_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/files/__init__.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/inference_create_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/inference_create_response.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/inference_model.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/inference_model_list.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/inference_response.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/inference_response_chunk.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/item_locator.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/item_locator_template.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/model_create_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/model_delete_response.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/model_list_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/model_update_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/question.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/question_create_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/question_list.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/question_list_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/span_batch_response.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/span_update_params.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/span_upsert_batch_response.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/sgp_dev/lib/.keep +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/__init__.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/__init__.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/chat/__init__.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/chat/test_completions.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/files/__init__.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/files/test_content.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/test_completions.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/test_dataset_items.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/test_datasets.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/test_evaluation_items.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/test_evaluations.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/test_files.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/test_inference.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/test_models.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/api_resources/test_questions.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/conftest.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/lib/tracing/test_span.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/lib/tracing/test_trace.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/lib/tracing/test_trace_exporter.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/lib/tracing/test_tracing.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/sample_file.txt +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/test_deepcopy.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/test_extract_files.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/test_files.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/test_models.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/test_qs.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/test_required_args.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/test_response.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/test_streaming.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/test_transform.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/test_utils/test_proxy.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/test_utils/test_typing.py +0 -0
- {scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/tests/utils.py +0 -0
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.0-alpha.28 (2025-07-11)
|
|
4
|
+
|
|
5
|
+
Full Changelog: [v0.1.0-alpha.27...v0.1.0-alpha.28](https://github.com/scaleapi/sgp-python-beta/compare/v0.1.0-alpha.27...v0.1.0-alpha.28)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* **api:** api update ([63befc8](https://github.com/scaleapi/sgp-python-beta/commit/63befc8168d56b166e43bdcfb804033cce9b1052))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* **client:** don't send Content-Type header on GET requests ([9ca896f](https://github.com/scaleapi/sgp-python-beta/commit/9ca896fb0adf0a643cc071ad97a956752d63e42a))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Chores
|
|
18
|
+
|
|
19
|
+
* **readme:** fix version rendering on pypi ([f4d2382](https://github.com/scaleapi/sgp-python-beta/commit/f4d23824e3d9238635cbefc406bd525a652ad8cc))
|
|
20
|
+
|
|
21
|
+
## 0.1.0-alpha.27 (2025-07-10)
|
|
22
|
+
|
|
23
|
+
Full Changelog: [v0.1.0-alpha.26...v0.1.0-alpha.27](https://github.com/scaleapi/sgp-python-beta/compare/v0.1.0-alpha.26...v0.1.0-alpha.27)
|
|
24
|
+
|
|
25
|
+
### Features
|
|
26
|
+
|
|
27
|
+
* OpenAI subprocessor ([#121](https://github.com/scaleapi/sgp-python-beta/issues/121)) ([321507e](https://github.com/scaleapi/sgp-python-beta/commit/321507e666c4aec253451c670fbf42ff13361dbc))
|
|
28
|
+
|
|
3
29
|
## 0.1.0-alpha.26 (2025-07-09)
|
|
4
30
|
|
|
5
31
|
Full Changelog: [v0.1.0-alpha.25...v0.1.0-alpha.26](https://github.com/scaleapi/sgp-python-beta/compare/v0.1.0-alpha.25...v0.1.0-alpha.26)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: scale-gp-beta
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.0a28
|
|
4
4
|
Summary: The official Python library for the Scale GP API
|
|
5
5
|
Project-URL: Homepage, https://github.com/scaleapi/sgp-python-beta
|
|
6
6
|
Project-URL: Repository, https://github.com/scaleapi/sgp-python-beta
|
|
@@ -30,12 +30,13 @@ Requires-Dist: sniffio
|
|
|
30
30
|
Requires-Dist: typing-extensions<5,>=4.10
|
|
31
31
|
Provides-Extra: aiohttp
|
|
32
32
|
Requires-Dist: aiohttp; extra == 'aiohttp'
|
|
33
|
-
Requires-Dist: httpx-aiohttp>=0.1.
|
|
33
|
+
Requires-Dist: httpx-aiohttp>=0.1.8; extra == 'aiohttp'
|
|
34
34
|
Description-Content-Type: text/markdown
|
|
35
35
|
|
|
36
36
|
# Scale GP Python API library
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
<!-- prettier-ignore -->
|
|
39
|
+
[)](https://pypi.org/project/scale-gp-beta/)
|
|
39
40
|
|
|
40
41
|
The Scale GP Python library provides convenient access to the Scale GP REST API from any Python 3.8+
|
|
41
42
|
application. The library includes type definitions for all request params and response fields,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Scale GP Python API library
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<!-- prettier-ignore -->
|
|
4
|
+
[)](https://pypi.org/project/scale-gp-beta/)
|
|
4
5
|
|
|
5
6
|
The Scale GP Python library provides convenient access to the Scale GP REST API from any Python 3.8+
|
|
6
7
|
application. The library includes type definitions for all request params and response fields,
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A simple example demonstrating how to trace an OpenAI Agent run.
|
|
3
|
+
|
|
4
|
+
To run this example:
|
|
5
|
+
1. Install the necessary packages:
|
|
6
|
+
pip install openai-agents
|
|
7
|
+
2. Fill in your SGP `api_key` and `account_id`.
|
|
8
|
+
3. Run the script from your terminal
|
|
9
|
+
"""
|
|
10
|
+
import os
|
|
11
|
+
import asyncio
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
from agents import Agent, Runner, function_tool, set_trace_processors # type: ignore
|
|
15
|
+
except ImportError as e:
|
|
16
|
+
raise ImportError("Please install the required packages: pip install openai-agents") from e
|
|
17
|
+
|
|
18
|
+
import scale_gp_beta.lib.tracing as tracing
|
|
19
|
+
from scale_gp_beta import SGPClient
|
|
20
|
+
from scale_gp_beta.lib.tracing.integrations import OpenAITracingSGPProcessor
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@function_tool # type: ignore
|
|
24
|
+
def get_current_weather(city: str) -> str:
|
|
25
|
+
if "san francisco" in city.lower():
|
|
26
|
+
return "The weather in San Francisco is foggy."
|
|
27
|
+
return f"The weather in {city} is sunny."
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
async def main() -> None:
|
|
31
|
+
weather_agent = Agent( # type: ignore
|
|
32
|
+
name="Weather Agent",
|
|
33
|
+
instructions="You are a helpful assistant that can provide weather information.",
|
|
34
|
+
model="gpt-4-turbo",
|
|
35
|
+
tools=[get_current_weather],
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
result = await Runner.run(weather_agent, "What's the weather like in San Francisco?") # type: ignore
|
|
39
|
+
print("Final Output:", result.final_output) # type: ignore
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
if __name__ == "__main__":
|
|
43
|
+
api_key = "XXX"
|
|
44
|
+
account_id = "XXX"
|
|
45
|
+
os.environ["OPENAI_API_KEY"] = "XXX"
|
|
46
|
+
|
|
47
|
+
tracing.init(SGPClient(api_key=api_key, account_id=account_id), disabled=False)
|
|
48
|
+
|
|
49
|
+
sgp_processor = OpenAITracingSGPProcessor()
|
|
50
|
+
set_trace_processors([sgp_processor])
|
|
51
|
+
asyncio.run(main())
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "scale-gp-beta"
|
|
3
|
-
version = "0.1.0-alpha.
|
|
3
|
+
version = "0.1.0-alpha.28"
|
|
4
4
|
description = "The official Python library for the Scale GP API"
|
|
5
5
|
dynamic = ["readme"]
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -39,7 +39,7 @@ Homepage = "https://github.com/scaleapi/sgp-python-beta"
|
|
|
39
39
|
Repository = "https://github.com/scaleapi/sgp-python-beta"
|
|
40
40
|
|
|
41
41
|
[project.optional-dependencies]
|
|
42
|
-
aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.
|
|
42
|
+
aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.8"]
|
|
43
43
|
|
|
44
44
|
[tool.rye]
|
|
45
45
|
managed = true
|
|
@@ -529,6 +529,15 @@ class BaseClient(Generic[_HttpxClientT, _DefaultStreamT]):
|
|
|
529
529
|
# work around https://github.com/encode/httpx/discussions/2880
|
|
530
530
|
kwargs["extensions"] = {"sni_hostname": prepared_url.host.replace("_", "-")}
|
|
531
531
|
|
|
532
|
+
is_body_allowed = options.method.lower() != "get"
|
|
533
|
+
|
|
534
|
+
if is_body_allowed:
|
|
535
|
+
kwargs["json"] = json_data if is_given(json_data) else None
|
|
536
|
+
kwargs["files"] = files
|
|
537
|
+
else:
|
|
538
|
+
headers.pop("Content-Type", None)
|
|
539
|
+
kwargs.pop("data", None)
|
|
540
|
+
|
|
532
541
|
# TODO: report this error to httpx
|
|
533
542
|
return self._client.build_request( # pyright: ignore[reportUnknownMemberType]
|
|
534
543
|
headers=headers,
|
|
@@ -540,8 +549,6 @@ class BaseClient(Generic[_HttpxClientT, _DefaultStreamT]):
|
|
|
540
549
|
# so that passing a `TypedDict` doesn't cause an error.
|
|
541
550
|
# https://github.com/microsoft/pyright/issues/3526#event-6715453066
|
|
542
551
|
params=self.qs.stringify(cast(Mapping[str, Any], params)) if params else None,
|
|
543
|
-
json=json_data if is_given(json_data) else None,
|
|
544
|
-
files=files,
|
|
545
552
|
**kwargs,
|
|
546
553
|
)
|
|
547
554
|
|
scale_gp_beta-0.1.0a28/src/scale_gp_beta/lib/tracing/integrations/openai/openai_span_type_map.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from typing import Dict, Optional
|
|
2
|
+
|
|
3
|
+
from scale_gp_beta.lib.tracing.types import SpanTypeLiterals
|
|
4
|
+
|
|
5
|
+
OPENAI_SPAN_TYPE_MAP: Dict[str, SpanTypeLiterals] = {
|
|
6
|
+
"generation": "COMPLETION",
|
|
7
|
+
"agent": "AGENT_WORKFLOW",
|
|
8
|
+
"function": "CODE_EXECUTION",
|
|
9
|
+
"response": "COMPLETION",
|
|
10
|
+
"handoff": "CUSTOM",
|
|
11
|
+
"custom": "CUSTOM",
|
|
12
|
+
"guardrail": "STANDALONE",
|
|
13
|
+
"transcription": "STANDALONE",
|
|
14
|
+
"speech": "STANDALONE",
|
|
15
|
+
"speech_group": "STANDALONE",
|
|
16
|
+
"mcp_tools": "STANDALONE",
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def openai_span_type_map(span_type: Optional[str]) -> SpanTypeLiterals:
|
|
21
|
+
"""
|
|
22
|
+
Maps an OpenAI span type string to its corresponding SGP SpanTypeLiteral.
|
|
23
|
+
|
|
24
|
+
Returns "CUSTOM" if the input is None or not found in the map.
|
|
25
|
+
"""
|
|
26
|
+
if not span_type:
|
|
27
|
+
return "CUSTOM"
|
|
28
|
+
|
|
29
|
+
return OPENAI_SPAN_TYPE_MAP.get(span_type, "CUSTOM")
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# The following `type: ignore` is necessary because this file provides an optional
|
|
2
|
+
# integration for the 'openai-agents' library. The linter will report missing
|
|
3
|
+
# imports if the library isn't installed in the development environment, but the
|
|
4
|
+
# code handles this gracefully at runtime with a try/except block.
|
|
5
|
+
# type: ignore
|
|
6
|
+
import logging
|
|
7
|
+
from typing import TYPE_CHECKING, Any, Dict, Optional
|
|
8
|
+
|
|
9
|
+
from scale_gp_beta.lib.tracing.span import BaseSpan
|
|
10
|
+
from scale_gp_beta.lib.tracing.tracing import create_span, flush_queue, create_trace, tracing_queue_manager
|
|
11
|
+
from scale_gp_beta.lib.tracing.trace_queue_manager import TraceQueueManager
|
|
12
|
+
|
|
13
|
+
from .utils import sgp_span_name, parse_metadata, extract_response, parse_input_output
|
|
14
|
+
from .openai_span_type_map import openai_span_type_map
|
|
15
|
+
|
|
16
|
+
log: logging.Logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
try:
|
|
19
|
+
from agents.tracing import (
|
|
20
|
+
Span as OpenAISpan,
|
|
21
|
+
Trace as OpenAITrace,
|
|
22
|
+
SpanData as OpenAISpanData,
|
|
23
|
+
ResponseSpanData as OpenAIResponseSpanData,
|
|
24
|
+
TracingProcessor,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
_openai_agents_installed = True
|
|
28
|
+
except ImportError:
|
|
29
|
+
_openai_agents_installed = False
|
|
30
|
+
TracingProcessor = object
|
|
31
|
+
class _Fallback:
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
OpenAISpan = _Fallback
|
|
35
|
+
OpenAITrace = _Fallback
|
|
36
|
+
OpenAISpanData = _Fallback
|
|
37
|
+
OpenAIResponseSpanData = _Fallback
|
|
38
|
+
|
|
39
|
+
if TYPE_CHECKING:
|
|
40
|
+
OpenAISpan = Any
|
|
41
|
+
OpenAITrace = Any
|
|
42
|
+
OpenAISpanData = Any
|
|
43
|
+
OpenAIResponseSpanData = Any
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class OpenAITracingSGPProcessor(TracingProcessor):
|
|
47
|
+
"""
|
|
48
|
+
An SGP tracing processor that integrates with OpenAI Agents SDK.
|
|
49
|
+
|
|
50
|
+
This processor requires the 'openai-agents' library to be installed.
|
|
51
|
+
It will raise an ImportError on initialization if the library is not found.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def __init__(
|
|
55
|
+
self,
|
|
56
|
+
*,
|
|
57
|
+
queue_manager: Optional[TraceQueueManager] = None,
|
|
58
|
+
):
|
|
59
|
+
"""
|
|
60
|
+
Initializes the processor.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
queue_manager: An optional custom trace queue manager.
|
|
64
|
+
|
|
65
|
+
Raises:
|
|
66
|
+
ImportError: If the 'openai-agents' package is not installed.
|
|
67
|
+
"""
|
|
68
|
+
# This runtime check is the gatekeeper. If 'openai-agents' isn't
|
|
69
|
+
# installed, no instance of this class can be created.
|
|
70
|
+
if not _openai_agents_installed:
|
|
71
|
+
raise ImportError(
|
|
72
|
+
"The 'openai-agents' package is required to use the OpenAITracingSGPProcessor. "
|
|
73
|
+
"Please install it with: pip install 'openai-agents'"
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
self._queue_manager = queue_manager or tracing_queue_manager()
|
|
77
|
+
self._spans: Dict[str, BaseSpan] = {}
|
|
78
|
+
|
|
79
|
+
def on_trace_start(self, openai_trace: "OpenAITrace") -> None:
|
|
80
|
+
sgp_trace = create_trace(
|
|
81
|
+
name=openai_trace.name or "Agent Workflow",
|
|
82
|
+
span_type="AGENT_WORKFLOW",
|
|
83
|
+
group_id=openai_trace.group_id,
|
|
84
|
+
trace_id=openai_trace.trace_id,
|
|
85
|
+
metadata={"openai_metadata": openai_trace.metadata or {}},
|
|
86
|
+
)
|
|
87
|
+
sgp_trace.start()
|
|
88
|
+
self._spans[openai_trace.trace_id] = sgp_trace.root_span
|
|
89
|
+
|
|
90
|
+
def on_trace_end(self, openai_trace: "OpenAITrace") -> None:
|
|
91
|
+
root_span = self._spans.pop(openai_trace.trace_id, None)
|
|
92
|
+
if root_span is None:
|
|
93
|
+
log.warning(f"No root span found for trace_id: {openai_trace.trace_id}")
|
|
94
|
+
return
|
|
95
|
+
root_span.end()
|
|
96
|
+
|
|
97
|
+
def on_span_start(self, openai_span: "OpenAISpan") -> None:
|
|
98
|
+
_spans_key = openai_span.parent_id or openai_span.trace_id
|
|
99
|
+
parent_span = self._spans.get(_spans_key)
|
|
100
|
+
span_data = openai_span.span_data
|
|
101
|
+
|
|
102
|
+
if not parent_span:
|
|
103
|
+
log.warning(f"No parent span found for span_id: {openai_span.span_id}")
|
|
104
|
+
return
|
|
105
|
+
|
|
106
|
+
name = sgp_span_name(openai_span)
|
|
107
|
+
sgp_span_type = openai_span_type_map(span_data.type if span_data else None)
|
|
108
|
+
|
|
109
|
+
new_span = create_span(
|
|
110
|
+
name=name,
|
|
111
|
+
span_type=sgp_span_type,
|
|
112
|
+
span_id=openai_span.span_id,
|
|
113
|
+
trace_id=parent_span.trace_id,
|
|
114
|
+
parent_id=parent_span.span_id,
|
|
115
|
+
)
|
|
116
|
+
new_span.start()
|
|
117
|
+
self._spans[openai_span.span_id] = new_span
|
|
118
|
+
|
|
119
|
+
def on_span_end(self, openai_span: "OpenAISpan") -> None:
|
|
120
|
+
sgp_span = self._spans.pop(openai_span.span_id, None)
|
|
121
|
+
if sgp_span is None:
|
|
122
|
+
log.warning(f"No existing span found for span_id: {openai_span.span_id}")
|
|
123
|
+
return
|
|
124
|
+
|
|
125
|
+
# special case response type, if there are more like this we should change arch to support this
|
|
126
|
+
if isinstance(openai_span.span_data, OpenAIResponseSpanData):
|
|
127
|
+
response = extract_response(openai_span)
|
|
128
|
+
sgp_span.input = {"input": openai_span.span_data.input}
|
|
129
|
+
sgp_span.output = {"output": response.get("output", None) if response else None }
|
|
130
|
+
else:
|
|
131
|
+
sgp_span.output = parse_input_output(openai_span, "output")
|
|
132
|
+
sgp_span.input = parse_input_output(openai_span, "input")
|
|
133
|
+
|
|
134
|
+
sgp_span.metadata = parse_metadata(openai_span)
|
|
135
|
+
|
|
136
|
+
if openai_span.error:
|
|
137
|
+
sgp_span.set_error(error_message=str(openai_span.error))
|
|
138
|
+
sgp_span.end()
|
|
139
|
+
|
|
140
|
+
def shutdown(self) -> None:
|
|
141
|
+
self._queue_manager.shutdown()
|
|
142
|
+
|
|
143
|
+
def force_flush(self) -> None:
|
|
144
|
+
flush_queue()
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
import json
|
|
3
|
+
from typing import Any, Dict, Optional
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
from agents.tracing import (
|
|
7
|
+
Span as OpenAISpan,
|
|
8
|
+
ResponseSpanData as OpenAIResponseSpanData,
|
|
9
|
+
)
|
|
10
|
+
except ImportError:
|
|
11
|
+
OpenAISpan = Any
|
|
12
|
+
OpenAIResponseSpanData = Any
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def sgp_span_name(openai_span: "OpenAISpan") -> str:
|
|
16
|
+
span_data = openai_span.span_data
|
|
17
|
+
if span_data is None:
|
|
18
|
+
return "Unnamed Span"
|
|
19
|
+
default_name = str(type(span_data).__name__).replace("SpanData", "")
|
|
20
|
+
|
|
21
|
+
return span_data.export().get("name", default_name)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def extract_response(openai_span: "OpenAISpan") -> Optional[Dict[str, Any]]:
|
|
25
|
+
span_data = openai_span.span_data
|
|
26
|
+
if not isinstance(span_data, OpenAIResponseSpanData):
|
|
27
|
+
return None
|
|
28
|
+
|
|
29
|
+
return {} if span_data.response is None else span_data.response.model_dump()
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def parse_metadata(openai_span: "OpenAISpan") -> Dict[str, Any]:
|
|
33
|
+
"""Extracts and formats metadata from an OpenAI span."""
|
|
34
|
+
if not openai_span.span_data:
|
|
35
|
+
return {}
|
|
36
|
+
|
|
37
|
+
excluded_fields = ("output", "input")
|
|
38
|
+
exported_span_data: dict = openai_span.span_data.export()
|
|
39
|
+
exported_span_data["openai_span_id"] = openai_span.span_id
|
|
40
|
+
|
|
41
|
+
filtered_span_data: dict = {
|
|
42
|
+
k: v for k, v in exported_span_data.items() if k not in excluded_fields
|
|
43
|
+
}
|
|
44
|
+
response = extract_response(openai_span)
|
|
45
|
+
if response is not None:
|
|
46
|
+
filtered_span_data["openai_response"] = response
|
|
47
|
+
return {"openai_metadata": filtered_span_data}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def parse_input_output(openai_span: "OpenAISpan", key: str) -> Dict[str, Any]:
|
|
51
|
+
"""
|
|
52
|
+
Safely extracts and parses input/output data from a span.
|
|
53
|
+
The openai-agents SDK sometimes returns this data as a JSON string.
|
|
54
|
+
"""
|
|
55
|
+
span_data = openai_span.span_data
|
|
56
|
+
if not span_data:
|
|
57
|
+
return {}
|
|
58
|
+
exported_span_data: dict = span_data.export()
|
|
59
|
+
value: Optional[Any] = exported_span_data.get(key)
|
|
60
|
+
if value is None:
|
|
61
|
+
return {}
|
|
62
|
+
|
|
63
|
+
if isinstance(value, str):
|
|
64
|
+
try:
|
|
65
|
+
return json.loads(value)
|
|
66
|
+
except (json.JSONDecodeError, TypeError):
|
|
67
|
+
return {key: value}
|
|
68
|
+
return {key: value}
|
|
File without changes
|
|
@@ -91,6 +91,7 @@ class SpansResource(SyncAPIResource):
|
|
|
91
91
|
"FILE_RETRIEVAL",
|
|
92
92
|
"KB_ADD_CHUNK",
|
|
93
93
|
"KB_MANAGEMENT",
|
|
94
|
+
"GUARDRAIL",
|
|
94
95
|
"TRACER",
|
|
95
96
|
"AGENT_TRACER",
|
|
96
97
|
"AGENT_WORKFLOW",
|
|
@@ -283,6 +284,7 @@ class SpansResource(SyncAPIResource):
|
|
|
283
284
|
group_id: str | NotGiven = NOT_GIVEN,
|
|
284
285
|
names: List[str] | NotGiven = NOT_GIVEN,
|
|
285
286
|
parents_only: bool | NotGiven = NOT_GIVEN,
|
|
287
|
+
search_text: str | NotGiven = NOT_GIVEN,
|
|
286
288
|
span_id: str | NotGiven = NOT_GIVEN,
|
|
287
289
|
span_ids: List[str] | NotGiven = NOT_GIVEN,
|
|
288
290
|
statuses: List[Literal["SUCCESS", "ERROR", "CANCELED"]] | NotGiven = NOT_GIVEN,
|
|
@@ -310,6 +312,7 @@ class SpansResource(SyncAPIResource):
|
|
|
310
312
|
"FILE_RETRIEVAL",
|
|
311
313
|
"KB_ADD_CHUNK",
|
|
312
314
|
"KB_MANAGEMENT",
|
|
315
|
+
"GUARDRAIL",
|
|
313
316
|
"TRACER",
|
|
314
317
|
"AGENT_TRACER",
|
|
315
318
|
"AGENT_WORKFLOW",
|
|
@@ -344,6 +347,8 @@ class SpansResource(SyncAPIResource):
|
|
|
344
347
|
|
|
345
348
|
parents_only: Only fetch spans that are the top-level (ie. have no parent_id)
|
|
346
349
|
|
|
350
|
+
search_text: Free text search across span input and output fields
|
|
351
|
+
|
|
347
352
|
span_id: Filter by span ID (deprecated: use span_ids instead)
|
|
348
353
|
|
|
349
354
|
span_ids: Filter by span IDs
|
|
@@ -373,6 +378,7 @@ class SpansResource(SyncAPIResource):
|
|
|
373
378
|
"group_id": group_id,
|
|
374
379
|
"names": names,
|
|
375
380
|
"parents_only": parents_only,
|
|
381
|
+
"search_text": search_text,
|
|
376
382
|
"span_id": span_id,
|
|
377
383
|
"span_ids": span_ids,
|
|
378
384
|
"statuses": statuses,
|
|
@@ -493,6 +499,7 @@ class AsyncSpansResource(AsyncAPIResource):
|
|
|
493
499
|
"FILE_RETRIEVAL",
|
|
494
500
|
"KB_ADD_CHUNK",
|
|
495
501
|
"KB_MANAGEMENT",
|
|
502
|
+
"GUARDRAIL",
|
|
496
503
|
"TRACER",
|
|
497
504
|
"AGENT_TRACER",
|
|
498
505
|
"AGENT_WORKFLOW",
|
|
@@ -685,6 +692,7 @@ class AsyncSpansResource(AsyncAPIResource):
|
|
|
685
692
|
group_id: str | NotGiven = NOT_GIVEN,
|
|
686
693
|
names: List[str] | NotGiven = NOT_GIVEN,
|
|
687
694
|
parents_only: bool | NotGiven = NOT_GIVEN,
|
|
695
|
+
search_text: str | NotGiven = NOT_GIVEN,
|
|
688
696
|
span_id: str | NotGiven = NOT_GIVEN,
|
|
689
697
|
span_ids: List[str] | NotGiven = NOT_GIVEN,
|
|
690
698
|
statuses: List[Literal["SUCCESS", "ERROR", "CANCELED"]] | NotGiven = NOT_GIVEN,
|
|
@@ -712,6 +720,7 @@ class AsyncSpansResource(AsyncAPIResource):
|
|
|
712
720
|
"FILE_RETRIEVAL",
|
|
713
721
|
"KB_ADD_CHUNK",
|
|
714
722
|
"KB_MANAGEMENT",
|
|
723
|
+
"GUARDRAIL",
|
|
715
724
|
"TRACER",
|
|
716
725
|
"AGENT_TRACER",
|
|
717
726
|
"AGENT_WORKFLOW",
|
|
@@ -746,6 +755,8 @@ class AsyncSpansResource(AsyncAPIResource):
|
|
|
746
755
|
|
|
747
756
|
parents_only: Only fetch spans that are the top-level (ie. have no parent_id)
|
|
748
757
|
|
|
758
|
+
search_text: Free text search across span input and output fields
|
|
759
|
+
|
|
749
760
|
span_id: Filter by span ID (deprecated: use span_ids instead)
|
|
750
761
|
|
|
751
762
|
span_ids: Filter by span IDs
|
|
@@ -775,6 +786,7 @@ class AsyncSpansResource(AsyncAPIResource):
|
|
|
775
786
|
"group_id": group_id,
|
|
776
787
|
"names": names,
|
|
777
788
|
"parents_only": parents_only,
|
|
789
|
+
"search_text": search_text,
|
|
778
790
|
"span_id": span_id,
|
|
779
791
|
"span_ids": span_ids,
|
|
780
792
|
"statuses": statuses,
|
{scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/src/scale_gp_beta/types/span_search_params.py
RENAMED
|
@@ -44,6 +44,9 @@ class SpanSearchParams(TypedDict, total=False):
|
|
|
44
44
|
parents_only: bool
|
|
45
45
|
"""Only fetch spans that are the top-level (ie. have no parent_id)"""
|
|
46
46
|
|
|
47
|
+
search_text: str
|
|
48
|
+
"""Free text search across span input and output fields"""
|
|
49
|
+
|
|
47
50
|
span_id: str
|
|
48
51
|
"""Filter by span ID (deprecated: use span_ids instead)"""
|
|
49
52
|
|
|
@@ -81,6 +84,7 @@ class SpanSearchParams(TypedDict, total=False):
|
|
|
81
84
|
"FILE_RETRIEVAL",
|
|
82
85
|
"KB_ADD_CHUNK",
|
|
83
86
|
"KB_MANAGEMENT",
|
|
87
|
+
"GUARDRAIL",
|
|
84
88
|
"TRACER",
|
|
85
89
|
"AGENT_TRACER",
|
|
86
90
|
"AGENT_WORKFLOW",
|
|
@@ -237,6 +237,7 @@ class TestSpans:
|
|
|
237
237
|
group_id="group_id",
|
|
238
238
|
names=["string"],
|
|
239
239
|
parents_only=True,
|
|
240
|
+
search_text="search_text",
|
|
240
241
|
span_id="span_id",
|
|
241
242
|
span_ids=["string"],
|
|
242
243
|
statuses=["SUCCESS"],
|
|
@@ -535,6 +536,7 @@ class TestAsyncSpans:
|
|
|
535
536
|
group_id="group_id",
|
|
536
537
|
names=["string"],
|
|
537
538
|
parents_only=True,
|
|
539
|
+
search_text="search_text",
|
|
538
540
|
span_id="span_id",
|
|
539
541
|
span_ids=["string"],
|
|
540
542
|
statuses=["SUCCESS"],
|
|
@@ -505,7 +505,7 @@ class TestSGPClient:
|
|
|
505
505
|
def test_multipart_repeating_array(self, client: SGPClient) -> None:
|
|
506
506
|
request = client._build_request(
|
|
507
507
|
FinalRequestOptions.construct(
|
|
508
|
-
method="
|
|
508
|
+
method="post",
|
|
509
509
|
url="/foo",
|
|
510
510
|
headers={"Content-Type": "multipart/form-data; boundary=6b7ba517decee4a450543ea6ae821c82"},
|
|
511
511
|
json_data={"array": ["foo", "bar"]},
|
|
@@ -1399,7 +1399,7 @@ class TestAsyncSGPClient:
|
|
|
1399
1399
|
def test_multipart_repeating_array(self, async_client: AsyncSGPClient) -> None:
|
|
1400
1400
|
request = async_client._build_request(
|
|
1401
1401
|
FinalRequestOptions.construct(
|
|
1402
|
-
method="
|
|
1402
|
+
method="post",
|
|
1403
1403
|
url="/foo",
|
|
1404
1404
|
headers={"Content-Type": "multipart/form-data; boundary=6b7ba517decee4a450543ea6ae821c82"},
|
|
1405
1405
|
json_data={"array": ["foo", "bar"]},
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scale_gp_beta-0.1.0a26 → scale_gp_beta-0.1.0a28}/examples/tracing/0_primitives_fibonacci.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|