Showing preview only (5,965K chars total). Download the full file or copy to clipboard to get everything.
Repository: NVIDIA-AI-Blueprints/video-search-and-summarization
Branch: main
Commit: aafcc7e6e14c
Files: 823
Total size: 5.5 MB
Directory structure:
gitextract_872b8gvq/
├── .gitattributes
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report_form.yml
│ │ ├── config.yml
│ │ ├── documentation_request.yml
│ │ └── feature_request_form.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── copy-pr-bot.yaml
│ ├── scripts/
│ │ ├── check_copyright_headers.py
│ │ └── trigger-downstream-pipeline.sh
│ └── workflows/
│ └── ci.yml
├── .pre-commit-config.yaml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── LICENSE-3rd-party.txt
├── LICENSE.DATA
├── README.md
├── SECURITY.md
├── agent/
│ ├── .gitattributes
│ ├── .pre-commit-config.yaml
│ ├── AGENTS.md
│ ├── LICENSE-3rd-party.txt
│ ├── LICENSE.md
│ ├── README.md
│ ├── docker/
│ │ ├── Dockerfile
│ │ ├── cleanup_vulnerabilities.py
│ │ └── verify_ffmpeg_tarball.py
│ ├── pyproject.toml
│ ├── src/
│ │ ├── sitecustomize.py
│ │ └── vss_agents/
│ │ ├── __init__.py
│ │ ├── agents/
│ │ │ ├── __init__.py
│ │ │ ├── critic_agent.py
│ │ │ ├── data_models.py
│ │ │ ├── multi_report_agent.py
│ │ │ ├── postprocessing/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── data_models.py
│ │ │ │ ├── postprocessing_node.py
│ │ │ │ └── validators/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── llm_based_rule_validator.py
│ │ │ │ ├── non_empty_response_validator.py
│ │ │ │ └── url_validator.py
│ │ │ ├── register.py
│ │ │ ├── report_agent.py
│ │ │ ├── search_agent.py
│ │ │ └── top_agent.py
│ │ ├── api/
│ │ │ ├── __init__.py
│ │ │ ├── custom_fastapi_worker.py
│ │ │ ├── health_endpoint.py
│ │ │ ├── register.py
│ │ │ ├── rtsp_stream_api.py
│ │ │ ├── video_delete.py
│ │ │ ├── video_search_ingest.py
│ │ │ └── video_upload_url.py
│ │ ├── data_models/
│ │ │ ├── __init__.py
│ │ │ └── vss.py
│ │ ├── embed/
│ │ │ ├── __init__.py
│ │ │ ├── cosmos_embed.py
│ │ │ ├── embed.py
│ │ │ └── rtvi_cv_embed.py
│ │ ├── evaluators/
│ │ │ ├── __init__.py
│ │ │ ├── customized_qa_evaluator/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── evaluate.py
│ │ │ │ └── register.py
│ │ │ ├── customized_trajectory_evaluator/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── evaluate.py
│ │ │ │ └── register.py
│ │ │ ├── evaluate_patch.py
│ │ │ ├── register.py
│ │ │ ├── report_evaluator/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── data_models.py
│ │ │ │ ├── eval_config_models.py
│ │ │ │ ├── evaluate.py
│ │ │ │ ├── field_evaluators/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── common.py
│ │ │ │ │ └── llm_judge.py
│ │ │ │ └── register.py
│ │ │ └── utils.py
│ │ ├── prompt.py
│ │ ├── py.typed
│ │ ├── tools/
│ │ │ ├── __init__.py
│ │ │ ├── attribute_search.py
│ │ │ ├── chart_generator.py
│ │ │ ├── code_executor/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── docker_backend/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── docker_executor.py
│ │ │ │ │ └── image_builder.py
│ │ │ │ └── python_executor.py
│ │ │ ├── embed_search.py
│ │ │ ├── evaluation_compressor.py
│ │ │ ├── fov_counts_with_chart.py
│ │ │ ├── geolocation.py
│ │ │ ├── incidents.py
│ │ │ ├── lvs_video_understanding.py
│ │ │ ├── multi_incident_formatter.py
│ │ │ ├── prompt_gen.py
│ │ │ ├── register.py
│ │ │ ├── report_gen.py
│ │ │ ├── rtvi_vlm_alert.py
│ │ │ ├── s3_picture_url.py
│ │ │ ├── search.py
│ │ │ ├── template_report_gen.py
│ │ │ ├── video_caption.py
│ │ │ ├── video_detailed_caption.py
│ │ │ ├── video_frame_timestamp.py
│ │ │ ├── video_report_gen.py
│ │ │ ├── video_skim_caption.py
│ │ │ ├── video_understanding.py
│ │ │ ├── vss_summarize.py
│ │ │ ├── vst/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── duration.py
│ │ │ │ ├── register.py
│ │ │ │ ├── sensor_list.py
│ │ │ │ ├── snapshot.py
│ │ │ │ ├── timeline.py
│ │ │ │ ├── utils.py
│ │ │ │ ├── video_clip.py
│ │ │ │ └── video_list.py
│ │ │ ├── vst_download.py
│ │ │ └── vst_files.py
│ │ ├── utils/
│ │ │ ├── asyncmixin.py
│ │ │ ├── file_mapping.py
│ │ │ ├── frame_select.py
│ │ │ ├── markdown_parser.py
│ │ │ ├── parser.py
│ │ │ ├── reasoning_parsing.py
│ │ │ ├── reasoning_utils.py
│ │ │ ├── retry.py
│ │ │ ├── time_convert.py
│ │ │ ├── time_measure.py
│ │ │ ├── url_translation.py
│ │ │ └── video_file.py
│ │ └── video_analytics/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── embeddings.py
│ │ ├── es_client.py
│ │ ├── interface.py
│ │ ├── nvschema.py
│ │ ├── query_builders.py
│ │ ├── tools.py
│ │ └── utils.py
│ ├── stubs/
│ │ └── nat/
│ │ ├── __init__.pyi
│ │ └── data_models/
│ │ ├── __init__.pyi
│ │ ├── common.pyi
│ │ ├── evaluator.pyi
│ │ └── function.pyi
│ └── tests/
│ └── unit_test/
│ ├── __init__.py
│ ├── agents/
│ │ ├── __init__.py
│ │ ├── postprocessing/
│ │ │ ├── __init__.py
│ │ │ ├── test_llm_based_rule_validator.py
│ │ │ ├── test_non_empty_response_validator.py
│ │ │ ├── test_postprocessing_node.py
│ │ │ └── test_url_validator.py
│ │ ├── test_data_models.py
│ │ ├── test_multi_report_agent.py
│ │ ├── test_report_agent.py
│ │ ├── test_search_agent.py
│ │ └── test_top_agent.py
│ ├── api/
│ │ ├── __init__.py
│ │ ├── conftest.py
│ │ ├── test_health_endpoint_coverage.py
│ │ ├── test_rtsp_stream_api.py
│ │ ├── test_video_search_ingest.py
│ │ ├── test_video_upload_url.py
│ │ ├── test_video_upload_url_converters.py
│ │ ├── test_video_upload_url_coverage.py
│ │ └── test_video_upload_url_inner.py
│ ├── conftest.py
│ ├── data_models/
│ │ ├── __init__.py
│ │ └── test_vss.py
│ ├── embed/
│ │ └── test_cosmos_embed.py
│ ├── evaluators/
│ │ ├── __init__.py
│ │ ├── test_custom_qa.py
│ │ ├── test_custom_trajectory.py
│ │ ├── test_data_models.py
│ │ ├── test_eval_config_models.py
│ │ ├── test_evaluate.py
│ │ ├── test_evaluate_patch.py
│ │ ├── test_field_evaluators.py
│ │ ├── test_llm_judge.py
│ │ ├── test_llm_judge_coverage.py
│ │ ├── test_llm_judge_field_discovery.py
│ │ ├── test_register_coverage.py
│ │ ├── test_report_evaluator.py
│ │ └── test_utils.py
│ ├── test_prompt.py
│ ├── test_sitecustomize.py
│ ├── tools/
│ │ ├── __init__.py
│ │ ├── test_build_vst_url.py
│ │ ├── test_chart_generator.py
│ │ ├── test_chart_generator_converters.py
│ │ ├── test_chart_generator_coverage.py
│ │ ├── test_chart_generator_inner.py
│ │ ├── test_code_executor.py
│ │ ├── test_embed_search.py
│ │ ├── test_embed_search_coverage.py
│ │ ├── test_embed_search_edge_cases.py
│ │ ├── test_embed_search_inner.py
│ │ ├── test_evaluation_compressor.py
│ │ ├── test_fov_counts.py
│ │ ├── test_geolocation.py
│ │ ├── test_incidents.py
│ │ ├── test_lvs_video_understanding.py
│ │ ├── test_multi_incident_formatter.py
│ │ ├── test_prompt_gen.py
│ │ ├── test_prompt_gen_coverage.py
│ │ ├── test_prompt_gen_inner.py
│ │ ├── test_python_executor.py
│ │ ├── test_python_executor_coverage.py
│ │ ├── test_report_gen.py
│ │ ├── test_rtvi_vlm_alert.py
│ │ ├── test_rtvi_vlm_alert_inner.py
│ │ ├── test_s3_picture_url.py
│ │ ├── test_search.py
│ │ ├── test_search_converters.py
│ │ ├── test_search_coverage.py
│ │ ├── test_search_inner.py
│ │ ├── test_search_more_edge_cases.py
│ │ ├── test_template_report_gen.py
│ │ ├── test_video_caption.py
│ │ ├── test_video_caption_coverage.py
│ │ ├── test_video_caption_inner.py
│ │ ├── test_video_caption_vss_inner.py
│ │ ├── test_video_detailed_caption.py
│ │ ├── test_video_detailed_caption_coverage.py
│ │ ├── test_video_frame_timestamp.py
│ │ ├── test_video_frame_timestamp_coverage.py
│ │ ├── test_video_report_gen.py
│ │ ├── test_video_skim_caption.py
│ │ ├── test_video_skim_caption_coverage.py
│ │ ├── test_video_understanding.py
│ │ ├── test_video_upload_url.py
│ │ ├── test_vss_summarize.py
│ │ ├── test_vss_summarize_coverage.py
│ │ ├── test_vss_summarize_inner.py
│ │ ├── test_vst_tools.py
│ │ └── vst/
│ │ ├── __init__.py
│ │ ├── test_bounding_box.py
│ │ ├── test_duration_coverage.py
│ │ ├── test_sensor_list.py
│ │ ├── test_snapshot.py
│ │ ├── test_snapshot_coverage.py
│ │ ├── test_snapshot_inner.py
│ │ ├── test_stream_list.py
│ │ ├── test_timeline.py
│ │ ├── test_utils.py
│ │ ├── test_video_clip.py
│ │ ├── test_video_clip_coverage.py
│ │ ├── test_video_clip_inner.py
│ │ └── test_video_list_coverage.py
│ ├── utils/
│ │ ├── __init__.py
│ │ ├── test_asyncmixin.py
│ │ ├── test_file_mapping.py
│ │ ├── test_frame_select.py
│ │ ├── test_markdown_parser.py
│ │ ├── test_parser.py
│ │ ├── test_reasoning_parsing.py
│ │ ├── test_reasoning_utils.py
│ │ ├── test_retry.py
│ │ ├── test_rewrite_url_host.py
│ │ ├── test_screenshot.py
│ │ ├── test_time_measure.py
│ │ ├── test_url_translation.py
│ │ └── test_video_file.py
│ └── video_analytics/
│ ├── __init__.py
│ ├── test_embeddings.py
│ ├── test_es_client.py
│ ├── test_interface.py
│ ├── test_nvschema.py
│ ├── test_query_builders.py
│ ├── test_tools.py
│ ├── test_tools_deep_coverage.py
│ ├── test_tools_edge_cases.py
│ ├── test_tools_functions.py
│ ├── test_tools_inner.py
│ ├── test_tools_inner_fns.py
│ ├── test_tools_integration.py
│ └── test_utils.py
├── deployments/
│ ├── LICENSE-3rd-party.txt
│ ├── MANIFEST
│ ├── NOTICE.md
│ ├── README.md
│ ├── agents/
│ │ ├── agent_ui/
│ │ │ └── compose.yml
│ │ ├── compose.yml
│ │ └── vss-agent/
│ │ └── vss-agent-docker-compose.yml
│ ├── compose.yml
│ ├── developer-workflow/
│ │ ├── compose.yml
│ │ ├── dev-profile-alerts/
│ │ │ ├── Dockerfiles/
│ │ │ │ ├── EDGE-perception.Dockerfile
│ │ │ │ ├── kibana-dashboard.Dockerfile
│ │ │ │ └── perception.Dockerfile
│ │ │ ├── compose.yml
│ │ │ ├── deepstream/
│ │ │ │ ├── EDGE-configs/
│ │ │ │ │ ├── cfg_kafka.txt
│ │ │ │ │ ├── coco_classmap.txt
│ │ │ │ │ ├── config_triton_nvinferserver_gdino.txt
│ │ │ │ │ ├── rtdetr-960x544-labels.txt
│ │ │ │ │ ├── rtdetr-960x544.txt
│ │ │ │ │ └── run_config-api-rtdetr-protobuf.txt
│ │ │ │ ├── configs/
│ │ │ │ │ ├── cfg_kafka.txt
│ │ │ │ │ ├── coco_classmap.txt
│ │ │ │ │ ├── config_triton_nvinferserver_gdino.txt
│ │ │ │ │ ├── rtdetr-960x544-labels.txt
│ │ │ │ │ ├── rtdetr-960x544.txt
│ │ │ │ │ └── run_config-api-rtdetr-protobuf.txt
│ │ │ │ └── init-scripts/
│ │ │ │ └── ds-start.sh
│ │ │ ├── kibana-dashboard/
│ │ │ │ ├── init-scripts/
│ │ │ │ │ └── kibana-import-dashboard.sh
│ │ │ │ └── its-kibana-objects.ndjson
│ │ │ ├── nvstreamer/
│ │ │ │ └── configs/
│ │ │ │ ├── vst-config.json
│ │ │ │ └── vst-storage.json
│ │ │ ├── sdr/
│ │ │ │ └── docker_cluster_config.json
│ │ │ ├── vlm-as-verifier/
│ │ │ │ └── configs/
│ │ │ │ ├── EDGE-LOCAL-VLM-config.yml
│ │ │ │ ├── alert_type_config.json
│ │ │ │ └── config.yml
│ │ │ ├── vss-agent/
│ │ │ │ └── configs/
│ │ │ │ ├── config.yml
│ │ │ │ └── va_mcp_server_config.yml
│ │ │ ├── vss-behavior-analytics/
│ │ │ │ └── configs/
│ │ │ │ ├── vss-behavior-analytics-kafka-config.json
│ │ │ │ └── vss-behavior-analytics-redis-config.json
│ │ │ └── vss-video-analytics-api/
│ │ │ └── configs/
│ │ │ ├── video-analytics-api-kafka-config.json
│ │ │ └── video-analytics-api-redis-config.json
│ │ ├── dev-profile-base/
│ │ │ ├── compose.yml
│ │ │ └── vss-agent/
│ │ │ └── configs/
│ │ │ └── config.yml
│ │ ├── dev-profile-lvs/
│ │ │ ├── Dockerfiles/
│ │ │ │ └── kibana-dashboard.Dockerfile
│ │ │ ├── compose.yml
│ │ │ ├── kibana-dashboard/
│ │ │ │ ├── init-scripts/
│ │ │ │ │ └── kibana-import-dashboard.sh
│ │ │ │ └── lvs-kibana-objects.ndjson
│ │ │ └── vss-agent/
│ │ │ └── configs/
│ │ │ └── config.yml
│ │ └── dev-profile-search/
│ │ ├── Dockerfiles/
│ │ │ └── kibana-dashboard.Dockerfile
│ │ ├── compose.yml
│ │ ├── kibana-dashboard/
│ │ │ ├── init-scripts/
│ │ │ │ └── kibana-import-dashboard.sh
│ │ │ └── search-kibana-objects.ndjson
│ │ ├── video-analytics-2d-app/
│ │ │ ├── Dockerfiles/
│ │ │ │ └── perception-cnn.Dockerfile
│ │ │ ├── compose.yml
│ │ │ ├── deepstream/
│ │ │ │ ├── configs/
│ │ │ │ │ ├── cnn-models/
│ │ │ │ │ │ ├── ds-detector-labels.txt
│ │ │ │ │ │ ├── ds-kafka-config.txt
│ │ │ │ │ │ ├── ds-main-config.txt
│ │ │ │ │ │ ├── ds-main-redis-config.txt
│ │ │ │ │ │ ├── ds-nvdcf-accuracy-tracker-config.yml
│ │ │ │ │ │ ├── ds-ppl-analytics-pgie-config.yml
│ │ │ │ │ │ └── ds-redis-config.txt
│ │ │ │ │ └── config.csv
│ │ │ │ └── init-scripts/
│ │ │ │ └── ds-start.sh
│ │ │ ├── nvstreamer/
│ │ │ │ └── configs/
│ │ │ │ ├── vst-config.json
│ │ │ │ └── vst-storage.json
│ │ │ ├── sdr/
│ │ │ │ └── docker_cluster_config.json
│ │ │ └── vss-search-analytics/
│ │ │ └── configs/
│ │ │ ├── vss-search-analytics-kafka-config.json
│ │ │ └── vss-search-analytics-redis-config.json
│ │ └── vss-agent/
│ │ └── configs/
│ │ └── config.yml
│ ├── foundational/
│ │ ├── 3rdParty_Licenses
│ │ ├── Dockerfiles/
│ │ │ ├── elastic-init.Dockerfile
│ │ │ ├── elasticsearch-gpu.Dockerfile
│ │ │ ├── elasticsearch.Dockerfile
│ │ │ ├── kafka-health-check.Dockerfile
│ │ │ └── redis-health-check.Dockerfile
│ │ ├── broker-health-check/
│ │ │ └── scripts/
│ │ │ ├── check-kafka-health.sh
│ │ │ └── check-redis-health.sh
│ │ ├── elk/
│ │ │ ├── configs/
│ │ │ │ ├── elasticsearch.yml
│ │ │ │ ├── kibana.yml
│ │ │ │ ├── logstash.yml
│ │ │ │ ├── mdx-kafka-logstash.conf
│ │ │ │ └── mdx-redis-logstash.conf
│ │ │ ├── gems/
│ │ │ │ └── logstash-input-redis_stream-3.1.0-java.gem
│ │ │ ├── init-scripts/
│ │ │ │ ├── elasticsearch-ilm-policy-creation.sh
│ │ │ │ ├── elasticsearch-ingest-pipeline-creation.sh
│ │ │ │ └── elasticsearch-template-creation.sh
│ │ │ └── pb_definitions/
│ │ │ ├── descriptors/
│ │ │ │ ├── ext.desc
│ │ │ │ └── schema.desc
│ │ │ └── ruby/
│ │ │ ├── ext_pb.rb
│ │ │ └── schema_pb.rb
│ │ ├── kafka/
│ │ │ └── init-scripts/
│ │ │ └── create-kafka-topics.sh
│ │ ├── kafka-entrypoint.sh
│ │ ├── mdx-foundational.yml
│ │ └── redis/
│ │ └── configs/
│ │ └── redis.conf
│ ├── lvs/
│ │ ├── README.md
│ │ ├── compose.yml
│ │ └── configs/
│ │ └── config.yaml
│ ├── nim/
│ │ ├── compose.yml
│ │ ├── cosmos-reason1-7b/
│ │ │ ├── compose.yml
│ │ │ ├── hw-H100-shared.env
│ │ │ ├── hw-H100.env
│ │ │ ├── hw-L40S.env
│ │ │ ├── hw-OTHER-shared.env
│ │ │ ├── hw-OTHER.env
│ │ │ ├── hw-RTXPRO6000BW-shared.env
│ │ │ └── hw-RTXPRO6000BW.env
│ │ ├── cosmos-reason2-8b/
│ │ │ ├── compose.yml
│ │ │ ├── hw-DGX-SPARK-shared.env
│ │ │ ├── hw-DGX-SPARK.env
│ │ │ ├── hw-H100-shared.env
│ │ │ ├── hw-H100.env
│ │ │ ├── hw-L40S.env
│ │ │ ├── hw-OTHER-shared.env
│ │ │ ├── hw-OTHER.env
│ │ │ ├── hw-RTXPRO6000BW-shared.env
│ │ │ └── hw-RTXPRO6000BW.env
│ │ ├── fallback-override.env
│ │ ├── gpt-oss-20b/
│ │ │ ├── compose.yml
│ │ │ ├── hw-H100-shared.env
│ │ │ ├── hw-H100.env
│ │ │ ├── hw-OTHER-shared.env
│ │ │ ├── hw-OTHER.env
│ │ │ ├── hw-RTXPRO6000BW-shared.env
│ │ │ └── hw-RTXPRO6000BW.env
│ │ ├── llama-3.3-nemotron-super-49b-v1.5/
│ │ │ ├── compose.yml
│ │ │ ├── hw-H100-shared.env
│ │ │ ├── hw-H100.env
│ │ │ ├── hw-OTHER-shared.env
│ │ │ ├── hw-OTHER.env
│ │ │ ├── hw-RTXPRO6000BW-shared.env
│ │ │ └── hw-RTXPRO6000BW.env
│ │ ├── nemotron-3-nano/
│ │ │ ├── compose.yml
│ │ │ ├── hw-H100-shared.env
│ │ │ ├── hw-H100.env
│ │ │ ├── hw-OTHER-shared.env
│ │ │ ├── hw-OTHER.env
│ │ │ ├── hw-RTXPRO6000BW-shared.env
│ │ │ └── hw-RTXPRO6000BW.env
│ │ ├── nvidia-nemotron-nano-9b-v2/
│ │ │ ├── compose.yml
│ │ │ ├── hw-H100-shared.env
│ │ │ ├── hw-H100.env
│ │ │ ├── hw-L40S.env
│ │ │ ├── hw-OTHER-shared.env
│ │ │ ├── hw-OTHER.env
│ │ │ ├── hw-RTXPRO6000BW-shared.env
│ │ │ └── hw-RTXPRO6000BW.env
│ │ ├── nvidia-nemotron-nano-9b-v2-fp8/
│ │ │ ├── compose.yml
│ │ │ ├── hw-AGX-THOR-shared.env
│ │ │ ├── hw-AGX-THOR.env
│ │ │ ├── hw-DGX-SPARK-shared.env
│ │ │ ├── hw-DGX-SPARK.env
│ │ │ ├── hw-IGX-THOR-shared.env
│ │ │ ├── hw-IGX-THOR.env
│ │ │ ├── hw-OTHER-shared.env
│ │ │ └── hw-OTHER.env
│ │ └── qwen3-vl-8b-instruct/
│ │ ├── compose.yml
│ │ ├── hw-H100-shared.env
│ │ ├── hw-H100.env
│ │ ├── hw-OTHER-shared.env
│ │ ├── hw-OTHER.env
│ │ ├── hw-RTXPRO6000BW-shared.env
│ │ └── hw-RTXPRO6000BW.env
│ ├── proxy/
│ │ ├── compose.yml
│ │ └── nginx.conf.template
│ ├── rtvi/
│ │ ├── compose.yml
│ │ ├── rtvi-embed/
│ │ │ └── rtvi-embed-docker-compose.yml
│ │ └── rtvi-vlm/
│ │ └── rtvi-vlm-docker-compose.yml
│ ├── vlm-as-verifier/
│ │ ├── README.md
│ │ ├── compose.yml
│ │ └── scripts/
│ │ └── env-substitute.py
│ └── vst/
│ ├── developer/
│ │ └── vst/
│ │ ├── configs/
│ │ │ ├── adaptor_config.json
│ │ │ ├── nginx-mms.conf
│ │ │ ├── nginx-mms.conf.template
│ │ │ ├── nginx-vst.conf
│ │ │ ├── nginx-vst.conf.template
│ │ │ ├── postgresql.conf
│ │ │ ├── rtsp_streams.json
│ │ │ ├── vst_config.json
│ │ │ ├── vst_config_kafka.json
│ │ │ ├── vst_config_redis.json
│ │ │ └── vst_storage.json
│ │ ├── docker-compose.yaml
│ │ └── sdr-streamprocessing/
│ │ ├── envoy.yaml
│ │ ├── sdr-compose.yaml
│ │ └── sdr-config/
│ │ ├── data_wl.yaml
│ │ └── docker_cluster_config.json
│ └── scripts/
│ └── user_additional_install.sh
├── scripts/
│ ├── LICENSE-3rd-party-dev-profile.txt
│ ├── deploy_vss_launchable.ipynb
│ └── dev-profile.sh
└── ui/
├── .dockerignore
├── .eslintrc.js
├── .gitignore
├── CODE-OF-CONDUCT.md
├── CONTRIBUTING.md
├── DOCKER-README.md
├── Dockerfile
├── LICENSE
├── LICENSE-3rd-party.txt
├── README.md
├── SECURITY.md
├── apps/
│ ├── nemo-agent-toolkit-ui/
│ │ ├── .gitignore
│ │ ├── __mocks__/
│ │ │ ├── next-i18next.js
│ │ │ ├── react-markdown.js
│ │ │ └── websocket.ts
│ │ ├── __tests__/
│ │ │ ├── api/
│ │ │ │ └── httpEndpoints.test.ts
│ │ │ ├── components/
│ │ │ │ ├── Chat.conversation-state.test.tsx
│ │ │ │ ├── Chat.error-recovery.test.tsx
│ │ │ │ ├── Chat.human-interaction.test.tsx
│ │ │ │ ├── Chat.streaming-edge-cases.test.tsx
│ │ │ │ ├── Chat.ui-behavior.test.tsx
│ │ │ │ ├── Chat.websocket-reliability.test.tsx
│ │ │ │ └── Chat.websocket.test.tsx
│ │ │ ├── types/
│ │ │ │ └── websocket.test.ts
│ │ │ └── utils/
│ │ │ ├── app/
│ │ │ │ └── importExports.test.ts
│ │ │ └── chatTransform.test.ts
│ │ ├── docs/
│ │ │ └── ui/
│ │ │ ├── README.md
│ │ │ ├── button-reference.md
│ │ │ ├── chat/
│ │ │ │ └── chat-interface.md
│ │ │ ├── settings/
│ │ │ │ └── configuration-management.md
│ │ │ └── sidebar/
│ │ │ └── conversation-management.md
│ │ ├── next-env.d.ts
│ │ ├── next-i18next.config.js
│ │ ├── next.config.js
│ │ ├── package.json
│ │ ├── pages/
│ │ │ ├── _app.tsx
│ │ │ ├── _document.tsx
│ │ │ ├── api/
│ │ │ │ └── chat.ts
│ │ │ └── index.tsx
│ │ ├── public/
│ │ │ └── locales/
│ │ │ └── en/
│ │ │ └── common.json
│ │ └── tsconfig.json
│ └── nv-metropolis-bp-vss-ui/
│ ├── .gitignore
│ ├── README.md
│ ├── components/
│ │ ├── Home.tsx
│ │ ├── ModeControlsSection.tsx
│ │ └── TabWithChatSidebarLayout.tsx
│ ├── constants/
│ │ └── constants.tsx
│ ├── hooks/
│ │ ├── useTabChatSidebarResize.ts
│ │ ├── useTabChatSidebars.ts
│ │ └── useTheme.ts
│ ├── next-env.d.ts
│ ├── next-i18next.config.js
│ ├── next.config.js
│ ├── package.json
│ ├── pages/
│ │ ├── _app.tsx
│ │ ├── _document.tsx
│ │ ├── api/
│ │ │ └── chat.ts
│ │ └── index.tsx
│ ├── postcss.config.js
│ ├── public/
│ │ └── locales/
│ │ └── en/
│ │ └── common.json
│ ├── styles/
│ │ ├── globals.css
│ │ └── rsuite-custom.css
│ ├── tailwind.config.js
│ ├── tsconfig.json
│ └── utils/
│ ├── index.ts
│ ├── searchTabChatEnv.ts
│ ├── tabChatEnv.ts
│ └── tabChatSidebarConfig.ts
├── custom-server.js
├── package.json
├── packages/
│ ├── nemo-agent-toolkit-ui/
│ │ ├── .dockerignore
│ │ ├── .eslintrc.js
│ │ ├── .gitignore
│ │ ├── .swcrc
│ │ ├── README.md
│ │ ├── TESTING.md
│ │ ├── __mocks__/
│ │ │ ├── next-i18next.js
│ │ │ ├── react-markdown.js
│ │ │ └── websocket.ts
│ │ ├── __tests__/
│ │ │ ├── api/
│ │ │ │ └── routes.test.ts
│ │ │ ├── components/
│ │ │ │ ├── Chat.conversation-state.test.tsx
│ │ │ │ ├── Chat.streaming-edge-cases.test.tsx
│ │ │ │ ├── Chat.ui-behavior.test.tsx
│ │ │ │ ├── Chat.websocket.test.tsx
│ │ │ │ └── InteractionModal.test.tsx
│ │ │ ├── proxy/
│ │ │ │ └── proxy-integration.test.js
│ │ │ ├── security/
│ │ │ │ ├── json-import-validation.test.ts
│ │ │ │ └── url-validation.test.ts
│ │ │ ├── types/
│ │ │ │ └── websocket.test.ts
│ │ │ └── utils/
│ │ │ ├── app/
│ │ │ │ └── importExports.test.ts
│ │ │ └── chatTransform.test.ts
│ │ ├── components/
│ │ │ ├── Avatar/
│ │ │ │ ├── AgentAvatar.tsx
│ │ │ │ ├── BotAvatar.tsx
│ │ │ │ ├── SystemAvatar.tsx
│ │ │ │ └── UserAvatar.tsx
│ │ │ ├── Buttons/
│ │ │ │ └── SidebarActionButton/
│ │ │ │ ├── SidebarActionButton.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Chat/
│ │ │ │ ├── Chat.tsx
│ │ │ │ ├── ChatFileUpload.tsx
│ │ │ │ ├── ChatHeader.tsx
│ │ │ │ ├── ChatInput.tsx
│ │ │ │ ├── ChatInteractionMessage.tsx
│ │ │ │ ├── ChatLoader.tsx
│ │ │ │ ├── ChatMessage.tsx
│ │ │ │ ├── CustomAgentParams.tsx
│ │ │ │ ├── ErrorMessageDiv.tsx
│ │ │ │ ├── MemoizedChatMessage.tsx
│ │ │ │ ├── README.md
│ │ │ │ └── Regenerate.tsx
│ │ │ ├── Chatbar/
│ │ │ │ ├── Chatbar.context.tsx
│ │ │ │ ├── Chatbar.state.tsx
│ │ │ │ ├── Chatbar.tsx
│ │ │ │ ├── README.md
│ │ │ │ └── components/
│ │ │ │ ├── ChatFolders.tsx
│ │ │ │ ├── ChatSidebarContent.tsx
│ │ │ │ ├── ChatbarSettings.tsx
│ │ │ │ ├── ClearConversations.tsx
│ │ │ │ ├── Conversation.tsx
│ │ │ │ └── Conversations.tsx
│ │ │ ├── Folder/
│ │ │ │ ├── Folder.tsx
│ │ │ │ ├── README.md
│ │ │ │ └── index.ts
│ │ │ ├── Markdown/
│ │ │ │ ├── AgentThink.tsx
│ │ │ │ ├── Chart.tsx
│ │ │ │ ├── CodeBlock.tsx
│ │ │ │ ├── CustomComponents.tsx
│ │ │ │ ├── CustomDetails.tsx
│ │ │ │ ├── CustomIncidents.tsx
│ │ │ │ ├── CustomSummary.tsx
│ │ │ │ ├── Image.tsx
│ │ │ │ ├── Loading.tsx
│ │ │ │ ├── MemoizedReactMarkdown.tsx
│ │ │ │ ├── Video.tsx
│ │ │ │ └── VideoModal.tsx
│ │ │ ├── Mobile/
│ │ │ │ └── Navbar.tsx
│ │ │ ├── Search/
│ │ │ │ ├── Search.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Settings/
│ │ │ │ ├── Import.tsx
│ │ │ │ └── SettingDialog.tsx
│ │ │ ├── Sidebar/
│ │ │ │ ├── README.md
│ │ │ │ ├── Sidebar.tsx
│ │ │ │ ├── SidebarButton.tsx
│ │ │ │ ├── SidebarInner.tsx
│ │ │ │ ├── components/
│ │ │ │ │ └── OpenCloseButton.tsx
│ │ │ │ └── index.ts
│ │ │ └── Spinner/
│ │ │ ├── Spinner.tsx
│ │ │ └── index.ts
│ │ ├── config.json
│ │ ├── constants/
│ │ │ ├── constants.tsx
│ │ │ └── index.ts
│ │ ├── hooks/
│ │ │ ├── useConversationOperations.ts
│ │ │ ├── useCreateReducer.ts
│ │ │ └── useFolderOperations.ts
│ │ ├── jest.config.js
│ │ ├── jest.setup.js
│ │ ├── lib-src/
│ │ │ ├── app.ts
│ │ │ ├── contexts/
│ │ │ │ └── RuntimeConfigContext.tsx
│ │ │ ├── index.d.ts
│ │ │ ├── index.ts
│ │ │ ├── server.d.ts
│ │ │ └── server.ts
│ │ ├── middleware.ts
│ │ ├── next-env.d.ts
│ │ ├── next-i18next.config.js
│ │ ├── next.config.js
│ │ ├── package.json
│ │ ├── pages/
│ │ │ ├── _app.tsx
│ │ │ ├── _document.tsx
│ │ │ ├── api/
│ │ │ │ ├── chat.ts
│ │ │ │ └── home/
│ │ │ │ ├── home.context.tsx
│ │ │ │ ├── home.server.tsx
│ │ │ │ ├── home.state.tsx
│ │ │ │ ├── home.tsx
│ │ │ │ └── index.ts
│ │ │ └── index.tsx
│ │ ├── postcss.config.js
│ │ ├── prettier.config.js
│ │ ├── proxy/
│ │ │ ├── request-transformers.js
│ │ │ └── response-processors.js
│ │ ├── public/
│ │ │ └── locales/
│ │ │ └── en/
│ │ │ ├── common.json
│ │ │ └── sidebar.json
│ │ ├── styles/
│ │ │ └── globals.css
│ │ ├── tailwind.config.js
│ │ ├── tsconfig.json
│ │ ├── tsconfig.lib.json
│ │ ├── tsconfig.typecheck.json
│ │ ├── types/
│ │ │ ├── chat.ts
│ │ │ ├── data.ts
│ │ │ ├── env.ts
│ │ │ ├── error.ts
│ │ │ ├── export.ts
│ │ │ ├── folder.ts
│ │ │ ├── index.ts
│ │ │ ├── prompt.ts
│ │ │ ├── settings.ts
│ │ │ ├── storage.ts
│ │ │ └── websocket.ts
│ │ ├── utils/
│ │ │ ├── app/
│ │ │ │ ├── api.ts
│ │ │ │ ├── clean.ts
│ │ │ │ ├── codeblock.ts
│ │ │ │ ├── const.ts
│ │ │ │ ├── conversation.ts
│ │ │ │ ├── folders.ts
│ │ │ │ ├── helper.ts
│ │ │ │ ├── importExport.ts
│ │ │ │ ├── prompts.ts
│ │ │ │ └── settings.ts
│ │ │ ├── chatTransform.ts
│ │ │ ├── data/
│ │ │ │ └── throttle.ts
│ │ │ ├── media/
│ │ │ │ └── validation.ts
│ │ │ ├── security/
│ │ │ │ ├── import-validation.ts
│ │ │ │ ├── oauth-validation.ts
│ │ │ │ └── url-validation.js
│ │ │ ├── server/
│ │ │ │ ├── apiWrapper.ts
│ │ │ │ └── chatApiHandler.ts
│ │ │ └── shared/
│ │ │ ├── clipboard.ts
│ │ │ ├── formatters.ts
│ │ │ └── videoUpload.ts
│ │ └── vitest.config.ts
│ └── nv-metropolis-bp-vss-ui/
│ ├── README.md
│ ├── alerts/
│ │ ├── .gitignore
│ │ ├── .swcrc
│ │ ├── README.md
│ │ ├── __mocks__/
│ │ │ └── @nemo-agent-toolkit-ui.js
│ │ ├── __tests__/
│ │ │ ├── components/
│ │ │ │ ├── AlertsComponent.test.tsx
│ │ │ │ ├── CustomTimeInput.test.tsx
│ │ │ │ ├── FilterControls.test.tsx
│ │ │ │ └── FilterTag.test.tsx
│ │ │ ├── hooks/
│ │ │ │ ├── useAlerts.test.ts
│ │ │ │ ├── useAutoRefresh.test.ts
│ │ │ │ ├── useFilters.test.ts
│ │ │ │ ├── useTimeWindow.test.ts
│ │ │ │ └── useVideoModal.test.ts
│ │ │ └── utils/
│ │ │ └── timeUtils.test.ts
│ │ ├── jest.config.js
│ │ ├── jest.setup.js
│ │ ├── lib-src/
│ │ │ ├── AlertsComponent.tsx
│ │ │ ├── components/
│ │ │ │ ├── AlertsSidebarControls.tsx
│ │ │ │ ├── AlertsTable.tsx
│ │ │ │ ├── AutoRefreshControl.tsx
│ │ │ │ ├── CustomTimeInput.tsx
│ │ │ │ ├── FilterControls.tsx
│ │ │ │ ├── FilterTag.tsx
│ │ │ │ ├── MetadataSection.tsx
│ │ │ │ ├── ThumbnailButton.tsx
│ │ │ │ └── TimeFormatSwitch.tsx
│ │ │ ├── hooks/
│ │ │ │ ├── useAlerts.ts
│ │ │ │ ├── useAutoRefresh.ts
│ │ │ │ ├── useFilters.ts
│ │ │ │ ├── useTimeWindow.ts
│ │ │ │ └── useVideoModal.ts
│ │ │ ├── index.ts
│ │ │ ├── server.d.ts
│ │ │ ├── server.ts
│ │ │ ├── types.ts
│ │ │ └── utils/
│ │ │ └── timeUtils.ts
│ │ ├── package.json
│ │ ├── tsconfig.json
│ │ └── tsconfig.lib.json
│ ├── all/
│ │ ├── .gitignore
│ │ ├── .swcrc
│ │ ├── README.md
│ │ ├── lib-src/
│ │ │ ├── index.d.ts
│ │ │ ├── index.ts
│ │ │ ├── server.d.ts
│ │ │ └── server.ts
│ │ ├── package.json
│ │ ├── tsconfig.json
│ │ └── tsconfig.lib.json
│ ├── dashboard/
│ │ ├── .gitignore
│ │ ├── .swcrc
│ │ ├── README.md
│ │ ├── lib-src/
│ │ │ ├── DashboardComponent.tsx
│ │ │ ├── components/
│ │ │ │ └── DashboardSidebarControls.tsx
│ │ │ ├── index.ts
│ │ │ ├── server.d.ts
│ │ │ └── server.ts
│ │ ├── package.json
│ │ ├── tsconfig.json
│ │ └── tsconfig.lib.json
│ ├── map/
│ │ ├── .swcrc
│ │ ├── README.md
│ │ ├── lib-src/
│ │ │ ├── MapComponent.tsx
│ │ │ ├── components/
│ │ │ │ └── MapSidebarControls.tsx
│ │ │ ├── index.ts
│ │ │ ├── server.d.ts
│ │ │ └── server.ts
│ │ ├── package.json
│ │ ├── tsconfig.json
│ │ └── tsconfig.lib.json
│ ├── search/
│ │ ├── .gitignore
│ │ ├── .swcrc
│ │ ├── README.md
│ │ ├── __mocks__/
│ │ │ └── @nemo-agent-toolkit-ui.js
│ │ ├── __tests__/
│ │ │ ├── components/
│ │ │ │ ├── FilterPopover.test.tsx
│ │ │ │ ├── SearchComponent.test.tsx
│ │ │ │ ├── SearchHeader.test.tsx
│ │ │ │ └── VideoSearchList.test.tsx
│ │ │ ├── hooks/
│ │ │ │ ├── useFilter.test.ts
│ │ │ │ ├── useSearch.test.ts
│ │ │ │ └── useVideoModal.test.ts
│ │ │ └── utils/
│ │ │ ├── Formatter.test.ts
│ │ │ └── agentResponseParser.test.ts
│ │ ├── jest.config.js
│ │ ├── jest.setup.js
│ │ ├── lib-src/
│ │ │ ├── SearchComponent.tsx
│ │ │ ├── components/
│ │ │ │ ├── FilterPopover.tsx
│ │ │ │ ├── SearchHeader.tsx
│ │ │ │ ├── SearchSidebarControls.tsx
│ │ │ │ └── VideoSearchList.tsx
│ │ │ ├── hooks/
│ │ │ │ ├── useFilter.ts
│ │ │ │ ├── useSearch.ts
│ │ │ │ └── useVideoModal.ts
│ │ │ ├── index.ts
│ │ │ ├── server.d.ts
│ │ │ ├── server.ts
│ │ │ ├── types.ts
│ │ │ └── utils/
│ │ │ ├── Formatter.ts
│ │ │ └── agentResponseParser.ts
│ │ ├── package.json
│ │ ├── tsconfig.json
│ │ └── tsconfig.lib.json
│ └── video-management/
│ ├── .swcrc
│ ├── __mocks__/
│ │ └── @nemo-agent-toolkit-ui.js
│ ├── __tests__/
│ │ ├── components/
│ │ │ └── StreamsGrid.test.tsx
│ │ └── utils/
│ │ └── filterStreams.test.ts
│ ├── jest.config.js
│ ├── jest.setup.js
│ ├── lib-src/
│ │ ├── VideoManagementComponent.tsx
│ │ ├── api.ts
│ │ ├── components/
│ │ │ ├── AddRtspDialog.tsx
│ │ │ ├── AgentUploadDialog.tsx
│ │ │ ├── EmptyState.tsx
│ │ │ ├── LoadingState.tsx
│ │ │ ├── StreamCard.tsx
│ │ │ ├── StreamsGrid.tsx
│ │ │ ├── Toolbar.tsx
│ │ │ ├── UploadProgressPanel.tsx
│ │ │ ├── VideoManagementSidebarControls.tsx
│ │ │ └── index.ts
│ │ ├── constants.ts
│ │ ├── hooks/
│ │ │ ├── index.ts
│ │ │ ├── useStorageTimelines.ts
│ │ │ └── useStreams.ts
│ │ ├── index.ts
│ │ ├── rtspStream.ts
│ │ ├── server.ts
│ │ ├── types.ts
│ │ ├── utils.ts
│ │ └── videoDelete.ts
│ ├── package.json
│ ├── tsconfig.json
│ └── tsconfig.lib.json
└── turbo.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
*.mp4 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
================================================
FILE: .github/CODEOWNERS
================================================
# CODEOWNERS — VSS Blueprint
#
# Default: all PRs require review from VSS-developers.
# Refine per-directory owners as teams are onboarded.
#
# Docs: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
# Default — all files
* @NVIDIA-AI-Blueprints/VSS-developers
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report_form.yml
================================================
name: Bug Report
description: File a bug report
title: "[BUG]: "
labels: ["bug", "? - Needs Triage"]
body:
- type: input
id: version
attributes:
label: Version
description: What version of VSS are you running?
placeholder: "e.g. 3.1.0"
validations:
required: true
- type: dropdown
id: installation
attributes:
label: Installation method
options:
- Docker Compose
- Source build
- Other
validations:
required: true
- type: textarea
id: description
attributes:
label: Describe the bug
description: A clear and concise description of the bug.
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Steps to reproduce
description: Steps to reproduce the behavior.
placeholder: |
1. Deploy with '...'
2. Send request '...'
3. See error
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected behavior
description: A clear description of what you expected to happen.
- type: textarea
id: logs
attributes:
label: Relevant log output
description: Please paste any relevant log output.
render: shell
- type: textarea
id: env
attributes:
label: Environment details
description: |
Include relevant details about your environment:
- OS and version
- GPU model and driver version
- Docker version
- Any relevant configuration
- type: checkboxes
id: terms
attributes:
label: Code of Conduct
options:
- label: I agree to follow this project's [Code of Conduct](https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization/blob/main/CODE_OF_CONDUCT.md)
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
- name: Ask a Question
url: https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization/discussions
about: Please ask any questions here.
================================================
FILE: .github/ISSUE_TEMPLATE/documentation_request.yml
================================================
name: Documentation Request
description: Report incorrect or missing documentation
title: "[DOC]: "
labels: ["documentation", "? - Needs Triage"]
body:
- type: dropdown
id: request-type
attributes:
label: Is this a correction or a request for new documentation?
options:
- Correction / Update
- New Documentation
validations:
required: true
- type: input
id: doc-link
attributes:
label: Link to existing documentation (if applicable)
placeholder: "https://..."
- type: textarea
id: description
attributes:
label: Describe the issue or what documentation is needed
description: Provide details about what is incorrect, outdated, or missing.
validations:
required: true
- type: textarea
id: proposed
attributes:
label: Proposed correction or content
description: If you have a suggestion for the correction or new content, describe it here.
- type: checkboxes
id: terms
attributes:
label: Code of Conduct
options:
- label: I agree to follow this project's [Code of Conduct](https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization/blob/main/CODE_OF_CONDUCT.md)
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request_form.yml
================================================
name: Feature Request
description: Suggest a new feature or enhancement
title: "[FEA]: "
labels: ["feature request", "? - Needs Triage"]
body:
- type: dropdown
id: request-type
attributes:
label: Is this a new feature, an improvement, or a change to existing functionality?
options:
- New Feature
- Improvement
- Change
validations:
required: true
- type: dropdown
id: priority
attributes:
label: How would you describe the priority of this feature request?
options:
- Critical (currently preventing work)
- High
- Medium
- Low (nice-to-have)
- type: textarea
id: problem
attributes:
label: Is your feature request related to a problem? Please describe.
description: A clear and concise description of the problem.
placeholder: "I'm frustrated when..."
validations:
required: true
- type: textarea
id: solution
attributes:
label: Describe the solution you'd like
description: A clear description of what you want to happen.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Describe alternatives you've considered
description: Any alternative solutions or features you've considered.
- type: textarea
id: context
attributes:
label: Additional context
description: Add any other context, screenshots, or examples.
- type: checkboxes
id: terms
attributes:
label: Code of Conduct
options:
- label: I agree to follow this project's [Code of Conduct](https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization/blob/main/CODE_OF_CONDUCT.md)
required: true
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## Description
<!-- Provide a standalone description of changes in this PR. -->
<!-- Reference any issues closed by this PR with "closes #1234". -->
## Checklist
- [ ] I am familiar with the [Contributing Guidelines](https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization/blob/HEAD/CONTRIBUTING.md).
- [ ] New or existing tests cover these changes.
- [ ] The documentation is up to date with these changes.
================================================
FILE: .github/copy-pr-bot.yaml
================================================
enabled: true
auto_sync_draft: false
auto_sync_ready: true
additional_vetters:
- akshayanv
- ayyappa-dev
- daviddu0425
- freshyjmp
- hugoverjus
- jiayin-nvidia
- kaushikc-nvidia
- liamy-nv
- mansiigo
- nv-mpandele
- prisrivastav-nv
- soumilinandi
- ssmmoo1
- vineet-raina
- zac-wang-nv
================================================
FILE: .github/scripts/check_copyright_headers.py
================================================
#!/usr/bin/env python3
# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
"""Check that source files contain an SPDX copyright header.
Scans Python (.py) and TypeScript/JavaScript (.ts, .tsx, .js, .jsx)
files tracked by git. Files matching EXCLUDE_PATTERNS are skipped.
Exit code 0 if all files pass, 1 if any are missing headers.
"""
from __future__ import annotations
import fnmatch
import subprocess
import sys
from pathlib import Path
# SPDX identifier that must appear in the first 5 lines of each file
REQUIRED_MARKER = "SPDX-License-Identifier"
# File extensions to check
CHECK_EXTENSIONS = {".py", ".ts", ".tsx", ".js", ".jsx"}
# Glob patterns to skip (relative to repo root)
EXCLUDE_PATTERNS = (
# Auto-generated / third-party
"**/node_modules/**",
"**/__pycache__/**",
"**/.venv/**",
"**/3rdparty/**",
# Next.js generated type declarations
"**/*-env.d.ts",
"**/next-env.d.ts",
# Config files that are too short for headers
"**/.eslintrc.js",
# Lock files
"**/uv.lock",
"**/package-lock.json",
# Stubs (third-party type stubs)
"**/stubs/**",
# UI — original MIT-licensed code; headers will be added incrementally
"ui/**",
"services/ui/**",
)
def git_ls_files() -> list[str]:
"""Return all git-tracked files."""
result = subprocess.run(
["git", "ls-files"],
capture_output=True,
text=True,
check=True,
)
return result.stdout.strip().splitlines()
def is_excluded(path: str) -> bool:
"""Check if path matches any exclude pattern."""
return any(fnmatch.fnmatch(path, pat) for pat in EXCLUDE_PATTERNS)
def has_spdx_header(filepath: str) -> bool:
"""Check if the first 5 lines contain the SPDX marker."""
try:
with open(filepath, encoding="utf-8", errors="ignore") as f:
for i, line in enumerate(f):
if i >= 5:
break
if REQUIRED_MARKER in line:
return True
except (OSError, UnicodeDecodeError):
return True # skip unreadable files
return False
def main() -> int:
files = git_ls_files()
missing: list[str] = []
for filepath in files:
ext = Path(filepath).suffix
if ext not in CHECK_EXTENSIONS:
continue
if is_excluded(filepath):
continue
if not has_spdx_header(filepath):
missing.append(filepath)
if missing:
print(f"ERROR: {len(missing)} file(s) missing SPDX copyright header:\n")
for f in sorted(missing):
print(f" {f}")
print(f"\nExpected '{REQUIRED_MARKER}' in the first 5 lines.")
print("See CONTRIBUTING.md for the required header format.")
return 1
print(f"OK: All {len(files)} tracked files checked — no missing headers.")
return 0
if __name__ == "__main__":
sys.exit(main())
================================================
FILE: .github/scripts/trigger-downstream-pipeline.sh
================================================
#!/usr/bin/env python3
import json
import os
import sys
from typing import Any
from urllib.error import ContentTooShortError
from urllib.error import HTTPError
from urllib.error import URLError
from urllib.parse import quote
from urllib.parse import urlencode
from urllib.request import Request
from urllib.request import urlopen
def emit_error(message: str) -> None:
print(f"::error::{message}", file=sys.stderr)
def add_mask(value: str) -> None:
if value:
print(f"::add-mask::{value}")
def require_env(name: str) -> str:
value = os.environ.get(name, "").strip()
if not value:
emit_error(f"Missing {name}")
raise SystemExit(1)
return value
def api_base_url(raw_url: str) -> str:
base = raw_url.rstrip("/")
if not base.endswith("/api/v4"):
base = f"{base}/api/v4"
return base
def request_json(action: str, url: str, token: str, data: bytes | None = None) -> dict[str, Any]:
headers = {
"PRIVATE-TOKEN": token,
"Accept": "application/json",
}
if data is not None:
headers["Content-Type"] = "application/x-www-form-urlencoded"
request = Request(url, data=data, headers=headers)
try:
with urlopen(request) as response:
payload = response.read().decode("utf-8")
except HTTPError as exc:
_ = exc.read()
emit_error(f"{action} failed with status {exc.code}")
raise SystemExit(1) from exc
except (URLError, ContentTooShortError) as exc:
_ = exc
emit_error(f"{action} failed due to a connection error")
raise SystemExit(1) from exc
try:
parsed = json.loads(payload)
except (UnicodeDecodeError, json.JSONDecodeError) as exc:
_ = exc
emit_error(f"{action} returned an unexpected response")
raise SystemExit(1) from exc
if not isinstance(parsed, dict):
emit_error(f"{action} returned an unexpected response")
raise SystemExit(1)
return parsed
def fetch_project_id(base_url: str, token: str, project_path: str) -> int:
encoded_project_path = quote(project_path, safe="")
response = request_json("Project lookup", f"{base_url}/projects/{encoded_project_path}", token)
return int(response["id"])
def trigger_pipeline(
base_url: str,
token: str,
project_id: int,
ref: str,
variable_name: str,
commit_sha: str,
) -> int:
payload = urlencode(
[
("ref", ref),
("variables[][key]", variable_name),
("variables[][value]", commit_sha),
]
).encode("utf-8")
response = request_json("Pipeline trigger", f"{base_url}/projects/{project_id}/pipeline", token, data=payload)
return int(response.get("iid") or response["id"])
def write_summary(message: str) -> None:
summary_path = os.environ.get("GITHUB_STEP_SUMMARY", "").strip()
if not summary_path:
return
with open(summary_path, "a", encoding="utf-8") as summary_file:
summary_file.write(f"{message}\n")
def main() -> int:
try:
base_url = api_base_url(require_env("DOWNSTREAM_CI_URL"))
token = require_env("DOWNSTREAM_CI_TOKEN")
project_path = require_env("DOWNSTREAM_PROJECT_PATH")
commit_sha = require_env("GITHUB_SHA")
ref = os.environ.get("DOWNSTREAM_REF", "main")
variable_name = os.environ.get("DOWNSTREAM_SUBMODULE_HASH_VARIABLE", "VSS_SUBMODULE_HASH")
for value in (base_url, token, project_path, ref, variable_name):
add_mask(value)
project_id = fetch_project_id(base_url, token, project_path)
pipeline_number = trigger_pipeline(base_url, token, project_id, ref, variable_name, commit_sha)
message = f"Triggered pipeline number {pipeline_number}"
print(message)
write_summary(message)
return 0
except SystemExit:
raise
except Exception as exc:
_ = exc
emit_error("Unexpected failure while triggering the downstream pipeline")
return 1
if __name__ == "__main__":
raise SystemExit(main())
================================================
FILE: .github/workflows/ci.yml
================================================
# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: CI
on:
push:
branches:
- main
- develop
- "pull-request/[0-9]+"
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
defaults:
run:
shell: bash
jobs:
# ---------------------------------------------------------------------------
# Job 1: Python lint (ruff check + ruff format + yamllint)
# ---------------------------------------------------------------------------
lint:
name: Lint (Python)
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: agent
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- name: Install uv
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
with:
version: "0.6.2"
- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.13"
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libcairo2-dev pkg-config
- name: Install dev dependencies
run: uv sync --group dev --frozen
- name: ruff check
run: uv run ruff check .
- name: ruff format
run: uv run ruff format --check .
- name: yamllint
run: |
uv run yamllint \
-d '{extends: default, rules: {line-length: {max: 120}, document-start: disable, indentation: {spaces: 2, indent-sequences: false}}}' \
$(git ls-files '*.yml' '*.yaml' | grep -v '\.gitlab-ci\.yml')
# ---------------------------------------------------------------------------
# Job 2: Python type checking (mypy)
# ---------------------------------------------------------------------------
typecheck:
name: Type Check (mypy)
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: agent
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- name: Install uv
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
with:
version: "0.6.2"
- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.13"
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libcairo2-dev pkg-config
- name: Install dev dependencies
run: uv sync --group dev --frozen
- name: mypy
run: uv run mypy src/vss_agents/
# ---------------------------------------------------------------------------
# Job 3: Python tests (pytest + coverage)
# ---------------------------------------------------------------------------
test:
name: Test (pytest)
runs-on: ubuntu-latest
timeout-minutes: 15
defaults:
run:
working-directory: agent
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- name: Install uv
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
with:
version: "0.6.2"
- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.13"
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libcairo2-dev pkg-config
- name: Install dev dependencies
run: uv sync --group dev --frozen
- name: pytest
timeout-minutes: 10
run: |
uv run pytest \
--cov=src/vss_agents \
--cov-report=xml:coverage.xml \
--cov-report=term-missing \
-m "not slow and not integration"
- name: Upload coverage report
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: always()
with:
name: coverage-report
path: agent/coverage.xml
# ---------------------------------------------------------------------------
# Job 4: Security scanning (detect-secrets)
# ---------------------------------------------------------------------------
security:
name: Security Scan (detect-secrets)
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: agent
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.13"
- name: Install detect-secrets
run: python -m pip install detect-secrets==1.5.0
- name: detect-secrets
run: |
detect-secrets-hook --no-verify \
--exclude-files '(gitleaks-baseline\.json|^deployments/MANIFEST$)' \
$(git ls-files)
# ---------------------------------------------------------------------------
# Job 5: Frontend lint + typecheck
# ---------------------------------------------------------------------------
frontend-lint:
name: Lint & Typecheck (UI)
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: ui
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- name: Set up Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: "lts/*"
cache: "npm"
cache-dependency-path: ui/package-lock.json
- name: Install dependencies
run: npm ci
- name: Lint
run: npm run lint
- name: Typecheck
run: npm run typecheck
# ---------------------------------------------------------------------------
# Job 6: Frontend build
# ---------------------------------------------------------------------------
frontend-build:
name: Build (UI)
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: ui
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- name: Set up Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: "lts/*"
cache: "npm"
cache-dependency-path: ui/package-lock.json
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
# ---------------------------------------------------------------------------
# Job 7: Copyright header check
# ---------------------------------------------------------------------------
copyright-headers:
name: Copyright Headers
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- name: Check SPDX headers
run: python3 .github/scripts/check_copyright_headers.py
# ---------------------------------------------------------------------------
# Job 8: DCO sign-off check
# ---------------------------------------------------------------------------
dco:
name: DCO Sign-off
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
fetch-depth: 0
- name: Check DCO sign-off
run: |
MERGE_BASE=$(git merge-base HEAD origin/${GITHUB_BASE_REF:-main} 2>/dev/null || echo HEAD~1)
COMMITS=$(git rev-list "$MERGE_BASE"..HEAD 2>/dev/null || echo "")
if [ -z "$COMMITS" ]; then
echo "No new commits to check."
exit 0
fi
FAILED=0
for sha in $COMMITS; do
MSG=$(git log -1 --format="%B" "$sha")
if ! echo "$MSG" | grep -q "^Signed-off-by:"; then
echo "FAIL: Commit $sha missing DCO sign-off"
echo " Subject: $(git log -1 --format='%s' "$sha")"
FAILED=1
fi
done
if [ "$FAILED" -eq 1 ]; then
echo ""
echo "All commits must include a Signed-off-by line."
echo "Use: git commit -s -m 'your message'"
echo "Or amend: git commit --amend -s --no-edit"
exit 1
fi
echo "OK: All commits have DCO sign-off."
# ---------------------------------------------------------------------------
# Job 9: Dependency license check (Python)
# ---------------------------------------------------------------------------
license-check-python:
name: License Check (Python)
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: agent
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- name: Install uv
uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
with:
version: "0.6.2"
- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.13"
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libcairo2-dev pkg-config
- name: Install dependencies
run: uv sync --frozen
- name: Install pip-licenses
run: uv run pip install pip-licenses
- name: Check Python dependency licenses
run: |
echo "=== Dependency License Report ==="
uv run pip-licenses --format=plain --order=license
echo ""
echo "=== Checking for disallowed licenses ==="
DISALLOWED=$(uv run pip-licenses --format=csv | grep -iE 'GPL|AGPL|SSPL|BUSL' | grep -v 'LGPL' || true)
if [ -n "$DISALLOWED" ]; then
echo "ERROR: Found packages with disallowed licenses:"
echo "$DISALLOWED"
exit 1
fi
echo "OK: No disallowed licenses found."
# ---------------------------------------------------------------------------
# Job 10: Dependency license check (UI)
# ---------------------------------------------------------------------------
license-check-ui:
name: License Check (UI)
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: ui
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- name: Set up Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: "lts/*"
cache: "npm"
cache-dependency-path: ui/package-lock.json
- name: Install dependencies
run: npm ci
- name: Check UI dependency licenses
run: |
# Dump all licenses as JSON, then validate in Node.
# OSRB-approved exceptions are filtered by package name prefix.
npx license-checker --json --excludePrivatePackages > /tmp/licenses.json
node -e '
const licenses = require("/tmp/licenses.json");
const allowed = new Set([
"MIT","Apache-2.0","BSD-2-Clause","BSD-3-Clause","ISC","0BSD",
"Unlicense","CC0-1.0","CC-BY-4.0","CC-BY-3.0","Python-2.0",
"BlueOak-1.0.0","MPL-2.0"
]);
// OSRB-approved exceptions (dynamically linked, reviewed)
const excludePrefixes = ["@img/sharp-libvips"];
const failures = [];
for (const [pkg, info] of Object.entries(licenses)) {
const name = pkg.replace(/@[^@]+$/, "");
if (excludePrefixes.some(p => name.startsWith(p))) continue;
const lic = String(info.licenses || "UNKNOWN");
// license-checker appends * when license is inferred from file (e.g. "MIT*")
const parts = lic.replace(/[()]/g, "").split(/ OR | AND /);
const ok = parts.some(p => allowed.has(p.trim().replace(/\*$/, "")));
if (!ok) failures.push(pkg + ": " + lic);
}
if (failures.length) {
console.error("ERROR: " + failures.length + " package(s) with disallowed licenses:\n");
failures.forEach(f => console.error(" " + f));
process.exit(1);
}
console.log("OK: " + Object.keys(licenses).length + " packages checked.");
'
# ---------------------------------------------------------------------------
# Job 11: Trigger downstream pipeline on main
# ---------------------------------------------------------------------------
trigger-downstream-pipeline:
name: Trigger Downstream Pipeline
needs:
- lint
- typecheck
- test
- security
- frontend-lint
- frontend-build
- copyright-headers
- dco
- license-check-python
- license-check-ui
runs-on: self-hosted
timeout-minutes: 10
env:
DOWNSTREAM_CI_URL: ${{ secrets.DOWNSTREAM_CI_URL }}
DOWNSTREAM_CI_TOKEN: ${{ secrets.DOWNSTREAM_CI_TOKEN }}
DOWNSTREAM_PROJECT_PATH: hverjus/ci-vss-oss
DOWNSTREAM_REF: main
DOWNSTREAM_SUBMODULE_HASH_VARIABLE: VSS_SUBMODULE_HASH
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- name: Trigger pipeline
run: python3 .github/scripts/trigger-downstream-pipeline.sh
================================================
FILE: .pre-commit-config.yaml
================================================
repos:
- repo: https://github.com/trufflesecurity/trufflehog
rev: v3.94.2
hooks:
- id: trufflehog
name: TruffleHog secret scan
entry: trufflehog git file://. --since-commit HEAD --results=verified,unknown --fail
language: golang
stages: [pre-commit]
- repo: local
hooks:
# DCO sign-off check — ensures every commit has Signed-off-by
- id: dco-signoff
name: DCO sign-off check
entry: bash -c 'git log -1 --format="%B" | grep -q "^Signed-off-by" || { echo "ERROR - Commit missing DCO sign-off. Use git commit -s"; exit 1; }'
language: system
always_run: true
pass_filenames: false
stages: [pre-commit]
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting GitHub_Conduct@nvidia.com. All complaints will be reviewed and
investigated and will result in a response that is deemed necessary and appropriate
to the circumstances. The project team is obligated to maintain confidentiality with
regard to the reporter of an incident. Further details of specific enforcement policies
may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Video Search and Summarization
If you are interested in contributing to Video Search and Summarization (VSS), your contributions will fall into the following categories:
1. You want to report a bug, feature request, or documentation issue
- File an [issue](https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization/issues/new/choose)
describing what you encountered or what you want to see changed.
- The team will evaluate the issues and triage them, scheduling
them for a release. If you believe the issue needs priority attention,
comment on the issue to notify the team.
2. You want to propose a new feature and implement it
- Post about your intended feature, and we shall discuss the design and
implementation.
- Once we agree that the plan looks good, go ahead and implement it, using
the [code contributions](#code-contributions) guide below.
3. You want to implement a feature or bug-fix for an outstanding issue
- Follow the [code contributions](#code-contributions) guide below.
- If you need more context on a particular issue, please ask and we shall
provide.
## Licensing
This project uses a dual-license model:
- **Apache-2.0** — applies to all code in the repository except the `ui/` directory.
- **MIT** — applies to the original code under the `ui/` directory, which is derived from [NVIDIA NeMo Agent Toolkit UI](https://github.com/NVIDIA/NeMo-Agent-Toolkit-UI/).
**All contributions to this repository, regardless of which directory they target, are accepted under the Apache-2.0 license.** Even if you are contributing changes to the `ui/` directory, your contribution will be licensed under Apache-2.0. The original `ui/` code retains its MIT license, but any additions or modifications contributed through this repository are Apache-2.0.
See the [LICENSE](LICENSE) file for the full license texts.
### Developer Certificate of Origin (DCO)
All contributions must include a DCO sign-off. By adding a `Signed-off-by` line to your commit messages, you certify that you wrote (or otherwise have the right to submit) the contribution, and that you are licensing it under the Apache-2.0 license.
To sign off, add the `-s` flag when committing:
```bash
git commit -s -m "Your commit message"
```
This appends a line like:
```
Signed-off-by: Your Name <your.email@example.com>
```
If you have already made commits without a sign-off, you can amend the most recent one:
```bash
git commit --amend -s --no-edit
```
**Pull requests with unsigned commits will not be merged.**
## Pre-commit hooks
This repository uses [pre-commit](https://pre-commit.com/) hooks to run security scans before each commit. You must install and enable them before contributing.
### Setup
```bash
pip install pre-commit
pre-commit install
```
### What runs
| Hook | Purpose |
|------|---------|
| [TruffleHog](https://github.com/trufflesecurity/trufflehog) | Scans commits for secrets, credentials, and API keys |
The hooks run automatically on `git commit`. To run them manually against all files:
```bash
pre-commit run --all-files
```
If a hook fails, fix the issue before committing. **Pull requests that contain detected secrets will not be merged.**
## Code contributions
### Your first issue
1. Read the project's [README.md](https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization/blob/main/README.md)
to learn how to set up the development environment.
2. Find an issue to work on. The best way is to look for the [good first issue](https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)
or [help wanted](https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) labels.
3. Comment on the issue saying you are going to work on it.
4. Code! Make sure to update unit tests!
5. When done, [create your pull request](https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization/compare).
6. Verify that CI passes all [status checks](https://help.github.com/articles/about-status-checks/), or fix if needed.
7. Wait for other developers to review your code and update code as needed.
8. Once reviewed and approved, a maintainer will merge your pull request.
Remember, if you are unsure about anything, don't hesitate to comment on issues and ask for clarifications!
### Pull request guidelines
- Provide a clear description of the changes in your PR.
- Reference any issues closed by the PR with "closes #1234".
- Ensure new or existing tests cover your changes.
- Keep the documentation up to date with your changes.
### UI directory — no external contributions
The `ui/` directory is maintained internally by the NVIDIA Metropolis UI team and is **not open to external contributions**. Pull requests that modify files under `ui/` from external contributors will be closed. If you find a bug or want to request a feature related to the UI, please [file an issue](https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization/issues/new/choose) instead.
### Branch naming
Branches used to create PRs should have a name of the form `<type>/<name>` which conforms to the following conventions:
- Type:
- `feat` - For new features
- `fix` - For bug fixes
- `docs` - For documentation changes
- `refactor` - For code refactoring
- `test` - For adding or updating tests
- Name:
- A name to convey what is being worked on
- Please use dashes between words as opposed to spaces.
## Attribution
Portions adopted from the [NVIDIA PLC-OSS-Template](https://github.com/NVIDIA-GitHub-Management/PLC-OSS-Template).
================================================
FILE: LICENSE
================================================
This project is Apache2 licensed. Code under the ui folder is MIT licensed.
Here is the complete license text for Apache-2.0 license :
##########################################################################################
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
##########################################################################################
MIT License
Copyright (c) 2024 Ivan Fioravanti
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
MIT License
Copyright (c) 2024 Mckay Wrigley
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: LICENSE-3rd-party.txt
================================================
This file contains the list of third party software with their licenses used in this project.
See below files for the licenses:
- agent/LICENSE-3rd-party.txt
- ui/LICENSE-3rd-party.txt
- scripts/LICENSE-3rd-party-dev-profile.txt
- deployments/LICENSE-3rd-party.txt
================================================
FILE: LICENSE.DATA
================================================
NVIDIA ASSET LICENSE
IMPORTANT NOTICE – PLEASE READ AND AGREE BEFORE USING THE ASSETS.
This license agreement (“Agreement”) is a legal agreement between you, whether an individual or entity ("you”) and NVIDIA Corporation ("NVIDIA") and governs your use of the NVIDIA data provided hereunder (the “ASSETS”).
This Agreement can be accepted only by an adult of legal age of majority in the country in which the ASSETS is used. If you are under the legal age of majority, you must ask your parent or legal guardian to consent to this Agreement.
If you don’t have the required age or authority to accept this Agreement or if you don’t accept all the terms and conditions of this Agreement, do not use the ASSETS.
You agree to use the ASSETS only for purposes that are permitted by this Agreement and any applicable law or regulation in the relevant jurisdictions.
1. License.
Subject to the terms of this Agreement, NVIDIA grants you a non-exclusive, revocable, non-transferable, non-sublicensable license to use the ASSETS, reproduce the ASSETS and prepare derivative works based on the ASSETS (“Derivative Works”), in each case solely for you to perform a trial or demonstration. The ASSETS include images and other information. The information provided is for example purposes, and may not correspond to actual information regarding the corresponding images.
2. Limitations.
Your license to use the ASSETS and Derivative Works is restricted as follows: (i) you may not change or remove copyright, watermarks, or other proprietary notices in the ASSETS and Derivative Works, or otherwise attempt to mislead others about the origin of the ASSETS; (ii) you may not sell, rent, sublicense, transfer, distribute, or otherwise make the ASSETS and Derivative Works available to others; and (iii) you may not deploy the ASSETS as part of a commercial product or service or directly or indirectly create, train, test or improve AI models or artificial intelligent systems using the ASSETS, including any architectures, models, or weights."
3. Ownership.
The ASSETS, including all intellectual property rights, is and will remain the sole and exclusive property of NVIDIA or its licensors. Except as expressly granted in this Agreement, (i) NVIDIA reserves all rights, interests, and remedies in connection with the ASSETS and Derivative Works, and (ii) no other license or right is granted to you by implication, estoppel or otherwise.
4. Feedback.
You may, but you are not obligated to, provide suggestions, requests, fixes, modifications, enhancements, or other feedback regarding the ASSETS (collectively, “Feedback”). Feedback, even if designated as confidential by you, will not create any confidentiality obligation for NVIDIA or its affiliates. If you provide Feedback, you hereby grant NVIDIA, its affiliates and its designees a non-exclusive, perpetual, irrevocable, sublicensable, worldwide, royalty-free, fully paid-up and transferable license, under your intellectual property rights, to publicly perform, publicly display, reproduce, use, make, have made, sell, offer for sale, distribute (through multiple tiers of distribution), import, create derivative works of and otherwise commercialize and exploit the Feedback at NVIDIA’s discretion.
5. Term and Termination.
This Agreement expires twelve (12) months after the date of initial delivery or download of the ASSET. This Agreement will automatically terminate without notice from NVIDIA if you fail to comply with any of the terms in this Agreement or if you commence or participate in any legal proceeding against NVIDIA with respect to the ASSETS. Additionally, either party may terminate this Agreement at any time with prior written notice to the other party. Upon any termination, you must stop using and destroy all copies of the ASSETS and Derivative Works. Upon written request, you will certify in writing that you have complied with your commitments under this section. All provisions will survive termination, except for the licenses granted to you.
6. Disclaimer of Warranties.
THE ASSETS ARE PROVIDED BY NVIDIA AS-IS AND WITH ALL FAULTS. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, NVIDIA DISCLAIMS ALL WARRANTIES AND REPRESENTATIONS OF ANY KIND, WHETHER EXPRESS, IMPLIED OR STATUTORY, RELATING TO OR ARISING UNDER THIS AGREEMENT, INCLUDING, WITHOUT LIMITATION, THE WARRANTIES OF TITLE, NONINFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, USAGE OF TRADE AND COURSE OF DEALING.
7. Limitations of Liability.
7.1 DISCLAIMER. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL NVIDIA BE LIABLE FOR ANY (I) INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES, OR (II) DAMAGES FOR THE (A) COST OF PROCURING SUBSTITUTE GOODS OR (B) LOSS OF PROFITS, REVENUES, USE, DATA OR GOODWILL ARISING OUT OF OR RELATED TO THIS AGREEMENT, WHETHER BASED ON BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY, OR OTHERWISE, AND EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND EVEN IF A PARTY’S REMEDIES FAIL THEIR ESSENTIAL PURPOSE.
7.2 DAMAGES CAP. ADDITIONALLY, TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, NVIDIA’S TOTAL CUMULATIVE AGGREGATE LIABILITY FOR ANY AND ALL LIABILITIES, OBLIGATIONS OR CLAIMS ARISING OUT OF OR RELATED TO THIS AGREEMENT WILL NOT EXCEED FIVE U.S. DOLLARS (US$5).
8. Governing Law and Jurisdiction.
This Agreement will be governed in all respects by the laws of the United States and the laws of the State of Delaware, without regard to conflict of laws principles or the United Nations Convention on Contracts for the International Sale of Goods. The state and federal courts residing in Santa Clara County, California will have exclusive jurisdiction over any dispute or claim arising out of or related to this Agreement, and the parties irrevocably consent to personal jurisdiction and venue in those courts; except that either party may apply for injunctive remedies or an equivalent type of urgent legal relief in any jurisdiction.
9. No Assignment.
NVIDIA may assign, delegate or transfer its rights or obligations under this Agreement by any means or operation of law. You may not, without NVIDIA’s prior written consent, assign, delegate or transfer any of your rights or obligations under this Agreement by any means or operation of law, and any attempt to do so is null and void.
10. Export.
The ASSETS are subject to United States export laws and regulations. You agree to comply with all applicable export, import, trade and economic sanctions laws and regulations, including the Export Administration Regulations and Office of Foreign Assets Control regulations. These laws include restrictions on destinations, end-users and end-use.
11. Entire Agreement.
Regarding the subject matter of this Agreement, the parties agree that this Agreement constitutes the entire and exclusive agreement between the parties and supersedes all prior and contemporaneous communications. If a court of competent jurisdiction rules that a provision of this Agreement is unenforceable, that provision will be deemed modified to the extent necessary to make it enforceable and the remainder of this Agreement will continue in full force and effect. Any amendment to this Agreement must be in writing and signed by authorized representatives of both parties.
(v. August 20, 2025)
================================================
FILE: README.md
================================================
<h2>NVIDIA AI Blueprint: Video Search and Summarization</h2>
### Table of Contents
- [Overview](#overview)
- [Use Case / Problem Description](#use-case--problem-description)
- [Agent Workflows](#agent-workflows)
- [Software Components](#software-components)
- [Target Audience](#target-audience)
- [Repository Structure Overview](#repository-structure-overview)
- [Documentation](#documentation)
- [Prerequisites](#prerequisites)
- [Hardware Requirements](#hardware-requirements)
- [Quickstart Guide](#quickstart-guide)
- [Contributing](#contributing)
- [License](#license)
## Overview
This repository is what powers the [build experience](https://build.nvidia.com/nvidia/video-search-and-summarization), showcasing video search and summarization agent with NVIDIA NIM microservices.
Insightful, accurate, and interactive video analytics AI agents enable a range of industries to make better decisions faster. These AI agents are given tasks through natural language and can perform complex operations like video summarization and visual question-answering, unlocking entirely new application possibilities. The NVIDIA AI Blueprint makes it easy to get started building and customizing video analytics AI agents for video search and summarization — all powered by generative AI, vision language models (VLMs) like Cosmos Nemotron VLMs, large language models (LLMs) like Llama Nemotron LLMs,d NVIDIA NIM.
## Use Case / Problem Description
The NVIDIA AI Blueprint for Video Search and Summarization addresses the challenge of deploying visual agents capable of interacting with large volumes of video data, both stored and streamed. This can be used to create vision AI agents, that can be applied to a multitude of use cases such as monitoring smart spaces, warehouse automation, and SOP validation. This is important where quick and accurate video analysis can lead to better decision-making and enhanced operational efficiency.
## Agent Workflows
We provide multiple reference [Agent Workflows](https://docs.nvidia.com/vss/3.1.0/adding-workflows.html) which demonstrate how the individual components can be leveraged by an agent:
| Workflow | Description |
|----------|-------------|
| [Q&A and Report Generation (Quickstart)](https://docs.nvidia.com/vss/3.1.0/quickstart.html) | Video retrieval, VLM-based Q&A, and report generation on short video clips |
| [Alert Verification](https://docs.nvidia.com/vss/3.1.0/agent-workflow-alert-verification.html) | Realtime processing of videos using perception (object detection, tracking) and behavior analytics to generate alerts, which are subsequently verified with VLM to reduce false positives |
| [Real-Time Alerts](https://docs.nvidia.com/vss/3.1.0/agent-workflow-rt-alert.html) | Continuous processing of video streams through VLM for anomaly detection |
| [Video Search](https://docs.nvidia.com/vss/3.1.0/agent-workflow-search.html) | Natural language search across video archives using video embeddings (alpha) |
| [Long Video Summarization](https://docs.nvidia.com/vss/3.1.0/agent-workflow-lvs.html) | Analysis and summarization of extended video recordings through chunking and aggregation of dense captions |
## Software Components
<div align="center">
<img src="https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization/raw/main/assets/vss-architecture.png" width="800">
</div>
1. **NIM microservices**: Here are models used in this blueprint:
- [Cosmos-Reason2-8B](https://build.nvidia.com/nvidia/cosmos-reason2-8b)
- [NVIDIA Nemotron-Nano-9B-v2](https://build.nvidia.com/nvidia/nvidia-nemotron-nano-9b-v2)
2. **Real-time video intelligence**: The Real-Time Video Intelligence layer extracts rich visual features, semantic embeddings, and contextual understanding from video data in real-time, publishing results to a message broker for downstream analytics and agentic workflows. It provides three core microservices for processing video streams.
3. **Downstream analytics**: The Downstream Analytics layer processes and enriches the metadata streams generated by real-time video intelligence microservices, transforming raw detections into actionable insights and verified alerts.
4. **Agent and offline processing**: The top-level agent leverages the Model Context Protocol (MCP) to access video analytics data, incident records, and vision processing capabilities through a unified tool interface. It integrates multiple vision-based tools including video understanding with Vision Language Models (VLMs), semantic video search using embeddings, long video summarization for extended footage analysis, and video snapshot/clip retrieval.
## Target Audience
This blueprint is designed for ease of setup with extensive configuration options, requiring technical expertise. It is intended for:
1. **Video Analysts and IT Engineers:** Professionals focused on analyzing video data and ensuring efficient processing and summarization. The blueprint offers 1-click deployment steps, easy-to-manage configurations, and plug-and-play models, making it accessible for early developers.
2. **GenAI Developers / Machine Learning Engineers:** Experts who need to customize the blueprint for specific use cases. This includes modifying the pipelines for unique datasets and fine-tuning LLMs as needed. For advanced users, the blueprint provides detailed configuration options and custom deployment possibilities, enabling extensive customization and optimization.
## Repository Structure Overview
| Directory | Description |
|-----------|-------------|
| `agent/` | Video search and summarization agent (Python). Contains `src/vss_agents/` (tools, agents, APIs, embeddings, evaluators, video analytics), `tests/`, `stubs/`, `docker/`, and `3rdparty/`. See [agent/README.md](agent/README.md). |
| `deployments/` | Deployment configs and Docker Compose: NIM model configs (`nim/`), developer workflows (`developer-workflow/` — dev-profile-base, dev-profile-search, dev-profile-alerts, dev-profile-lvs), foundational services, LVS, RTVI, VLM-as-verifier, VST, and root `compose.yml`. |
| `scripts/` | Deployment and patch scripts, including the Brev launchable notebook (`deploy_vss_launchable.ipynb`) and dev-profile / patch scripts. |
| `ui/` | Frontend monorepo (Next.js, Turbo): `apps/` (nemo-agent-toolkit-ui, nv-metropolis-bp-vss-ui) and shared `packages/`. See [ui/README.md](ui/README.md). |
## Documentation
For detailed instructions and additional information about this blueprint, please refer to the [official documentation](https://docs.nvidia.com/vss/3.1.0/index.html).
## Prerequisites
### Obtain API Key
- NVIDIA AI Enterprise developer licence required to local host NVIDIA NIM.
- API catalog keys:
- NVIDIA [API catalog](https://build.nvidia.com/) or [NGC](https://org.ngc.nvidia.com/setup/api-keys) ([steps to generate key](https://docs.nvidia.com/ngc/gpu-cloud/ngc-user-guide/index.html#generating-api-key))
## Hardware Requirements
The platform requirement can vary depending on the configuration and deployment topology used for VSS and dependencies like VLM, LLM, etc. For a list of validated GPU topologies and what configuration to use, see the [GPU requirements](https://docs.nvidia.com/vss/3.1.0/prerequisites.html#development-profile-gpu-requirements).
## Quickstart Guide
### Launchable Deployment
**Ideal for:** Quickly getting started with your own videos without worrying about hardware and software requirements.
Follow the steps from the [documentation](https://docs.nvidia.com/vss/3.1.0/cloud-brev.html) and notebook in [scripts](scripts/) directory to complete all pre-requisites and deploy the blueprint using Brev Launchable in a 2xRTX PRO 6000 SE AWS instance.
- [scripts/deploy_vss_launchable.ipynb](scripts/deploy_vss_launchable.ipynb): This notebook is tailored specifically for the AWS CSP which uses Ephemeral storage.
### Docker Compose Deployment
**Ideal for:** Deploying a VSS agent on your own hardware or bare metal cloud instance.
#### System Requirements
- OS:
- x86 hosts: Ubuntu 22.04 or Ubuntu 24.04
- DGX-SPARK: DGX OS 7.4.0
- IGX-THOR: Jetson Linux BSP (Rel 38.5)
- AGX-THOR: Jetson Linux BSP (Rel 38.4)
- NVIDIA Driver:
- 580.105.08 (x86 hosts with Ubuntu 24.04)
- 580.65.06 (x86 hosts with Ubuntu 22.04)
- 580.95.05 (DGX-SPARK)
- 580.00 (IGX-THOR and AGX-THOR)
- NVIDIA Container Toolkit: 1.17.8+
- Docker: 27.2.0+
- Docker Compose: v2.29.0+
- NGC CLI: 4.10.0+
Please refer to [Prerequisites section here for installation details](https://docs.nvidia.com/vss/3.1.0/prerequisites.html).
## Contributing
This project is currently in early access and not accepting contributions. Once made generally available, this project will accept contributions.
## License
Refer to [LICENSE](LICENSE)
================================================
FILE: SECURITY.md
================================================
## Security
NVIDIA is dedicated to the security and trust of our software products and services, including all source code repositories managed through our organization.
If you need to report a security issue, please use the appropriate contact points outlined below. **Please do not report security vulnerabilities through GitHub.**
## Reporting Potential Security Vulnerability in an NVIDIA Product
To report a potential security vulnerability in any NVIDIA product:
- Web: [Security Vulnerability Submission Form](https://www.nvidia.com/object/submit-security-vulnerability.html)
- E-Mail: psirt@nvidia.com
- We encourage you to use the following PGP key for secure email communication: [NVIDIA public PGP Key for communication](https://www.nvidia.com/en-us/security/pgp-key)
- Please include the following information:
- Product/Driver name and version/branch that contains the vulnerability
- Type of vulnerability (code execution, denial of service, buffer overflow, etc.)
- Instructions to reproduce the vulnerability
- Proof-of-concept or exploit code
- Potential impact of the vulnerability, including how an attacker could exploit the vulnerability
While NVIDIA currently does not have a bug bounty program, we do offer acknowledgement when an externally reported security issue is addressed under our coordinated vulnerability disclosure policy. Please visit our [Product Security Incident Response Team (PSIRT)](https://www.nvidia.com/en-us/security/psirt-policies/) policies page for more information.
## NVIDIA Product Security
For all security-related concerns, please visit NVIDIA's Product Security portal at https://www.nvidia.com/en-us/security
================================================
FILE: agent/.gitattributes
================================================
*.mp4 filter=lfs diff=lfs merge=lfs -text
3rdparty/ffmpeg/FFmpeg-n8.0.1.tar.gz filter=lfs diff=lfs merge=lfs -text
================================================
FILE: agent/.pre-commit-config.yaml
================================================
# SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.3.3
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix]
- id: ruff-format
- repo: https://github.com/astral-sh/uv-pre-commit
rev: 0.6.2
hooks:
- id: uv-lock
- repo: https://github.com/adrienverge/yamllint
rev: v1.35.1
hooks:
- id: yamllint
args:
- '-d'
- '{extends: default, rules: {line-length: {max: 120}, document-start: disable,
indentation: {spaces: 2, indent-sequences: false}}}'
files: \.(yaml|yml)$
exclude: (^\.gitlab-ci\.yml$|^tests/\.gitlab-ci\.yml$)
- repo: local
hooks:
- id: gitleaks
name: gitleaks
language: docker_image
entry: zricethezav/gitleaks:v8.30.0 protect --staged --redact -v --baseline-path gitleaks-baseline.json
pass_filenames: false
stages: [pre-commit]
- repo: https://github.com/Yelp/detect-secrets
rev: v1.5.0
hooks:
- id: detect-secrets
args: ['--baseline', '.secrets.baseline']
exclude: gitleaks-baseline\.json$
- repo: local
hooks:
- id: mypy
name: mypy
entry: uv run mypy
language: system
types: [python]
files: ^src/vss_agents/
pass_filenames: false
args: [src/vss_agents/]
default_language_version:
python: python3
================================================
FILE: agent/AGENTS.md
================================================
# AGENTS.md
## Project Overview
NVIDIA VSS Agent — video search, summarization, and incident analysis built on
[NVIDIA AIQ Toolkit](https://docs.nvidia.com/nemo/agent-toolkit/latest/index.html).
**Tech stack:** Python 3.13, NAT framework (nvidia-nat), LangChain/LangGraph, FastAPI,
Pydantic v2, OpenCV, xhtml2pdf. Package manager: `uv`. Linter/formatter: Ruff. Type checker: Mypy.
## Commands
```bash
# Setup
uv venv --python 3.13 && uv sync --group dev && source .venv/bin/activate
sudo apt-get install libcairo2-dev pkg-config python3-dev # PDF generation deps
pre-commit install
# Test
uv run pytest tests/unit_test/ -v # all tests
uv run pytest tests/unit_test/tools/test_video_clip.py -v # single file
# Lint & type-check (run all three after every change)
uv run ruff check src/ # lint
uv run ruff check src/vss_agents/tools/video_clip.py # lint single file
uv run ruff format --check src/ # format check
uv run mypy src/vss_agents/ # type check
# Run the agent (dev-profile-base example; see README.md Quick Start)
nat serve --config_file ../deployments/developer-workflow/dev-profile-base/vss-agent/configs/config.yml \
--host 0.0.0.0 --port 8000
```
## Project Structure
```
src/vss_agents/
├── agents/ # Orchestration agents (top_agent, report_agent, multi_report_agent)
│ └── postprocessing/ # Response validation (URL validator, etc.)
├── api/ # FastAPI endpoints, custom workers, RTSP/video ingest routes
├── data_models/ # Pydantic models shared across modules
├── embed/ # Embedding and vector-search utilities
├── evaluators/ # LLM-judge evaluators (trajectory, QA, report quality)
├── tools/ # NAT tools: video_understanding, report_gen, geolocation, …
│ ├── vst/ # Video Storage Toolkit tools (clip, snapshot, video_list)
│ └── code_executor/ # Sandboxed code execution (Docker backend)
├── utils/ # Shared helpers
└── video_analytics/ # Video Analytics MCP server and ES client
tests/unit_test/ # Mirrors src/ tree — every module has a matching test dir
stubs/ # Mypy stubs for NAT framework (nat.data_models)
```
## Code Style
- **Line length**: 120 chars. **Quotes**: double. **Trailing commas**: yes.
- **Imports**: one per line, isort-sorted, `force-single-line = true`.
- **Type hints**: required on all function signatures. No `Any` without justification.
- **Dependencies**: sorted in `pyproject.toml`, `~=` with 2-digit precision (e.g. `~=1.2`).
```python
# ✅ Good
async def fetch_video_clip(sensor_id: str, start: float, end: float) -> VideoClipResult:
if end <= start:
raise ValueError(f"end ({end}) must be after start ({start})")
return await self._vst_client.get_clip(sensor_id, start, end)
# ❌ Bad — missing types, vague name, no validation
async def get(id, s, e):
return await self._vst_client.get_clip(id, s, e)
```
**License header** (required on every Python file):
```python
# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
```
## Architecture Patterns
- **Tools** subclass `FunctionBaseConfig` (NAT framework). Each tool has a `register.py`
entry point listed under `[project.entry-points.'nat.components']` in `pyproject.toml`.
- **Agents** are LangGraph state machines (`top_agent.py` routes to tools and sub-agents).
- **Config** is YAML with `${ENV_VAR}` substitution. Profiles live in
`../deployments/developer-workflow/<profile>/vss-agent/configs/config.yml`.
- **Stubs**: `stubs/` has Mypy stubs for NAT. When subclassing a NAT base config,
verify `uv run mypy src/vss_agents/` passes — extend the stub if needed.
## Testing
- Unit tests mirror `src/` under `tests/unit_test/`. Adding a new module? Add a matching test file.
- Use `pytest-asyncio` for async tests. Mark slow tests with `@pytest.mark.slow`.
- Mocking: mock external services (VST, LLM, VLM, Elasticsearch) — never call real endpoints in unit tests.
## Git Workflow
- Create a feature branch from `main`. Keep commits focused.
- Pre-commit hooks run `ruff`, `gitleaks` (secret scanning), and format checks automatically.
- Run `uv run pytest tests/unit_test/ -v` before pushing.
## Boundaries
- **Always**: add type hints, add the license header, run `ruff check` + `ruff format --check` + `mypy` after changes, write or update unit tests for new code.
- **Ask first**: adding new dependencies to `pyproject.toml`, modifying agent orchestration in `top_agent.py`, changing YAML config schema.
- **Never**: commit secrets or API keys, modify files under `3rdparty/`, remove or skip failing tests, hardcode IPs/URLs (use `${ENV_VAR}` in configs).
================================================
FILE: agent/LICENSE-3rd-party.txt
================================================
# Dependencies Licenses
This file contains the license texts for all dependencies used in this project.
Total packages: 237
---
--------------------------------------------------------------------------------
## aioboto3 (15.5.0)
**License:** Apache-2.0
**License URL:** https://github.com/terricain/aioboto3/blob/main/LICENSE
```
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2015-2016 Nikolai Novik
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```
--------------------------------------------------------------------------------
## aiobotocore (2.25.1)
**License:** Apache-2.0
**License URL:** https://github.com/aio-libs/aiobotocore/blob/master/LICENSE
```
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2015-2016 Nikolai Novik
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```
--------------------------------------------------------------------------------
## aiofiles (25.1.0)
**License:** Apache-2.0
**License URL:** https://github.com/Tinche/aiofiles/blob/main/LICENSE
```
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```
--------------------------------------------------------------------------------
## aiohappyeyeballs (2.6.1)
**License:** PSF-2.0
**License URL:** https://github.com/aio-libs/aiohappyeyeballs/blob/main/LICENSE
```
A. HISTORY OF THE SOFTWARE
==========================
Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands
as a successor of a language called ABC. Guido remains Python's
principal author, although it includes many contributions from others.
In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see https://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.
In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team. In October of the same
year, the PythonLabs team moved to Digital Creations, which became
Zope Corporation. In 2001, the Python Software Foundation (PSF, see
https://www.python.org/psf/) was formed, a non-profit organization
created specifically to own Python-related Intellectual Property.
Zope Corporation was a sponsoring member of the PSF.
All Python releases are Open Source (see https://opensource.org for
the Open Source Definition). Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.
Release Derived Year Owner GPL-
from compatible? (1)
0.9.0 thru 1.2 1991-1995 CWI yes
1.3 thru 1.5.2 1.2 1995-1999 CNRI yes
1.6 1.5.2 2000 CNRI no
2.0 1.6 2000 BeOpen.com no
1.6.1 1.6 2001 CNRI yes (2)
2.1 2.0+1.6.1 2001 PSF no
2.0.1 2.0+1.6.1 2001 PSF yes
2.1.1 2.1+2.0.1 2001 PSF yes
2.1.2 2.1.1 2002 PSF yes
2.1.3 2.1.2 2002 PSF yes
2.2 and above 2.1.1 2001-now PSF yes
Footnotes:
(1) GPL-compatible doesn't mean that we're distributing Python under
the GPL. All Python licenses, unlike the GPL, let you distribute
a modified version without making your changes open source. The
GPL-compatible licenses make it possible to combine Python with
other software that is released under the GPL; the others don't.
(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
because its license has a choice of law clause. According to
CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
is "not incompatible" with the GPL.
Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.
B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================
Python software and documentation are licensed under the
Python Software Foundation License Version 2.
Starting with Python 3.8.6, examples, recipes, and other code in
the documentation are dual licensed under the PSF License Version 2
and the Zero-Clause BSD license.
Some software incorporated into Python is under different licenses.
The licenses are listed with code falling under that license.
PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------
1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.
2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation;
All Rights Reserved" are retained in Python alone or in any derivative version
prepared by Licensee.
3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.
4. PSF is making Python available to Licensee on an "AS IS"
basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.
5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.
7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee. This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.
8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.
BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------
BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").
2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.
3. BeOpen is making the Software available to Licensee on an "AS IS"
basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.
4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.
6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions. Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee. This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party. As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.
7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.
CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------
1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.
2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee. Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement. This Agreement together with
Python 1.6.1 may be located on the internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013. This
Agreement may also be obtained from a proxy server on the internet
using the following URL: http://hdl.handle.net/1895.22/1013".
3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.
4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.
5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.
7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee. This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.
8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.
ACCEPT
CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------
Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands. All rights reserved.
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION
----------------------------------------------------------------------
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
```
--------------------------------------------------------------------------------
## aiohttp (3.13.2)
**License:** Apache-2.0 AND MIT
**License URL:** https://github.com/aio-libs/aiohttp/blob/master/LICENSE.txt
```
Copyright aio-libs contributors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```
--------------------------------------------------------------------------------
## aioitertools (0.13.0)
**License:** MIT
**License URL:** https://github.com/omnilib/aioitertools/blob/main/LICENSE
```
MIT License
Copyright (c) 2022 Amethyst Reese
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
--------------------------------------------------------------------------------
## aiorwlock (1.5.0)
**License:** Apache-2.0
**License URL:** https://github.com/aio-libs/aiorwlock/blob/master/LICENSE
```
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2015-2019 Andrew Svetlov, Nikolay Novik
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```
--------------------------------------------------------------------------------
## aiosignal (1.4.0)
**License:** Apache 2.0
**License URL:** https://github.com/aio-libs/aiosignal/blob/master/LICENSE
```
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2013-2019 Nikolay Kim and Andrew Svetlov
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
```
--------------------------------------------------------------------------------
## aiosqlite (0.21.0)
**License:** MIT License
**License URL:** https://github.com/omnilib/aiosqlite/blob/main/LICENSE
```
MIT License
Copyright (c) 2022 Amethyst Reese
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
--------------------------------------------------------------------------------
## alembic (1.17.2)
**License:** MIT
**License URL:** https://github.com/sqlalchemy/alembic/blob/main/LICENSE
```
Copyright 2009-2026 Michael Bayer.
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
--------------------------------------------------------------------------------
## annotated-doc (0.0.4)
**License:** MIT
**License URL:** https://github.com/fastapi/annotated-doc/blob/main/LICENSE
```
The MIT License (MIT)
Copyright (c) 2025 Sebastián Ramírez
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
```
--------------------------------------------------------------------------------
## annotated-types (0.7.0)
**License:** MIT License
**License URL:** https://github.com/annotated-types/annotated-types/blob/main/LICENSE
```
The MIT License (MIT)
Copyright (c) 2022 the contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
--------------------------------------------------------------------------------
## anyio (4.12.0)
**License:** MIT
**License URL:** https://github.com/agronholm/anyio/blob/master/LICENSE
```
The MIT License (MIT)
Copyright (c) 2018 Alex Grönholm
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
```
--------------------------------------------------------------------------------
## appdirs (1.4.4)
**License:** MIT
**License URL:** https://github.com/ActiveState/appdirs/blob/master/LICENSE.txt
```
The MIT License (MIT)
Copyright (c) 2010 ActiveState Software Inc.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
```
--------------------------------------------------------------------------------
## arabic-reshaper (3.0.0)
**License:** MIT
**License URL:** https://github.com/mpcabd/python-arabic-reshaper/blob/master/LICENSE
```
MIT License
Copyright (c) 2019 Abdullah Diab
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
--------------------------------------------------------------------------------
## arize-phoenix-otel (0.13.1)
**License:** Elastic 2.0
**License URL:** https://github.com/Arize-ai/phoenix/blob/main/LICENSE
```
Elastic License 2.0 (ELv2)
**Acceptance**
By using the software, you agree to all of the terms and conditions below.
**Copyright License**
The licensor grants you a non-exclusive, royalty-free, worldwide, non-sublicensable, non-transferable license to use, copy, distribute, make available, and prepare derivative works of the software, in each case subject to the limitations and conditions below.
**Limitations**
You may not provide the software to third parties as a hosted or managed service, where the service provides users with access to any substantial set of the features or functionality of the software.
You may not move, change, disable, or circumvent the license key functionality in the software, and you may not remove or obscure any functionality in the software that is protected by the license key.
You may not alter, remove, or obscure any licensing, copyright, or other notices of the licensor in the software. Any use of the licensor’s trademarks is subject to applicable law.
**Patents**
The licensor grants you a license, under any patent claims the licensor can license, or becomes able to license, to make, have made, use, sell, offer for sale, import and have imported the software, in each case subject to the limitations and conditions in this license. This license does not cover any patent claims that you cause to be infringed by modifications or additions to the software. If you or your company make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
**Notices**
You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms.
If you modify the software, you must include in any modified copies of the software prominent notices stating that you have modified the software.
**No Other Rights**
These terms do not imply any licenses other than those expressly granted in these terms.
**Termination**
If you use the software in violation of these terms, such use is not licensed, and your licenses will automatically terminate. If the licensor provides you with a notice of your violation, and you cease all violation of this license no later than 30 days after you receive that notice, your licenses will be reinstated retroactively. However, if you violate these terms after such reinstatement, any additional violation of these terms will cause your licenses to terminate automatically and permanently.
**No Liability**
As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.
**Definitions**
The *licensor* is the entity offering these terms, and the *software* is the software the licensor makes available under these terms, including any portion of it.
*you* refers to the individual or entity agreeing to these terms.
*your company* is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. *control* means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
*your licenses* are all the licenses granted to you for the software under these terms.
*use* means anything you do with the software requiring one of your licenses.
*trademark* means trademarks, service marks, and similar rights.
```
--------------------------------------------------------------------------------
## asn1crypto (1.5.1)
**License:** MIT
**License URL:** https://github.com/wbond/asn1crypto/blob/master/LICENSE
```
Copyright (c) 2015-2022 Will Bond <will@wbond.net>
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
--------------------------------------------------------------------------------
## attrs (25.4.0)
**License:** MIT
**License URL:** https://github.com/python-attrs/attrs/blob/main/LICENSE
```
The MIT License (MIT)
Copyright (c) 2015 Hynek Schlawack and the attrs contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```
--------------------------------------------------------------------------------
## authlib (1.6.5)
**License:** BSD-3-Clause
**License URL:** https://github.com/authlib/authlib/blob/main/LICENSE
```
BSD 3-Clause License
Copyright (c) 2017, Hsiaoming Yang
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
```
--------------------------------------------------------------------------------
## beautifulsoup4 (4.14.3)
**License:** MIT License
**License URL:** https://github.com/wention/BeautifulSoup4?tab=License-1-ov-file
```
Beautiful Soup is made available under the MIT license:
Copyright (c) Leonard Richardson
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Beautiful Soup incorporates code from the html5lib library, which is
also made available under the MIT license. Copyright (c) James Graham
and other contributors
Beautiful Soup has an optional dependency on the soupsieve library,
which is also made available under the MIT license. Copyright (c)
Isaac Muse
```
--------------------------------------------------------------------------------
## blinker (1.9.0)
**License:** MIT
**License URL:** https://github.com/pallets-eco/blinker/blob/main/LICENSE.txt
```
Copyright 2010 Jason Kirtland
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
```
--------------------------------------------------------------------------------
## boto3 (1.40.61)
**License:** Apache-2.0
**License URL:** https://github.com/boto/boto3/blob/master/LICENSE
```
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
```
--------------------------------------------------------------------------------
## botocore (1.40.61)
**License:** Apache-2.0
**License URL:** https://github.com/boto/botocore/blob/master/LICENSE.txt
```
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
```
--------------------------------------------------------------------------------
## cachetools (7.0.0)
**License:** MIT
**License URL:** https://github.com/tkem/cachetools/blob/master/LICENSE
```
The MIT License (MIT)
Copyright (c) 2014-2026 Thomas Kemmer
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
```
--------------------------------------------------------------------------------
## certifi (2025.11.12)
**License:** MPL-2.0
**License URL:** https://github.com/certifi/python-certifi/blob/master/LICENSE
```
This package contains a modified version of ca-bundle.crt:
ca-bundle.crt -- Bundle of CA Root Certificates
This is a bundle of X.509 certificates of public Certificate Authorities
(CA). These were automatically extracted from Mozilla's root certificates
file (certdata.txt). This file can be found in the mozilla source tree:
https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt
It contains the certificates in PEM format and therefore
can be directly used with curl / libcurl / php_curl, or with
an Apache+mod_ssl webserver for SSL client authentication.
Just configure this file as the SSLCACertificateFile.#
***** BEGIN LICENSE BLOCK *****
This Source Code Form is subject to the terms of the Mozilla Public License,
v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
one at http://mozilla.org/MPL/2.0/.
***** END LICENSE BLOCK *****
@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $
```
--------------------------------------------------------------------------------
## cffi (2.0.0)
**License:** MIT
**License URL:** https://github.com/python-cffi/cffi/blob/main/LICENSE
```
Except when otherwise stated (look for LICENSE files in directories or
information at the beginning of each file) all software and
documentation is licensed as follows:
MIT No Attribution
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the
Software is furnished to do so.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
```
--------------------------------------------------------------------------------
## charset-normalizer (3.4.4)
**License:** MIT
**License URL:** https://github.com/jawah/charset_normalizer/blob/master/LICENSE
```
MIT License
Copyright (c) 2025 TAHRI Ahmed R.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR
gitextract_872b8gvq/
├── .gitattributes
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report_form.yml
│ │ ├── config.yml
│ │ ├── documentation_request.yml
│ │ └── feature_request_form.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── copy-pr-bot.yaml
│ ├── scripts/
│ │ ├── check_copyright_headers.py
│ │ └── trigger-downstream-pipeline.sh
│ └── workflows/
│ └── ci.yml
├── .pre-commit-config.yaml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── LICENSE-3rd-party.txt
├── LICENSE.DATA
├── README.md
├── SECURITY.md
├── agent/
│ ├── .gitattributes
│ ├── .pre-commit-config.yaml
│ ├── AGENTS.md
│ ├── LICENSE-3rd-party.txt
│ ├── LICENSE.md
│ ├── README.md
│ ├── docker/
│ │ ├── Dockerfile
│ │ ├── cleanup_vulnerabilities.py
│ │ └── verify_ffmpeg_tarball.py
│ ├── pyproject.toml
│ ├── src/
│ │ ├── sitecustomize.py
│ │ └── vss_agents/
│ │ ├── __init__.py
│ │ ├── agents/
│ │ │ ├── __init__.py
│ │ │ ├── critic_agent.py
│ │ │ ├── data_models.py
│ │ │ ├── multi_report_agent.py
│ │ │ ├── postprocessing/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── data_models.py
│ │ │ │ ├── postprocessing_node.py
│ │ │ │ └── validators/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── llm_based_rule_validator.py
│ │ │ │ ├── non_empty_response_validator.py
│ │ │ │ └── url_validator.py
│ │ │ ├── register.py
│ │ │ ├── report_agent.py
│ │ │ ├── search_agent.py
│ │ │ └── top_agent.py
│ │ ├── api/
│ │ │ ├── __init__.py
│ │ │ ├── custom_fastapi_worker.py
│ │ │ ├── health_endpoint.py
│ │ │ ├── register.py
│ │ │ ├── rtsp_stream_api.py
│ │ │ ├── video_delete.py
│ │ │ ├── video_search_ingest.py
│ │ │ └── video_upload_url.py
│ │ ├── data_models/
│ │ │ ├── __init__.py
│ │ │ └── vss.py
│ │ ├── embed/
│ │ │ ├── __init__.py
│ │ │ ├── cosmos_embed.py
│ │ │ ├── embed.py
│ │ │ └── rtvi_cv_embed.py
│ │ ├── evaluators/
│ │ │ ├── __init__.py
│ │ │ ├── customized_qa_evaluator/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── evaluate.py
│ │ │ │ └── register.py
│ │ │ ├── customized_trajectory_evaluator/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── evaluate.py
│ │ │ │ └── register.py
│ │ │ ├── evaluate_patch.py
│ │ │ ├── register.py
│ │ │ ├── report_evaluator/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── data_models.py
│ │ │ │ ├── eval_config_models.py
│ │ │ │ ├── evaluate.py
│ │ │ │ ├── field_evaluators/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── common.py
│ │ │ │ │ └── llm_judge.py
│ │ │ │ └── register.py
│ │ │ └── utils.py
│ │ ├── prompt.py
│ │ ├── py.typed
│ │ ├── tools/
│ │ │ ├── __init__.py
│ │ │ ├── attribute_search.py
│ │ │ ├── chart_generator.py
│ │ │ ├── code_executor/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── docker_backend/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── docker_executor.py
│ │ │ │ │ └── image_builder.py
│ │ │ │ └── python_executor.py
│ │ │ ├── embed_search.py
│ │ │ ├── evaluation_compressor.py
│ │ │ ├── fov_counts_with_chart.py
│ │ │ ├── geolocation.py
│ │ │ ├── incidents.py
│ │ │ ├── lvs_video_understanding.py
│ │ │ ├── multi_incident_formatter.py
│ │ │ ├── prompt_gen.py
│ │ │ ├── register.py
│ │ │ ├── report_gen.py
│ │ │ ├── rtvi_vlm_alert.py
│ │ │ ├── s3_picture_url.py
│ │ │ ├── search.py
│ │ │ ├── template_report_gen.py
│ │ │ ├── video_caption.py
│ │ │ ├── video_detailed_caption.py
│ │ │ ├── video_frame_timestamp.py
│ │ │ ├── video_report_gen.py
│ │ │ ├── video_skim_caption.py
│ │ │ ├── video_understanding.py
│ │ │ ├── vss_summarize.py
│ │ │ ├── vst/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── duration.py
│ │ │ │ ├── register.py
│ │ │ │ ├── sensor_list.py
│ │ │ │ ├── snapshot.py
│ │ │ │ ├── timeline.py
│ │ │ │ ├── utils.py
│ │ │ │ ├── video_clip.py
│ │ │ │ └── video_list.py
│ │ │ ├── vst_download.py
│ │ │ └── vst_files.py
│ │ ├── utils/
│ │ │ ├── asyncmixin.py
│ │ │ ├── file_mapping.py
│ │ │ ├── frame_select.py
│ │ │ ├── markdown_parser.py
│ │ │ ├── parser.py
│ │ │ ├── reasoning_parsing.py
│ │ │ ├── reasoning_utils.py
│ │ │ ├── retry.py
│ │ │ ├── time_convert.py
│ │ │ ├── time_measure.py
│ │ │ ├── url_translation.py
│ │ │ └── video_file.py
│ │ └── video_analytics/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── embeddings.py
│ │ ├── es_client.py
│ │ ├── interface.py
│ │ ├── nvschema.py
│ │ ├── query_builders.py
│ │ ├── tools.py
│ │ └── utils.py
│ ├── stubs/
│ │ └── nat/
│ │ ├── __init__.pyi
│ │ └── data_models/
│ │ ├── __init__.pyi
│ │ ├── common.pyi
│ │ ├── evaluator.pyi
│ │ └── function.pyi
│ └── tests/
│ └── unit_test/
│ ├── __init__.py
│ ├── agents/
│ │ ├── __init__.py
│ │ ├── postprocessing/
│ │ │ ├── __init__.py
│ │ │ ├── test_llm_based_rule_validator.py
│ │ │ ├── test_non_empty_response_validator.py
│ │ │ ├── test_postprocessing_node.py
│ │ │ └── test_url_validator.py
│ │ ├── test_data_models.py
│ │ ├── test_multi_report_agent.py
│ │ ├── test_report_agent.py
│ │ ├── test_search_agent.py
│ │ └── test_top_agent.py
│ ├── api/
│ │ ├── __init__.py
│ │ ├── conftest.py
│ │ ├── test_health_endpoint_coverage.py
│ │ ├── test_rtsp_stream_api.py
│ │ ├── test_video_search_ingest.py
│ │ ├── test_video_upload_url.py
│ │ ├── test_video_upload_url_converters.py
│ │ ├── test_video_upload_url_coverage.py
│ │ └── test_video_upload_url_inner.py
│ ├── conftest.py
│ ├── data_models/
│ │ ├── __init__.py
│ │ └── test_vss.py
│ ├── embed/
│ │ └── test_cosmos_embed.py
│ ├── evaluators/
│ │ ├── __init__.py
│ │ ├── test_custom_qa.py
│ │ ├── test_custom_trajectory.py
│ │ ├── test_data_models.py
│ │ ├── test_eval_config_models.py
│ │ ├── test_evaluate.py
│ │ ├── test_evaluate_patch.py
│ │ ├── test_field_evaluators.py
│ │ ├── test_llm_judge.py
│ │ ├── test_llm_judge_coverage.py
│ │ ├── test_llm_judge_field_discovery.py
│ │ ├── test_register_coverage.py
│ │ ├── test_report_evaluator.py
│ │ └── test_utils.py
│ ├── test_prompt.py
│ ├── test_sitecustomize.py
│ ├── tools/
│ │ ├── __init__.py
│ │ ├── test_build_vst_url.py
│ │ ├── test_chart_generator.py
│ │ ├── test_chart_generator_converters.py
│ │ ├── test_chart_generator_coverage.py
│ │ ├── test_chart_generator_inner.py
│ │ ├── test_code_executor.py
│ │ ├── test_embed_search.py
│ │ ├── test_embed_search_coverage.py
│ │ ├── test_embed_search_edge_cases.py
│ │ ├── test_embed_search_inner.py
│ │ ├── test_evaluation_compressor.py
│ │ ├── test_fov_counts.py
│ │ ├── test_geolocation.py
│ │ ├── test_incidents.py
│ │ ├── test_lvs_video_understanding.py
│ │ ├── test_multi_incident_formatter.py
│ │ ├── test_prompt_gen.py
│ │ ├── test_prompt_gen_coverage.py
│ │ ├── test_prompt_gen_inner.py
│ │ ├── test_python_executor.py
│ │ ├── test_python_executor_coverage.py
│ │ ├── test_report_gen.py
│ │ ├── test_rtvi_vlm_alert.py
│ │ ├── test_rtvi_vlm_alert_inner.py
│ │ ├── test_s3_picture_url.py
│ │ ├── test_search.py
│ │ ├── test_search_converters.py
│ │ ├── test_search_coverage.py
│ │ ├── test_search_inner.py
│ │ ├── test_search_more_edge_cases.py
│ │ ├── test_template_report_gen.py
│ │ ├── test_video_caption.py
│ │ ├── test_video_caption_coverage.py
│ │ ├── test_video_caption_inner.py
│ │ ├── test_video_caption_vss_inner.py
│ │ ├── test_video_detailed_caption.py
│ │ ├── test_video_detailed_caption_coverage.py
│ │ ├── test_video_frame_timestamp.py
│ │ ├── test_video_frame_timestamp_coverage.py
│ │ ├── test_video_report_gen.py
│ │ ├── test_video_skim_caption.py
│ │ ├── test_video_skim_caption_coverage.py
│ │ ├── test_video_understanding.py
│ │ ├── test_video_upload_url.py
│ │ ├── test_vss_summarize.py
│ │ ├── test_vss_summarize_coverage.py
│ │ ├── test_vss_summarize_inner.py
│ │ ├── test_vst_tools.py
│ │ └── vst/
│ │ ├── __init__.py
│ │ ├── test_bounding_box.py
│ │ ├── test_duration_coverage.py
│ │ ├── test_sensor_list.py
│ │ ├── test_snapshot.py
│ │ ├── test_snapshot_coverage.py
│ │ ├── test_snapshot_inner.py
│ │ ├── test_stream_list.py
│ │ ├── test_timeline.py
│ │ ├── test_utils.py
│ │ ├── test_video_clip.py
│ │ ├── test_video_clip_coverage.py
│ │ ├── test_video_clip_inner.py
│ │ └── test_video_list_coverage.py
│ ├── utils/
│ │ ├── __init__.py
│ │ ├── test_asyncmixin.py
│ │ ├── test_file_mapping.py
│ │ ├── test_frame_select.py
│ │ ├── test_markdown_parser.py
│ │ ├── test_parser.py
│ │ ├── test_reasoning_parsing.py
│ │ ├── test_reasoning_utils.py
│ │ ├── test_retry.py
│ │ ├── test_rewrite_url_host.py
│ │ ├── test_screenshot.py
│ │ ├── test_time_measure.py
│ │ ├── test_url_translation.py
│ │ └── test_video_file.py
│ └── video_analytics/
│ ├── __init__.py
│ ├── test_embeddings.py
│ ├── test_es_client.py
│ ├── test_interface.py
│ ├── test_nvschema.py
│ ├── test_query_builders.py
│ ├── test_tools.py
│ ├── test_tools_deep_coverage.py
│ ├── test_tools_edge_cases.py
│ ├── test_tools_functions.py
│ ├── test_tools_inner.py
│ ├── test_tools_inner_fns.py
│ ├── test_tools_integration.py
│ └── test_utils.py
├── deployments/
│ ├── LICENSE-3rd-party.txt
│ ├── MANIFEST
│ ├── NOTICE.md
│ ├── README.md
│ ├── agents/
│ │ ├── agent_ui/
│ │ │ └── compose.yml
│ │ ├── compose.yml
│ │ └── vss-agent/
│ │ └── vss-agent-docker-compose.yml
│ ├── compose.yml
│ ├── developer-workflow/
│ │ ├── compose.yml
│ │ ├── dev-profile-alerts/
│ │ │ ├── Dockerfiles/
│ │ │ │ ├── EDGE-perception.Dockerfile
│ │ │ │ ├── kibana-dashboard.Dockerfile
│ │ │ │ └── perception.Dockerfile
│ │ │ ├── compose.yml
│ │ │ ├── deepstream/
│ │ │ │ ├── EDGE-configs/
│ │ │ │ │ ├── cfg_kafka.txt
│ │ │ │ │ ├── coco_classmap.txt
│ │ │ │ │ ├── config_triton_nvinferserver_gdino.txt
│ │ │ │ │ ├── rtdetr-960x544-labels.txt
│ │ │ │ │ ├── rtdetr-960x544.txt
│ │ │ │ │ └── run_config-api-rtdetr-protobuf.txt
│ │ │ │ ├── configs/
│ │ │ │ │ ├── cfg_kafka.txt
│ │ │ │ │ ├── coco_classmap.txt
│ │ │ │ │ ├── config_triton_nvinferserver_gdino.txt
│ │ │ │ │ ├── rtdetr-960x544-labels.txt
│ │ │ │ │ ├── rtdetr-960x544.txt
│ │ │ │ │ └── run_config-api-rtdetr-protobuf.txt
│ │ │ │ └── init-scripts/
│ │ │ │ └── ds-start.sh
│ │ │ ├── kibana-dashboard/
│ │ │ │ ├── init-scripts/
│ │ │ │ │ └── kibana-import-dashboard.sh
│ │ │ │ └── its-kibana-objects.ndjson
│ │ │ ├── nvstreamer/
│ │ │ │ └── configs/
│ │ │ │ ├── vst-config.json
│ │ │ │ └── vst-storage.json
│ │ │ ├── sdr/
│ │ │ │ └── docker_cluster_config.json
│ │ │ ├── vlm-as-verifier/
│ │ │ │ └── configs/
│ │ │ │ ├── EDGE-LOCAL-VLM-config.yml
│ │ │ │ ├── alert_type_config.json
│ │ │ │ └── config.yml
│ │ │ ├── vss-agent/
│ │ │ │ └── configs/
│ │ │ │ ├── config.yml
│ │ │ │ └── va_mcp_server_config.yml
│ │ │ ├── vss-behavior-analytics/
│ │ │ │ └── configs/
│ │ │ │ ├── vss-behavior-analytics-kafka-config.json
│ │ │ │ └── vss-behavior-analytics-redis-config.json
│ │ │ └── vss-video-analytics-api/
│ │ │ └── configs/
│ │ │ ├── video-analytics-api-kafka-config.json
│ │ │ └── video-analytics-api-redis-config.json
│ │ ├── dev-profile-base/
│ │ │ ├── compose.yml
│ │ │ └── vss-agent/
│ │ │ └── configs/
│ │ │ └── config.yml
│ │ ├── dev-profile-lvs/
│ │ │ ├── Dockerfiles/
│ │ │ │ └── kibana-dashboard.Dockerfile
│ │ │ ├── compose.yml
│ │ │ ├── kibana-dashboard/
│ │ │ │ ├── init-scripts/
│ │ │ │ │ └── kibana-import-dashboard.sh
│ │ │ │ └── lvs-kibana-objects.ndjson
│ │ │ └── vss-agent/
│ │ │ └── configs/
│ │ │ └── config.yml
│ │ └── dev-profile-search/
│ │ ├── Dockerfiles/
│ │ │ └── kibana-dashboard.Dockerfile
│ │ ├── compose.yml
│ │ ├── kibana-dashboard/
│ │ │ ├── init-scripts/
│ │ │ │ └── kibana-import-dashboard.sh
│ │ │ └── search-kibana-objects.ndjson
│ │ ├── video-analytics-2d-app/
│ │ │ ├── Dockerfiles/
│ │ │ │ └── perception-cnn.Dockerfile
│ │ │ ├── compose.yml
│ │ │ ├── deepstream/
│ │ │ │ ├── configs/
│ │ │ │ │ ├── cnn-models/
│ │ │ │ │ │ ├── ds-detector-labels.txt
│ │ │ │ │ │ ├── ds-kafka-config.txt
│ │ │ │ │ │ ├── ds-main-config.txt
│ │ │ │ │ │ ├── ds-main-redis-config.txt
│ │ │ │ │ │ ├── ds-nvdcf-accuracy-tracker-config.yml
│ │ │ │ │ │ ├── ds-ppl-analytics-pgie-config.yml
│ │ │ │ │ │ └── ds-redis-config.txt
│ │ │ │ │ └── config.csv
│ │ │ │ └── init-scripts/
│ │ │ │ └── ds-start.sh
│ │ │ ├── nvstreamer/
│ │ │ │ └── configs/
│ │ │ │ ├── vst-config.json
│ │ │ │ └── vst-storage.json
│ │ │ ├── sdr/
│ │ │ │ └── docker_cluster_config.json
│ │ │ └── vss-search-analytics/
│ │ │ └── configs/
│ │ │ ├── vss-search-analytics-kafka-config.json
│ │ │ └── vss-search-analytics-redis-config.json
│ │ └── vss-agent/
│ │ └── configs/
│ │ └── config.yml
│ ├── foundational/
│ │ ├── 3rdParty_Licenses
│ │ ├── Dockerfiles/
│ │ │ ├── elastic-init.Dockerfile
│ │ │ ├── elasticsearch-gpu.Dockerfile
│ │ │ ├── elasticsearch.Dockerfile
│ │ │ ├── kafka-health-check.Dockerfile
│ │ │ └── redis-health-check.Dockerfile
│ │ ├── broker-health-check/
│ │ │ └── scripts/
│ │ │ ├── check-kafka-health.sh
│ │ │ └── check-redis-health.sh
│ │ ├── elk/
│ │ │ ├── configs/
│ │ │ │ ├── elasticsearch.yml
│ │ │ │ ├── kibana.yml
│ │ │ │ ├── logstash.yml
│ │ │ │ ├── mdx-kafka-logstash.conf
│ │ │ │ └── mdx-redis-logstash.conf
│ │ │ ├── gems/
│ │ │ │ └── logstash-input-redis_stream-3.1.0-java.gem
│ │ │ ├── init-scripts/
│ │ │ │ ├── elasticsearch-ilm-policy-creation.sh
│ │ │ │ ├── elasticsearch-ingest-pipeline-creation.sh
│ │ │ │ └── elasticsearch-template-creation.sh
│ │ │ └── pb_definitions/
│ │ │ ├── descriptors/
│ │ │ │ ├── ext.desc
│ │ │ │ └── schema.desc
│ │ │ └── ruby/
│ │ │ ├── ext_pb.rb
│ │ │ └── schema_pb.rb
│ │ ├── kafka/
│ │ │ └── init-scripts/
│ │ │ └── create-kafka-topics.sh
│ │ ├── kafka-entrypoint.sh
│ │ ├── mdx-foundational.yml
│ │ └── redis/
│ │ └── configs/
│ │ └── redis.conf
│ ├── lvs/
│ │ ├── README.md
│ │ ├── compose.yml
│ │ └── configs/
│ │ └── config.yaml
│ ├── nim/
│ │ ├── compose.yml
│ │ ├── cosmos-reason1-7b/
│ │ │ ├── compose.yml
│ │ │ ├── hw-H100-shared.env
│ │ │ ├── hw-H100.env
│ │ │ ├── hw-L40S.env
│ │ │ ├── hw-OTHER-shared.env
│ │ │ ├── hw-OTHER.env
│ │ │ ├── hw-RTXPRO6000BW-shared.env
│ │ │ └── hw-RTXPRO6000BW.env
│ │ ├── cosmos-reason2-8b/
│ │ │ ├── compose.yml
│ │ │ ├── hw-DGX-SPARK-shared.env
│ │ │ ├── hw-DGX-SPARK.env
│ │ │ ├── hw-H100-shared.env
│ │ │ ├── hw-H100.env
│ │ │ ├── hw-L40S.env
│ │ │ ├── hw-OTHER-shared.env
│ │ │ ├── hw-OTHER.env
│ │ │ ├── hw-RTXPRO6000BW-shared.env
│ │ │ └── hw-RTXPRO6000BW.env
│ │ ├── fallback-override.env
│ │ ├── gpt-oss-20b/
│ │ │ ├── compose.yml
│ │ │ ├── hw-H100-shared.env
│ │ │ ├── hw-H100.env
│ │ │ ├── hw-OTHER-shared.env
│ │ │ ├── hw-OTHER.env
│ │ │ ├── hw-RTXPRO6000BW-shared.env
│ │ │ └── hw-RTXPRO6000BW.env
│ │ ├── llama-3.3-nemotron-super-49b-v1.5/
│ │ │ ├── compose.yml
│ │ │ ├── hw-H100-shared.env
│ │ │ ├── hw-H100.env
│ │ │ ├── hw-OTHER-shared.env
│ │ │ ├── hw-OTHER.env
│ │ │ ├── hw-RTXPRO6000BW-shared.env
│ │ │ └── hw-RTXPRO6000BW.env
│ │ ├── nemotron-3-nano/
│ │ │ ├── compose.yml
│ │ │ ├── hw-H100-shared.env
│ │ │ ├── hw-H100.env
│ │ │ ├── hw-OTHER-shared.env
│ │ │ ├── hw-OTHER.env
│ │ │ ├── hw-RTXPRO6000BW-shared.env
│ │ │ └── hw-RTXPRO6000BW.env
│ │ ├── nvidia-nemotron-nano-9b-v2/
│ │ │ ├── compose.yml
│ │ │ ├── hw-H100-shared.env
│ │ │ ├── hw-H100.env
│ │ │ ├── hw-L40S.env
│ │ │ ├── hw-OTHER-shared.env
│ │ │ ├── hw-OTHER.env
│ │ │ ├── hw-RTXPRO6000BW-shared.env
│ │ │ └── hw-RTXPRO6000BW.env
│ │ ├── nvidia-nemotron-nano-9b-v2-fp8/
│ │ │ ├── compose.yml
│ │ │ ├── hw-AGX-THOR-shared.env
│ │ │ ├── hw-AGX-THOR.env
│ │ │ ├── hw-DGX-SPARK-shared.env
│ │ │ ├── hw-DGX-SPARK.env
│ │ │ ├── hw-IGX-THOR-shared.env
│ │ │ ├── hw-IGX-THOR.env
│ │ │ ├── hw-OTHER-shared.env
│ │ │ └── hw-OTHER.env
│ │ └── qwen3-vl-8b-instruct/
│ │ ├── compose.yml
│ │ ├── hw-H100-shared.env
│ │ ├── hw-H100.env
│ │ ├── hw-OTHER-shared.env
│ │ ├── hw-OTHER.env
│ │ ├── hw-RTXPRO6000BW-shared.env
│ │ └── hw-RTXPRO6000BW.env
│ ├── proxy/
│ │ ├── compose.yml
│ │ └── nginx.conf.template
│ ├── rtvi/
│ │ ├── compose.yml
│ │ ├── rtvi-embed/
│ │ │ └── rtvi-embed-docker-compose.yml
│ │ └── rtvi-vlm/
│ │ └── rtvi-vlm-docker-compose.yml
│ ├── vlm-as-verifier/
│ │ ├── README.md
│ │ ├── compose.yml
│ │ └── scripts/
│ │ └── env-substitute.py
│ └── vst/
│ ├── developer/
│ │ └── vst/
│ │ ├── configs/
│ │ │ ├── adaptor_config.json
│ │ │ ├── nginx-mms.conf
│ │ │ ├── nginx-mms.conf.template
│ │ │ ├── nginx-vst.conf
│ │ │ ├── nginx-vst.conf.template
│ │ │ ├── postgresql.conf
│ │ │ ├── rtsp_streams.json
│ │ │ ├── vst_config.json
│ │ │ ├── vst_config_kafka.json
│ │ │ ├── vst_config_redis.json
│ │ │ └── vst_storage.json
│ │ ├── docker-compose.yaml
│ │ └── sdr-streamprocessing/
│ │ ├── envoy.yaml
│ │ ├── sdr-compose.yaml
│ │ └── sdr-config/
│ │ ├── data_wl.yaml
│ │ └── docker_cluster_config.json
│ └── scripts/
│ └── user_additional_install.sh
├── scripts/
│ ├── LICENSE-3rd-party-dev-profile.txt
│ ├── deploy_vss_launchable.ipynb
│ └── dev-profile.sh
└── ui/
├── .dockerignore
├── .eslintrc.js
├── .gitignore
├── CODE-OF-CONDUCT.md
├── CONTRIBUTING.md
├── DOCKER-README.md
├── Dockerfile
├── LICENSE
├── LICENSE-3rd-party.txt
├── README.md
├── SECURITY.md
├── apps/
│ ├── nemo-agent-toolkit-ui/
│ │ ├── .gitignore
│ │ ├── __mocks__/
│ │ │ ├── next-i18next.js
│ │ │ ├── react-markdown.js
│ │ │ └── websocket.ts
│ │ ├── __tests__/
│ │ │ ├── api/
│ │ │ │ └── httpEndpoints.test.ts
│ │ │ ├── components/
│ │ │ │ ├── Chat.conversation-state.test.tsx
│ │ │ │ ├── Chat.error-recovery.test.tsx
│ │ │ │ ├── Chat.human-interaction.test.tsx
│ │ │ │ ├── Chat.streaming-edge-cases.test.tsx
│ │ │ │ ├── Chat.ui-behavior.test.tsx
│ │ │ │ ├── Chat.websocket-reliability.test.tsx
│ │ │ │ └── Chat.websocket.test.tsx
│ │ │ ├── types/
│ │ │ │ └── websocket.test.ts
│ │ │ └── utils/
│ │ │ ├── app/
│ │ │ │ └── importExports.test.ts
│ │ │ └── chatTransform.test.ts
│ │ ├── docs/
│ │ │ └── ui/
│ │ │ ├── README.md
│ │ │ ├── button-reference.md
│ │ │ ├── chat/
│ │ │ │ └── chat-interface.md
│ │ │ ├── settings/
│ │ │ │ └── configuration-management.md
│ │ │ └── sidebar/
│ │ │ └── conversation-management.md
│ │ ├── next-env.d.ts
│ │ ├── next-i18next.config.js
│ │ ├── next.config.js
│ │ ├── package.json
│ │ ├── pages/
│ │ │ ├── _app.tsx
│ │ │ ├── _document.tsx
│ │ │ ├── api/
│ │ │ │ └── chat.ts
│ │ │ └── index.tsx
│ │ ├── public/
│ │ │ └── locales/
│ │ │ └── en/
│ │ │ └── common.json
│ │ └── tsconfig.json
│ └── nv-metropolis-bp-vss-ui/
│ ├── .gitignore
│ ├── README.md
│ ├── components/
│ │ ├── Home.tsx
│ │ ├── ModeControlsSection.tsx
│ │ └── TabWithChatSidebarLayout.tsx
│ ├── constants/
│ │ └── constants.tsx
│ ├── hooks/
│ │ ├── useTabChatSidebarResize.ts
│ │ ├── useTabChatSidebars.ts
│ │ └── useTheme.ts
│ ├── next-env.d.ts
│ ├── next-i18next.config.js
│ ├── next.config.js
│ ├── package.json
│ ├── pages/
│ │ ├── _app.tsx
│ │ ├── _document.tsx
│ │ ├── api/
│ │ │ └── chat.ts
│ │ └── index.tsx
│ ├── postcss.config.js
│ ├── public/
│ │ └── locales/
│ │ └── en/
│ │ └── common.json
│ ├── styles/
│ │ ├── globals.css
│ │ └── rsuite-custom.css
│ ├── tailwind.config.js
│ ├── tsconfig.json
│ └── utils/
│ ├── index.ts
│ ├── searchTabChatEnv.ts
│ ├── tabChatEnv.ts
│ └── tabChatSidebarConfig.ts
├── custom-server.js
├── package.json
├── packages/
│ ├── nemo-agent-toolkit-ui/
│ │ ├── .dockerignore
│ │ ├── .eslintrc.js
│ │ ├── .gitignore
│ │ ├── .swcrc
│ │ ├── README.md
│ │ ├── TESTING.md
│ │ ├── __mocks__/
│ │ │ ├── next-i18next.js
│ │ │ ├── react-markdown.js
│ │ │ └── websocket.ts
│ │ ├── __tests__/
│ │ │ ├── api/
│ │ │ │ └── routes.test.ts
│ │ │ ├── components/
│ │ │ │ ├── Chat.conversation-state.test.tsx
│ │ │ │ ├── Chat.streaming-edge-cases.test.tsx
│ │ │ │ ├── Chat.ui-behavior.test.tsx
│ │ │ │ ├── Chat.websocket.test.tsx
│ │ │ │ └── InteractionModal.test.tsx
│ │ │ ├── proxy/
│ │ │ │ └── proxy-integration.test.js
│ │ │ ├── security/
│ │ │ │ ├── json-import-validation.test.ts
│ │ │ │ └── url-validation.test.ts
│ │ │ ├── types/
│ │ │ │ └── websocket.test.ts
│ │ │ └── utils/
│ │ │ ├── app/
│ │ │ │ └── importExports.test.ts
│ │ │ └── chatTransform.test.ts
│ │ ├── components/
│ │ │ ├── Avatar/
│ │ │ │ ├── AgentAvatar.tsx
│ │ │ │ ├── BotAvatar.tsx
│ │ │ │ ├── SystemAvatar.tsx
│ │ │ │ └── UserAvatar.tsx
│ │ │ ├── Buttons/
│ │ │ │ └── SidebarActionButton/
│ │ │ │ ├── SidebarActionButton.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Chat/
│ │ │ │ ├── Chat.tsx
│ │ │ │ ├── ChatFileUpload.tsx
│ │ │ │ ├── ChatHeader.tsx
│ │ │ │ ├── ChatInput.tsx
│ │ │ │ ├── ChatInteractionMessage.tsx
│ │ │ │ ├── ChatLoader.tsx
│ │ │ │ ├── ChatMessage.tsx
│ │ │ │ ├── CustomAgentParams.tsx
│ │ │ │ ├── ErrorMessageDiv.tsx
│ │ │ │ ├── MemoizedChatMessage.tsx
│ │ │ │ ├── README.md
│ │ │ │ └── Regenerate.tsx
│ │ │ ├── Chatbar/
│ │ │ │ ├── Chatbar.context.tsx
│ │ │ │ ├── Chatbar.state.tsx
│ │ │ │ ├── Chatbar.tsx
│ │ │ │ ├── README.md
│ │ │ │ └── components/
│ │ │ │ ├── ChatFolders.tsx
│ │ │ │ ├── ChatSidebarContent.tsx
│ │ │ │ ├── ChatbarSettings.tsx
│ │ │ │ ├── ClearConversations.tsx
│ │ │ │ ├── Conversation.tsx
│ │ │ │ └── Conversations.tsx
│ │ │ ├── Folder/
│ │ │ │ ├── Folder.tsx
│ │ │ │ ├── README.md
│ │ │ │ └── index.ts
│ │ │ ├── Markdown/
│ │ │ │ ├── AgentThink.tsx
│ │ │ │ ├── Chart.tsx
│ │ │ │ ├── CodeBlock.tsx
│ │ │ │ ├── CustomComponents.tsx
│ │ │ │ ├── CustomDetails.tsx
│ │ │ │ ├── CustomIncidents.tsx
│ │ │ │ ├── CustomSummary.tsx
│ │ │ │ ├── Image.tsx
│ │ │ │ ├── Loading.tsx
│ │ │ │ ├── MemoizedReactMarkdown.tsx
│ │ │ │ ├── Video.tsx
│ │ │ │ └── VideoModal.tsx
│ │ │ ├── Mobile/
│ │ │ │ └── Navbar.tsx
│ │ │ ├── Search/
│ │ │ │ ├── Search.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Settings/
│ │ │ │ ├── Import.tsx
│ │ │ │ └── SettingDialog.tsx
│ │ │ ├── Sidebar/
│ │ │ │ ├── README.md
│ │ │ │ ├── Sidebar.tsx
│ │ │ │ ├── SidebarButton.tsx
│ │ │ │ ├── SidebarInner.tsx
│ │ │ │ ├── components/
│ │ │ │ │ └── OpenCloseButton.tsx
│ │ │ │ └── index.ts
│ │ │ └── Spinner/
│ │ │ ├── Spinner.tsx
│ │ │ └── index.ts
│ │ ├── config.json
│ │ ├── constants/
│ │ │ ├── constants.tsx
│ │ │ └── index.ts
│ │ ├── hooks/
│ │ │ ├── useConversationOperations.ts
│ │ │ ├── useCreateReducer.ts
│ │ │ └── useFolderOperations.ts
│ │ ├── jest.config.js
│ │ ├── jest.setup.js
│ │ ├── lib-src/
│ │ │ ├── app.ts
│ │ │ ├── contexts/
│ │ │ │ └── RuntimeConfigContext.tsx
│ │ │ ├── index.d.ts
│ │ │ ├── index.ts
│ │ │ ├── server.d.ts
│ │ │ └── server.ts
│ │ ├── middleware.ts
│ │ ├── next-env.d.ts
│ │ ├── next-i18next.config.js
│ │ ├── next.config.js
│ │ ├── package.json
│ │ ├── pages/
│ │ │ ├── _app.tsx
│ │ │ ├── _document.tsx
│ │ │ ├── api/
│ │ │ │ ├── chat.ts
│ │ │ │ └── home/
│ │ │ │ ├── home.context.tsx
│ │ │ │ ├── home.server.tsx
│ │ │ │ ├── home.state.tsx
│ │ │ │ ├── home.tsx
│ │ │ │ └── index.ts
│ │ │ └── index.tsx
│ │ ├── postcss.config.js
│ │ ├── prettier.config.js
│ │ ├── proxy/
│ │ │ ├── request-transformers.js
│ │ │ └── response-processors.js
│ │ ├── public/
│ │ │ └── locales/
│ │ │ └── en/
│ │ │ ├── common.json
│ │ │ └── sidebar.json
│ │ ├── styles/
│ │ │ └── globals.css
│ │ ├── tailwind.config.js
│ │ ├── tsconfig.json
│ │ ├── tsconfig.lib.json
│ │ ├── tsconfig.typecheck.json
│ │ ├── types/
│ │ │ ├── chat.ts
│ │ │ ├── data.ts
│ │ │ ├── env.ts
│ │ │ ├── error.ts
│ │ │ ├── export.ts
│ │ │ ├── folder.ts
│ │ │ ├── index.ts
│ │ │ ├── prompt.ts
│ │ │ ├── settings.ts
│ │ │ ├── storage.ts
│ │ │ └── websocket.ts
│ │ ├── utils/
│ │ │ ├── app/
│ │ │ │ ├── api.ts
│ │ │ │ ├── clean.ts
│ │ │ │ ├── codeblock.ts
│ │ │ │ ├── const.ts
│ │ │ │ ├── conversation.ts
│ │ │ │ ├── folders.ts
│ │ │ │ ├── helper.ts
│ │ │ │ ├── importExport.ts
│ │ │ │ ├── prompts.ts
│ │ │ │ └── settings.ts
│ │ │ ├── chatTransform.ts
│ │ │ ├── data/
│ │ │ │ └── throttle.ts
│ │ │ ├── media/
│ │ │ │ └── validation.ts
│ │ │ ├── security/
│ │ │ │ ├── import-validation.ts
│ │ │ │ ├── oauth-validation.ts
│ │ │ │ └── url-validation.js
│ │ │ ├── server/
│ │ │ │ ├── apiWrapper.ts
│ │ │ │ └── chatApiHandler.ts
│ │ │ └── shared/
│ │ │ ├── clipboard.ts
│ │ │ ├── formatters.ts
│ │ │ └── videoUpload.ts
│ │ └── vitest.config.ts
│ └── nv-metropolis-bp-vss-ui/
│ ├── README.md
│ ├── alerts/
│ │ ├── .gitignore
│ │ ├── .swcrc
│ │ ├── README.md
│ │ ├── __mocks__/
│ │ │ └── @nemo-agent-toolkit-ui.js
│ │ ├── __tests__/
│ │ │ ├── components/
│ │ │ │ ├── AlertsComponent.test.tsx
│ │ │ │ ├── CustomTimeInput.test.tsx
│ │ │ │ ├── FilterControls.test.tsx
│ │ │ │ └── FilterTag.test.tsx
│ │ │ ├── hooks/
│ │ │ │ ├── useAlerts.test.ts
│ │ │ │ ├── useAutoRefresh.test.ts
│ │ │ │ ├── useFilters.test.ts
│ │ │ │ ├── useTimeWindow.test.ts
│ │ │ │ └── useVideoModal.test.ts
│ │ │ └── utils/
│ │ │ └── timeUtils.test.ts
│ │ ├── jest.config.js
│ │ ├── jest.setup.js
│ │ ├── lib-src/
│ │ │ ├── AlertsComponent.tsx
│ │ │ ├── components/
│ │ │ │ ├── AlertsSidebarControls.tsx
│ │ │ │ ├── AlertsTable.tsx
│ │ │ │ ├── AutoRefreshControl.tsx
│ │ │ │ ├── CustomTimeInput.tsx
│ │ │ │ ├── FilterControls.tsx
│ │ │ │ ├── FilterTag.tsx
│ │ │ │ ├── MetadataSection.tsx
│ │ │ │ ├── ThumbnailButton.tsx
│ │ │ │ └── TimeFormatSwitch.tsx
│ │ │ ├── hooks/
│ │ │ │ ├── useAlerts.ts
│ │ │ │ ├── useAutoRefresh.ts
│ │ │ │ ├── useFilters.ts
│ │ │ │ ├── useTimeWindow.ts
│ │ │ │ └── useVideoModal.ts
│ │ │ ├── index.ts
│ │ │ ├── server.d.ts
│ │ │ ├── server.ts
│ │ │ ├── types.ts
│ │ │ └── utils/
│ │ │ └── timeUtils.ts
│ │ ├── package.json
│ │ ├── tsconfig.json
│ │ └── tsconfig.lib.json
│ ├── all/
│ │ ├── .gitignore
│ │ ├── .swcrc
│ │ ├── README.md
│ │ ├── lib-src/
│ │ │ ├── index.d.ts
│ │ │ ├── index.ts
│ │ │ ├── server.d.ts
│ │ │ └── server.ts
│ │ ├── package.json
│ │ ├── tsconfig.json
│ │ └── tsconfig.lib.json
│ ├── dashboard/
│ │ ├── .gitignore
│ │ ├── .swcrc
│ │ ├── README.md
│ │ ├── lib-src/
│ │ │ ├── DashboardComponent.tsx
│ │ │ ├── components/
│ │ │ │ └── DashboardSidebarControls.tsx
│ │ │ ├── index.ts
│ │ │ ├── server.d.ts
│ │ │ └── server.ts
│ │ ├── package.json
│ │ ├── tsconfig.json
│ │ └── tsconfig.lib.json
│ ├── map/
│ │ ├── .swcrc
│ │ ├── README.md
│ │ ├── lib-src/
│ │ │ ├── MapComponent.tsx
│ │ │ ├── components/
│ │ │ │ └── MapSidebarControls.tsx
│ │ │ ├── index.ts
│ │ │ ├── server.d.ts
│ │ │ └── server.ts
│ │ ├── package.json
│ │ ├── tsconfig.json
│ │ └── tsconfig.lib.json
│ ├── search/
│ │ ├── .gitignore
│ │ ├── .swcrc
│ │ ├── README.md
│ │ ├── __mocks__/
│ │ │ └── @nemo-agent-toolkit-ui.js
│ │ ├── __tests__/
│ │ │ ├── components/
│ │ │ │ ├── FilterPopover.test.tsx
│ │ │ │ ├── SearchComponent.test.tsx
│ │ │ │ ├── SearchHeader.test.tsx
│ │ │ │ └── VideoSearchList.test.tsx
│ │ │ ├── hooks/
│ │ │ │ ├── useFilter.test.ts
│ │ │ │ ├── useSearch.test.ts
│ │ │ │ └── useVideoModal.test.ts
│ │ │ └── utils/
│ │ │ ├── Formatter.test.ts
│ │ │ └── agentResponseParser.test.ts
│ │ ├── jest.config.js
│ │ ├── jest.setup.js
│ │ ├── lib-src/
│ │ │ ├── SearchComponent.tsx
│ │ │ ├── components/
│ │ │ │ ├── FilterPopover.tsx
│ │ │ │ ├── SearchHeader.tsx
│ │ │ │ ├── SearchSidebarControls.tsx
│ │ │ │ └── VideoSearchList.tsx
│ │ │ ├── hooks/
│ │ │ │ ├── useFilter.ts
│ │ │ │ ├── useSearch.ts
│ │ │ │ └── useVideoModal.ts
│ │ │ ├── index.ts
│ │ │ ├── server.d.ts
│ │ │ ├── server.ts
│ │ │ ├── types.ts
│ │ │ └── utils/
│ │ │ ├── Formatter.ts
│ │ │ └── agentResponseParser.ts
│ │ ├── package.json
│ │ ├── tsconfig.json
│ │ └── tsconfig.lib.json
│ └── video-management/
│ ├── .swcrc
│ ├── __mocks__/
│ │ └── @nemo-agent-toolkit-ui.js
│ ├── __tests__/
│ │ ├── components/
│ │ │ └── StreamsGrid.test.tsx
│ │ └── utils/
│ │ └── filterStreams.test.ts
│ ├── jest.config.js
│ ├── jest.setup.js
│ ├── lib-src/
│ │ ├── VideoManagementComponent.tsx
│ │ ├── api.ts
│ │ ├── components/
│ │ │ ├── AddRtspDialog.tsx
│ │ │ ├── AgentUploadDialog.tsx
│ │ │ ├── EmptyState.tsx
│ │ │ ├── LoadingState.tsx
│ │ │ ├── StreamCard.tsx
│ │ │ ├── StreamsGrid.tsx
│ │ │ ├── Toolbar.tsx
│ │ │ ├── UploadProgressPanel.tsx
│ │ │ ├── VideoManagementSidebarControls.tsx
│ │ │ └── index.ts
│ │ ├── constants.ts
│ │ ├── hooks/
│ │ │ ├── index.ts
│ │ │ ├── useStorageTimelines.ts
│ │ │ └── useStreams.ts
│ │ ├── index.ts
│ │ ├── rtspStream.ts
│ │ ├── server.ts
│ │ ├── types.ts
│ │ ├── utils.ts
│ │ └── videoDelete.ts
│ ├── package.json
│ ├── tsconfig.json
│ └── tsconfig.lib.json
└── turbo.json
Showing preview only (331K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3430 symbols across 375 files)
FILE: .github/scripts/check_copyright_headers.py
function git_ls_files (line 48) | def git_ls_files() -> list[str]:
function is_excluded (line 59) | def is_excluded(path: str) -> bool:
function has_spdx_header (line 64) | def has_spdx_header(filepath: str) -> bool:
function main (line 78) | def main() -> int:
FILE: agent/docker/cleanup_vulnerabilities.py
function remove_path (line 27) | def remove_path(path):
function find_all_expat_files (line 49) | def find_all_expat_files():
function main (line 71) | def main():
FILE: agent/docker/verify_ffmpeg_tarball.py
function find_tarball (line 40) | def find_tarball(search_dir: Path) -> Path | None:
function is_valid_gzip (line 46) | def is_valid_gzip(filepath: Path) -> bool:
function get_file_info (line 57) | def get_file_info(filepath: Path) -> str:
function main (line 70) | def main() -> int:
FILE: agent/src/sitecustomize.py
function _load_env_file (line 38) | def _load_env_file(env_path: Path) -> None:
function _auto_load_env_files (line 51) | def _auto_load_env_files() -> None:
FILE: agent/src/vss_agents/agents/critic_agent.py
class CriticAgentConfig (line 87) | class CriticAgentConfig(FunctionBaseConfig, name="critic_agent"):
class VideoInfo (line 111) | class VideoInfo(BaseModel):
class CriticAgentInput (line 125) | class CriticAgentInput(BaseModel):
class CriticAgentResult (line 137) | class CriticAgentResult(Enum):
class VideoResult (line 146) | class VideoResult(BaseModel):
class CriticAgentOutput (line 157) | class CriticAgentOutput(BaseModel):
function get_json_from_string (line 163) | def get_json_from_string(string: str) -> str:
function _convert_to_seconds (line 171) | def _convert_to_seconds(timestamp: str, video_start_dt: datetime) -> float:
function critic_agent (line 178) | async def critic_agent(config: CriticAgentConfig, builder: Builder) -> A...
FILE: agent/src/vss_agents/agents/data_models.py
class AgentDecision (line 26) | class AgentDecision(enum.StrEnum):
class AgentMessageChunkType (line 35) | class AgentMessageChunkType(enum.StrEnum):
class AgentMessageChunk (line 45) | class AgentMessageChunk(BaseModel):
class AgentOutput (line 52) | class AgentOutput(BaseModel):
FILE: agent/src/vss_agents/agents/multi_report_agent.py
class MultiReportAgentInput (line 43) | class MultiReportAgentInput(BaseModel):
class MultiReportAgentConfig (line 68) | class MultiReportAgentConfig(FunctionBaseConfig, name="multi_report_agen...
function multi_report_agent (line 88) | async def multi_report_agent(config: MultiReportAgentConfig, builder: Bu...
FILE: agent/src/vss_agents/agents/postprocessing/data_models.py
class ValidatorResult (line 27) | class ValidatorResult(BaseModel):
class PostprocessingResult (line 35) | class PostprocessingResult(BaseModel):
class BaseValidatorConfig (line 45) | class BaseValidatorConfig(BaseModel):
class URLValidatorConfig (line 51) | class URLValidatorConfig(BaseValidatorConfig):
class NonEmptyResponseValidatorConfig (line 59) | class NonEmptyResponseValidatorConfig(BaseValidatorConfig):
class LLMBasedRuleValidatorConfig (line 65) | class LLMBasedRuleValidatorConfig(BaseValidatorConfig):
class ValidatorsConfig (line 75) | class ValidatorsConfig(BaseModel):
class PostprocessingConfig (line 83) | class PostprocessingConfig(BaseModel):
FILE: agent/src/vss_agents/agents/postprocessing/postprocessing_node.py
function _format_message (line 44) | def _format_message(msg: BaseMessage) -> str:
function extract_current_trajectory (line 65) | def extract_current_trajectory(scratchpad: list[BaseMessage]) -> str:
class PostprocessingNode (line 99) | class PostprocessingNode:
method __init__ (line 102) | def __init__(
method _create_validators (line 114) | def _create_validators(self) -> None:
method _run_validator (line 142) | async def _run_validator(self, validator: BaseValidator, **kwargs: Any...
method process (line 163) | async def process(
FILE: agent/src/vss_agents/agents/postprocessing/validators/base.py
class BaseValidator (line 26) | class BaseValidator(ABC):
method __init__ (line 31) | def __init__(
method validate (line 43) | async def validate(self, output: str, **kwargs: Any) -> ValidatorResult:
method format_feedback (line 52) | def format_feedback(self, issues: list[str]) -> str:
FILE: agent/src/vss_agents/agents/postprocessing/validators/llm_based_rule_validator.py
class LLMBasedRuleValidatorOutput (line 39) | class LLMBasedRuleValidatorOutput(BaseModel):
class LLMBasedRuleValidator (line 59) | class LLMBasedRuleValidator(BaseValidator):
method __init__ (line 64) | def __init__(
method validate (line 89) | async def validate(self, output: str, **kwargs: Any) -> ValidatorResult:
FILE: agent/src/vss_agents/agents/postprocessing/validators/non_empty_response_validator.py
class NonEmptyResponseValidator (line 27) | class NonEmptyResponseValidator(BaseValidator):
method __init__ (line 32) | def __init__(
method validate (line 46) | async def validate(self, output: str, **kwargs: Any) -> ValidatorResul...
FILE: agent/src/vss_agents/agents/postprocessing/validators/url_validator.py
function _strip_url (line 75) | def _strip_url(url: str) -> str:
function extract_urls_from_tags_with_alt (line 80) | def extract_urls_from_tags_with_alt(text: str) -> list[str]:
function extract_urls_from_markdown_links (line 96) | def extract_urls_from_markdown_links(text: str) -> list[str]:
function is_valid_url (line 106) | def is_valid_url(src: str) -> bool:
function extract_urls (line 111) | def extract_urls(text: str) -> list[str]:
class URLValidator (line 123) | class URLValidator(BaseValidator):
method __init__ (line 128) | def __init__(
method validate (line 153) | async def validate(self, output: str, **kwargs: Any) -> ValidatorResul...
method _validate_url (line 195) | async def _validate_url(self, session: aiohttp.ClientSession, url: str...
method _try_request (line 217) | async def _try_request(self, session: aiohttp.ClientSession, url: str)...
FILE: agent/src/vss_agents/agents/report_agent.py
class ReportAgentInput (line 54) | class ReportAgentInput(BaseModel):
class VideoReportAgentInput (line 90) | class VideoReportAgentInput(BaseModel):
class ReportAgentConfig (line 112) | class ReportAgentConfig(FunctionBaseConfig, name="report_agent"):
function report_agent (line 135) | async def report_agent(config: ReportAgentConfig, builder: Builder) -> A...
FILE: agent/src/vss_agents/agents/search_agent.py
function _to_search_results (line 58) | def _to_search_results(raw: list) -> list[SearchResult]:
class SearchAgentInput (line 79) | class SearchAgentInput(BaseModel):
class SearchAgentConfig (line 98) | class SearchAgentConfig(FunctionBaseConfig, name="search_agent"):
function _to_incidents_output (line 177) | def _to_incidents_output(search_output: SearchOutput) -> str:
function _helper_markdown_bullet_list (line 207) | def _helper_markdown_bullet_list(search_output: SearchOutput) -> str:
function _to_chat_response (line 230) | def _to_chat_response(search_output: SearchOutput) -> ChatResponse:
function _to_chat_response_chunk (line 236) | def _to_chat_response_chunk(search_output: SearchOutput) -> ChatResponse...
function search_agent (line 243) | async def search_agent(config: SearchAgentConfig, builder: Builder) -> A...
FILE: agent/src/vss_agents/agents/top_agent.py
class TopAgentRequest (line 90) | class TopAgentRequest(ChatRequestOrMessage):
function _extract_text_content (line 100) | def _extract_text_content(message: "Message") -> dict:
function _get_content_text (line 132) | def _get_content_text(msg: BaseMessage) -> str:
function strip_frontend_tags (line 147) | def strip_frontend_tags(content: str) -> str:
class TopAgentState (line 166) | class TopAgentState(BaseModel):
class TopAgentConfig (line 186) | class TopAgentConfig(FunctionBaseConfig, name="top_agent"):
class TopAgent (line 229) | class TopAgent(AsyncMixin):
method __ainit__ (line 250) | async def __ainit__(
method _get_tool (line 313) | def _get_tool(self, tool_name: str) -> BaseTool | None:
method _plan_update_node (line 320) | async def _plan_update_node(self, state: TopAgentState) -> TopAgentState:
method _tool_accepts_param (line 407) | def _tool_accepts_param(self, tool_name: str, param_name: str) -> bool:
method astream (line 415) | async def astream(
method _plan_node (line 539) | async def _plan_node(self, state: TopAgentState) -> TopAgentState:
method agent_node (line 651) | async def agent_node(self, state: TopAgentState) -> TopAgentState:
method tool_or_subagent_node (line 757) | async def tool_or_subagent_node(self, state: TopAgentState) -> TopAgen...
method _postprocessing_node (line 1031) | async def _postprocessing_node(self, state: TopAgentState) -> TopAgent...
method _conditional_edge (line 1058) | async def _conditional_edge(self, state: TopAgentState) -> str:
method _conditional_edge_from_tool (line 1091) | async def _conditional_edge_from_tool(self, state: TopAgentState) -> str:
method finalize_node (line 1104) | async def finalize_node(self, state: TopAgentState) -> TopAgentState:
method _build_graph (line 1129) | async def _build_graph(self) -> CompiledStateGraph:
function _extract_prompt_sections (line 1197) | async def _extract_prompt_sections(
function _get_subagents (line 1248) | async def _get_subagents(subagent_names: list[str], builder: Builder) ->...
function top_agent (line 1288) | async def top_agent(config: TopAgentConfig, builder: Builder) -> AsyncGe...
FILE: agent/src/vss_agents/api/custom_fastapi_worker.py
class CustomFastApiFrontEndWorker (line 31) | class CustomFastApiFrontEndWorker(FastApiFrontEndPluginWorker):
method __init__ (line 36) | def __init__(self, config: Config):
method add_routes (line 40) | async def add_routes(self, app: FastAPI, builder: WorkflowBuilder) -> ...
method _maybe_register_streaming_routes (line 65) | def _maybe_register_streaming_routes(self, app: FastAPI) -> None:
FILE: agent/src/vss_agents/api/health_endpoint.py
class HealthEndpointConfig (line 35) | class HealthEndpointConfig(FunctionBaseConfig, name="health_endpoint"):
function health_endpoint (line 42) | async def health_endpoint(config: HealthEndpointConfig, _: Builder) -> A...
FILE: agent/src/vss_agents/api/rtsp_stream_api.py
class StreamMode (line 39) | class StreamMode(StrEnum):
class ServiceConfig (line 53) | class ServiceConfig:
method __init__ (line 56) | def __init__(
class AddStreamRequest (line 78) | class AddStreamRequest(BaseModel):
class AddStreamResponse (line 91) | class AddStreamResponse(BaseModel):
class DeleteStreamResponse (line 99) | class DeleteStreamResponse(BaseModel):
function add_to_vst (line 112) | async def add_to_vst(config: ServiceConfig, request: AddStreamRequest) -...
function cleanup_vst_sensor (line 141) | async def cleanup_vst_sensor(config: ServiceConfig, sensor_id: str | Non...
function cleanup_vst_storage (line 146) | async def cleanup_vst_storage(config: ServiceConfig, sensor_id: str | No...
function get_stream_info_by_name (line 151) | async def get_stream_info_by_name(config: ServiceConfig, name: str) -> t...
function add_to_rtvi_cv (line 167) | async def add_to_rtvi_cv(
function add_to_rtvi_embed (line 210) | async def add_to_rtvi_embed(
function start_embedding_generation (line 253) | async def start_embedding_generation(
function cleanup_rtvi_cv (line 305) | async def cleanup_rtvi_cv(
function cleanup_rtvi_embed_stream (line 337) | async def cleanup_rtvi_embed_stream(
function cleanup_rtvi_embed_generation (line 357) | async def cleanup_rtvi_embed_generation(
function create_rtsp_stream_api_router (line 382) | def create_rtsp_stream_api_router(
function register_rtsp_stream_api_routes (line 619) | def register_rtsp_stream_api_routes(app: FastAPI, config: Any) -> None:
FILE: agent/src/vss_agents/api/video_delete.py
class DeleteVideoResponse (line 50) | class DeleteVideoResponse(BaseModel):
function _remove_from_rtvi_cv (line 63) | async def _remove_from_rtvi_cv(
function _delete_es_documents (line 113) | async def _delete_es_documents(es_endpoint: str, index_pattern: str, id_...
function create_video_delete_router (line 163) | def create_video_delete_router(
function register_video_delete_routes (line 315) | def register_video_delete_routes(app: "FastAPI", config: "Any") -> None:
FILE: agent/src/vss_agents/api/video_search_ingest.py
class VideoIngestResponse (line 48) | class VideoIngestResponse(BaseModel):
function create_streaming_video_ingest_router (line 57) | def create_streaming_video_ingest_router(
function register_streaming_routes (line 350) | def register_streaming_routes(app: "FastAPI", config: "Any") -> None:
FILE: agent/src/vss_agents/api/video_upload_url.py
class VideoUploadURLConfig (line 34) | class VideoUploadURLConfig(FunctionBaseConfig, name="video_upload_url"):
class VideoUploadURLInput (line 47) | class VideoUploadURLInput(BaseModel):
class VideoUploadURLOutput (line 61) | class VideoUploadURLOutput(BaseModel):
function video_upload_url (line 71) | async def video_upload_url(config: VideoUploadURLConfig, _builder: Build...
FILE: agent/src/vss_agents/data_models/__init__.py
class ParserMixin (line 20) | class ParserMixin(ABC):
method get_output_parser (line 24) | def get_output_parser(cls) -> PydanticOutputParser:
FILE: agent/src/vss_agents/data_models/vss.py
function float_to_int (line 27) | def float_to_int(v: float | int) -> int:
class MediaInfoOffset (line 31) | class MediaInfoOffset(BaseModel):
method validate_start_and_end (line 62) | def validate_start_and_end(cls, data: dict[str, Any]) -> dict[str, Any]:
function timestamp_validator (line 76) | def timestamp_validator(v: str, validation_info: Any) -> str:
function remove_timezone (line 88) | def remove_timezone(dt: datetime | str) -> datetime:
FILE: agent/src/vss_agents/embed/cosmos_embed.py
class CosmosEmbedClient (line 25) | class CosmosEmbedClient(EmbedClient):
method __init__ (line 26) | def __init__(self, endpoint: str):
method get_image_embedding (line 33) | async def get_image_embedding(self, image_url: str) -> list[float]:
method get_text_embedding (line 62) | async def get_text_embedding(self, text: str) -> list[float]:
method get_video_embedding (line 82) | async def get_video_embedding(self, video_url: str) -> list[float]:
method get_video_embeddings_from_urls (line 86) | async def get_video_embeddings_from_urls(self, urls: list[str]) -> lis...
FILE: agent/src/vss_agents/embed/embed.py
class EmbedClient (line 19) | class EmbedClient(ABC):
method get_image_embedding (line 23) | async def get_image_embedding(self, image_url: str) -> list[float]:
method get_text_embedding (line 28) | async def get_text_embedding(self, text: str) -> list[float]:
method get_video_embedding (line 33) | async def get_video_embedding(self, video_url: str) -> list[float]:
FILE: agent/src/vss_agents/embed/rtvi_cv_embed.py
class RTVICVEmbedClient (line 26) | class RTVICVEmbedClient(EmbedClient):
method __init__ (line 29) | def __init__(self, endpoint: str):
method get_text_embedding (line 40) | async def get_text_embedding(self, text: str) -> list[float]:
method get_image_embedding (line 77) | async def get_image_embedding(self, image_url: str) -> list[float]:
method get_video_embedding (line 82) | async def get_video_embedding(self, video_url: str) -> list[float]:
FILE: agent/src/vss_agents/evaluators/customized_qa_evaluator/evaluate.py
class CustomizedQAEvaluator (line 80) | class CustomizedQAEvaluator(BaseEvaluator):
method __init__ (line 90) | def __init__(
method evaluate_item (line 124) | async def evaluate_item(self, item: EvalInputItem) -> EvalOutputItem:
FILE: agent/src/vss_agents/evaluators/customized_qa_evaluator/register.py
class CustomizedQAEvaluatorConfig (line 26) | class CustomizedQAEvaluatorConfig(EvaluatorBaseConfig, name="customized_...
function register_customized_qa_evaluator (line 55) | async def register_customized_qa_evaluator(
FILE: agent/src/vss_agents/evaluators/customized_trajectory_evaluator/evaluate.py
class CustomizedTrajectoryEvaluator (line 41) | class CustomizedTrajectoryEvaluator(BaseEvaluator):
method __init__ (line 42) | def __init__(
method _format_tool_schemas (line 72) | def _format_tool_schemas(self) -> str:
method _extract_tool_calls_from_llm_end (line 94) | def _extract_tool_calls_from_llm_end(self, llm_end_step: Any) -> list[...
method _get_agent_selected_uuids (line 119) | def _get_agent_selected_uuids(self, trajectory: list[Any]) -> set[str]:
method evaluate_item (line 185) | async def evaluate_item(self, item: EvalInputItem) -> EvalOutputItem:
FILE: agent/src/vss_agents/evaluators/customized_trajectory_evaluator/register.py
class CustomizedTrajectoryEvaluatorConfig (line 28) | class CustomizedTrajectoryEvaluatorConfig(EvaluatorBaseConfig, name="cus...
function register_customized_trajectory_evaluator (line 64) | async def register_customized_trajectory_evaluator(
FILE: agent/src/vss_agents/evaluators/evaluate_patch.py
class DatasetFilter (line 76) | class DatasetFilter(enum.StrEnum):
function _get_conversation (line 83) | def _get_conversation(dataset_entry: dict) -> list:
function is_multi_turn_item (line 94) | def is_multi_turn_item(dataset_entry: dict) -> bool:
function _expand_multi_turn_items (line 104) | def _expand_multi_turn_items(eval_input_items: list) -> list:
function _filter_by_dataset_filter (line 146) | def _filter_by_dataset_filter(items: list, dataset_filter: list[str]) ->...
function _write_latency_summary (line 201) | def _write_latency_summary(evaluation_run: Any, items: list[Any]) -> flo...
function apply_patch (line 232) | def apply_patch() -> None:
FILE: agent/src/vss_agents/evaluators/report_evaluator/data_models.py
class EvaluationScore (line 23) | class EvaluationScore(BaseModel):
method from_error (line 36) | def from_error(
FILE: agent/src/vss_agents/evaluators/report_evaluator/eval_config_models.py
class FieldConfig (line 23) | class FieldConfig(BaseModel):
method validate_and_collect_methods (line 40) | def validate_and_collect_methods(self) -> "FieldConfig":
class EvalMetricsConfig (line 75) | class EvalMetricsConfig(BaseModel):
method from_dict (line 94) | def from_dict(cls, config: dict[str, Any]) -> "EvalMetricsConfig":
FILE: agent/src/vss_agents/evaluators/report_evaluator/evaluate.py
class ExtendedEvalOutputItem (line 49) | class ExtendedEvalOutputItem(EvalOutputItem):
class ExtendedEvalOutput (line 55) | class ExtendedEvalOutput(EvalOutput):
class ReportEvaluatorConfig (line 63) | class ReportEvaluatorConfig(EvaluatorBaseConfig, name="report_evaluator"):
function _load_eval_metrics_yaml (line 99) | def _load_eval_metrics_yaml(config_path: str) -> EvalMetricsConfig:
function _fetch_and_parse_report (line 127) | async def _fetch_and_parse_report(
class ReportEvaluator (line 165) | class ReportEvaluator(BaseEvaluator):
method __init__ (line 172) | def __init__(
method evaluate (line 209) | async def evaluate(self, eval_input_items: list[EvalInputItem]) -> Ext...
method evaluate_item (line 248) | async def evaluate_item(self, item: EvalInputItem) -> ExtendedEvalOutp...
method evaluate_tree (line 343) | async def evaluate_tree(self, reference: Any, actual: Any, config: Fie...
method _score_value (line 488) | async def _score_value(self, reference: Any, actual: Any, method: str,...
FILE: agent/src/vss_agents/evaluators/report_evaluator/field_evaluators/base.py
function register_metric (line 27) | def register_metric(name: str) -> Callable[[type["EvaluationMetric"]], t...
class EvaluationMetric (line 56) | class EvaluationMetric(ABC):
method evaluate (line 60) | async def evaluate(self, actual: Any, reference: Any, field_name: str ...
FILE: agent/src/vss_agents/evaluators/report_evaluator/field_evaluators/common.py
function tokenize_text (line 25) | def tokenize_text(text: str) -> list[str]:
function calculate_f1_score (line 31) | def calculate_f1_score(pred_tokens: list[str], ref_tokens: list[str]) ->...
class NonEmptyMetric (line 57) | class NonEmptyMetric(EvaluationMetric):
method evaluate (line 60) | async def evaluate(self, actual: str, reference: str, field_name: str ...
class F1Metric (line 65) | class F1Metric(EvaluationMetric):
method evaluate (line 68) | async def evaluate(self, actual: str, reference: str, field_name: str ...
class ExactMatchMetric (line 76) | class ExactMatchMetric(EvaluationMetric):
method evaluate (line 79) | async def evaluate(self, actual: str, reference: str, field_name: str ...
class RegexMetric (line 89) | class RegexMetric(EvaluationMetric):
method evaluate (line 92) | async def evaluate(self, actual: str, reference: str, field_name: str ...
FILE: agent/src/vss_agents/evaluators/report_evaluator/field_evaluators/llm_judge.py
class FieldEvaluation (line 46) | class FieldEvaluation(BaseModel):
class LLMJudgeMetric (line 54) | class LLMJudgeMetric(EvaluationMetric):
method __init__ (line 63) | def __init__(self, **kwargs: Any) -> None:
method _invoke_llm (line 97) | async def _invoke_llm(
method evaluate (line 153) | async def evaluate(self, actual: Any, reference: Any, field_name: str ...
method evaluate_with_field_discovery (line 201) | async def evaluate_with_field_discovery(
FILE: agent/src/vss_agents/evaluators/report_evaluator/register.py
function register_report_evaluator (line 33) | async def register_report_evaluator(
FILE: agent/src/vss_agents/evaluators/utils.py
function compute_item_latency (line 39) | def compute_item_latency(item: EvalInputItem) -> float | None:
function should_evaluate (line 55) | def should_evaluate(item: EvalInputItem, evaluator_type: str) -> bool:
class ScoreOutputParser (line 88) | class ScoreOutputParser:
method parse (line 95) | def parse(self, response: Any) -> dict:
function strip_agent_think_tags (line 135) | def strip_agent_think_tags(text: str) -> str:
function invoke_llm_with_retry (line 153) | async def invoke_llm_with_retry(
FILE: agent/src/vss_agents/tools/attribute_search.py
class AttributeSearchInput (line 51) | class AttributeSearchInput(BaseModel):
class AttributeSearchMetadata (line 99) | class AttributeSearchMetadata(BaseModel):
class AttributeSearchResult (line 114) | class AttributeSearchResult(BaseModel):
class AttributeSearchConfig (line 121) | class AttributeSearchConfig(FunctionBaseConfig, name="attribute_search"):
function _perform_frame_lookups (line 224) | async def _perform_frame_lookups(
function _get_frame_from_behavior (line 291) | async def _get_frame_from_behavior(
function _search_behavior (line 421) | async def _search_behavior(
function _build_result (line 562) | async def _build_result(
function _extend_clip_to_one_second (line 685) | async def _extend_clip_to_one_second(
function _deduplicate_by_object (line 767) | def _deduplicate_by_object(
function search_by_attributes (line 877) | async def search_by_attributes(
function search_single_attribute (line 984) | async def search_single_attribute(
function search_attributes (line 1010) | async def search_attributes(
function _fuse_multi_attribute (line 1078) | async def _fuse_multi_attribute(
function _append_multi_attribute (line 1179) | async def _append_multi_attribute(
function build_attribute_search (line 1269) | async def build_attribute_search(config: AttributeSearchConfig, _builder...
FILE: agent/src/vss_agents/tools/chart_generator.py
class ChartType (line 46) | class ChartType(StrEnum):
class ChartFileFormat (line 51) | class ChartFileFormat(StrEnum):
class ChartData (line 57) | class ChartData(BaseModel):
class BarChartData (line 62) | class BarChartData(ChartData):
class PieChartData (line 69) | class PieChartData(ChartData):
class ChartGeneratorConfig (line 77) | class ChartGeneratorConfig(FunctionBaseConfig, name="chart_generator"):
method must_be_directory_url (line 89) | def must_be_directory_url(cls, v: str) -> str:
class ChartGeneratorInput (line 107) | class ChartGeneratorInput(BaseModel):
method validate_and_sanitize_output_dir (line 116) | def validate_and_sanitize_output_dir(cls, v: str | None) -> str | None:
class ChartGenExecOutput (line 124) | class ChartGenExecOutput(BaseModel):
function plot_bar_chart (line 133) | def plot_bar_chart(bar_chart_data: BarChartData) -> matplotlib.figure.Fi...
function plot_pie_chart (line 174) | def plot_pie_chart(pie_chart_data: PieChartData) -> matplotlib.figure.Fi...
function convert_to_format (line 210) | def convert_to_format(chart: matplotlib.figure.Figure, chart_file_format...
function _str_input_converter (line 217) | def _str_input_converter(input: str) -> ChartGeneratorInput:
function _chat_request_input_converter (line 221) | def _chat_request_input_converter(request: ChatRequest) -> ChartGenerato...
function chart_generator (line 230) | async def chart_generator(config: ChartGeneratorConfig, builder: Builder...
FILE: agent/src/vss_agents/tools/code_executor/docker_backend/__init__.py
function cleanup_docker_resources (line 28) | def cleanup_docker_resources() -> None:
FILE: agent/src/vss_agents/tools/code_executor/docker_backend/docker_executor.py
class DockerExecutor (line 30) | class DockerExecutor:
method __init__ (line 31) | def __init__(self, gpu: bool = False):
method _pack_files (line 36) | def _pack_files(self, files: dict[str, str | bytes]) -> bytes:
method run_code (line 80) | def run_code(
method build_image (line 159) | def build_image(self, image: str, base_image: str, language_packages: ...
FILE: agent/src/vss_agents/tools/code_executor/docker_backend/image_builder.py
class ImageInfo (line 27) | class ImageInfo(TypedDict):
class ImageBuilder (line 34) | class ImageBuilder:
method __new__ (line 50) | def __new__(cls) -> "ImageBuilder":
method _cleanup_at_exit (line 65) | def _cleanup_at_exit(cls) -> None:
method __del__ (line 71) | def __del__(self) -> None:
method reset_instance (line 80) | def reset_instance(cls) -> None:
method cleanup (line 91) | def cleanup(self) -> None:
method _generate_dockerfile (line 113) | def _generate_dockerfile(
method _create_dockerfile_tar (line 177) | def _create_dockerfile_tar(self, dockerfile_content: str) -> bytes:
method build_image (line 189) | def build_image(
method get_image_tag (line 240) | def get_image_tag(self, image: str) -> str | None:
method get_all_images (line 244) | def get_all_images(self) -> dict[str, ImageInfo]:
FILE: agent/src/vss_agents/tools/code_executor/python_executor.py
class CodeExecutorConfig (line 35) | class CodeExecutorConfig(FunctionBaseConfig, name="python_executor"):
class CodeExecutorInput (line 56) | class CodeExecutorInput(BaseModel):
class CodeExecutorOutput (line 69) | class CodeExecutorOutput(BaseModel):
function python_executor (line 76) | async def python_executor(config: CodeExecutorConfig, _builder: Builder)...
FILE: agent/src/vss_agents/tools/embed_search.py
function _sanitize_for_logging (line 51) | def _sanitize_for_logging(obj: Any) -> Any:
class EmbedSearchResultItem (line 85) | class EmbedSearchResultItem(BaseModel):
class EmbedSearchOutput (line 97) | class EmbedSearchOutput(BaseModel):
class QueryInput (line 104) | class QueryInput(BaseModel):
class EmbedSearchConfig (line 121) | class EmbedSearchConfig(FunctionBaseConfig, name="embed_search"):
function _str_input_converter (line 151) | def _str_input_converter(input: str) -> QueryInput:
function _chat_request_input_converter (line 168) | def _chat_request_input_converter(request: ChatRequest) -> QueryInput:
function _to_str_output (line 188) | def _to_str_output(output: EmbedSearchOutput) -> str:
function _generate_query_embedding (line 193) | async def _generate_query_embedding(query_input: QueryInput, embed_clien...
function _build_es_query (line 224) | def _build_es_query(query_input: QueryInput, query_embedding: list[float...
function _process_search_hit (line 399) | async def _process_search_hit(
function embed_search (line 591) | async def embed_search(config: EmbedSearchConfig, _builder: Builder) -> ...
FILE: agent/src/vss_agents/tools/evaluation_compressor.py
class EvaluationCompressorConfig (line 46) | class EvaluationCompressorConfig(FunctionBaseConfig, name="evaluation_co...
class EvaluationCompressorInput (line 56) | class EvaluationCompressorInput(BaseModel):
function remove_caption_details (line 60) | def remove_caption_details(text: str) -> str:
function count_sections_by_token_limit (line 78) | def count_sections_by_token_limit(input_text: str, token_limit: int, llm...
function split_text_by_sections (line 97) | def split_text_by_sections(input_text: str, num_sections: int) -> list:
function evaluation_compressor (line 136) | async def evaluation_compressor(config: EvaluationCompressorConfig, buil...
FILE: agent/src/vss_agents/tools/fov_counts_with_chart.py
class FOVCountsWithChartConfig (line 32) | class FOVCountsWithChartConfig(FunctionBaseConfig, name="get_fov_counts_...
class FOVCountsWithChartInput (line 49) | class FOVCountsWithChartInput(BaseModel):
class FOVCountsWithChartOutput (line 71) | class FOVCountsWithChartOutput(BaseModel):
function get_fov_counts_with_chart (line 82) | async def get_fov_counts_with_chart(config: FOVCountsWithChartConfig, bu...
FILE: agent/src/vss_agents/tools/geolocation.py
class GeolocationConfig (line 32) | class GeolocationConfig(FunctionBaseConfig, name="geolocation"):
class GeolocationInput (line 38) | class GeolocationInput(BaseModel):
class GeolocationOutput (line 45) | class GeolocationOutput(BaseModel):
function geolocation (line 71) | async def geolocation(config: GeolocationConfig, __builder: Builder) -> ...
FILE: agent/src/vss_agents/tools/incidents.py
class VARetrievalConfig (line 37) | class VARetrievalConfig(FunctionBaseConfig, name="va_retrieval"):
class VARetrievalInput (line 74) | class VARetrievalInput(BaseModel):
class DuckDBIncidentsManager (line 102) | class DuckDBIncidentsManager:
method __init__ (line 109) | def __init__(self, config: "VARetrievalConfig") -> None:
method normalize_timestamp (line 116) | def normalize_timestamp(timestamp: str | None) -> str | None:
method get_instance (line 149) | async def get_instance(cls, config: VARetrievalConfig) -> "DuckDBIncid...
method _async_init (line 175) | async def _async_init(self) -> None:
method clear_instances (line 200) | def clear_instances(cls) -> None:
method refresh_data (line 205) | async def refresh_data(self) -> None:
method _setup_database (line 213) | def _setup_database(self) -> None:
method load_incidents_from_bucket (line 251) | async def load_incidents_from_bucket(self) -> int:
method load_json_content (line 331) | async def load_json_content(self, content: bytes, source_file: str) ->...
method run_sql (line 389) | def run_sql(self, sql: str) -> list[dict[str, Any]]:
method get_schema (line 395) | def get_schema(self) -> list[tuple[Any, ...]]:
function va_retrieval (line 401) | async def va_retrieval(config: VARetrievalConfig, _builder: Builder) -> ...
FILE: agent/src/vss_agents/tools/lvs_video_understanding.py
class LVSStatus (line 55) | class LVSStatus(StrEnum):
class LVSVideoUnderstandingConfig (line 74) | class LVSVideoUnderstandingConfig(FunctionBaseConfig, name="lvs_video_un...
class LVSVideoUnderstandingInput (line 224) | class LVSVideoUnderstandingInput(BaseModel):
function lvs_video_understanding (line 235) | async def lvs_video_understanding(
FILE: agent/src/vss_agents/tools/multi_incident_formatter.py
function _normalize_timestamp (line 40) | def _normalize_timestamp(timestamp: str) -> str:
class MultiIncidentFormatterConfig (line 62) | class MultiIncidentFormatterConfig(FunctionBaseConfig, name="multi_incid...
class IncidentData (line 98) | class IncidentData(BaseModel):
class MultiIncidentFormatterInput (line 108) | class MultiIncidentFormatterInput(BaseModel):
method normalize_timestamps (line 135) | def normalize_timestamps(cls, v: str | None) -> str | None:
class MultiIncidentFormatterOutput (line 142) | class MultiIncidentFormatterOutput(BaseModel):
function _fetch_incidents (line 159) | async def _fetch_incidents(
function _format_single_incident (line 228) | async def _format_single_incident(
function _generate_incidents_chart (line 313) | async def _generate_incidents_chart(
function _determine_optimal_bin_size (line 361) | def _determine_optimal_bin_size(incidents: list[IncidentData]) -> str | ...
function _generate_time_series_chart (line 450) | async def _generate_time_series_chart(
function _multi_incident_formatter_impl (line 546) | async def _multi_incident_formatter_impl(
function multi_incident_formatter (line 661) | async def multi_incident_formatter(
FILE: agent/src/vss_agents/tools/prompt_gen.py
class PromptGenConfig (line 32) | class PromptGenConfig(FunctionBaseConfig, name="prompt_gen"):
class PromptGenInput (line 39) | class PromptGenInput(BaseModel):
function prompt_gen (line 49) | async def prompt_gen(config: PromptGenConfig, builder: Builder) -> Async...
FILE: agent/src/vss_agents/tools/report_gen.py
class ReportGenConfig (line 37) | class ReportGenConfig(FunctionBaseConfig, name="report_gen"):
class ReportGenInput (line 68) | class ReportGenInput(BaseModel):
class ReportGenOutput (line 77) | class ReportGenOutput(BaseModel):
function _format_messages_to_markdown (line 93) | def _format_messages_to_markdown(messages: list[Any]) -> str:
function _load_custom_template (line 178) | def _load_custom_template(template_path: str, template_name: str) -> str:
function _format_custom_report (line 205) | async def _format_custom_report(
function report_gen (line 246) | async def report_gen(config: ReportGenConfig, builder: Builder) -> Async...
FILE: agent/src/vss_agents/tools/rtvi_vlm_alert.py
class RTVIVLMAlertConfig (line 39) | class RTVIVLMAlertConfig(FunctionBaseConfig, name="rtvi_vlm_alert"):
class RTVIVLMAlertInput (line 77) | class RTVIVLMAlertInput(BaseModel):
class RTVIVLMAlertOutput (line 115) | class RTVIVLMAlertOutput(BaseModel):
function rtvi_vlm_alert (line 133) | async def rtvi_vlm_alert(config: RTVIVLMAlertConfig, builder: Builder) -...
FILE: agent/src/vss_agents/tools/s3_picture_url.py
class S3PictureURLConfig (line 33) | class S3PictureURLConfig(FunctionBaseConfig, name="s3_picture_url"):
class S3PictureURLInput (line 54) | class S3PictureURLInput(BaseModel):
class S3PictureURLOutput (line 64) | class S3PictureURLOutput(BaseModel):
function s3_picture_url (line 82) | async def s3_picture_url(config: S3PictureURLConfig, _builder: Builder) ...
FILE: agent/src/vss_agents/tools/search.py
class DecomposedQuery (line 110) | class DecomposedQuery(BaseModel):
function _run_attribute_only_search (line 127) | async def _run_attribute_only_search(
function attribute_result_to_search_result (line 187) | def attribute_result_to_search_result(
function decompose_query (line 245) | async def decompose_query(
function _apply_weighted_linear_fusion (line 357) | def _apply_weighted_linear_fusion(
function _apply_rrf_fusion (line 396) | def _apply_rrf_fusion(
function _apply_rrf_fusion_with_attribute_rank (line 437) | def _apply_rrf_fusion_with_attribute_rank(
function fusion_search_rerank (line 487) | async def fusion_search_rerank(
function execute_core_search (line 662) | async def execute_core_search(
function execute_core_search_wrapper (line 1121) | async def execute_core_search_wrapper(
class SearchConfig (line 1150) | class SearchConfig(FunctionBaseConfig, name="search"):
class SearchInput (line 1237) | class SearchInput(BaseModel):
class SearchResult (line 1296) | class SearchResult(BaseModel):
class SearchOutput (line 1311) | class SearchOutput(BaseModel):
function search (line 1323) | async def search(config: SearchConfig, _builder: Builder) -> AsyncGenera...
FILE: agent/src/vss_agents/tools/template_report_gen.py
function _get_object_store_url (line 55) | def _get_object_store_url(object_store: Any, filename: str, config: "Tem...
function _replace_public_urls_with_private (line 86) | def _replace_public_urls_with_private(
class TemplateReportGenConfig (line 145) | class TemplateReportGenConfig(FunctionBaseConfig, name="template_report_...
class TemplateReportGenInput (line 226) | class TemplateReportGenInput(BaseModel):
class TemplateReportGenOutput (line 237) | class TemplateReportGenOutput(BaseModel):
function _convert_markdown_to_pdf (line 251) | def _convert_markdown_to_pdf(markdown_file_path: str, output_pdf_path: s...
function _load_custom_template (line 478) | def _load_custom_template(template_path: str, template_name: str) -> str:
function _fetch_cv_metadata (line 503) | async def _fetch_cv_metadata(
function _fetch_proximity_data (line 528) | async def _fetch_proximity_data(
function _fetch_geolocation_data (line 544) | async def _fetch_geolocation_data(
function _extract_object_ids_from_incident (line 589) | def _extract_object_ids_from_incident(alert_metadata: dict) -> list[str]:
function _run_vlm_analysis (line 623) | async def _run_vlm_analysis(
function _fetch_media_urls_for_report (line 662) | async def _fetch_media_urls_for_report(
function _save_markdown_to_object_store (line 704) | async def _save_markdown_to_object_store(
function _save_pdf_to_object_store (line 736) | async def _save_pdf_to_object_store(
function _fetch_behavior_data (line 801) | async def _fetch_behavior_data(
function _fetch_proximity_threshold (line 878) | async def _fetch_proximity_threshold(
function _format_custom_report (line 926) | async def _format_custom_report(
function template_report_gen (line 1019) | async def template_report_gen(config: TemplateReportGenConfig, builder: ...
FILE: agent/src/vss_agents/tools/video_caption.py
class VideoCaptionConfig (line 61) | class VideoCaptionConfig(FunctionBaseConfig, name="video_caption"):
class VideoCaptionInput (line 102) | class VideoCaptionInput(BaseModel):
method validate_end_timestamp (line 135) | def validate_end_timestamp(cls, info: dict) -> dict:
function call_vlm_partition (line 151) | async def call_vlm_partition(
function video_caption (line 201) | async def video_caption(config: VideoCaptionConfig, builder: Builder) ->...
FILE: agent/src/vss_agents/tools/video_detailed_caption.py
class VideoDetailedCaptionConfig (line 30) | class VideoDetailedCaptionConfig(FunctionBaseConfig, name="video_detaile...
class VideoDetailedCaptionInput (line 43) | class VideoDetailedCaptionInput(BaseModel):
method validate_end_timestamp (line 72) | def validate_end_timestamp(cls, info: dict) -> dict:
function video_detailed_caption (line 82) | async def video_detailed_caption(config: VideoDetailedCaptionConfig, bui...
FILE: agent/src/vss_agents/tools/video_frame_timestamp.py
class VideoFrameTimestampConfig (line 36) | class VideoFrameTimestampConfig(FunctionBaseConfig, name="video_frame_ti...
class VideoFrameTimestampInput (line 49) | class VideoFrameTimestampInput(BaseModel):
function video_frame_timestamp (line 63) | async def video_frame_timestamp(config: VideoFrameTimestampConfig, build...
FILE: agent/src/vss_agents/tools/video_report_gen.py
function _get_object_store_url (line 79) | def _get_object_store_url(object_store: Any, filename: str, config: "Vid...
function _divide_video_into_chunks (line 107) | def _divide_video_into_chunks(
function _remove_som_markers (line 142) | def _remove_som_markers(prompt: str) -> str:
function _replace_public_urls_with_private (line 183) | def _replace_public_urls_with_private(
function _convert_markdown_to_pdf (line 251) | def _convert_markdown_to_pdf(markdown_file_path: str, output_pdf_path: s...
class VideoReportGenConfig (line 358) | class VideoReportGenConfig(FunctionBaseConfig, name="video_report_gen"):
class VideoReportGenInput (line 470) | class VideoReportGenInput(BaseModel):
class VideoReportGenOutput (line 490) | class VideoReportGenOutput(BaseModel):
function _save_markdown_to_object_store (line 504) | async def _save_markdown_to_object_store(
function _save_pdf_to_object_store (line 533) | async def _save_pdf_to_object_store(
class TimestampMatch (line 595) | class TimestampMatch(NamedTuple):
function _parse_timestamps (line 602) | def _parse_timestamps(content: str) -> list[TimestampMatch]:
function _normalize_chunk_timestamps (line 632) | def _normalize_chunk_timestamps(content: str, chunk_start: float, chunk_...
function _filter_short_duration_from_markdown (line 700) | def _filter_short_duration_from_markdown(content: str, min_duration_seco...
function _mmss_to_iso (line 758) | def _mmss_to_iso(time_str: str, ref_timestamp: str) -> str:
function _inject_video_clips (line 786) | async def _inject_video_clips(
function _inject_snapshots (line 866) | async def _inject_snapshots(
function _clean_vlm_response (line 923) | def _clean_vlm_response(vlm_response: str) -> str:
function _filter_short_events (line 977) | def _filter_short_events(events: list[dict | Any], min_duration_seconds:...
function _format_lvs_response (line 1019) | def _format_lvs_response(lvs_response: str) -> str:
function _create_report_header (line 1101) | def _create_report_header(
function video_report_gen (line 1162) | async def video_report_gen(config: VideoReportGenConfig, builder: Builde...
FILE: agent/src/vss_agents/tools/video_skim_caption.py
class VideoSkimCaptionConfig (line 30) | class VideoSkimCaptionConfig(FunctionBaseConfig, name="video_skim_captio...
class VideoSkimCaptionInput (line 39) | class VideoSkimCaptionInput(BaseModel):
method validate_end_timestamp (line 68) | def validate_end_timestamp(cls, info: dict) -> dict:
function video_skim_caption (line 78) | async def video_skim_caption(config: VideoSkimCaptionConfig, builder: Bu...
FILE: agent/src/vss_agents/tools/video_understanding.py
function _parse_thinking_from_content (line 49) | def _parse_thinking_from_content(content: str) -> tuple[str | None, str]:
class VideoUnderstandingConfig (line 87) | class VideoUnderstandingConfig(FunctionBaseConfig, name="video_understan...
class VideoUnderstandingInput (line 176) | class VideoUnderstandingInput(BaseModel):
class VideoUnderstandingOffsetInput (line 210) | class VideoUnderstandingOffsetInput(BaseModel):
method validate_start_and_end_time (line 244) | def validate_start_and_end_time(cls, info: dict) -> dict:
function extend_timestamp (line 266) | def extend_timestamp(start_time: str, end_time: str) -> str:
function _build_vlm_messages (line 277) | async def _build_vlm_messages(
function video_understanding (line 334) | async def video_understanding(config: VideoUnderstandingConfig, builder:...
FILE: agent/src/vss_agents/tools/vss_summarize.py
class VSSSummarizeConfig (line 40) | class VSSSummarizeConfig(FunctionBaseConfig, name="vss_summarize"):
class VSSSummarizeInput (line 71) | class VSSSummarizeInput(BaseModel):
method validate_all (line 126) | def validate_all(cls, data: dict) -> Any:
class VSSSummarizeOutput (line 139) | class VSSSummarizeOutput(BaseModel):
method __str__ (line 146) | def __str__(self) -> str:
function vss_summarize (line 156) | async def vss_summarize(config: VSSSummarizeConfig, _builder: Builder) -...
FILE: agent/src/vss_agents/tools/vst/duration.py
class VSTDurationConfig (line 34) | class VSTDurationConfig(FunctionBaseConfig, name="vst.duration"):
class VSTDurationInput (line 43) | class VSTDurationInput(BaseModel):
class VSTDurationOutput (line 53) | class VSTDurationOutput(BaseModel):
function vst_duration (line 63) | async def vst_duration(config: VSTDurationConfig, _: Builder) -> AsyncGe...
FILE: agent/src/vss_agents/tools/vst/sensor_list.py
class VSTSensorListConfig (line 34) | class VSTSensorListConfig(FunctionBaseConfig, name="vst.sensor_list"):
class VSTSensorListInput (line 43) | class VSTSensorListInput(BaseModel):
class VSTSensorListOutput (line 49) | class VSTSensorListOutput(BaseModel):
function vst_sensor_list (line 59) | async def vst_sensor_list(config: VSTSensorListConfig, _: Builder) -> As...
FILE: agent/src/vss_agents/tools/vst/snapshot.py
function build_screenshot_url (line 49) | def build_screenshot_url(vst_external_url: str, stream_id: str, timestam...
class VSTSnapshotConfig (line 64) | class VSTSnapshotConfig(FunctionBaseConfig, name="vst.snapshot"):
class VSTSnapshotOffsetInput (line 87) | class VSTSnapshotOffsetInput(BaseModel):
class VSTSnapshotISOInput (line 104) | class VSTSnapshotISOInput(BaseModel):
class VSTSnapshotOutput (line 126) | class VSTSnapshotOutput(BaseModel):
function get_snapshot_url (line 139) | async def get_snapshot_url(
function vst_snapshot (line 190) | async def vst_snapshot(config: VSTSnapshotConfig, _builder: Builder) -> ...
FILE: agent/src/vss_agents/tools/vst/timeline.py
class VSTTimelineConfig (line 38) | class VSTTimelineConfig(FunctionBaseConfig, name="vst.timeline"):
class VSTTimelineInput (line 47) | class VSTTimelineInput(BaseModel):
class VSTTimelineOutput (line 56) | class VSTTimelineOutput(BaseModel):
function get_timeline (line 69) | async def get_timeline(stream_id: str, vst_internal_url: str | None = No...
function vst_timeline (line 127) | async def vst_timeline(config: VSTTimelineConfig, _: Builder) -> AsyncGe...
FILE: agent/src/vss_agents/tools/vst/utils.py
function build_vst_url (line 31) | def build_vst_url(base_url: str, url: str) -> str:
function build_overlay_config (line 56) | def build_overlay_config(
class VSTError (line 89) | class VSTError(Exception):
function get_name_to_stream_id_map (line 95) | async def get_name_to_stream_id_map(vst_internal_url: str | None = None)...
function get_stream_id (line 124) | async def get_stream_id(sensor_id: str, vst_internal_url: str | None = N...
function get_sensor_id_from_stream_id (line 144) | async def get_sensor_id_from_stream_id(stream_id: str, vst_internal_url:...
function validate_video_url (line 181) | async def validate_video_url(url: str, timeout: int = 30) -> bool:
function delete_vst_sensor (line 254) | async def delete_vst_sensor(vst_url: str, sensor_id: str) -> tuple[bool,...
function delete_vst_storage (line 285) | async def delete_vst_storage(vst_url: str, sensor_id: str) -> tuple[bool...
class VSTDirectUploader (line 343) | class VSTDirectUploader:
method __init__ (line 346) | def __init__(self, vst_api_url: str):
method upload_media_file (line 355) | async def upload_media_file(
function get_streams_info (line 445) | async def get_streams_info(vst_internal_url: str | None = None) -> dict[...
function get_stream_info_by_name (line 479) | async def get_stream_info_by_name(name: str, vst_internal_url: str | Non...
function add_sensor (line 491) | async def add_sensor(
function delete_sensor (line 555) | async def delete_sensor(sensor_id: str | None, vst_internal_url: str | N...
function get_storage_timeline (line 583) | async def get_storage_timeline(
function delete_storage (line 623) | async def delete_storage(sensor_id: str | None, vst_internal_url: str | ...
function get_rtsp_url (line 662) | async def get_rtsp_url(sensor_id: str, vst_internal_url: str | None = No...
FILE: agent/src/vss_agents/tools/vst/video_clip.py
class VSTVideoClipConfig (line 52) | class VSTVideoClipConfig(FunctionBaseConfig, name="vst.video_clip"):
class VSTVideoClipOffsetInput (line 75) | class VSTVideoClipOffsetInput(BaseModel):
method validate_start_and_end_time (line 101) | def validate_start_and_end_time(cls, info: dict) -> dict:
class VSTVideoClipISOInput (line 123) | class VSTVideoClipISOInput(BaseModel):
class VSTVideoClipOutput (line 152) | class VSTVideoClipOutput(BaseModel):
function get_video_url (line 165) | async def get_video_url(
function vst_video_clip (line 270) | async def vst_video_clip(config: VSTVideoClipConfig, _: Builder) -> Asyn...
FILE: agent/src/vss_agents/tools/vst/video_list.py
class VSTVideoListConfig (line 34) | class VSTVideoListConfig(FunctionBaseConfig, name="vst.video_list"):
class VSTVideoListInput (line 43) | class VSTVideoListInput(BaseModel):
class VSTVideoListOutput (line 49) | class VSTVideoListOutput(BaseModel):
function _vst_video_list (line 59) | async def _vst_video_list(config: VSTVideoListConfig, _builder: Builder)...
FILE: agent/src/vss_agents/tools/vst_download.py
class VSTDownloadConfig (line 32) | class VSTDownloadConfig(FunctionBaseConfig, name="vst_download"):
class VSTDownloadInput (line 40) | class VSTDownloadInput(BaseModel):
class VSTDownloadOutput (line 51) | class VSTDownloadOutput(BaseModel):
function vst_download (line 62) | async def vst_download(config: VSTDownloadConfig, _builder: Builder) -> ...
FILE: agent/src/vss_agents/tools/vst_files.py
class VSTFilesConfig (line 32) | class VSTFilesConfig(FunctionBaseConfig, name="vst_files"):
class VSTFilesInput (line 61) | class VSTFilesInput(BaseModel):
function vst_files (line 68) | async def vst_files(config: VSTFilesConfig, _builder: Builder) -> AsyncG...
FILE: agent/src/vss_agents/utils/asyncmixin.py
class AsyncMixin (line 19) | class AsyncMixin:
method __init__ (line 23) | def __init__(self, *args: Any, **kwargs: Any) -> None:
method __ainit__ (line 31) | async def __ainit__(self, *args: Any, **kwargs: Any) -> None:
method __initobj (line 34) | async def __initobj(self) -> "AsyncMixin":
method __await__ (line 42) | def __await__(self) -> Generator[Any, None, "AsyncMixin"]:
FILE: agent/src/vss_agents/utils/file_mapping.py
class StorageType (line 26) | class StorageType(Enum):
class VideoFileInfo (line 35) | class VideoFileInfo:
class FileMapping (line 47) | class FileMapping:
method __init__ (line 53) | def __init__(self) -> None:
method add_vst_files (line 58) | def add_vst_files(self, vst_files_data: dict[str, dict]) -> None:
method add_vss_files (line 90) | def add_vss_files(self, vss_files_data: dict[str, str]) -> None:
method get_file_info (line 112) | def get_file_info(self, filename: str) -> VideoFileInfo | None:
method get_vst_id (line 116) | def get_vst_id(self, filename: str) -> str | None:
method get_vss_id (line 120) | def get_vss_id(self, filename: str) -> str | None:
method get_storage_type (line 124) | def get_storage_type(self, filename: str) -> StorageType | None:
method has_vst_file (line 129) | def has_vst_file(self, filename: str) -> bool:
method has_vss_file (line 133) | def has_vss_file(self, filename: str) -> bool:
method get_all_filenames (line 137) | def get_all_filenames(self) -> list[str]:
method add_local_files (line 141) | def add_local_files(self, local_files_data: dict[str, dict]) -> None:
method get_files_by_storage_type (line 167) | def get_files_by_storage_type(self, storage_type: StorageType) -> dict...
method clear (line 173) | def clear(self) -> None:
function resolve_video_file (line 185) | async def resolve_video_file(
FILE: agent/src/vss_agents/utils/frame_select.py
function frame_select (line 26) | def frame_select(video_path: str, start_timestamp: float, end_timestamp:...
function has_nvidia_gpu (line 79) | def has_nvidia_gpu() -> bool:
FILE: agent/src/vss_agents/utils/markdown_parser.py
function parse_table_or_blocktext (line 24) | def parse_table_or_blocktext(
function parse_markdown_to_json (line 56) | def parse_markdown_to_json(content: str) -> dict[str, Any]:
FILE: agent/src/vss_agents/utils/parser.py
class ReActOutputParserError (line 24) | class ReActOutputParserError(ValueError, LangChainException):
method __init__ (line 25) | def __init__(
function parse_function_calls (line 38) | def parse_function_calls(text: str) -> list[dict[str, Any]]:
FILE: agent/src/vss_agents/utils/reasoning_parsing.py
function parse_content_blocks (line 19) | def parse_content_blocks(response: Any) -> tuple[str | None, str | None]:
function parse_reasoning_content (line 47) | def parse_reasoning_content(response: Any) -> tuple[str | None, str | No...
FILE: agent/src/vss_agents/utils/reasoning_utils.py
function get_llm_reasoning_bind_kwargs (line 23) | def get_llm_reasoning_bind_kwargs(llm: Any, llm_reasoning: bool | None) ...
function get_thinking_tag (line 59) | def get_thinking_tag(llm: Any, thinking: bool | None) -> str | None:
FILE: agent/src/vss_agents/utils/retry.py
function create_retry_strategy (line 28) | def create_retry_strategy(
FILE: agent/src/vss_agents/utils/time_convert.py
function datetime_to_iso8601 (line 22) | def datetime_to_iso8601(dt: datetime) -> str:
function iso8601_to_datetime (line 27) | def iso8601_to_datetime(timestamp: str) -> datetime:
function utc_timestamp_to_tz_timestamp (line 35) | def utc_timestamp_to_tz_timestamp(timestamp: str) -> str:
function tz_timestamp_to_utc_timestamp (line 42) | def tz_timestamp_to_utc_timestamp(timestamp: str) -> str:
FILE: agent/src/vss_agents/utils/time_measure.py
class TimeMeasure (line 28) | class TimeMeasure:
method __init__ (line 33) | def __init__(self, string: str, print: bool = True) -> None:
method __enter__ (line 43) | def __enter__(self) -> "TimeMeasure":
method __exit__ (line 48) | def __exit__(self, type: type[BaseException] | None, value: BaseExcept...
method execution_time (line 72) | def execution_time(self) -> float:
method current_execution_time (line 82) | def current_execution_time(self) -> float:
FILE: agent/src/vss_agents/utils/url_translation.py
function translate_url (line 43) | def translate_url(
function rewrite_url_host (line 169) | def rewrite_url_host(url: str, target_ip: str) -> str:
function _translate_proxy_url (line 214) | def _translate_proxy_url(url: str, parsed: ParseResult, vst_internal_url...
FILE: agent/src/vss_agents/utils/video_file.py
function get_video_duration (line 25) | def get_video_duration(file_path: str) -> float:
function pad_media_info (line 60) | def pad_media_info(media_info: MediaInfoOffset, video_duration: float, m...
FILE: agent/src/vss_agents/video_analytics/embeddings.py
class EmbeddingModel (line 30) | class EmbeddingModel:
method __init__ (line 39) | def __init__(self, model_name: str = "sentence-transformers/all-MiniLM...
method _load_model (line 49) | def _load_model(self) -> None:
method encode (line 61) | def encode(self, text: str) -> np.ndarray:
method encode_batch (line 81) | def encode_batch(self, texts: list[str]) -> np.ndarray:
class PlaceEmbeddingCache (line 107) | class PlaceEmbeddingCache:
method __init__ (line 115) | def __init__(self) -> None:
method add_places_batch (line 120) | def add_places_batch(self, names: list[str], embeddings: np.ndarray) -...
method find_similar (line 141) | def find_similar(
method size (line 181) | def size(self) -> int:
FILE: agent/src/vss_agents/video_analytics/es_client.py
class ESClient (line 29) | class ESClient:
method __init__ (line 43) | def __init__(self, es_url: str, index_prefix: str = ""):
method close (line 54) | async def close(self) -> None:
method __aenter__ (line 58) | async def __aenter__(self) -> "ESClient":
method __aexit__ (line 62) | async def __aexit__(
method get_index (line 68) | def get_index(self, index_key: str) -> str:
method search (line 88) | async def search(
method aggregate (line 144) | async def aggregate(self, index_key: str, query_body: dict, aggs: dict...
method get_by_id (line 175) | async def get_by_id(self, index_key: str, doc_id: str) -> dict | None:
method count (line 204) | async def count(self, index_key: str, query_body: dict) -> int:
FILE: agent/src/vss_agents/video_analytics/interface.py
class IncidentMetadata (line 24) | class IncidentMetadata(StrEnum):
class VideoAnalyticsInterface (line 35) | class VideoAnalyticsInterface(ABC):
method get_incident (line 41) | async def get_incident(
method get_incidents (line 64) | async def get_incidents(
method get_sensor_ids (line 104) | async def get_sensor_ids(self, place: str | None = None) -> list[str]:
method get_places (line 118) | async def get_places(self) -> dict:
method get_fov_histogram (line 134) | async def get_fov_histogram(
method get_average_speeds (line 179) | async def get_average_speeds(
method analyze (line 213) | async def analyze(
FILE: agent/src/vss_agents/video_analytics/nvschema.py
class Location (line 22) | class Location(BaseModel):
class Coordinates (line 28) | class Coordinates(BaseModel):
class Place (line 34) | class Place(BaseModel):
class Incident (line 42) | class Incident(BaseModel):
FILE: agent/src/vss_agents/video_analytics/query_builders.py
class IncidentQueryBuilder (line 26) | class IncidentQueryBuilder:
method build_query_by_id (line 34) | def build_query_by_id(incident_id: str) -> dict:
method build_query (line 52) | def build_query(
class FramesQueryBuilder (line 111) | class FramesQueryBuilder:
method build_query (line 120) | def build_query(sensor_id: str, start_time: str, end_time: str) -> dict:
method fov_histogram_aggregation (line 143) | def fov_histogram_aggregation(bucket_size_sec: int, object_type: str |...
class BehaviorQueryBuilder (line 189) | class BehaviorQueryBuilder:
method build_average_speed_query (line 201) | def build_average_speed_query(source: str, source_type: str, start_tim...
method average_speed_per_direction_aggregation (line 250) | def average_speed_per_direction_aggregation() -> dict:
FILE: agent/src/vss_agents/video_analytics/tools.py
class EmptyInput (line 47) | class EmptyInput(BaseModel):
class GetSensorIdsInput (line 53) | class GetSensorIdsInput(BaseModel):
class GetIncidentInput (line 59) | class GetIncidentInput(BaseModel):
class GetIncidentsInputBase (line 66) | class GetIncidentsInputBase(BaseModel):
method validate_timestamps (line 90) | def validate_timestamps(cls, v: str | None) -> str | None:
method validate_source_type (line 98) | def validate_source_type(cls, v: str | None) -> str | None:
method validate_source_and_type_together (line 105) | def validate_source_and_type_together(self) -> "GetIncidentsInputBase":
method validate_timestamps_together (line 112) | def validate_timestamps_together(self) -> "GetIncidentsInputBase":
class GetIncidentsInputWithVLM (line 119) | class GetIncidentsInputWithVLM(GetIncidentsInputBase):
method validate_vlm_verdict (line 129) | def validate_vlm_verdict(cls, v: str | None) -> str | None:
class FovHistogramInput (line 138) | class FovHistogramInput(BaseModel):
method validate_timestamps (line 149) | def validate_timestamps(cls, v: str) -> str:
class AverageSpeedsInput (line 154) | class AverageSpeedsInput(BaseModel):
method validate_timestamps (line 164) | def validate_timestamps(cls, v: str) -> str:
method validate_source_type (line 170) | def validate_source_type(cls, v: str) -> str:
class AnalyzeInput (line 177) | class AnalyzeInput(BaseModel):
method validate_timestamps (line 196) | def validate_timestamps(cls, v: str) -> str:
method validate_source_type (line 202) | def validate_source_type(cls, v: str) -> str:
method validate_analysis_type (line 210) | def validate_analysis_type(cls, v: str) -> str:
class VideoAnalyticsToolConfig (line 218) | class VideoAnalyticsToolConfig(FunctionGroupBaseConfig, name="video_anal...
function video_analytics (line 248) | async def video_analytics(_config: VideoAnalyticsToolConfig, _builder: B...
FILE: agent/src/vss_agents/video_analytics/utils.py
function validate_iso_timestamp (line 28) | def validate_iso_timestamp(timestamp: str) -> str:
function build_sensor_map (line 63) | def build_sensor_map(sensors: list[dict[str, Any]]) -> dict[str, dict[st...
function build_place_map (line 120) | def build_place_map(sensors: list[dict[str, Any]]) -> dict[str, list[str]]:
function parse_vst_sensor_list_response (line 164) | def parse_vst_sensor_list_response(sensors_str: str) -> set[str]:
function compute_bucket_size_seconds (line 211) | def compute_bucket_size_seconds(start_time: str, end_time: str, bucket_c...
function create_empty_histogram_buckets (line 236) | def create_empty_histogram_buckets(start_time: str, end_time: str, bucke...
function create_events_from_incidents (line 277) | def create_events_from_incidents(incidents: list[dict[str, Any]]) -> tup...
function sweep_overlapping_incidents (line 312) | def sweep_overlapping_incidents(
FILE: agent/stubs/nat/data_models/common.pyi
class BaseModelRegistryTag (line 18) | class BaseModelRegistryTag: ...
class TypedBaseModel (line 20) | class TypedBaseModel(BaseModel):
method __init_subclass__ (line 21) | def __init_subclass__(cls, name: str | None = None, **kwargs: object) ...
FILE: agent/stubs/nat/data_models/evaluator.pyi
class EvaluatorBaseConfig (line 19) | class EvaluatorBaseConfig(TypedBaseModel, BaseModelRegistryTag): ...
FILE: agent/stubs/nat/data_models/function.pyi
class FunctionBaseConfig (line 19) | class FunctionBaseConfig(TypedBaseModel, BaseModelRegistryTag): ...
class FunctionGroupBaseConfig (line 20) | class FunctionGroupBaseConfig(TypedBaseModel, BaseModelRegistryTag): ...
FILE: agent/tests/unit_test/agents/postprocessing/test_llm_based_rule_validator.py
function mock_llm (line 30) | def mock_llm():
class TestLLMBasedRuleValidatorInit (line 40) | class TestLLMBasedRuleValidatorInit:
method test_custom_prompt_template (line 43) | def test_custom_prompt_template(self, mock_llm):
method test_negative_max_retries_raises (line 47) | def test_negative_max_retries_raises(self, mock_llm):
class TestLLMBasedRuleValidatorValidate (line 52) | class TestLLMBasedRuleValidatorValidate:
method test_passes_when_llm_says_passed (line 56) | async def test_passes_when_llm_says_passed(self, mock_llm):
method test_fails_when_llm_says_failed (line 75) | async def test_fails_when_llm_says_failed(self, mock_llm):
method test_retries_on_output_parser_exception (line 94) | async def test_retries_on_output_parser_exception(self, mock_llm):
method test_raises_after_all_retries_exhausted (line 115) | async def test_raises_after_all_retries_exhausted(self, mock_llm):
method test_unexpected_exception_breaks_retry_loop (line 135) | async def test_unexpected_exception_breaks_retry_loop(self, mock_llm):
method test_bad_prompt_template_falls_back_to_default (line 156) | async def test_bad_prompt_template_falls_back_to_default(self, mock_llm):
FILE: agent/tests/unit_test/agents/postprocessing/test_non_empty_response_validator.py
function validator (line 24) | def validator():
function validator_with_template (line 29) | def validator_with_template():
class TestNonEmptyResponseValidator (line 33) | class TestNonEmptyResponseValidator:
method test_passes_on_non_empty_output (line 37) | async def test_passes_on_non_empty_output(self, validator):
method test_fails_on_empty_string (line 43) | async def test_fails_on_empty_string(self, validator):
method test_fails_on_whitespace_only (line 49) | async def test_fails_on_whitespace_only(self, validator):
method test_feedback_template (line 54) | def test_feedback_template(self, validator_with_template):
method test_feedback_template_none_normalized (line 58) | def test_feedback_template_none_normalized(self):
FILE: agent/tests/unit_test/agents/postprocessing/test_postprocessing_node.py
class TestPostprocessingNodeInit (line 30) | class TestPostprocessingNodeInit:
method test_default_config (line 33) | def test_default_config(self):
method test_creates_non_empty_validator (line 39) | def test_creates_non_empty_validator(self):
method test_creates_url_validator (line 46) | def test_creates_url_validator(self):
method test_custom_validation_order (line 53) | def test_custom_validation_order(self):
method test_default_validation_order_is_sequential (line 64) | def test_default_validation_order_is_sequential(self):
class TestPostprocessingNodeProcess (line 77) | class TestPostprocessingNodeProcess:
method test_empty_output_passes_without_non_empty_validator (line 81) | async def test_empty_output_passes_without_non_empty_validator(self):
method test_empty_output_fails_with_non_empty_validator (line 90) | async def test_empty_output_fails_with_non_empty_validator(self):
method test_non_empty_output_passes_non_empty_validator (line 99) | async def test_non_empty_output_passes_non_empty_validator(self):
method test_no_validators_passes (line 108) | async def test_no_validators_passes(self):
class TestPostprocessingNodeFailOpen (line 114) | class TestPostprocessingNodeFailOpen:
method test_fail_open_on_validator_exception (line 118) | async def test_fail_open_on_validator_exception(self):
method test_fail_closed_on_validator_exception (line 133) | async def test_fail_closed_on_validator_exception(self):
class TestPostprocessingNodeGroupTimeout (line 148) | class TestPostprocessingNodeGroupTimeout:
method test_group_timeout_fail_open (line 152) | async def test_group_timeout_fail_open(self):
method test_group_timeout_fail_closed (line 174) | async def test_group_timeout_fail_closed(self):
FILE: agent/tests/unit_test/agents/postprocessing/test_url_validator.py
class TestExtractUrls (line 29) | class TestExtractUrls:
method test_extracts_http_urls (line 32) | def test_extracts_http_urls(self):
method test_extracts_https_urls (line 36) | def test_extracts_https_urls(self):
method test_deduplicates (line 40) | def test_deduplicates(self):
method test_strips_trailing_punctuation (line 44) | def test_strips_trailing_punctuation(self):
method test_no_urls (line 50) | def test_no_urls(self):
method test_multiple_urls (line 53) | def test_multiple_urls(self):
method test_ignores_non_http_schemes (line 60) | def test_ignores_non_http_schemes(self):
function _mock_response (line 65) | def _mock_response(status):
class TestURLValidator (line 74) | class TestURLValidator:
method validator (line 78) | def validator(self):
method test_passes_when_no_urls (line 82) | async def test_passes_when_no_urls(self, validator):
method test_fails_when_tag_src_is_placeholder (line 89) | async def test_fails_when_tag_src_is_placeholder(self, validator):
method test_fails_when_markdown_link_url_is_placeholder (line 96) | async def test_fails_when_markdown_link_url_is_placeholder(self, valid...
method test_passes_when_tag_src_url_returns_200 (line 103) | async def test_passes_when_tag_src_url_returns_200(self, validator):
method test_fails_when_tag_src_url_returns_500 (line 117) | async def test_fails_when_tag_src_url_returns_500(self, validator):
method test_head_405_falls_back_to_get (line 131) | async def test_head_405_falls_back_to_get(self, validator):
method test_head_exception_falls_back_to_get (line 147) | async def test_head_exception_falls_back_to_get(self, validator):
method test_returns_all_invalid_and_inaccessible_urls_at_once (line 162) | async def test_returns_all_invalid_and_inaccessible_urls_at_once(self,...
method test_multiple_tags_partial_failure (line 180) | async def test_multiple_tags_partial_failure(self, validator):
method test_deduplicates_invalid_urls (line 204) | async def test_deduplicates_invalid_urls(self, validator):
method test_accepts_uppercase_scheme (line 213) | async def test_accepts_uppercase_scheme(self, validator):
method test_feedback_template (line 226) | def test_feedback_template(self):
method test_fails_when_tag_has_backslash_escaped_src (line 232) | async def test_fails_when_tag_has_backslash_escaped_src(self, validator):
method test_passes_when_backslash_escaped_src_url_returns_200 (line 241) | async def test_passes_when_backslash_escaped_src_url_returns_200(self,...
class TestExtractUrlsFromTagsWithAlt (line 257) | class TestExtractUrlsFromTagsWithAlt:
method test_normal_double_quotes (line 260) | def test_normal_double_quotes(self):
method test_normal_single_quotes (line 265) | def test_normal_single_quotes(self):
method test_backslash_escaped_double_quotes (line 270) | def test_backslash_escaped_double_quotes(self):
method test_backslash_escaped_single_quotes (line 275) | def test_backslash_escaped_single_quotes(self):
method test_alt_before_src_with_backslash_quotes (line 280) | def test_alt_before_src_with_backslash_quotes(self):
FILE: agent/tests/unit_test/agents/test_data_models.py
class TestAgentDecision (line 23) | class TestAgentDecision:
method test_agent_decision_values (line 26) | def test_agent_decision_values(self):
method test_agent_decision_is_string_enum (line 33) | def test_agent_decision_is_string_enum(self):
class TestAgentMessageChunkType (line 39) | class TestAgentMessageChunkType:
method test_message_chunk_type_values (line 42) | def test_message_chunk_type_values(self):
class TestAgentMessageChunk (line 51) | class TestAgentMessageChunk:
method test_create_message_chunk_defaults (line 54) | def test_create_message_chunk_defaults(self):
method test_create_message_chunk_with_values (line 60) | def test_create_message_chunk_with_values(self):
method test_message_chunk_all_types (line 69) | def test_message_chunk_all_types(self):
method test_message_chunk_long_content (line 75) | def test_message_chunk_long_content(self):
class TestAgentOutput (line 82) | class TestAgentOutput:
method test_create_agent_output_defaults (line 85) | def test_create_agent_output_defaults(self):
method test_create_agent_output_success (line 94) | def test_create_agent_output_success(self):
method test_create_agent_output_error (line 106) | def test_create_agent_output_error(self):
method test_create_agent_output_partial_success (line 116) | def test_create_agent_output_partial_success(self):
method test_agent_output_status_literal (line 126) | def test_agent_output_status_literal(self):
method test_agent_output_side_effects_types (line 133) | def test_agent_output_side_effects_types(self):
method test_agent_output_metadata_types (line 147) | def test_agent_output_metadata_types(self):
method test_agent_output_empty_error_message (line 161) | def test_agent_output_empty_error_message(self):
method test_agent_output_messages_types (line 166) | def test_agent_output_messages_types(self):
FILE: agent/tests/unit_test/agents/test_multi_report_agent.py
class TestMultiReportAgentInput (line 24) | class TestMultiReportAgentInput:
method test_input_minimal_sensor (line 27) | def test_input_minimal_sensor(self):
method test_input_minimal_place (line 38) | def test_input_minimal_place(self):
method test_input_with_time_range (line 45) | def test_input_with_time_range(self):
method test_input_with_max_result_size (line 55) | def test_input_with_max_result_size(self):
method test_input_max_result_size_must_be_positive (line 63) | def test_input_max_result_size_must_be_positive(self):
method test_input_invalid_source_type (line 77) | def test_input_invalid_source_type(self):
class TestMultiReportAgentConfig (line 85) | class TestMultiReportAgentConfig:
method test_config_creation (line 88) | def test_config_creation(self):
method test_config_custom_max_incidents (line 95) | def test_config_custom_max_incidents(self):
method test_config_max_incidents_minimum (line 102) | def test_config_max_incidents_minimum(self):
method test_config_max_incidents_maximum (line 109) | def test_config_max_incidents_maximum(self):
method test_config_max_incidents_below_minimum (line 116) | def test_config_max_incidents_below_minimum(self):
method test_config_max_incidents_above_maximum (line 123) | def test_config_max_incidents_above_maximum(self):
FILE: agent/tests/unit_test/agents/test_report_agent.py
class TestReportAgentInput (line 26) | class TestReportAgentInput:
method test_defaults (line 29) | def test_defaults(self):
method test_with_incident_id (line 38) | def test_with_incident_id(self):
method test_with_time_range (line 42) | def test_with_time_range(self):
method test_with_source_sensor (line 49) | def test_with_source_sensor(self):
method test_with_source_place (line 54) | def test_with_source_place(self):
method test_invalid_source_type (line 58) | def test_invalid_source_type(self):
method test_vlm_reasoning_enabled (line 62) | def test_vlm_reasoning_enabled(self):
method test_vlm_reasoning_disabled (line 66) | def test_vlm_reasoning_disabled(self):
class TestVideoReportAgentInput (line 71) | class TestVideoReportAgentInput:
method test_all_fields (line 74) | def test_all_fields(self):
method test_missing_sensor_id (line 79) | def test_missing_sensor_id(self):
method test_only_sensor_id (line 83) | def test_only_sensor_id(self):
FILE: agent/tests/unit_test/agents/test_search_agent.py
class TestSearchAgentConfig (line 35) | class TestSearchAgentConfig:
method test_required_fields (line 38) | def test_required_fields(self):
method test_all_fields (line 49) | def test_all_fields(self):
method test_defaults (line 64) | def test_defaults(self):
method test_custom_use_attribute_search (line 75) | def test_custom_use_attribute_search(self):
class TestSearchAgentInput (line 86) | class TestSearchAgentInput:
method test_required_query (line 89) | def test_required_query(self):
method test_missing_query_raises (line 94) | def test_missing_query_raises(self):
method test_defaults (line 99) | def test_defaults(self):
method test_all_fields (line 109) | def test_all_fields(self):
method test_agent_mode_disabled (line 128) | def test_agent_mode_disabled(self):
method test_fusion_disabled (line 136) | def test_fusion_disabled(self):
method test_custom_max_results (line 144) | def test_custom_max_results(self):
method test_top_k_override (line 152) | def test_top_k_override(self):
method test_time_filters (line 162) | def test_time_filters(self):
method test_only_start_time (line 172) | def test_only_start_time(self):
method test_only_end_time (line 181) | def test_only_end_time(self):
function _make_search_output (line 194) | def _make_search_output(num_results=1):
class TestToIncidentsOutput (line 212) | class TestToIncidentsOutput:
method test_empty_search_output (line 215) | def test_empty_search_output(self):
method test_with_results (line 222) | def test_with_results(self):
method test_incidents_json_structure (line 230) | def test_incidents_json_structure(self):
class TestToChatResponse (line 245) | class TestToChatResponse:
method test_empty_search_output (line 248) | def test_empty_search_output(self):
method test_with_results (line 254) | def test_with_results(self):
class TestToChatResponseChunk (line 260) | class TestToChatResponseChunk:
method test_empty_search_output (line 263) | def test_empty_search_output(self):
method test_with_results (line 268) | def test_with_results(self):
class TestHelperMarkdownBulletList (line 274) | class TestHelperMarkdownBulletList:
method test_empty_search_output (line 277) | def test_empty_search_output(self):
method test_with_results (line 283) | def test_with_results(self):
FILE: agent/tests/unit_test/agents/test_top_agent.py
class TestTopAgentConstants (line 26) | class TestTopAgentConstants:
method test_tool_not_found_error_message (line 29) | def test_tool_not_found_error_message(self):
method test_no_input_error_message (line 33) | def test_no_input_error_message(self):
method test_empty_messages_error (line 36) | def test_empty_messages_error(self):
method test_empty_scratchpad_error (line 39) | def test_empty_scratchpad_error(self):
class TestStripFrontendTags (line 43) | class TestStripFrontendTags:
method test_strip_frontend_tags (line 98) | def test_strip_frontend_tags(self, content, expected):
method test_none_content_returns_empty (line 101) | def test_none_content_returns_empty(self):
FILE: agent/tests/unit_test/api/conftest.py
function block_outbound_network (line 23) | def block_outbound_network(monkeypatch):
FILE: agent/tests/unit_test/api/test_health_endpoint_coverage.py
class TestHealthEndpointConfig (line 25) | class TestHealthEndpointConfig:
method test_defaults (line 28) | def test_defaults(self):
method test_custom (line 32) | def test_custom(self):
class TestHealthEndpointInner (line 37) | class TestHealthEndpointInner:
method test_health_check (line 41) | async def test_health_check(self):
FILE: agent/tests/unit_test/api/test_rtsp_stream_api.py
class TestStreamMode (line 43) | class TestStreamMode:
method test_search_mode (line 46) | def test_search_mode(self):
method test_other_mode (line 49) | def test_other_mode(self):
method test_from_string (line 52) | def test_from_string(self):
class TestServiceConfig (line 57) | class TestServiceConfig:
method test_basic_config (line 60) | def test_basic_config(self):
method test_full_config (line 69) | def test_full_config(self):
class TestAddStreamRequest (line 86) | class TestAddStreamRequest:
method test_required_fields (line 89) | def test_required_fields(self):
method test_all_fields (line 98) | def test_all_fields(self):
method test_alias_sensor_url (line 112) | def test_alias_sensor_url(self):
method test_missing_required_fields_fails (line 117) | def test_missing_required_fields_fails(self):
class TestAddStreamResponse (line 122) | class TestAddStreamResponse:
method test_success_response (line 125) | def test_success_response(self):
method test_failure_response (line 131) | def test_failure_response(self):
class TestDeleteStreamResponse (line 137) | class TestDeleteStreamResponse:
method test_success_response (line 140) | def test_success_response(self):
method test_partial_response (line 145) | def test_partial_response(self):
class TestAddToVst (line 150) | class TestAddToVst:
method test_successful_add (line 156) | async def test_successful_add(self, mock_get_rtsp_url, mock_add_sensor):
method test_vst_returns_error (line 173) | async def test_vst_returns_error(self, mock_add_sensor):
method test_vst_missing_sensor_id (line 187) | async def test_vst_missing_sensor_id(self, mock_add_sensor):
class TestAddToRtviCv (line 199) | class TestAddToRtviCv:
method test_successful_add (line 203) | async def test_successful_add(self):
method test_skipped_when_not_configured (line 217) | async def test_skipped_when_not_configured(self):
method test_rtvi_cv_error (line 228) | async def test_rtvi_cv_error(self):
class TestAddToRtviEmbed (line 243) | class TestAddToRtviEmbed:
method test_successful_add (line 247) | async def test_successful_add(self):
method test_skipped_when_not_configured (line 264) | async def test_skipped_when_not_configured(self):
method test_fallback_to_sensor_id (line 277) | async def test_fallback_to_sensor_id(self):
class TestStartEmbeddingGeneration (line 295) | class TestStartEmbeddingGeneration:
method test_successful_start (line 299) | async def test_successful_start(self):
method test_skipped_when_not_configured (line 321) | async def test_skipped_when_not_configured(self):
class TestGetStreamInfoByName (line 331) | class TestGetStreamInfoByName:
method test_successful_lookup (line 336) | async def test_successful_lookup(self, mock_vst_get_stream_info):
method test_name_not_found (line 349) | async def test_name_not_found(self, mock_vst_get_stream_info):
class TestCleanupFunctions (line 360) | class TestCleanupFunctions:
method test_cleanup_vst_sensor_success (line 365) | async def test_cleanup_vst_sensor_success(self, mock_vst_delete_sensor):
method test_cleanup_vst_storage_no_timeline (line 376) | async def test_cleanup_vst_storage_no_timeline(self, mock_vst_delete_s...
method test_cleanup_rtvi_cv_skipped (line 387) | async def test_cleanup_rtvi_cv_skipped(self):
method test_cleanup_rtvi_embed_stream_success (line 397) | async def test_cleanup_rtvi_embed_stream_success(self):
method test_cleanup_rtvi_embed_generation_success (line 410) | async def test_cleanup_rtvi_embed_generation_success(self):
class TestCreateRtspStreamApiRouter (line 423) | class TestCreateRtspStreamApiRouter:
method test_create_router (line 426) | def test_create_router(self):
method test_create_router_with_all_params (line 430) | def test_create_router_with_all_params(self):
method test_router_has_routes (line 441) | def test_router_has_routes(self):
class TestAddStreamEndpoint (line 446) | class TestAddStreamEndpoint:
method test_successful_add_search_mode (line 455) | async def test_successful_add_search_mode(
method test_successful_add_other_mode (line 487) | async def test_successful_add_other_mode(self, mock_add_vst):
method test_vst_failure_no_rollback_needed (line 505) | async def test_vst_failure_no_rollback_needed(self, mock_add_vst):
method test_rtvi_cv_failure_triggers_rollback (line 527) | async def test_rtvi_cv_failure_triggers_rollback(
class TestDeleteStreamEndpoint (line 560) | class TestDeleteStreamEndpoint:
method test_successful_delete_search_mode (line 570) | async def test_successful_delete_search_mode(
method test_delete_stream_not_found (line 607) | async def test_delete_stream_not_found(self, mock_get_stream_info):
method test_partial_delete (line 629) | async def test_partial_delete(
class TestRegisterRtspStreamApiRoutes (line 664) | class TestRegisterRtspStreamApiRoutes:
method test_register_with_config (line 667) | def test_register_with_config(self):
method test_register_with_env_vars (line 686) | def test_register_with_env_vars(self):
method test_register_missing_vst_url (line 704) | def test_register_missing_vst_url(self):
method test_register_missing_rtvi_embed_url (line 713) | def test_register_missing_rtvi_embed_url(self):
FILE: agent/tests/unit_test/api/test_video_search_ingest.py
class TestAllowedVideoTypes (line 32) | class TestAllowedVideoTypes:
method test_mp4_allowed (line 35) | def test_mp4_allowed(self):
method test_mkv_allowed (line 38) | def test_mkv_allowed(self):
method test_only_two_types (line 41) | def test_only_two_types(self):
class TestVideoIngestResponse (line 45) | class TestVideoIngestResponse:
method test_response_creation (line 48) | def test_response_creation(self):
method test_response_default_chunks (line 57) | def test_response_default_chunks(self):
method test_response_serialization (line 61) | def test_response_serialization(self):
class TestCreateStreamingVideoIngestRouter (line 72) | class TestCreateStreamingVideoIngestRouter:
method test_create_router (line 75) | def test_create_router(self):
method test_create_router_custom_params (line 81) | def test_create_router_custom_params(self):
method test_router_has_routes (line 90) | def test_router_has_routes(self):
class TestStreamVideoToVstEndpoint (line 98) | class TestStreamVideoToVstEndpoint:
method test_successful_upload (line 102) | async def test_successful_upload(self):
method test_missing_content_type (line 153) | async def test_missing_content_type(self):
method test_invalid_content_type (line 171) | async def test_invalid_content_type(self):
method test_missing_content_length (line 192) | async def test_missing_content_length(self):
method test_zero_content_length (line 210) | async def test_zero_content_length(self):
method test_invalid_content_length_format (line 228) | async def test_invalid_content_length_format(self):
method test_vst_upload_failure (line 246) | async def test_vst_upload_failure(self):
method test_filename_without_extension (line 278) | async def test_filename_without_extension(self):
class TestRegisterStreamingRoutes (line 318) | class TestRegisterStreamingRoutes:
method test_register_with_env_vars (line 321) | def test_register_with_env_vars(self):
method test_register_with_config (line 335) | def test_register_with_config(self):
method test_register_missing_vst_url (line 352) | def test_register_missing_vst_url(self):
method test_register_missing_rtvi_url (line 361) | def test_register_missing_rtvi_url(self):
FILE: agent/tests/unit_test/api/test_video_upload_url.py
class TestVideoUploadURLConfig (line 25) | class TestVideoUploadURLConfig:
method test_with_required_fields (line 28) | def test_with_required_fields(self):
method test_missing_vst_external_url_fails (line 36) | def test_missing_vst_external_url_fails(self):
method test_missing_agent_base_url_fails (line 40) | def test_missing_agent_base_url_fails(self):
class TestVideoUploadURLInput (line 45) | class TestVideoUploadURLInput:
method test_basic_input (line 48) | def test_basic_input(self):
method test_with_embedding (line 53) | def test_with_embedding(self):
method test_empty_filename_fails (line 60) | def test_empty_filename_fails(self):
method test_missing_filename_fails (line 64) | def test_missing_filename_fails(self):
method test_various_filenames (line 68) | def test_various_filenames(self):
class TestVideoUploadURLOutput (line 75) | class TestVideoUploadURLOutput:
method test_output_creation (line 78) | def test_output_creation(self):
method test_output_with_different_urls (line 83) | def test_output_with_different_urls(self):
class TestVideoUploadURLFunction (line 94) | class TestVideoUploadURLFunction:
method test_vst_url_construction (line 97) | def test_vst_url_construction(self):
method test_embedding_url_construction (line 110) | def test_embedding_url_construction(self):
method test_url_with_trailing_slash (line 121) | def test_url_with_trailing_slash(self):
method test_filename_without_extension (line 132) | def test_filename_without_extension(self):
method test_filename_with_multiple_dots (line 139) | def test_filename_with_multiple_dots(self):
method test_input_json_parsing (line 146) | def test_input_json_parsing(self):
method test_output_json_serialization (line 154) | def test_output_json_serialization(self):
FILE: agent/tests/unit_test/api/test_video_upload_url_converters.py
class TestVideoUploadURLConverters (line 27) | class TestVideoUploadURLConverters:
method config (line 31) | def config(self):
method mock_builder (line 38) | def mock_builder(self):
method test_str_input_converter (line 42) | async def test_str_input_converter(self, config, mock_builder):
method test_chat_request_input_converter (line 52) | async def test_chat_request_input_converter(self, config, mock_builder):
method test_chat_request_converter_error (line 66) | async def test_chat_request_converter_error(self, config, mock_builder):
method test_output_converter (line 80) | async def test_output_converter(self, config, mock_builder):
method test_chat_response_converter (line 91) | async def test_chat_response_converter(self, config, mock_builder):
FILE: agent/tests/unit_test/api/test_video_upload_url_coverage.py
class TestVideoUploadURLConfig (line 25) | class TestVideoUploadURLConfig:
method test_required_fields (line 28) | def test_required_fields(self):
method test_missing_vst_url_raises (line 36) | def test_missing_vst_url_raises(self):
method test_missing_agent_url_raises (line 40) | def test_missing_agent_url_raises(self):
class TestVideoUploadURLInput (line 45) | class TestVideoUploadURLInput:
method test_basic (line 48) | def test_basic(self):
method test_with_embedding (line 53) | def test_with_embedding(self):
method test_empty_filename_raises (line 57) | def test_empty_filename_raises(self):
method test_missing_filename_raises (line 61) | def test_missing_filename_raises(self):
class TestVideoUploadURLOutput (line 66) | class TestVideoUploadURLOutput:
method test_basic (line 69) | def test_basic(self):
method test_missing_url_raises (line 73) | def test_missing_url_raises(self):
FILE: agent/tests/unit_test/api/test_video_upload_url_inner.py
class TestVideoUploadUrlInner (line 27) | class TestVideoUploadUrlInner:
method config (line 31) | def config(self):
method mock_builder (line 38) | def mock_builder(self):
method test_upload_url_normal (line 42) | async def test_upload_url_normal(self, config, mock_builder):
method test_upload_url_embedding (line 56) | async def test_upload_url_embedding(self, config, mock_builder):
method test_upload_url_filename_without_extension (line 70) | async def test_upload_url_filename_without_extension(self, config, moc...
method test_upload_url_trailing_slash_stripped (line 82) | async def test_upload_url_trailing_slash_stripped(self, mock_builder):
method test_converters_registered (line 96) | async def test_converters_registered(self, config, mock_builder):
FILE: agent/tests/unit_test/conftest.py
function mock_llm (line 26) | def mock_llm():
function mock_llm_response (line 34) | def mock_llm_response():
function sample_video_event (line 45) | def sample_video_event():
function sample_incidents (line 51) | def sample_incidents():
function sample_sensors (line 76) | def sample_sensors():
function sample_markdown_report (line 104) | def sample_markdown_report():
function sample_geocoding_response (line 127) | def sample_geocoding_response():
function mock_async_http_response (line 152) | def mock_async_http_response():
function utc_now (line 160) | def utc_now():
FILE: agent/tests/unit_test/data_models/test_vss.py
class TestFloatToInt (line 28) | class TestFloatToInt:
method test_float_to_int_positive (line 31) | def test_float_to_int_positive(self):
method test_float_to_int_zero (line 37) | def test_float_to_int_zero(self):
method test_float_to_int_already_int (line 41) | def test_float_to_int_already_int(self):
method test_float_to_int_none (line 45) | def test_float_to_int_none(self):
method test_float_to_int_large (line 49) | def test_float_to_int_large(self):
class TestTimestampValidator (line 54) | class TestTimestampValidator:
method test_valid_rfc3339_timestamp (line 57) | def test_valid_rfc3339_timestamp(self):
method test_invalid_timestamp_format (line 67) | def test_invalid_timestamp_format(self):
method test_invalid_timestamp_values (line 76) | def test_invalid_timestamp_values(self):
class TestRemoveTimezone (line 86) | class TestRemoveTimezone:
method test_remove_timezone_from_z_suffix (line 89) | def test_remove_timezone_from_z_suffix(self):
method test_remove_timezone_from_offset (line 97) | def test_remove_timezone_from_offset(self):
method test_remove_timezone_from_datetime (line 102) | def test_remove_timezone_from_datetime(self):
method test_remove_timezone_naive_datetime (line 110) | def test_remove_timezone_naive_datetime(self):
method test_remove_timezone_invalid_string (line 117) | def test_remove_timezone_invalid_string(self):
method test_remove_timezone_invalid_type (line 122) | def test_remove_timezone_invalid_type(self):
method test_remove_timezone_without_microseconds (line 127) | def test_remove_timezone_without_microseconds(self):
class TestMediaInfoOffset (line 133) | class TestMediaInfoOffset:
method test_create_media_info_offset (line 136) | def test_create_media_info_offset(self):
method test_media_info_offset_defaults (line 143) | def test_media_info_offset_defaults(self):
method test_media_info_offset_float_conversion (line 149) | def test_media_info_offset_float_conversion(self):
method test_media_info_offset_none_to_default (line 155) | def test_media_info_offset_none_to_default(self):
method test_media_info_offset_alias_start (line 161) | def test_media_info_offset_alias_start(self):
method test_media_info_offset_type_literal (line 170) | def test_media_info_offset_type_literal(self):
method test_media_info_offset_large_values (line 175) | def test_media_info_offset_large_values(self):
method test_media_info_offset_forbid_extra (line 180) | def test_media_info_offset_forbid_extra(self):
FILE: agent/tests/unit_test/embed/test_cosmos_embed.py
class TestCosmosEmbedClient (line 27) | class TestCosmosEmbedClient:
method test_init (line 30) | def test_init(self):
method test_init_with_trailing_slash (line 37) | def test_init_with_trailing_slash(self):
class TestGetImageEmbedding (line 44) | class TestGetImageEmbedding:
method client (line 48) | def client(self):
method test_get_image_embedding_base64 (line 52) | async def test_get_image_embedding_base64(self, client):
method test_get_image_embedding_url (line 67) | async def test_get_image_embedding_url(self, client):
method test_get_image_embedding_http_error (line 85) | async def test_get_image_embedding_http_error(self, client):
class TestGetTextEmbedding (line 95) | class TestGetTextEmbedding:
method client (line 99) | def client(self):
method test_get_text_embedding_success (line 103) | async def test_get_text_embedding_success(self, client):
method test_get_text_embedding_http_error (line 120) | async def test_get_text_embedding_http_error(self, client):
class TestGetVideoEmbedding (line 130) | class TestGetVideoEmbedding:
method client (line 134) | def client(self):
method test_get_video_embedding_success (line 138) | async def test_get_video_embedding_success(self, client):
class TestGetVideoEmbeddingsFromUrls (line 148) | class TestGetVideoEmbeddingsFromUrls:
method client (line 152) | def client(self):
method test_get_video_embeddings_single_url (line 156) | async def test_get_video_embeddings_single_url(self, client):
method test_get_video_embeddings_multiple_urls (line 174) | async def test_get_video_embeddings_multiple_urls(self, client):
method test_get_video_embeddings_url_formatting (line 200) | async def test_get_video_embeddings_url_formatting(self, client):
FILE: agent/tests/unit_test/evaluators/test_custom_qa.py
class TestDefaultQAEvalPrompt (line 27) | class TestDefaultQAEvalPrompt:
method test_prompt_exists (line 30) | def test_prompt_exists(self):
method test_prompt_has_input_variables (line 33) | def test_prompt_has_input_variables(self):
method test_prompt_template_content (line 38) | def test_prompt_template_content(self):
class TestCustomizedQAEvaluator (line 43) | class TestCustomizedQAEvaluator:
method test_init_default_prompt (line 46) | def test_init_default_prompt(self):
method test_init_custom_prompt (line 56) | def test_init_custom_prompt(self):
method test_init_custom_params (line 68) | def test_init_custom_params(self):
method test_evaluate_item_skips_wrong_method (line 83) | async def test_evaluate_item_skips_wrong_method(self):
method test_evaluate_item_missing_ground_truth (line 102) | async def test_evaluate_item_missing_ground_truth(self):
method test_evaluate_item_success (line 121) | async def test_evaluate_item_success(self):
method test_evaluate_item_strips_agent_think_tags (line 150) | async def test_evaluate_item_strips_agent_think_tags(self):
FILE: agent/tests/unit_test/evaluators/test_custom_trajectory.py
class TestScoreOutputParser (line 29) | class TestScoreOutputParser:
method test_parse_simple_score (line 32) | def test_parse_simple_score(self):
method test_parse_with_thinking (line 45) | def test_parse_with_thinking(self):
method test_parse_with_reasoning_content_attribute (line 58) | def test_parse_with_reasoning_content_attribute(self):
method test_parse_score_zero (line 71) | def test_parse_score_zero(self):
method test_parse_score_one (line 83) | def test_parse_score_one(self):
method test_parse_no_score_raises_error (line 95) | def test_parse_no_score_raises_error(self):
method test_parse_score_out_of_range_raises_error (line 107) | def test_parse_score_out_of_range_raises_error(self):
class TestCustomizedTrajectoryEvaluatorInit (line 120) | class TestCustomizedTrajectoryEvaluatorInit:
method test_init_with_dual_prompts (line 123) | def test_init_with_dual_prompts(self):
method test_init_defaults_to_none_prompts (line 137) | def test_init_defaults_to_none_prompts(self):
class TestExtractToolCallsFromLlmEnd (line 144) | class TestExtractToolCallsFromLlmEnd:
method evaluator (line 148) | def evaluator(self):
method test_parses_tool_calls_from_data_output (line 152) | def test_parses_tool_calls_from_data_output(self, evaluator):
method test_parses_openai_format_tool_calls (line 164) | def test_parses_openai_format_tool_calls(self, evaluator):
method test_parses_multiple_tool_calls (line 173) | def test_parses_multiple_tool_calls(self, evaluator):
method test_returns_empty_for_no_data (line 185) | def test_returns_empty_for_no_data(self, evaluator):
method test_returns_empty_for_no_tool_calls_string (line 190) | def test_returns_empty_for_no_tool_calls_string(self, evaluator):
method test_returns_empty_for_malformed_tool_calls (line 198) | def test_returns_empty_for_malformed_tool_calls(self, evaluator):
class TestGetAgentSelectedUuids (line 207) | class TestGetAgentSelectedUuids:
method evaluator (line 211) | def evaluator(self):
method _create_mock_step (line 216) | def _create_mock_step(self, event_type, uuid, parent_id, payload_name=...
method test_returns_llm_end_that_made_tool_selection (line 234) | def test_returns_llm_end_that_made_tool_selection(self, evaluator):
method test_excludes_llm_end_without_tool_calls (line 254) | def test_excludes_llm_end_without_tool_calls(self, evaluator):
method test_multiple_tool_selections (line 270) | def test_multiple_tool_selections(self, evaluator):
method test_nested_tool_calls_filtered (line 293) | def test_nested_tool_calls_filtered(self, evaluator):
method test_tool_name_must_match (line 335) | def test_tool_name_must_match(self, evaluator):
method test_tool_matching_respects_order (line 364) | def test_tool_matching_respects_order(self, evaluator):
method test_openai_format_tool_name (line 392) | def test_openai_format_tool_name(self, evaluator):
class TestEvaluateItem (line 417) | class TestEvaluateItem:
method _make_evaluator (line 420) | def _make_evaluator(self, prompt_with_ref=None, prompt_without_ref=None):
method _make_item (line 428) | def _make_item(self, item_id="test_001", query="What?", output="Answer...
method _make_agent_action (line 439) | def _make_agent_action(self, tool_name, tool_input):
method test_uses_prompt_with_reference (line 452) | async def test_uses_prompt_with_reference(self, mock_adapter, mock_inv...
method test_uses_prompt_without_reference (line 480) | async def test_uses_prompt_without_reference(self, mock_adapter, mock_...
method test_raises_when_reference_but_no_prompt (line 501) | async def test_raises_when_reference_but_no_prompt(self, mock_adapter):
method test_raises_when_no_reference_and_no_prompt (line 518) | async def test_raises_when_no_reference_and_no_prompt(self, mock_adapt...
method test_structured_tool_calls_step_numbering (line 533) | async def test_structured_tool_calls_step_numbering(self, mock_adapter...
method test_tool_with_no_preceding_llm_defaults_to_step_1 (line 573) | async def test_tool_with_no_preceding_llm_defaults_to_step_1(self, moc...
method test_string_tool_input_is_parsed (line 601) | async def test_string_tool_input_is_parsed(self, mock_adapter, mock_in...
method test_conversation_history_formatted_in_prompt (line 631) | async def test_conversation_history_formatted_in_prompt(self, mock_ada...
method test_no_conversation_history_shows_placeholder (line 661) | async def test_no_conversation_history_shows_placeholder(self, mock_ad...
method test_build_reasoning_includes_all_fields (line 681) | async def test_build_reasoning_includes_all_fields(self, mock_adapter,...
FILE: agent/tests/unit_test/evaluators/test_data_models.py
class TestEvaluationScore (line 20) | class TestEvaluationScore:
method test_create_evaluation_score (line 23) | def test_create_evaluation_score(self):
method test_evaluation_score_with_error (line 38) | def test_evaluation_score_with_error(self):
method test_evaluation_score_with_field_scores (line 48) | def test_evaluation_score_with_field_scores(self):
method test_evaluation_score_bounds (line 62) | def test_evaluation_score_bounds(self):
method test_evaluation_score_from_error (line 70) | def test_evaluation_score_from_error(self):
method test_evaluation_score_from_error_with_field_scores (line 84) | def test_evaluation_score_from_error_with_field_scores(self):
method test_evaluation_score_from_error_defaults (line 93) | def test_evaluation_score_from_error_defaults(self):
method test_evaluation_score_optional_fields (line 102) | def test_evaluation_score_optional_fields(self):
method test_evaluation_score_none_section_score (line 112) | def test_evaluation_score_none_section_score(self):
FILE: agent/tests/unit_test/evaluators/test_eval_config_models.py
class TestFieldConfig (line 24) | class TestFieldConfig:
method test_create_field_config_defaults (line 27) | def test_create_field_config_defaults(self):
method test_create_field_config_with_method (line 34) | def test_create_field_config_with_method(self):
method test_field_config_with_nested_fields (line 39) | def test_field_config_with_nested_fields(self):
method test_field_config_dynamic_discovery (line 51) | def test_field_config_dynamic_discovery(self):
method test_field_config_method_collection (line 59) | def test_field_config_method_collection(self):
method test_field_config_nested_method_collection (line 64) | def test_field_config_nested_method_collection(self):
method test_field_config_average_without_fields_error (line 76) | def test_field_config_average_without_fields_error(self):
method test_field_config_empty_fields_error (line 81) | def test_field_config_empty_fields_error(self):
method test_field_config_forbid_extra (line 86) | def test_field_config_forbid_extra(self):
method test_default_method_is_llm_judge (line 91) | def test_default_method_is_llm_judge(self):
method test_methods_collected_from_nested_structure (line 97) | def test_methods_collected_from_nested_structure(self):
method test_validation_errors_parametrized (line 125) | def test_validation_errors_parametrized(self, invalid_config, expected...
class TestEvalMetricsConfig (line 131) | class TestEvalMetricsConfig:
method test_create_from_dict (line 134) | def test_create_from_dict(self):
method test_from_dict_single_root_key (line 150) | def test_from_dict_single_root_key(self):
method test_from_dict_empty_dict (line 155) | def test_from_dict_empty_dict(self):
method test_from_dict_invalid_type (line 160) | def test_from_dict_invalid_type(self):
method test_methods_collected (line 165) | def test_methods_collected(self):
method test_config_with_dynamic_discovery (line 179) | def test_config_with_dynamic_discovery(self):
method test_deep_nesting (line 190) | def test_deep_nesting(self):
FILE: agent/tests/unit_test/evaluators/test_evaluate.py
class TestEvaluateModuleImports (line 19) | class TestEvaluateModuleImports:
method test_module_import (line 22) | def test_module_import(self):
class TestEvaluationHelpers (line 29) | class TestEvaluationHelpers:
method test_evaluation_metrics_exist (line 32) | def test_evaluation_metrics_exist(self):
FILE: agent/tests/unit_test/evaluators/test_evaluate_patch.py
function _make_item (line 35) | def _make_item(item_id: str, query: str = "q", full_dataset_entry: dict ...
function _make_multi_turn_entry (line 45) | def _make_multi_turn_entry(turns: list[dict]) -> dict:
class TestGetConversation (line 56) | class TestGetConversation:
method test_returns_list_when_present (line 57) | def test_returns_list_when_present(self):
method test_returns_empty_for_missing_key (line 61) | def test_returns_empty_for_missing_key(self):
method test_returns_empty_for_non_list (line 65) | def test_returns_empty_for_non_list(self, value):
method test_returns_empty_list_as_is (line 68) | def test_returns_empty_list_as_is(self):
class TestIsMultiTurnItem (line 75) | class TestIsMultiTurnItem:
method test_true_with_conversation (line 76) | def test_true_with_conversation(self):
method test_false_without_conversation (line 80) | def test_false_without_conversation(self):
method test_false_with_empty_conversation (line 83) | def test_false_with_empty_conversation(self):
class TestExpandMultiTurnItems (line 90) | class TestExpandMultiTurnItems:
method test_single_turn_passes_through (line 91) | def test_single_turn_passes_through(self):
method test_multi_turn_expanded (line 97) | def test_multi_turn_expanded(self):
method test_expanded_items_share_conversation_id (line 116) | def test_expanded_items_share_conversation_id(self):
method test_default_turn_id (line 131) | def test_default_turn_id(self):
method test_mixed_single_and_multi (line 139) | def test_mixed_single_and_multi(self):
method test_preserves_turn_fields (line 155) | def test_preserves_turn_fields(self):
class TestFilterByDatasetFilter (line 171) | class TestFilterByDatasetFilter:
method test_empty_filter_returns_all (line 172) | def test_empty_filter_returns_all(self):
method test_single_turn_matching (line 176) | def test_single_turn_matching(self):
method test_single_turn_no_match (line 184) | def test_single_turn_no_match(self):
method test_narrows_evaluation_method (line 189) | def test_narrows_evaluation_method(self):
method test_narrows_multi_method_to_multiple (line 194) | def test_narrows_multi_method_to_multiple(self):
method test_multi_turn_keeps_whole_conversation_if_any_turn_matches (line 199) | def test_multi_turn_keeps_whole_conversation_if_any_turn_matches(self):
method test_multi_turn_narrows_evaluation_methods (line 219) | def test_multi_turn_narrows_evaluation_methods(self):
method test_multi_turn_filters_out_entire_conversation_if_no_turn_matches (line 240) | def test_multi_turn_filters_out_entire_conversation_if_no_turn_matches...
method test_mixed_single_and_multi_turn (line 260) | def test_mixed_single_and_multi_turn(self):
method test_non_list_evaluation_method_skipped (line 287) | def test_non_list_evaluation_method_skipped(self):
method test_missing_evaluation_method_skipped (line 292) | def test_missing_evaluation_method_skipped(self):
class TestWriteLatencySummary (line 301) | class TestWriteLatencySummary:
method test_writes_json_file (line 302) | def test_writes_json_file(self, tmp_path):
method test_returns_none_for_no_trajectory (line 325) | def test_returns_none_for_no_trajectory(self, tmp_path):
method test_returns_none_on_error (line 339) | def test_returns_none_on_error(self):
class TestDatasetFilterValidation (line 350) | class TestDatasetFilterValidation:
method _validate_dataset_filter (line 358) | def _validate_dataset_filter(env_value: str) -> list[str]:
method test_all_is_valid (line 374) | def test_all_is_valid(self):
method test_single_filter (line 377) | def test_single_filter(self):
method test_multiple_filters (line 382) | def test_multiple_filters(self):
method test_whitespace_handling (line 386) | def test_whitespace_handling(self):
method test_case_insensitive (line 390) | def test_case_insensitive(self):
method test_invalid_value_raises (line 394) | def test_invalid_value_raises(self):
method test_all_combined_with_others_raises (line 398) | def test_all_combined_with_others_raises(self):
FILE: agent/tests/unit_test/evaluators/test_field_evaluators.py
class TestTokenizeText (line 30) | class TestTokenizeText:
method test_tokenize_simple_text (line 33) | def test_tokenize_simple_text(self):
method test_tokenize_with_punctuation (line 38) | def test_tokenize_with_punctuation(self):
method test_tokenize_numbers (line 45) | def test_tokenize_numbers(self):
method test_tokenize_empty_string (line 51) | def test_tokenize_empty_string(self):
method test_tokenize_case_insensitive (line 56) | def test_tokenize_case_insensitive(self):
class TestCalculateF1Score (line 62) | class TestCalculateF1Score:
method test_f1_identical_tokens (line 65) | def test_f1_identical_tokens(self):
method test_f1_no_overlap (line 70) | def test_f1_no_overlap(self):
method test_f1_partial_overlap (line 75) | def test_f1_partial_overlap(self):
method test_f1_both_empty (line 80) | def test_f1_both_empty(self):
method test_f1_pred_empty (line 85) | def test_f1_pred_empty(self):
method test_f1_ref_empty (line 90) | def test_f1_ref_empty(self):
method test_f1_single_token_match (line 95) | def test_f1_single_token_match(self):
method test_f1_zero_precision_recall_edge_case (line 100) | def test_f1_zero_precision_recall_edge_case(self):
class TestNonEmptyMetric (line 108) | class TestNonEmptyMetric:
method test_non_empty_with_content (line 112) | async def test_non_empty_with_content(self):
method test_non_empty_with_empty_string (line 119) | async def test_non_empty_with_empty_string(self):
method test_non_empty_with_whitespace_only (line 126) | async def test_non_empty_with_whitespace_only(self):
method test_non_empty_with_none (line 133) | async def test_non_empty_with_none(self):
class TestF1Metric (line 140) | class TestF1Metric:
method test_f1_metric_identical (line 144) | async def test_f1_metric_identical(self):
method test_f1_metric_different (line 151) | async def test_f1_metric_different(self):
method test_f1_metric_partial (line 158) | async def test_f1_metric_partial(self):
class TestExactMatchMetric (line 165) | class TestExactMatchMetric:
method test_exact_match_identical (line 169) | async def test_exact_match_identical(self):
method test_exact_match_different (line 176) | async def test_exact_match_different(self):
method test_exact_match_whitespace_normalized (line 183) | async def test_exact_match_whitespace_normalized(self):
method test_exact_match_case_sensitive (line 190) | async def test_exact_match_case_sensitive(self):
class TestRegexMetric (line 197) | class TestRegexMetric:
method test_regex_match (line 201) | async def test_regex_match(self):
method test_regex_no_match (line 208) | async def test_regex_no_match(self):
method test_regex_invalid_pattern (line 215) | async def test_regex_invalid_pattern(self):
method test_regex_email_pattern (line 222) | async def test_regex_email_pattern(self):
class TestRegisterMetric (line 229) | class TestRegisterMetric:
method test_register_new_metric (line 232) | def test_register_new_metric(self):
method test_duplicate_registration_raises (line 241) | def test_duplicate_registration_raises(self):
FILE: agent/tests/unit_test/evaluators/test_llm_judge.py
class TestFieldEvaluation (line 27) | class TestFieldEvaluation:
method test_field_evaluation_basic (line 30) | def test_field_evaluation_basic(self):
method test_field_evaluation_no_match (line 35) | def test_field_evaluation_no_match(self):
method test_field_evaluation_perfect_score (line 40) | def test_field_evaluation_perfect_score(self):
method test_field_evaluation_score_bounds (line 44) | def test_field_evaluation_score_bounds(self):
method test_field_evaluation_invalid_score_above (line 52) | def test_field_evaluation_invalid_score_above(self):
method test_field_evaluation_invalid_score_below (line 56) | def test_field_evaluation_invalid_score_below(self):
class TestLLMJudgeMetric (line 61) | class TestLLMJudgeMetric:
method test_init_missing_llm (line 64) | def test_init_missing_llm(self):
method test_init_missing_prompt (line 68) | def test_init_missing_prompt(self):
method test_init_success (line 73) | def test_init_success(self):
method test_init_custom_max_retries (line 82) | def test_init_custom_max_retries(self):
method test_init_with_multi_field_prompt (line 91) | def test_init_with_multi_field_prompt(self):
method test_evaluate_with_strings (line 101) | async def test_evaluate_with_strings(self):
method test_evaluate_with_dicts (line 123) | async def test_evaluate_with_dicts(self):
method test_evaluate_llm_error_returns_none (line 144) | async def test_evaluate_llm_error_returns_none(self):
method test_evaluate_with_field_discovery_no_prompt (line 159) | async def test_evaluate_with_field_discovery_no_prompt(self):
method test_evaluate_with_field_discovery_empty_fields (line 174) | async def test_evaluate_with_field_discovery_empty_fields(self):
FILE: agent/tests/unit_test/evaluators/test_llm_judge_coverage.py
class TestFieldEvaluation (line 27) | class TestFieldEvaluation:
method test_basic (line 30) | def test_basic(self):
method test_no_match (line 35) | def test_no_match(self):
method test_score_bounds (line 40) | def test_score_bounds(self):
class TestLLMJudgeMetricInit (line 47) | class TestLLMJudgeMetricInit:
method test_missing_llm_raises (line 50) | def test_missing_llm_raises(self):
method test_missing_prompt_raises (line 54) | def test_missing_prompt_raises(self):
method test_valid_init (line 67) | def test_valid_init(self):
method test_with_thinking_tag (line 85) | def test_with_thinking_tag(self):
method test_with_multi_field_prompt (line 102) | def test_with_multi_field_prompt(self):
class TestLLMJudgeMetricEvaluate (line 120) | class TestLLMJudgeMetricEvaluate:
method mock_metric (line 124) | def mock_metric(self):
method test_evaluate_success (line 140) | async def test_evaluate_success(self, mock_metric):
method test_evaluate_with_dict_values (line 153) | async def test_evaluate_with_dict_values(self, mock_metric):
method test_evaluate_failure_returns_none (line 166) | async def test_evaluate_failure_returns_none(self, mock_metric):
class TestLLMJudgeMetricInvokeLLM (line 172) | class TestLLMJudgeMetricInvokeLLM:
method mock_metric (line 176) | def mock_metric(self):
method test_invoke_with_retries (line 193) | async def test_invoke_with_retries(self, mock_metric):
method test_invoke_all_retries_fail (line 211) | async def test_invoke_all_retries_fail(self, mock_metric):
class TestLLMJudgeMetricFieldDiscovery (line 221) | class TestLLMJudgeMetricFieldDiscovery:
method mock_metric (line 225) | def mock_metric(self):
method test_empty_unspecified_fields (line 242) | async def test_empty_unspecified_fields(self, mock_metric):
method test_missing_multi_field_prompt_raises (line 249) | async def test_missing_multi_field_prompt_raises(self):
method test_field_discovery_exception_returns_none (line 271) | async def test_field_discovery_exception_returns_none(self, mock_metric):
FILE: agent/tests/unit_test/evaluators/test_llm_judge_field_discovery.py
class TestLLMJudgeFieldDiscoverySuccess (line 26) | class TestLLMJudgeFieldDiscoverySuccess:
method test_field_discovery_success (line 30) | async def test_field_discovery_success(self):
method test_field_discovery_missing_attribute (line 69) | async def test_field_discovery_missing_attribute(self):
method test_evaluate_with_non_str_actual (line 103) | async def test_evaluate_with_non_str_actual(self):
method test_invoke_with_thinking_tag (line 133) | async def test_invoke_with_thinking_tag(self):
FILE: agent/tests/unit_test/evaluators/test_register_coverage.py
class TestCustomizedQAEvaluatorConfig (line 24) | class TestCustomizedQAEvaluatorConfig:
method test_required_fields (line 27) | def test_required_fields(self):
method test_custom_values (line 35) | def test_custom_values(self):
method test_missing_llm_name_raises (line 48) | def test_missing_llm_name_raises(self):
class TestCustomizedTrajectoryEvaluatorConfig (line 53) | class TestCustomizedTrajectoryEvaluatorConfig:
method test_required_fields (line 56) | def test_required_fields(self):
method test_custom_values (line 66) | def test_custom_values(self):
method test_missing_llm_name_raises (line 81) | def test_missing_llm_name_raises(self):
FILE: agent/tests/unit_test/evaluators/test_report_evaluator.py
class MockMetric (line 40) | class MockMetric(EvaluationMetric):
method __init__ (line 43) | def __init__(self, score: float = 1.0):
method evaluate (line 46) | async def evaluate(self, actual: Any, reference: Any, field_name: str ...
class MockLLMJudge (line 51) | class MockLLMJudge(EvaluationMetric):
method __init__ (line 54) | def __init__(self, score: float = 1.0):
method evaluate (line 57) | async def evaluate(self, actual: Any, reference: Any, field_name: str ...
method evaluate_with_field_discovery (line 61) | async def evaluate_with_field_discovery(
class TestLoadEvalMetricsYAML (line 74) | class TestLoadEvalMetricsYAML:
method test_load_eval_metrics_yaml_success (line 77) | def test_load_eval_metrics_yaml_success(self):
method test_load_eval_metrics_yaml_errors (line 110) | def test_load_eval_metrics_yaml_errors(self, yaml_content, expected_er...
class TestFetchAndParseReport (line 125) | class TestFetchAndParseReport:
method test_fetch_and_parse_report_success (line 129) | async def test_fetch_and_parse_report_success(self):
method test_fetch_and_parse_report_errors (line 156) | async def test_fetch_and_parse_report_errors(self, response, url_patte...
class TestReportEvaluator (line 166) | class TestReportEvaluator:
method setup_method (line 167) | def setup_method(self):
method test_evaluate_tree_section_with_fields_verifies_averaging (line 196) | async def test_evaluate_tree_section_with_fields_verifies_averaging(se...
method test_evaluate_tree_default_to_llm_judge_when_method_none (line 234) | async def test_evaluate_tree_default_to_llm_judge_when_method_none(self):
method test_evaluate_tree_error_scenarios (line 252) | async def test_evaluate_tree_error_scenarios(self, setup_func, expecte...
method test_evaluate_tree_dynamic_discovery_reference_field_scenarios (line 288) | async def test_evaluate_tree_dynamic_discovery_reference_field_scenari...
method test_evaluate_tree_nested_sections (line 349) | async def test_evaluate_tree_nested_sections(self):
method test_evaluate_tree_explicit_plus_dynamic_discovery (line 409) | async def test_evaluate_tree_explicit_plus_dynamic_discovery(self):
method test_score_value_with_env_vars (line 457) | async def test_score_value_with_env_vars(self):
method test_evaluate_item_success (line 481) | async def test_evaluate_item_success(self):
method test_evaluate_item_error_handling (line 519) | async def test_evaluate_item_error_handling(self):
method test_evaluate_item_with_vlm_scoring (line 541) | async def test_evaluate_item_with_vlm_scoring(self):
method test_evaluate_item_with_vlm_scoring_disabled (line 616) | async def test_evaluate_item_with_vlm_scoring_disabled(self):
method test_evaluate_item_vlm_scoring_treats_none_as_zero (line 658) | async def test_evaluate_item_vlm_scoring_treats_none_as_zero(self):
FILE: agent/tests/unit_test/evaluators/test_utils.py
class TestShouldEvaluate (line 30) | class TestShouldEvaluate:
method test_missing_full_dataset_entry (line 33) | def test_missing_full_dataset_entry(self):
method test_missing_evaluation_method (line 47) | def test_missing_evaluation_method(self):
method test_evaluation_method_not_list (line 59) | def test_evaluation_method_not_list(self):
method test_evaluator_type_in_list (line 71) | def test_evaluator_type_in_list(self):
method test_evaluator_type_not_in_list (line 83) | def test_evaluator_type_not_in_list(self):
method test_empty_evaluation_method_list (line 94) | def test_empty_evaluation_method_list(self):
class TestComputeItemLatency (line 106) | class TestComputeItemLatency:
method _make_item (line 109) | def _make_item(self, trajectory_timestamps=None):
method test_computes_latency_from_timestamps (line 123) | def test_computes_latency_from_timestamps(self):
method test_single_timestamp_returns_zero (line 127) | def test_single_timestamp_returns_zero(self):
method test_two_timestamps (line 131) | def test_two_timestamps(self):
method test_returns_none_for_empty_trajectory (line 135) | def test_returns_none_for_empty_trajectory(self):
method test_returns_none_for_no_trajectory (line 139) | def test_returns_none_for_no_trajectory(self):
method test_rounds_to_3_decimals (line 143) | def test_rounds_to_3_decimals(self):
class TestStripAgentThinkTags (line 148) | class TestStripAgentThinkTags:
method test_no_tags (line 151) | def test_no_tags(self):
method test_single_tag (line 155) | def test_single_tag(self):
method test_multiple_tags (line 159) | def test_multiple_tags(self):
method test_multiline_tags (line 163) | def test_multiline_tags(self):
method test_empty_string (line 170) | def test_empty_string(self):
method test_none_input (line 173) | def test_none_input(self):
method test_only_tags (line 176) | def test_only_tags(self):
class TestScoreOutputParser (line 181) | class TestScoreOutputParser:
method test_parse_simple_score (line 184) | def test_parse_simple_score(self):
method test_parse_score_with_text (line 197) | def test_parse_score_with_text(self):
method test_parse_with_think_tags (line 209) | def test_parse_with_think_tags(self):
class TestInvokeLLMWithRetry (line 223) | class TestInvokeLLMWithRetry:
method test_successful_invocation (line 227) | async def test_successful_invocation(self):
method test_retry_on_failure (line 260) | async def test_retry_on_failure(self):
method test_exhausted_retries (line 294) | async def test_exhausted_retries(self):
method test_llm_judge_reasoning_disabled (line 322) | async def test_llm_judge_reasoning_disabled(self):
FILE: agent/tests/unit_test/test_prompt.py
class TestVlmPromptExamples (line 24) | class TestVlmPromptExamples:
method test_examples_is_list (line 27) | def test_examples_is_list(self):
method test_examples_not_empty (line 31) | def test_examples_not_empty(self):
class TestVlmFormatInstruction (line 36) | class TestVlmFormatInstruction:
method test_instruction_is_string (line 39) | def test_instruction_is_string(self):
method test_instruction_mentions_timestamp (line 43) | def test_instruction_mentions_timestamp(self):
class TestInitSummarizePrompt (line 48) | class TestInitSummarizePrompt:
method test_prompt_is_dict (line 51) | def test_prompt_is_dict(self):
method test_prompt_has_required_keys (line 55) | def test_prompt_has_required_keys(self):
class TestVideoFrameTimestampPrompt (line 62) | class TestVideoFrameTimestampPrompt:
method test_prompt_is_string (line 65) | def test_prompt_is_string(self):
class TestVssSummarizePrompt (line 70) | class TestVssSummarizePrompt:
method test_prompt_is_string (line 73) | def test_prompt_is_string(self):
method test_prompt_contains_placeholders (line 77) | def test_prompt_contains_placeholders(self):
FILE: agent/tests/unit_test/test_sitecustomize.py
class TestSiteCustomize (line 21) | class TestSiteCustomize:
method test_load_env_file_with_dotenv (line 24) | def test_load_env_file_with_dotenv(self, tmp_path):
method test_load_env_file_without_dotenv (line 36) | def test_load_env_file_without_dotenv(self, tmp_path):
method test_load_env_file_nonexistent (line 47) | def test_load_env_file_nonexistent(self, tmp_path):
method test_auto_load_env_files_no_pointer (line 58) | def test_auto_load_env_files_no_pointer(self, tmp_path):
method test_auto_load_env_files_with_pointer (line 70) | def test_auto_load_env_files_with_pointer(self, tmp_path):
method test_auto_load_env_files_empty_pointer (line 98) | def test_auto_load_env_files_empty_pointer(self, tmp_path):
FILE: agent/tests/unit_test/tools/test_build_vst_url.py
class TestBuildVstUrl (line 23) | class TestBuildVstUrl:
method test_replaces_scheme_and_host (line 26) | def test_replaces_scheme_and_host(self):
method test_preserves_path_query_fragment (line 33) | def test_preserves_path_query_fragment(self):
method test_https_base_url (line 40) | def test_https_base_url(self):
method test_base_url_trailing_slash (line 47) | def test_base_url_trailing_slash(self):
method test_no_path (line 54) | def test_no_path(self):
method test_root_path (line 61) | def test_root_path(self):
method test_same_host (line 68) | def test_same_host(self):
method test_parametrized (line 90) | def test_parametrized(self, base, url, expected):
FILE: agent/tests/unit_test/tools/test_chart_generator.py
class TestChartType (line 34) | class TestChartType:
method test_chart_type_values (line 37) | def test_chart_type_values(self):
method test_chart_type_all_values (line 41) | def test_chart_type_all_values(self):
class TestChartFileFormat (line 45) | class TestChartFileFormat:
method test_chart_file_format_values (line 48) | def test_chart_file_format_values(self):
class TestChartData (line 54) | class TestChartData:
method test_chart_data_defaults (line 57) | def test_chart_data_defaults(self):
method test_chart_data_with_values (line 62) | def test_chart_data_with_values(self):
class TestBarChartData (line 68) | class TestBarChartData:
method test_bar_chart_data_creation (line 71) | def test_bar_chart_data_creation(self):
method test_bar_chart_data_full (line 81) | def test_bar_chart_data_full(self):
method test_bar_chart_data_empty_series (line 95) | def test_bar_chart_data_empty_series(self):
class TestPieChartData (line 103) | class TestPieChartData:
method test_pie_chart_data_creation (line 106) | def test_pie_chart_data_creation(self):
method test_pie_chart_data_with_title (line 115) | def test_pie_chart_data_with_title(self):
class TestChartGeneratorConfig (line 124) | class TestChartGeneratorConfig:
method test_config_defaults (line 127) | def test_config_defaults(self):
method test_config_with_custom_url (line 132) | def test_config_with_custom_url(self):
method test_config_url_with_trailing_slash (line 137) | def test_config_url_with_trailing_slash(self):
method test_config_url_with_query_fails (line 141) | def test_config_url_with_query_fails(self):
method test_config_url_with_fragment_fails (line 145) | def test_config_url_with_fragment_fails(self):
method test_config_url_pointing_to_file_fails (line 149) | def test_config_url_pointing_to_file_fails(self):
class TestChartGeneratorInput (line 154) | class TestChartGeneratorInput:
method test_input_with_bar_chart (line 157) | def test_input_with_bar_chart(self):
method test_input_with_pie_chart (line 167) | def test_input_with_pie_chart(self):
method test_input_with_mixed_charts (line 175) | def test_input_with_mixed_charts(self):
method test_input_output_dir_sanitization (line 181) | def test_input_output_dir_sanitization(self):
method test_input_output_dir_absolute_path (line 189) | def test_input_output_dir_absolute_path(self):
method test_input_output_dir_none (line 196) | def test_input_output_dir_none(self):
class TestChartGenExecOutput (line 201) | class TestChartGenExecOutput:
method test_output_success (line 204) | def test_output_success(self):
method test_output_failure (line 214) | def test_output_failure(self):
class TestPlotBarChart (line 224) | class TestPlotBarChart:
method test_plot_bar_chart_single_series (line 227) | def test_plot_bar_chart_single_series(self):
method test_plot_bar_chart_multiple_series (line 242) | def test_plot_bar_chart_multiple_series(self):
method test_plot_bar_chart_empty_series (line 257) | def test_plot_bar_chart_empty_series(self):
class TestPlotPieChart (line 269) | class TestPlotPieChart:
method test_plot_pie_chart_basic (line 272) | def test_plot_pie_chart_basic(self):
method test_plot_pie_chart_no_title (line 284) | def test_plot_pie_chart_no_title(self):
class TestConvertToFormat (line 296) | class TestConvertToFormat:
method test_convert_to_png (line 299) | def test_convert_to_png(self):
method test_convert_to_svg (line 314) | def test_convert_to_svg(self):
class TestStrInputConverter (line 328) | class TestStrInputConverter:
method test_convert_json_string (line 331) | def test_convert_json_string(self):
method test_convert_with_chart_data (line 337) | def test_convert_with_chart_data(self):
method test_convert_invalid_json (line 351) | def test_convert_invalid_json(self):
FILE: agent/tests/unit_test/tools/test_chart_generator_converters.py
class TestChartGeneratorConverters (line 26) | class TestChartGeneratorConverters:
method config (line 30) | def config(self):
method mock_builder (line 37) | def mock_builder(self):
method test_output_converter_with_success (line 43) | async def test_output_converter_with_success(self, config, mock_builder):
method test_output_converter_all_failed (line 59) | async def test_output_converter_all_failed(self, config, mock_builder):
method test_chat_response_converter (line 70) | async def test_chat_response_converter(self, config, mock_builder):
FILE: agent/tests/unit_test/tools/test_chart_generator_coverage.py
class TestChartType (line 39) | class TestChartType:
method test_bar (line 42) | def test_bar(self):
method test_pie (line 45) | def test_pie(self):
class TestChartFileFormat (line 49) | class TestChartFileFormat:
method test_png (line 52) | def test_png(self):
method test_svg (line 55) | def test_svg(self):
method test_jpeg (line 58) | def test_jpeg(self):
class TestBarChartData (line 62) | class TestBarChartData:
method test_basic (line 65) | def test_basic(self):
method test_with_labels (line 75) | def test_with_labels(self):
class TestPieChartData (line 88) | class TestPieChartData:
method test_basic (line 91) | def test_basic(self):
method test_with_title (line 96) | def test_with_title(self):
class TestPlotBarChart (line 101) | class TestPlotBarChart:
method test_basic_bar_chart (line 104) | def test_basic_bar_chart(self):
method test_multiple_series (line 116) | def test_multiple_series(self):
class TestPlotPieChart (line 126) | class TestPlotPieChart:
method test_basic_pie_chart (line 129) | def test_basic_pie_chart(self):
method test_pie_chart_no_title (line 135) | def test_pie_chart_no_title(self):
class TestConvertToFormat (line 142) | class TestConvertToFormat:
method test_convert_to_png (line 145) | def test_convert_to_png(self):
method test_convert_to_svg (line 153) | def test_convert_to_svg(self):
class TestChartGeneratorConfig (line 162) | class TestChartGeneratorConfig:
method test_defaults (line 165) | def test_defaults(self):
method test_custom_url (line 170) | def test_custom_url(self):
method test_url_with_query_raises (line 174) | def test_url_with_query_raises(self):
method test_url_with_fragment_raises (line 178) | def test_url_with_fragment_raises(self):
method test_url_pointing_to_file_raises (line 182) | def test_url_pointing_to_file_raises(self):
method test_url_normalization (line 186) | def test_url_normalization(self):
class TestChartGeneratorInput (line 191) | class TestChartGeneratorInput:
method test_basic (line 194) | def test_basic(self):
method test_output_dir_sanitized (line 201) | def test_output_dir_sanitized(self):
method test_output_dir_none (line 206) | def test_output_dir_none(self):
class TestChartGenExecOutput (line 212) | class TestChartGenExecOutput:
method test_success (line 215) | def test_success(self):
method test_failure (line 224) | def test_failure(self):
class TestStrInputConverter (line 233) | class TestStrInputConverter:
method test_valid_json (line 236) | def test_valid_json(self):
method test_invalid_json_raises (line 242) | def test_invalid_json_raises(self):
class TestChatRequestInputConverter (line 247) | class TestChatRequestInputConverter:
method test_valid_request (line 250) | def test_valid_request(self):
method test_invalid_content_raises (line 261) | def test_invalid_content_raises(self):
FILE: agent/tests/unit_test/tools/test_chart_generator_inner.py
class TestChartGeneratorInner (line 29) | class TestChartGeneratorInner:
method config (line 33) | def config(self):
method mock_builder (line 40) | def mock_builder(self):
method test_generate_bar_chart (line 48) | async def test_generate_bar_chart(self, config, mock_builder):
method test_generate_pie_chart (line 63) | async def test_generate_pie_chart(self, config, mock_builder):
method test_generate_multiple_charts (line 77) | async def test_generate_multiple_charts(self, config, mock_builder):
method test_no_object_store_raises (line 92) | async def test_no_object_store_raises(self, mock_builder):
method test_output_converter (line 105) | async def test_output_converter(self, config, mock_builder):
FILE: agent/tests/unit_test/tools/test_code_executor.py
class TestCodeExecutorConfig (line 28) | class TestCodeExecutorConfig:
method test_config_creation (line 31) | def test_config_creation(self):
method test_config_with_gpu (line 41) | def test_config_with_gpu(self):
method test_config_missing_base_image (line 49) | def test_config_missing_base_image(self):
method test_config_missing_language_packages (line 53) | def test_config_missing_language_packages(self):
method test_config_empty_packages (line 57) | def test_config_empty_packages(self):
class TestCodeExecutorInput (line 65) | class TestCodeExecutorInput:
method test_input_with_code (line 68) | def test_input_with_code(self):
method test_input_with_files (line 76) | def test_input_with_files(self):
method test_input_none_code (line 83) | def test_input_none_code(self):
method test_input_multiple_files (line 90) | def test_input_multiple_files(self):
class TestCodeExecutorOutput (line 102) | class TestCodeExecutorOutput:
method test_output_success (line 105) | def test_output_success(self):
method test_output_error (line 109) | def test_output_error(self):
method test_output_empty_message (line 113) | def test_output_empty_message(self):
method test_output_multiline (line 117) | def test_output_multiline(self):
method test_output_serialization (line 121) | def test_output_serialization(self):
class TestDockerBackendModule (line 127) | class TestDockerBackendModule:
method test_cleanup_docker_resources (line 130) | def test_cleanup_docker_resources(self):
FILE: agent/tests/unit_test/tools/test_embed_search.py
class TestChatRequestInputConverter (line 30) | class TestChatRequestInputConverter:
method test_valid_json_params (line 33) | def test_valid_json_params(self):
method test_valid_json_prompts (line 43) | def test_valid_json_prompts(self):
method test_invalid_json_uses_content_as_query (line 53) | def test_invalid_json_uses_content_as_query(self):
method test_json_without_params_or_prompts (line 63) | def test_json_without_params_or_prompts(self):
class TestEmbedSearchConfigValidation (line 74) | class TestEmbedSearchConfigValidation:
method test_missing_cosmos_endpoint_raises (line 77) | def test_missing_cosmos_endpoint_raises(self):
method test_missing_es_endpoint_raises (line 84) | def test_missing_es_endpoint_raises(self):
method test_missing_vst_base_url_raises (line 91) | def test_missing_vst_base_url_raises(self):
class TestQueryInputValidation (line 99) | class TestQueryInputValidation:
method test_empty_embeddings_list (line 102) | def test_empty_embeddings_list(self):
method test_embeddings_with_nested_dict (line 106) | def test_embeddings_with_nested_dict(self):
class TestEmbedSearchResultItem (line 115) | class TestEmbedSearchResultItem:
method test_defaults (line 118) | def test_defaults(self):
method test_with_values (line 128) | def test_with_values(self):
method test_serialization (line 146) | def test_serialization(self):
class TestEmbedSearchOutput (line 157) | class TestEmbedSearchOutput:
method test_defaults (line 160) | def test_defaults(self):
method test_with_results (line 165) | def test_with_results(self):
method test_serialization (line 177) | def test_serialization(self):
FILE: agent/tests/unit_test/tools/test_embed_search_coverage.py
class TestSanitizeForLogging (line 25) | class TestSanitizeForLogging:
method test_dict_with_vector_field (line 28) | def test_dict_with_vector_field(self):
method test_dict_with_empty_vector (line 34) | def test_dict_with_empty_vector(self):
method test_dict_with_query_vector (line 39) | def test_dict_with_query_vector(self):
method test_dict_with_embeddings_list (line 44) | def test_dict_with_embeddings_list(self):
method test_nested_dict (line 49) | def test_nested_dict(self):
method test_list_of_dicts (line 54) | def test_list_of_dicts(self):
method test_plain_value (line 60) | def test_plain_value(self):
method test_vector_non_list (line 65) | def test_vector_non_list(self):
class TestStrInputConverterEdgeCases (line 71) | class TestStrInputConverterEdgeCases:
method test_json_with_both_params_and_prompts_and_source_type (line 74) | def test_json_with_both_params_and_prompts_and_source_type(self):
method test_json_missing_source_type_falls_back (line 80) | def test_json_missing_source_type_falls_back(self):
class TestBase2025Constant (line 88) | class TestBase2025Constant:
method test_base_2025_is_utc (line 91) | def test_base_2025_is_utc(self):
method test_base_2025_is_jan_1 (line 96) | def test_base_2025_is_jan_1(self):
class TestEmbedSearchOutputEdgeCases (line 102) | class TestEmbedSearchOutputEdgeCases:
method test_with_query_embedding (line 105) | def test_with_query_embedding(self):
method test_empty_results_serialization (line 109) | def test_empty_results_serialization(self):
FILE: agent/tests/unit_test/tools/test_embed_search_edge_cases.py
function _make_es_response (line 30) | def _make_es_response(hits):
class TestEmbedSearchEdgeCases (line 37) | class TestEmbedSearchEdgeCases:
method config (line 41) | def config(self):
method mock_builder (line 50) | def mock_builder(self):
method mock_es_client (line 54) | def mock_es_client(self):
method mock_embed_client (line 60) | def mock_embed_client(self):
method _get_inner_fn (line 65) | async def _get_inner_fn(self, config, mock_builder, mock_es_client, mo...
method test_top_k_limits_results (line 73) | async def test_top_k_limits_results(self, config, mock_builder, mock_e...
method test_empty_response_field (line 111) | async def test_empty_response_field(self, config, mock_builder, mock_e...
method test_no_sensor_description (line 130) | async def test_no_sensor_description(self, config, mock_builder, mock_...
method test_response_data_not_dict (line 158) | async def test_response_data_not_dict(self, config, mock_builder, mock...
method test_with_filters_and_timestamps (line 177) | async def test_with_filters_and_timestamps(self, config, mock_builder,...
method test_timestamp_without_tz (line 198) | async def test_timestamp_without_tz(self, config, mock_builder, mock_e...
FILE: agent/tests/unit_test/tools/test_embed_search_inner.py
function _make_es_hit (line 30) | def _make_es_hit(source, score=0.9):
function _make_es_response (line 35) | def _make_es_response(hits):
class TestEmbedSearchInner (line 43) | class TestEmbedSearchInner:
method config (line 47) | def config(self):
method mock_builder (line 56) | def mock_builder(self):
method mock_es_client (line 60) | def mock_es_client(self):
method mock_embed_client (line 66) | def mock_embed_client(self):
method _get_inner_fn (line 73) | async def _get_inner_fn(self, config, mock_builder, mock_es_client, mo...
method test_text_query (line 81) | async def test_text_query(self, config, mock_builder, mock_es_client, ...
method test_image_url_query (line 114) | async def test_image_url_query(self, config, mock_builder, mock_es_cli...
method test_video_url_query (line 133) | async def test_video_url_query(self, config, mock_builder, mock_es_cli...
method test_precomputed_embeddings (line 144) | async def test_precomputed_embeddings(self, config, mock_builder, mock...
method test_no_query_raises (line 154) | async def test_no_query_raises(self, config, mock_builder, mock_es_cli...
method test_with_video_sources_filter (line 161) | async def test_with_video_sources_filter(self, config, mock_builder, m...
method test_with_comma_separated_video_sources (line 172) | async def test_with_comma_separated_video_sources(self, config, mock_b...
method test_with_description_filter (line 183) | async def test_with_description_filter(self, config, mock_builder, moc...
method test_with_timestamp_filters (line 192) | async def test_with_timestamp_filters(self, config, mock_builder, mock...
method test_with_top_k (line 208) | async def test_with_top_k(self, config, mock_builder, mock_es_client, ...
method test_with_min_cosine_similarity (line 217) | async def test_with_min_cosine_similarity(self, config, mock_builder, ...
method test_es_index_not_found (line 237) | async def test_es_index_not_found(self, config, mock_builder, mock_es_...
method test_hit_without_llm_skipped (line 252) | async def test_hit_without_llm_skipped(self, config, mock_builder, moc...
method test_hit_with_location_and_coordinate (line 268) | async def test_hit_with_location_and_coordinate(self, config, mock_bui...
method test_hit_with_no_queries (line 304) | async def test_hit_with_no_queries(self, config, mock_builder, mock_es...
method test_invalid_timestamp_in_response (line 323) | async def test_invalid_timestamp_in_response(self, config, mock_builde...
method test_timestamp_start_only (line 349) | async def test_timestamp_start_only(self, config, mock_builder, mock_e...
method test_invalid_timestamp_in_params (line 360) | async def test_invalid_timestamp_in_params(self, config, mock_builder,...
method test_with_vst_internal_url (line 372) | async def test_with_vst_internal_url(self, mock_builder, mock_es_clien...
method test_single_video_source_not_list (line 392) | async def test_single_video_source_not_list(self, config, mock_builder...
method test_queries_data_not_list (line 401) | async def test_queries_data_not_list(self, config, mock_builder, mock_...
method test_response_not_json (line 418) | async def test_response_not_json(self, config, mock_builder, mock_es_c...
method test_rtsp_source_type (line 437) | async def test_rtsp_source_type(self, config, mock_builder, mock_es_cl...
method test_video_file_index_not_exists (line 447) | async def test_video_file_index_not_exists(self, config, mock_builder,...
FILE: agent/tests/unit_test/tools/test_evaluation_compressor.py
class TestEvaluationCompressorConfig (line 26) | class TestEvaluationCompressorConfig:
method test_required_fields (line 29) | def test_required_fields(self):
method test_custom_remove_caption_details (line 38) | def test_custom_remove_caption_details(self):
method test_missing_llm_name_fails (line 46) | def test_missing_llm_name_fails(self):
method test_missing_token_limit_fails (line 50) | def test_missing_token_limit_fails(self):
class TestEvaluationCompressorInput (line 55) | class TestEvaluationCompressorInput:
method test_basic_input (line 58) | def test_basic_input(self):
method test_empty_string (line 62) | def test_empty_string(self):
method test_long_text (line 66) | def test_long_text(self):
class TestRemoveCaptionDetails (line 72) | class TestRemoveCaptionDetails:
method test_removes_timestamp_lines (line 75) | def test_removes_timestamp_lines(self):
method test_preserves_non_timestamp_lines (line 84) | def test_preserves_non_timestamp_lines(self):
method test_empty_input (line 93) | def test_empty_input(self):
method test_mixed_content (line 97) | def test_mixed_content(self):
method test_timestamp_with_spaces (line 116) | def test_timestamp_with_spaces(self):
class TestSplitTextBySections (line 124) | class TestSplitTextBySections:
method test_single_section (line 127) | def test_single_section(self):
method test_two_sections (line 133) | def test_two_sections(self):
method test_more_sections_than_paragraphs (line 142) | def test_more_sections_than_paragraphs(self):
method test_equal_sections (line 148) | def test_equal_sections(self):
method test_invalid_num_sections (line 159) | def test_invalid_num_sections(self):
method test_negative_num_sections (line 163) | def test_negative_num_sections(self):
method test_many_paragraphs (line 167) | def test_many_paragraphs(self):
FILE: agent/tests/unit_test/tools/test_fov_counts.py
class TestFOVCountsWithChartConfig (line 22) | class TestFOVCountsWithChartConfig:
method test_config_creation (line 25) | def test_config_creation(self):
method test_config_custom_base_url (line 34) | def test_config_custom_base_url(self):
class TestFOVCountsWithChartInput (line 43) | class TestFOVCountsWithChartInput:
method test_input_minimal (line 46) | def test_input_minimal(self):
method test_input_full (line 56) | def test_input_full(self):
method test_input_various_object_types (line 67) | def test_input_various_object_types(self):
class TestFOVCountsWithChartOutput (line 78) | class TestFOVCountsWithChartOutput:
method test_output_creation (line 81) | def test_output_creation(self):
method test_output_with_chart_url (line 93) | def test_output_with_chart_url(self):
method test_output_zero_counts (line 103) | def test_output_zero_counts(self):
method test_output_serialization (line 113) | def test_output_serialization(self):
FILE: agent/tests/unit_test/tools/test_geolocation.py
class TestGeolocationConfig (line 22) | class TestGeolocationConfig:
method test_config_defaults (line 25) | def test_config_defaults(self):
method test_config_custom_timeout (line 29) | def test_config_custom_timeout(self):
class TestGeolocationInput (line 34) | class TestGeolocationInput:
method test_input_creation (line 37) | def test_input_creation(self):
method test_input_zero_coordinates (line 42) | def test_input_zero_coordinates(self):
method test_input_negative_coordinates (line 47) | def test_input_negative_coordinates(self):
method test_input_extreme_latitude (line 52) | def test_input_extreme_latitude(self):
method test_input_extreme_longitude (line 56) | def test_input_extreme_longitude(self):
class TestGeolocationOutput (line 61) | class TestGeolocationOutput:
method test_output_defaults (line 64) | def test_output_defaults(self):
method test_output_full_data (line 77) | def test_output_full_data(self):
method test_output_partial_data (line 97) | def test_output_partial_data(self):
method test_output_serialization (line 106) | def test_output_serialization(self):
FILE: agent/tests/unit_test/tools/test_incidents.py
class TestVARetrievalConfig (line 22) | class TestVARetrievalConfig:
method test_defaults (line 25) | def test_defaults(self):
method test_custom_values (line 36) | def test_custom_values(self):
class TestVARetrievalInput (line 57) | class TestVARetrievalInput:
method test_defaults (line 60) | def test_defaults(self):
method test_sql_query_action (line 72) | def test_sql_query_action(self):
method test_get_schema_action (line 77) | def test_get_schema_action(self):
method test_single_incident_retrieval (line 81) | def test_single_incident_retrieval(self):
method test_time_range_query (line 85) | def test_time_range_query(self):
method test_place_source_type (line 99) | def test_place_source_type(self):
method test_with_includes (line 107) | def test_with_includes(self):
class TestDuckDBIncidentsManagerNormalizeTimestamp (line 112) | class TestDuckDBIncidentsManagerNormalizeTimestamp:
method test_none_timestamp (line 115) | def test_none_timestamp(self):
method test_z_suffix_conversion (line 119) | def test_z_suffix_conversion(self):
method test_timestamp_with_offset (line 123) | def test_timestamp_with_offset(self):
method test_timestamp_with_milliseconds (line 127) | def test_timestamp_with_milliseconds(self):
method test_timestamp_with_microseconds (line 131) | def test_timestamp_with_microseconds(self):
class TestDuckDBIncidentsManagerInit (line 136) | class TestDuckDBIncidentsManagerInit:
method test_init (line 139) | def test_init(self):
method test_class_level_instances (line 147) | def test_class_level_instances(self):
FILE: agent/tests/unit_test/tools/test_lvs_video_understanding.py
class TestLVSVideoUnderstandingConfig (line 24) | class TestLVSVideoUnderstandingConfig:
method test_with_required_fields (line 27) | def test_with_required_fields(self):
method test_custom_timeouts (line 44) | def test_custom_timeouts(self):
method test_custom_model (line 56) | def test_custom_model(self):
method test_custom_video_url_tool (line 66) | def test_custom_video_url_tool(self):
method test_missing_lvs_backend_url_fails (line 76) | def test_missing_lvs_backend_url_fails(self):
method test_missing_hitl_template_fails (line 84) | def test_missing_hitl_template_fails(self):
class TestLVSVideoUnderstandingInput (line 93) | class TestLVSVideoUnderstandingInput:
method test_basic_input (line 96) | def test_basic_input(self):
method test_missing_sensor_id_fails (line 102) | def test_missing_sensor_id_fails(self):
method test_empty_sensor_id_fails (line 106) | def test_empty_sensor_id_fails(self):
FILE: agent/tests/unit_test/tools/test_multi_incident_formatter.py
class TestNormalizeTimestamp (line 27) | class TestNormalizeTimestamp:
method test_normalize_microseconds (line 30) | def test_normalize_microseconds(self):
method test_normalize_already_correct (line 35) | def test_normalize_already_correct(self):
method test_normalize_short_milliseconds (line 40) | def test_normalize_short_milliseconds(self):
method test_normalize_no_fractional (line 45) | def test_normalize_no_fractional(self):
class TestIncidentData (line 52) | class TestIncidentData:
method test_create_incident_data (line 55) | def test_create_incident_data(self):
method test_incident_data_default_metadata (line 68) | def test_incident_data_default_metadata(self):
class TestMultiIncidentFormatterInput (line 79) | class TestMultiIncidentFormatterInput:
method test_create_input_basic (line 82) | def test_create_input_basic(self):
method test_create_input_with_times (line 92) | def test_create_input_with_times(self):
method test_create_input_timestamp_normalization (line 103) | def test_create_input_timestamp_normalization(self):
class TestMultiIncidentFormatterOutput (line 115) | class TestMultiIncidentFormatterOutput:
method test_create_output (line 118) | def test_create_output(self):
method test_create_output_no_chart (line 128) | def test_create_output_no_chart(self):
class TestDetermineOptimalBinSize (line 137) | class TestDetermineOptimalBinSize:
method test_determine_bin_size_empty (line 140) | def test_determine_bin_size_empty(self):
method test_determine_bin_size_single_incident (line 145) | def test_determine_bin_size_single_incident(self):
method test_determine_bin_size_hour_range (line 159) | def test_determine_bin_size_hour_range(self):
method test_determine_bin_size_day_range (line 178) | def test_determine_bin_size_day_range(self):
method test_determine_bin_size_invalid_timestamps (line 197) | def test_determine_bin_size_invalid_timestamps(self):
FILE: agent/tests/unit_test/tools/test_prompt_gen.py
class TestPromptGenConfig (line 21) | class TestPromptGenConfig:
method test_with_required_field (line 24) | def test_with_required_field(self):
method test_custom_prompt (line 29) | def test_custom_prompt(self):
class TestPromptGenInput (line 38) | class TestPromptGenInput:
method test_basic_input (line 41) | def test_basic_input(self):
method test_with_detailed_thinking (line 51) | def test_with_detailed_thinking(self):
method test_with_previous_prompt (line 59) | def test_with_previous_prompt(self):
method test_all_fields (line 67) | def test_all_fields(self):
FILE: agent/tests/unit_test/tools/test_prompt_gen_coverage.py
class TestPromptGenConfig (line 24) | class TestPromptGenConfig:
method test_required_fields (line 27) | def test_required_fields(self):
method test_custom_prompt (line 32) | def test_custom_prompt(self):
method test_missing_llm_raises (line 36) | def test_missing_llm_raises(self):
class TestPromptGenInput (line 41) | class TestPromptGenInput:
method test_required_fields (line 44) | def test_required_fields(self):
method test_all_fields (line 51) | def test_all_fields(self):
method test_missing_user_query_raises (line 61) | def test_missing_user_query_raises(self):
method test_missing_user_intent_raises (line 65) | def test_missing_user_intent_raises(self):
FILE: agent/tests/unit_test/tools/test_prompt_gen_inner.py
class TestPromptGenInner (line 27) | class TestPromptGenInner:
method config (line 31) | def config(self):
method mock_builder (line 37) | def mock_builder(self):
method test_basic_prompt_gen (line 41) | async def test_basic_prompt_gen(self, config, mock_builder):
method test_prompt_gen_with_detailed_thinking (line 57) | async def test_prompt_gen_with_detailed_thinking(self, config, mock_bu...
method test_prompt_gen_with_previous_prompt (line 73) | async def test_prompt_gen_with_previous_prompt(self, config, mock_buil...
FILE: agent/tests/unit_test/tools/test_python_executor.py
class TestCodeExecutorConfig (line 25) | class TestCodeExecutorConfig:
method test_with_required_fields (line 28) | def test_with_required_fields(self):
method test_with_gpu (line 38) | def test_with_gpu(self):
method test_empty_packages (line 46) | def test_empty_packages(self):
method test_missing_base_image_fails (line 53) | def test_missing_base_image_fails(self):
method test_missing_packages_fails (line 57) | def test_missing_packages_fails(self):
class TestCodeExecutorInput (line 62) | class TestCodeExecutorInput:
method test_basic_input (line 65) | def test_basic_input(self):
method test_with_files (line 73) | def test_with_files(self):
method test_none_code (line 85) | def test_none_code(self):
method test_multiline_code (line 92) | def test_multiline_code(self):
class TestCodeExecutorOutput (line 103) | class TestCodeExecutorOutput:
method test_successful_output (line 106) | def test_successful_output(self):
method test_error_output (line 110) | def test_error_output(self):
method test_multiline_output (line 114) | def test_multiline_output(self):
method test_serialization (line 119) | def test_serialization(self):
FILE: agent/tests/unit_test/tools/test_python_executor_coverage.py
class TestCodeExecutorConfig (line 25) | class TestCodeExecutorConfig:
method test_required_fields (line 28) | def test_required_fields(self):
method test_with_gpu (line 38) | def test_with_gpu(self):
method test_missing_base_image_raises (line 46) | def test_missing_base_image_raises(self):
method test_missing_packages_raises (line 50) | def test_missing_packages_raises(self):
class TestCodeExecutorInput (line 55) | class TestCodeExecutorInput:
method test_with_code (line 58) | def test_with_code(self):
method test_no_code (line 66) | def test_no_code(self):
method test_empty_files (line 70) | def test_empty_files(self):
class TestCodeExecutorOutput (line 75) | class TestCodeExecutorOutput:
method test_success_output (line 78) | def test_success_output(self):
method test_error_output (line 82) | def test_error_output(self):
method test_missing_message_raises (line 86) | def test_missing_message_raises(self):
FILE: agent/tests/unit_test/tools/test_report_gen.py
class TestReportGenConfig (line 26) | class TestReportGenConfig:
method test_with_required_field (line 29) | def test_with_required_field(self):
method test_custom_values (line 40) | def test_custom_values(self):
class TestReportGenInput (line 60) | class TestReportGenInput:
method test_with_string_messages (line 63) | def test_with_string_messages(self):
method test_with_list_messages (line 67) | def test_with_list_messages(self):
method test_with_empty_list (line 75) | def test_with_empty_list(self):
method test_missing_messages_fails (line 79) | def test_missing_messages_fails(self):
class TestReportGenOutput (line 84) | class TestReportGenOutput:
method test_output_creation (line 87) | def test_output_creation(self):
method test_output_serialization (line 103) | def test_output_serialization(self):
class TestFormatMessagesToMarkdown (line 121) | class TestFormatMessagesToMarkdown:
method test_format_empty_messages (line 124) | def test_format_empty_messages(self):
method test_format_dict_messages (line 129) | def test_format_dict_messages(self):
method test_format_string_message (line 140) | def test_format_string_message(self):
method test_format_object_with_content (line 145) | def test_format_object_with_content(self):
method test_format_nested_content (line 154) | def test_format_nested_content(self):
FILE: agent/tests/unit_test/tools/test_rtvi_vlm_alert.py
class TestRTVIVLMAlertConfig (line 26) | class TestRTVIVLMAlertConfig:
method test_required_fields (line 29) | def test_required_fields(self):
method test_custom_defaults (line 41) | def test_custom_defaults(self):
method test_optional_va_tool (line 59) | def test_optional_va_tool(self):
method test_missing_required_raises (line 67) | def test_missing_required_raises(self):
class TestRTVIVLMAlertInput (line 74) | class TestRTVIVLMAlertInput:
method test_start_action (line 77) | def test_start_action(self):
method test_stop_action (line 86) | def test_stop_action(self):
method test_get_incidents_action (line 90) | def test_get_incidents_action(self):
method test_defaults (line 103) | def test_defaults(self):
method test_invalid_action_raises (line 113) | def test_invalid_action_raises(self):
class TestRTVIVLMAlertOutput (line 118) | class TestRTVIVLMAlertOutput:
method test_success_output (line 121) | def test_success_output(self):
method test_failure_output (line 131) | def test_failure_output(self):
method test_incidents_output (line 138) | def test_incidents_output(self):
method test_defaults (line 149) | def test_defaults(self):
class TestSensorToRtviStreamIdMapping (line 157) | class TestSensorToRtviStreamIdMapping:
method test_mapping_is_dict (line 160) | def test_mapping_is_dict(self):
FILE: agent/tests/unit_test/tools/test_rtvi_vlm_alert_inner.py
class TestRTVIVLMAlertInner (line 31) | class TestRTVIVLMAlertInner:
method config (line 35) | def config(self):
method mock_builder (line 42) | def mock_builder(self):
method _get_inner_fn (line 45) | async def _get_inner_fn(self, config, mock_builder):
method test_get_incidents_no_sensor_name (line 51) | async def test_get_incidents_no_sensor_name(self, config, mock_builder):
method test_get_incidents_no_va_tool (line 59) | async def test_get_incidents_no_va_tool(self, config, mock_builder):
method test_get_incidents_with_va_tool (line 67) | async def test_get_incidents_with_va_tool(self, mock_builder):
method test_get_incidents_string_result (line 89) | async def test_get_incidents_string_result(self, mock_builder):
method test_get_incidents_va_tool_error (line 106) | async def test_get_incidents_va_tool_error(self, mock_builder):
method test_start_no_sensor_name (line 123) | async def test_start_no_sensor_name(self, config, mock_builder):
method test_stop_no_sensor_name (line 131) | async def test_stop_no_sensor_name(self, config, mock_builder):
method test_start_sensor_not_found (line 139) | async def test_start_sensor_not_found(self, config, mock_builder):
method test_stop_404_response (line 164) | async def test_stop_404_response(self, config, mock_builder):
method test_stop_error_response (line 197) | async def test_stop_error_response(self, config, mock_builder):
method test_stop_caption_error_continues (line 231) | async def test_stop_caption_error_continues(self, config, mock_builder):
method test_stop_no_active_alert (line 261) | async def test_stop_no_active_alert(self, config, mock_builder):
method test_stop_success (line 280) | async def test_stop_success(self, config, mock_builder):
method test_connection_error (line 311) | async def test_connection_error(self, config, mock_builder):
method test_generic_error (line 327) | async def test_generic_error(self, config, mock_builder):
FILE: agent/tests/unit_test/tools/test_s3_picture_url.py
class TestS3PictureURLConfig (line 25) | class TestS3PictureURLConfig:
method test_defaults (line 28) | def test_defaults(self):
method test_custom_values (line 35) | def test_custom_values(self):
class TestS3PictureURLInput (line 48) | class TestS3PictureURLInput:
method test_valid_sensor_id (line 51) | def test_valid_sensor_id(self):
method test_various_sensor_ids (line 55) | def test_various_sensor_ids(self):
method test_empty_sensor_id_fails (line 61) | def test_empty_sensor_id_fails(self):
method test_missing_sensor_id_fails (line 65) | def test_missing_sensor_id_fails(self):
class TestS3PictureURLOutput (line 70) | class TestS3PictureURLOutput:
method test_output_creation (line 73) | def test_output_creation(self):
method test_output_serialization (line 83) | def test_output_serialization(self):
method test_output_various_urls (line 94) | def test_output_various_urls(self):
FILE: agent/tests/unit_test/tools/test_search.py
class TestSearchConfig (line 38) | class TestSearchConfig:
method test_required_fields (line 41) | def test_required_fields(self):
method test_custom_prompt (line 52) | def test_custom_prompt(self):
method test_fusion_method_defaults (line 61) | def test_fusion_method_defaults(self):
method test_fusion_method_weighted_linear (line 74) | def test_fusion_method_weighted_linear(self):
method test_fusion_method_rrf_custom (line 88) | def test_fusion_method_rrf_custom(self):
class TestSearchInput (line 103) | class TestSearchInput:
method test_required_fields (line 106) | def test_required_fields(self):
method test_all_fields (line 115) | def test_all_fields(self):
method test_defaults (line 134) | def test_defaults(self):
method test_missing_query_raises (line 147) | def test_missing_query_raises(self):
method test_missing_agent_mode_raises (line 151) | def test_missing_agent_mode_raises(self):
method test_extra_fields_forbidden (line 155) | def test_extra_fields_forbidden(self):
class TestSearchResult (line 165) | class TestSearchResult:
method test_valid_result (line 168) | def test_valid_result(self):
method test_missing_required_field_raises (line 186) | def test_missing_required_field_raises(self):
class TestSearchOutput (line 194) | class TestSearchOutput:
method test_empty_data (line 197) | def test_empty_data(self):
method test_with_results (line 201) | def test_with_results(self):
method test_extra_fields_forbidden (line 225) | def test_extra_fields_forbidden(self):
method test_serialization (line 232) | def test_serialization(self):
class TestQueryInput (line 248) | class TestQueryInput:
method test_defaults (line 251) | def test_defaults(self):
method test_with_values (line 260) | def test_with_values(self):
class TestEmbedSearchConfig (line 274) | class TestEmbedSearchConfig:
method test_required_fields (line 277) | def test_required_fields(self):
method test_custom_index (line 288) | def test_custom_index(self):
class TestStrInputConverter (line 298) | class TestStrInputConverter:
method test_json_with_params (line 301) | def test_json_with_params(self):
method test_json_with_prompts (line 307) | def test_json_with_prompts(self):
method test_invalid_json_format (line 313) | def test_invalid_json_format(self):
method test_json_without_params_or_prompts (line 318) | def test_json_without_params_or_prompts(self):
class TestDecomposedQuery (line 325) | class TestDecomposedQuery:
method test_defaults (line 328) | def test_defaults(self):
method test_with_values (line 339) | def test_with_values(self):
method test_with_negative_min_cosine_similarity (line 359) | def test_with_negative_min_cosine_similarity(self):
class TestQueryDecompositionPrompt (line 368) | class TestQueryDecompositionPrompt:
method test_prompt_has_placeholders (line 371) | def test_prompt_has_placeholders(self):
method test_prompt_contains_instructions (line 376) | def test_prompt_contains_instructions(self):
class TestDecomposeQuery (line 388) | class TestDecomposeQuery:
method mock_llm (line 392) | def mock_llm(self):
method test_simple_query (line 399) | async def test_simple_query(self, mock_llm):
method test_query_with_time_range (line 413) | async def test_query_with_time_range(self, mock_llm):
method test_query_with_video_sources (line 426) | async def test_query_with_video_sources(self, mock_llm):
method test_complex_query_all_parameters (line 443) | async def test_complex_query_all_parameters(self, mock_llm):
method test_query_with_json_code_block (line 470) | async def test_query_with_json_code_block(self, mock_llm):
method test_query_with_plain_code_block (line 482) | async def test_query_with_plain_code_block(self, mock_llm):
method test_fallback_on_invalid_json (line 494) | async def test_fallback_on_invalid_json(self, mock_llm):
method test_fallback_on_llm_exception (line 505) | async def test_fallback_on_llm_exception(self, mock_llm):
method test_with_video_file_names (line 515) | async def test_with_video_file_names(self, mock_llm):
method test_empty_response_fields (line 532) | async def test_empty_response_fields(self, mock_llm):
method test_custom_few_shot_examples (line 546) | async def test_custom_few_shot_examples(self, mock_llm):
method test_query_with_only_attributes (line 563) | async def test_query_with_only_attributes(self, mock_llm):
method test_partial_time_range (line 576) | async def test_partial_time_range(self, mock_llm):
method test_query_with_top_k (line 589) | async def test_query_with_top_k(self, mock_llm):
method test_query_with_min_cosine_similarity (line 599) | async def test_query_with_min_cosine_similarity(self, mock_llm):
method test_query_with_all_filtering_params (line 609) | async def test_query_with_all_filtering_params(self, mock_llm):
method test_invalid_top_k_ignored (line 622) | async def test_invalid_top_k_ignored(self, mock_llm):
method test_invalid_min_cosine_similarity_ignored (line 632) | async def test_invalid_min_cosine_similarity_ignored(self, mock_llm):
method test_negative_min_cosine_similarity (line 642) | async def test_negative_min_cosine_similarity(self, mock_llm):
class TestQueryInputSourceType (line 652) | class TestQueryInputSourceType:
method test_source_type_required (line 655) | def test_source_type_required(self):
method test_source_type_rtsp (line 659) | def test_source_type_rtsp(self):
method test_source_type_video_file (line 663) | def test_source_type_video_file(self):
method test_source_type_in_serialization (line 667) | def test_source_type_in_serialization(self):
FILE: agent/tests/unit_test/tools/test_search_converters.py
function _make_embed_output (line 31) | def _make_embed_output(results):
class TestSearchConverters (line 49) | class TestSearchConverters:
method config (line 53) | def config(self):
method mock_builder (line 59) | def mock_builder(self):
method test_str_input_converter (line 63) | async def test_str_input_converter(self, config, mock_builder):
method test_chat_request_converter (line 80) | async def test_chat_request_converter(self, config, mock_builder):
method test_chat_request_converter_error (line 99) | async def test_chat_request_converter_error(self, config, mock_builder):
method test_output_converter (line 117) | async def test_output_converter(self, config, mock_builder):
method test_chat_response_converter (line 144) | async def test_chat_response_converter(self, config, mock_builder):
method test_chat_response_chunk_converter (line 158) | async def test_chat_response_chunk_converter(self, config, mock_builder):
method test_search_dict_output (line 172) | async def test_search_dict_output(self, config, mock_builder):
method test_search_embed_error_with_meta (line 190) | async def test_search_embed_error_with_meta(self, config, mock_builder):
method test_search_embed_error_with_int_arg (line 212) | async def test_search_embed_error_with_int_arg(self, config, mock_buil...
method test_search_sensor_description_fallback (line 232) | async def test_search_sensor_description_fallback(self, config, mock_b...
method test_search_invalid_end_time_iso (line 260) | async def test_search_invalid_end_time_iso(self, config, mock_builder):
method test_search_no_base_timestamp (line 287) | async def test_search_no_base_timestamp(self, config, mock_builder):
FILE: agent/tests/unit_test/tools/test_search_coverage.py
class TestSearchInputConversion (line 28) | class TestSearchInputConversion:
method test_json_str_conversion (line 31) | def test_json_str_conversion(self):
method test_json_with_all_fields (line 37) | def test_json_with_all_fields(self):
class TestSearchOutputSerialization (line 57) | class TestSearchOutputSerialization:
method test_round_trip_serialization (line 60) | def test_round_trip_serialization(self):
class TestEmbedSearchOutputConversion (line 78) | class TestEmbedSearchOutputConversion:
method test_embed_search_result_item_to_search_result (line 81) | def test_embed_search_result_item_to_search_result(self):
method test_embed_search_output_with_results (line 106) | def test_embed_search_output_with_results(self):
method test_embed_search_output_empty (line 123) | def test_embed_search_output_empty(self):
method test_search_result_with_none_similarity (line 128) | def test_search_result_with_none_similarity(self):
method test_search_result_empty_video_name_skipped (line 136) | def test_search_result_empty_video_name_skipped(self):
method test_end_time_iso_string_parsing (line 141) | def test_end_time_iso_string_parsing(self):
method test_end_time_default_value (line 150) | def test_end_time_default_value(self):
method test_start_time_invalid_iso_string (line 162) | def test_start_time_invalid_iso_string(self):
method test_screenshot_url_fallback_to_empty (line 173) | def test_screenshot_url_fallback_to_empty(self):
method test_parse_base_timestamp_invalid (line 178) | def test_parse_base_timestamp_invalid(self):
method test_embed_search_output_serialization_round_trip (line 188) | def test_embed_search_output_serialization_round_trip(self):
FILE: agent/tests/unit_test/tools/test_search_inner.py
function _make_embed_output_with_results (line 31) | def _make_embed_output_with_results(results):
class TestSearchInner (line 49) | class TestSearchInner:
method config (line 53) | def config(self):
method mock_builder (line 61) | def mock_builder(self):
method _get_inner_fn (line 65) | async def _get_inner_fn(self, config, mock_builder, embed_output):
method test_basic_search_no_agent_mode (line 78) | async def test_basic_search_no_agent_mode(self, config, mock_builder):
method test_search_with_video_sources (line 102) | async def test_search_with_video_sources(self, config, mock_builder):
method test_search_with_timestamps (line 127) | async def test_search_with_timestamps(self, config, mock_builder):
method test_search_no_results (line 155) | async def test_search_no_results(self, config, mock_builder):
method test_search_empty_video_name_skipped (line 165) | async def test_search_empty_video_name_skipped(self, config, mock_buil...
method test_search_string_output (line 181) | async def test_search_string_output(self, config, mock_builder):
method test_search_with_agent_mode (line 209) | async def test_search_with_agent_mode(self, config, mock_builder):
method test_search_agent_mode_json_code_block (line 248) | async def test_search_agent_mode_json_code_block(self, config, mock_bu...
method test_search_agent_mode_code_block_no_json (line 279) | async def test_search_agent_mode_code_block_no_json(self, config, mock...
method test_search_agent_mode_invalid_json (line 310) | async def test_search_agent_mode_invalid_json(self, config, mock_build...
method test_search_agent_mode_llm_error (line 341) | async def test_search_agent_mode_llm_error(self, config, mock_builder):
method test_search_embed_value_error (line 371) | async def test_search_embed_value_error(self, config, mock_builder):
method test_search_embed_generic_error (line 390) | async def test_search_embed_generic_error(self, config, mock_builder):
method test_search_embed_error_with_status_code (line 409) | async def test_search_embed_error_with_status_code(self, config, mock_...
method test_search_with_description_in_results (line 430) | async def test_search_with_description_in_results(self, config, mock_b...
method test_search_with_float_timestamps_in_response (line 450) | async def test_search_with_float_timestamps_in_response(self, config, ...
method test_search_agent_mode_with_min_cosine_similarity (line 470) | async def test_search_agent_mode_with_min_cosine_similarity(self, conf...
method test_search_agent_mode_invalid_timestamps (line 509) | async def test_search_agent_mode_invalid_timestamps(self, config, mock...
method test_search_agent_mode_json_block_no_closing (line 548) | async def test_search_agent_mode_json_block_no_closing(self, config, m...
method test_search_converters (line 580) | async def test_search_converters(self, config, mock_builder):
FILE: agent/tests/unit_test/tools/test_search_more_edge_cases.py
function _make_embed_output (line 30) | def _make_embed_output(results):
class TestSearchMoreEdgeCases (line 48) | class TestSearchMoreEdgeCases:
method config (line 52) | def config(self):
method mock_builder (line 58) | def mock_builder(self):
method test_agent_mode_code_block_no_closing (line 62) | async def test_agent_mode_code_block_no_closing(self, config, mock_bui...
method test_query_exception_skipped (line 93) | async def test_query_exception_skipped(self, config, mock_builder):
method test_agent_mode_not_dict_extracted (line 121) | async def test_agent_mode_not_dict_extracted(self, config, mock_builder):
method test_no_timestamp_no_base (line 143) | async def test_no_timestamp_no_base(self, config, mock_builder):
method test_agent_mode_response_without_content_attr (line 168) | async def test_agent_mode_response_without_content_attr(self, config, ...
FILE: agent/tests/unit_test/tools/test_template_report_gen.py
class TestGetObjectStoreUrl (line 23) | class TestGetObjectStoreUrl:
method test_s3_object_store (line 26) | def test_s3_object_store(self):
method test_s3_object_store_with_trailing_slash (line 37) | def test_s3_object_store_with_trailing_slash(self):
method test_in_memory_store (line 47) | def test_in_memory_store(self):
method test_in_memory_store_base_url_no_trailing_slash (line 56) | def test_in_memory_store_base_url_no_trailing_slash(self):
class TestPdfConversionAvailable (line 66) | class TestPdfConversionAvailable:
method test_pdf_conversion_flag_is_bool (line 69) | def test_pdf_conversion_flag_is_bool(self):
FILE: agent/tests/unit_test/tools/test_video_caption.py
class TestVideoCaptionConfig (line 30) | class TestVideoCaptionConfig:
method test_required_fields (line 33) | def test_required_fields(self):
method test_custom_values (line 42) | def test_custom_values(self):
class TestVideoCaptionInput (line 58) | class TestVideoCaptionInput:
method test_valid_input (line 61) | def test_valid_input(self):
method test_end_timestamp_clamped_to_duration (line 75) | def test_end_timestamp_clamped_to_duration(self):
method test_end_timestamp_none_uses_duration (line 86) | def test_end_timestamp_none_uses_duration(self):
method test_negative_duration_raises (line 96) | def test_negative_duration_raises(self):
method test_zero_duration_raises (line 106) | def test_zero_duration_raises(self):
method test_extra_fields_forbidden (line 116) | def test_extra_fields_forbidden(self):
class TestErrorMessages (line 128) | class TestErrorMessages:
method test_error_messages_defined (line 131) | def test_error_messages_defined(self):
class TestCallVlmPartition (line 137) | class TestCallVlmPartition:
method test_successful_caption (line 141) | async def test_successful_caption(self):
method test_retry_on_error_message (line 156) | async def test_retry_on_error_message(self):
method test_success_without_retry (line 182) | async def test_success_without_retry(self):
class TestVLMPrompt (line 198) | class TestVLMPrompt:
method test_prompt_contains_placeholders (line 201) | def test_prompt_contains_placeholders(self):
method test_prompt_formatting (line 206) | def test_prompt_formatting(self):
FILE: agent/tests/unit_test/tools/test_video_caption_coverage.py
class TestVideoCaptionConfig (line 29) | class TestVideoCaptionConfig:
method test_required_fields (line 32) | def test_required_fields(self):
method test_custom_fields (line 39) | def test_custom_fields(self):
class TestVideoCaptionInput (line 53) | class TestVideoCaptionInput:
method test_valid_input (line 56) | def test_valid_input(self):
method test_end_timestamp_capped_to_duration (line 69) | def test_end_timestamp_capped_to_duration(self):
method test_end_timestamp_none_capped (line 80) | def test_end_timestamp_none_capped(self):
method test_zero_duration_raises (line 91) | def test_zero_duration_raises(self):
method test_negative_duration_raises (line 102) | def test_negative_duration_raises(self):
method test_extra_fields_forbidden (line 113) | def test_extra_fields_forbidden(self):
class TestErrorMessages (line 126) | class TestErrorMessages:
method test_error_messages_exist (line 129) | def test_error_messages_exist(self):
class TestCallVlmPartition (line 135) | class TestCallVlmPartition:
method test_successful_caption (line 139) | async def test_successful_caption(self):
method test_retry_on_error_message (line 158) | async def test_retry_on_error_message(self):
method test_no_retry_for_long_error_message (line 188) | async def test_no_retry_for_long_error_message(self):
FILE: agent/tests/unit_test/tools/test_video_caption_inner.py
class TestVideoDetailedCaptionInner (line 29) | class TestVideoDetailedCaptionInner:
method config (line 33) | def config(self):
method mock_builder (line 37) | def mock_builder(self):
method test_caption_success (line 41) | async def test_caption_success(self, config, mock_builder):
method test_duration_too_long (line 61) | async def test_duration_too_long(self, config, mock_builder):
method test_caption_tool_error (line 77) | async def test_caption_tool_error(self, config, mock_builder):
class TestVideoSkimCaptionInner (line 97) | class TestVideoSkimCaptionInner:
method config (line 101) | def config(self):
method mock_builder (line 105) | def mock_builder(self):
method test_skim_success (line 109) | async def test_skim_success(self, config, mock_builder):
method test_skim_tool_error (line 129) | async def test_skim_tool_error(self, config, mock_builder):
FILE: agent/tests/unit_test/tools/test_video_caption_vss_inner.py
class TestVideoCaptionVSSInner (line 30) | class TestVideoCaptionVSSInner:
method config_vss (line 34) | def config_vss(self):
method mock_builder (line 42) | def mock_builder(self):
method test_vss_caption_success (line 46) | async def test_vss_caption_success(self, config_vss, mock_builder):
method test_vss_caption_with_cleanup (line 112) | async def test_vss_caption_with_cleanup(self, config_vss, mock_builder):
class TestVideoCaptionNonVSSInner (line 167) | class TestVideoCaptionNonVSSInner:
method config_no_vss (line 171) | def config_no_vss(self):
method mock_builder (line 180) | def mock_builder(self):
method test_non_vss_caption (line 184) | async def test_non_vss_caption(self, config_no_vss, mock_builder):
FILE: agent/tests/unit_test/tools/test_video_detailed_caption.py
class TestVideoDetailedCaptionConfig (line 24) | class TestVideoDetailedCaptionConfig:
method test_defaults (line 27) | def test_defaults(self):
method test_custom_values (line 32) | def test_custom_values(self):
class TestVideoDetailedCaptionInput (line 41) | class TestVideoDetailedCaptionInput:
method test_valid_input (line 44) | def test_valid_input(self):
method test_end_timestamp_clamped_to_duration (line 58) | def test_end_timestamp_clamped_to_duration(self):
method test_end_timestamp_none_uses_duration (line 69) | def test_end_timestamp_none_uses_duration(self):
method test_negative_duration_raises (line 79) | def test_negative_duration_raises(self):
method test_zero_duration_raises (line 89) | def test_zero_duration_raises(self):
method test_extra_fields_forbidden (line 99) | def test_extra_fields_forbidden(self):
method test_missing_filename_raises (line 110) | def test_missing_filename_raises(self):
method test_missing_start_timestamp_raises (line 119) | def test_missing_start_timestamp_raises(self):
method test_missing_user_prompt_raises (line 128) | def test_missing_user_prompt_raises(self):
method test_missing_video_duration_raises (line 137) | def test_missing_video_duration_raises(self):
FILE: agent/tests/unit_test/tools/test_video_detailed_caption_coverage.py
class TestVideoDetailedCaptionConfig (line 24) | class TestVideoDetailedCaptionConfig:
method test_defaults (line 27) | def test_defaults(self):
method test_custom (line 32) | def test_custom(self):
class TestVideoDetailedCaptionInput (line 41) | class TestVideoDetailedCaptionInput:
method test_valid_input (line 44) | def test_valid_input(self):
method test_end_timestamp_capped (line 56) | def test_end_timestamp_capped(self):
method test_end_timestamp_none (line 66) | def test_end_timestamp_none(self):
method test_zero_duration_raises (line 76) | def test_zero_duration_raises(self):
method test_extra_fields_forbidden (line 86) | def test_extra_fields_forbidden(self):
FILE: agent/tests/unit_test/tools/test_video_frame_timestamp.py
class TestVideoFrameTimestampConfig (line 25) | class TestVideoFrameTimestampConfig:
method test_defaults (line 28) | def test_defaults(self):
method test_custom_values (line 33) | def test_custom_values(self):
class TestVideoFrameTimestampInput (line 42) | class TestVideoFrameTimestampInput:
method test_valid_input (line 45) | def test_valid_input(self):
method test_zero_offset (line 53) | def test_zero_offset(self):
method test_large_offset (line 60) | def test_large_offset(self):
method test_missing_asset_file_path_raises (line 67) | def test_missing_asset_file_path_raises(self):
method test_missing_frame_offset_raises (line 73) | def test_missing_frame_offset_raises(self):
method test_negative_offset_allowed (line 79) | def test_negative_offset_allowed(self):
class TestVideoFrameTimestampPrompt (line 88) | class TestVideoFrameTimestampPrompt:
method test_prompt_is_string (line 91) | def test_prompt_is_string(self):
method test_prompt_not_empty (line 94) | def test_prompt_not_empty(self):
FILE: agent/tests/unit_test/tools/test_video_frame_timestamp_coverage.py
class TestVideoFrameTimestampConfig (line 24) | class TestVideoFrameTimestampConfig:
method test_defaults (line 27) | def test_defaults(self):
method test_custom (line 32) | def test_custom(self):
class TestVideoFrameTimestampInput (line 40) | class TestVideoFrameTimestampInput:
method test_valid_input (line 43) | def test_valid_input(self):
method test_missing_path_raises (line 51) | def test_missing_path_raises(self):
method test_missing_offset_raises (line 55) | def test_missing_offset_raises(self):
FILE: agent/tests/unit_test/tools/test_video_report_gen.py
class TestTimestampMatch (line 33) | class TestTimestampMatch:
method test_creation (line 36) | def test_creation(self):
method test_named_access (line 41) | def test_named_access(self):
method test_tuple_unpacking (line 46) | def test_tuple_unpacking(self):
class TestParseTimestamps (line 53) | class TestParseTimestamps:
method test_parse_simple_timestamp (line 56) | def test_parse_simple_timestamp(self):
method test_parse_multiple_timestamps (line 62) | def test_parse_multiple_timestamps(self):
method test_parse_with_spaces (line 69) | def test_parse_with_spaces(self):
method test_parse_decimal_timestamps (line 75) | def test_parse_decimal_timestamps(self):
method test_parse_no_timestamps (line 81) | def test_parse_no_timestamps(self):
method test_parse_preserves_position (line 86) | def test_parse_preserves_position(self):
method test_parse_large_timestamps (line 92) | def test_parse_large_timestamps(self):
class TestNormalizeChunkTimestamps (line 99) | class TestNormalizeChunkTimestamps:
method test_timestamps_match_chunk_duration (line 102) | def test_timestamps_match_chunk_duration(self):
method test_normalization_ratio_scaling_down (line 110) | def test_normalization_ratio_scaling_down(self):
method test_normalization_ratio_scaling_up (line 119) | def test_normalization_ratio_scaling_up(self):
method test_multiple_timestamps_normalized (line 128) | def test_multiple_timestamps_normalized(self):
method test_no_timestamps_returns_original (line 138) | def test_no_timestamps_returns_original(self):
method test_ratio_close_to_one_no_normalization (line 144) | def test_ratio_close_to_one_no_normalization(self):
method test_chunk_offset_applied_with_matching_duration (line 152) | def test_chunk_offset_applied_with_matching_duration(self):
method test_small_timestamps_scaled_up_with_offset (line 160) | def test_small_timestamps_scaled_up_with_offset(self):
class TestDivideVideoIntoChunks (line 169) | class TestDivideVideoIntoChunks:
method test_single_chunk (line 172) | def test_single_chunk(self):
method test_exact_division (line 178) | def test_exact_division(self):
method test_with_remainder (line 185) | def test_with_remainder(self):
method test_zero_duration (line 193) | def test_zero_duration(self):
class TestVideoReportGenInput (line 199) | class TestVideoReportGenInput:
method test_required_fields (line 202) | def test_required_fields(self):
method test_optional_vlm_reasoning (line 211) | def test_optional_vlm_reasoning(self):
method test_missing_required_fails (line 220) | def test_missing_required_fails(self):
class TestVideoReportGenOutput (line 229) | class TestVideoReportGenOutput:
method test_output_creation (line 232) | def test_output_creation(self):
method test_output_optional_fields (line 251) | def test_output_optional_fields(self):
method test_output_serialization (line 266) | def test_output_serialization(self):
class TestTimestampFormatDetection (line 287) | class TestTimestampFormatDetection:
method test_non_stream_model_has_float_timestamp (line 296) | def test_non_stream_model_has_float_timestamp(self):
method test_stream_model_has_str_timestamp (line 304) | def test_stream_model_has_str_timestamp(self):
method test_detection_logic_identifies_float_schema (line 309) | def test_detection_logic_identifies_float_schema(self):
method test_detection_logic_identifies_str_schema (line 317) | def test_detection_logic_identifies_str_schema(self):
method test_non_stream_model_accepts_float_offsets (line 325) | def test_non_stream_model_accepts_float_offsets(self):
method test_non_stream_model_rejects_iso_timestamps (line 337) | def test_non_stream_model_rejects_iso_timestamps(self):
method test_stream_model_accepts_iso_timestamps (line 352) | def test_stream_model_accepts_iso_timestamps(self):
class TestResourcesSectionFormatting (line 365) | class TestResourcesSectionFormatting:
method test_video_playback_url_on_separate_paragraph (line 372) | def test_video_playback_url_on_separate_paragraph(self):
method test_pdf_css_has_word_break_for_links (line 399) | def test_pdf_css_has_word_break_for_links(self):
FILE: agent/tests/unit_test/tools/test_video_skim_caption.py
class TestVideoSkimCaptionConfig (line 24) | class TestVideoSkimCaptionConfig:
method test_defaults (line 27) | def test_defaults(self):
method test_custom_values (line 31) | def test_custom_values(self):
class TestVideoSkimCaptionInput (line 36) | class TestVideoSkimCaptionInput:
method test_valid_input (line 39) | def test_valid_input(self):
method test_end_timestamp_clamped_to_duration (line 53) | def test_end_timestamp_clamped_to_duration(self):
method test_end_timestamp_none_uses_duration (line 64) | def test_end_timestamp_none_uses_duration(self):
method test_negative_duration_raises (line 74) | def test_negative_duration_raises(self):
method test_zero_duration_raises (line 84) | def test_zero_duration_raises(self):
method test_extra_fields_forbidden (line 94) | def test_extra_fields_forbidden(self):
method test_long_video_input (line 105) | def test_long_video_input(self):
FILE: agent/tests/unit_test/tools/test_video_skim_caption_coverage.py
class TestVideoSkimCaptionConfig (line 24) | class TestVideoSkimCaptionConfig:
method test_defaults (line 27) | def test_defaults(self):
method test_custom_fps (line 31) | def test_custom_fps(self):
class TestVideoSkimCaptionInput (line 36) | class TestVideoSkimCaptionInput:
method test_valid_input (line 39) | def test_valid_input(self):
method test_end_timestamp_capped (line 51) | def test_end_timestamp_capped(self):
method test_end_timestamp_none (line 61) | def test_end_timestamp_none(self):
method test_zero_duration_raises (line 71) | def test_zero_duration_raises(self):
method test_extra_fields_forbidden (line 81) | def test_extra_fields_forbidden(self):
FILE: agent/tests/unit_test/tools/test_video_understanding.py
class TestParseThinkingFromContent (line 20) | class TestParseThinkingFromContent:
method test_empty_content (line 23) | def test_empty_content(self):
method test_none_content (line 29) | def test_none_content(self):
method test_no_tags (line 35) | def test_no_tags(self):
method test_think_and_answer_tags (line 42) | def test_think_and_answer_tags(self):
method test_only_think_tags (line 49) | def test_only_think_tags(self):
method test_think_tags_with_whitespace (line 56) | def test_think_tags_with_whitespace(self):
method test_malformed_tags_start_after_end (line 63) | def test_malformed_tags_start_after_end(self):
method test_nested_content_in_think (line 70) | def test_nested_content_in_think(self):
method test_empty_think_tags (line 77) | def test_empty_think_tags(self):
method test_content_before_think (line 84) | def test_content_before_think(self):
method test_empty_answer_after_think (line 91) | def test_empty_answer_after_think(self):
FILE: agent/tests/unit_test/tools/test_video_upload_url.py
class TestVideoUploadURLConfig (line 25) | class TestVideoUploadURLConfig:
method test_config_creation (line 28) | def test_config_creation(self):
method test_config_missing_vst_base_url (line 36) | def test_config_missing_vst_base_url(self):
method test_config_missing_agent_base_url (line 42) | def test_config_missing_agent_base_url(self):
class TestVideoUploadURLInput (line 49) | class TestVideoUploadURLInput:
method test_input_basic (line 52) | def test_input_basic(self):
method test_input_with_embedding (line 57) | def test_input_with_embedding(self):
method test_input_empty_filename_fails (line 61) | def test_input_empty_filename_fails(self):
method test_input_with_extension (line 65) | def test_input_with_extension(self):
method test_input_without_extension (line 69) | def test_input_without_extension(self):
class TestVideoUploadURLOutput (line 74) | class TestVideoUploadURLOutput:
method test_output_creation (line 77) | def test_output_creation(self):
method test_output_embedding_url (line 83) | def test_output_embedding_url(self):
method test_output_serialization (line 87) | def test_output_serialization(self):
FILE: agent/tests/unit_test/tools/test_vss_summarize.py
class TestVSSSummarizeConfig (line 29) | class TestVSSSummarizeConfig:
method test_required_fields (line 32) | def test_required_fields(self):
method test_custom_values (line 41) | def test_custom_values(self):
method test_missing_backend_url_raises (line 55) | def test_missing_backend_url_raises(self):
class TestVSSSummarizeInput (line 60) | class TestVSSSummarizeInput:
method test_valid_input_with_uuid (line 63) | def test_valid_input_with_uuid(self):
method test_valid_input_with_media_info (line 77) | def test_valid_input_with_media_info(self):
method test_media_info_end_clamped_to_duration (line 89) | def test_media_info_end_clamped_to_duration(self):
method test_step_size_bounds (line 101) | def test_step_size_bounds(self):
method test_step_size_too_small_raises (line 112) | def test_step_size_too_small_raises(self):
method test_step_size_too_large_raises (line 122) | def test_step_size_too_large_raises(self):
method test_default_prompts (line 132) | def test_default_prompts(self):
method test_custom_prompts (line 142) | def test_custom_prompts(self):
method test_list_of_uuids (line 154) | def test_list_of_uuids(self):
method test_prompt_max_length (line 163) | def test_prompt_max_length(self):
method test_prompt_exceeds_max_length_raises (line 174) | def test_prompt_exceeds_max_length_raises(self):
class TestVSSSummarizeOutput (line 184) | class TestVSSSummarizeOutput:
method test_valid_output (line 187) | def test_valid_output(self):
method test_str_representation (line 197) | def test_str_representation(self):
method test_step_size_none (line 212) | def test_step_size_none(self):
method test_empty_summary (line 221) | def test_empty_summary(self):
FILE: agent/tests/unit_test/tools/test_vss_summarize_coverage.py
class TestVSSSummarizeConfig (line 28) | class TestVSSSummarizeConfig:
method test_required_fields (line 31) | def test_required_fields(self):
method test_custom_config (line 40) | def test_custom_config(self):
method test_extra_fields_forbidden (line 52) | def test_extra_fields_forbidden(self):
class TestVSSSummarizeInput (line 60) | class TestVSSSummarizeInput:
method test_basic_input (line 63) | def test_basic_input(self):
method test_with_media_info (line 77) | def test_with_media_info(self):
method test_media_info_end_capped_to_duration (line 89) | def test_media_info_end_capped_to_duration(self):
method test_step_size (line 100) | def test_step_size(self):
method test_custom_prompts (line 110) | def test_custom_prompts(self):
method test_list_of_ids (line 122) | def test_list_of_ids(self):
method test_extra_fields_forbidden (line 131) | def test_extra_fields_forbidden(self):
class TestVSSSummarizeOutput (line 141) | class TestVSSSummarizeOutput:
method test_basic_output (line 144) | def test_basic_output(self):
method test_str_representation (line 153) | def test_str_representation(self):
method test_str_representation_no_step_size (line 164) | def test_str_representation_no_step_size(self):
FILE: agent/tests/unit_test/tools/test_vss_summarize_inner.py
class TestVSSSummarizeInner (line 30) | class TestVSSSummarizeInner:
method config (line 34) | def config(self):
method mock_builder (line 42) | def mock_builder(self):
method test_summarize_success (line 46) | async def test_summarize_success(self, config, mock_builder):
method test_summarize_with_step_size (line 83) | async def test_summarize_with_step_size(self, config, mock_builder):
method test_summarize_api_error (line 116) | async def test_summarize_api_error(self, config, mock_builder):
method test_summarize_empty_choices (line 143) | async def test_summarize_empty_choices(self, config, mock_builder):
method test_summarize_connection_error (line 170) | async def test_summarize_connection_error(self, config, mock_builder):
method test_init_model_error (line 193) | async def test_init_model_error(self, config, mock_builder):
FILE: agent/tests/unit_test/tools/test_vst_tools.py
class TestVSTDownloadConfig (line 24) | class TestVSTDownloadConfig:
method test_with_required_field (line 27) | def test_with_required_field(self):
method test_custom_values (line 33) | def test_custom_values(self):
class TestVSTDownloadInput (line 43) | class TestVSTDownloadInput:
method test_basic_input (line 46) | def test_basic_input(self):
method test_with_custom_container (line 61) | def test_with_custom_container(self):
class TestVSTDownloadOutput (line 73) | class TestVSTDownloadOutput:
method test_output_creation (line 76) | def test_output_creation(self):
method test_output_no_cleanup (line 87) | def test_output_no_cleanup(self):
class TestVSTFilesConfig (line 97) | class TestVSTFilesConfig:
method test_with_required_field (line 100) | def test_with_required_field(self):
method test_custom_values (line 109) | def test_custom_values(self):
class TestVSTFilesInput (line 123) | class TestVSTFilesInput:
method test_basic_input (line 126) | def test_basic_input(self):
FILE: agent/tests/unit_test/tools/vst/test_bounding_box.py
class TestBuildOverlayConfig (line 38) | class TestBuildOverlayConfig:
method test_overlay_disabled_returns_none (line 41) | def test_overlay_disabled_returns_none(self):
method test_overlay_disabled_with_object_ids_returns_none (line
Condensed preview — 823 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,095K chars).
[
{
"path": ".gitattributes",
"chars": 83,
"preview": "*.mp4 filter=lfs diff=lfs merge=lfs -text\n*.gem filter=lfs diff=lfs merge=lfs -text"
},
{
"path": ".github/CODEOWNERS",
"chars": 346,
"preview": "# CODEOWNERS — VSS Blueprint\n#\n# Default: all PRs require review from VSS-developers.\n# Refine per-directory owners as t"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report_form.yml",
"chars": 1858,
"preview": "name: Bug Report\ndescription: File a bug report\ntitle: \"[BUG]: \"\nlabels: [\"bug\", \"? - Needs Triage\"]\nbody:\n - type: inp"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 202,
"preview": "blank_issues_enabled: true\n\ncontact_links:\n - name: Ask a Question\n url: https://github.com/NVIDIA-AI-Blueprints/vid"
},
{
"path": ".github/ISSUE_TEMPLATE/documentation_request.yml",
"chars": 1252,
"preview": "name: Documentation Request\ndescription: Report incorrect or missing documentation\ntitle: \"[DOC]: \"\nlabels: [\"documentat"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request_form.yml",
"chars": 1757,
"preview": "name: Feature Request\ndescription: Suggest a new feature or enhancement\ntitle: \"[FEA]: \"\nlabels: [\"feature request\", \"? "
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 424,
"preview": "## Description\n<!-- Provide a standalone description of changes in this PR. -->\n<!-- Reference any issues closed by this"
},
{
"path": ".github/copy-pr-bot.yaml",
"chars": 316,
"preview": "enabled: true\nauto_sync_draft: false\nauto_sync_ready: true\nadditional_vetters:\n - akshayanv\n - ayyappa-dev\n - daviddu"
},
{
"path": ".github/scripts/check_copyright_headers.py",
"chars": 2992,
"preview": "#!/usr/bin/env python3\n# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights re"
},
{
"path": ".github/scripts/trigger-downstream-pipeline.sh",
"chars": 4092,
"preview": "#!/usr/bin/env python3\n\nimport json\nimport os\nimport sys\nfrom typing import Any\nfrom urllib.error import ContentTooShort"
},
{
"path": ".github/workflows/ci.yml",
"chars": 14369,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": ".pre-commit-config.yaml",
"chars": 715,
"preview": "repos:\n - repo: https://github.com/trufflesecurity/trufflehog\n rev: v3.94.2\n hooks:\n - id: trufflehog\n "
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3340,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
},
{
"path": "CONTRIBUTING.md",
"chars": 5731,
"preview": "# Contributing to Video Search and Summarization\n\nIf you are interested in contributing to Video Search and Summarizatio"
},
{
"path": "LICENSE",
"chars": 13822,
"preview": "This project is Apache2 licensed. Code under the ui folder is MIT licensed.\n\nHere is the complete license text for Apach"
},
{
"path": "LICENSE-3rd-party.txt",
"chars": 266,
"preview": "This file contains the list of third party software with their licenses used in this project.\n\nSee below files for the l"
},
{
"path": "LICENSE.DATA",
"chars": 7396,
"preview": "NVIDIA ASSET LICENSE \n\nIMPORTANT NOTICE – PLEASE READ AND AGREE BEFORE USING THE ASSETS.\n\nThis license agreement (“Agree"
},
{
"path": "README.md",
"chars": 8791,
"preview": "<h2>NVIDIA AI Blueprint: Video Search and Summarization</h2>\n\n### Table of Contents\n- [Overview](#overview)\n- [Use Case "
},
{
"path": "SECURITY.md",
"chars": 1704,
"preview": "## Security\n\nNVIDIA is dedicated to the security and trust of our software products and services, including all source c"
},
{
"path": "agent/.gitattributes",
"chars": 115,
"preview": "*.mp4 filter=lfs diff=lfs merge=lfs -text\n3rdparty/ffmpeg/FFmpeg-n8.0.1.tar.gz filter=lfs diff=lfs merge=lfs -text\n"
},
{
"path": "agent/.pre-commit-config.yaml",
"chars": 1940,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/AGENTS.md",
"chars": 5394,
"preview": "# AGENTS.md\n\n## Project Overview\n\nNVIDIA VSS Agent — video search, summarization, and incident analysis built on\n[NVIDIA"
},
{
"path": "agent/LICENSE-3rd-party.txt",
"chars": 1061175,
"preview": "# Dependencies Licenses\n\nThis file contains the license texts for all dependencies used in this project.\n\nTotal packages"
},
{
"path": "agent/LICENSE.md",
"chars": 10808,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "agent/README.md",
"chars": 9005,
"preview": "<!--\n SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n SPDX-Lic"
},
{
"path": "agent/docker/Dockerfile",
"chars": 7055,
"preview": "# Multi-architecture Dockerfile for production builds (AMD64/ARM64)\nARG USER_ID=1000\nARG GROUP_ID=1000\n\n# Builder stage "
},
{
"path": "agent/docker/cleanup_vulnerabilities.py",
"chars": 4877,
"preview": "#!/usr/bin/env python3\n# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights re"
},
{
"path": "agent/docker/verify_ffmpeg_tarball.py",
"chars": 3963,
"preview": "#!/usr/bin/env python3\n# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights re"
},
{
"path": "agent/pyproject.toml",
"chars": 12436,
"preview": "[build-system]\nrequires = [\"hatchling\", \"hatch-vcs\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.version]\nsource = \"v"
},
{
"path": "agent/src/sitecustomize.py",
"chars": 2824,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/__init__.py",
"chars": 685,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/__init__.py",
"chars": 685,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/critic_agent.py",
"chars": 11036,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/data_models.py",
"chars": 3137,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/multi_report_agent.py",
"chars": 9794,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/postprocessing/__init__.py",
"chars": 1297,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/postprocessing/data_models.py",
"chars": 3218,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/postprocessing/postprocessing_node.py",
"chars": 9481,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/postprocessing/validators/__init__.py",
"chars": 1221,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/postprocessing/validators/base.py",
"chars": 2036,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/postprocessing/validators/llm_based_rule_validator.py",
"chars": 6294,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/postprocessing/validators/non_empty_response_validator.py",
"chars": 2221,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/postprocessing/validators/url_validator.py",
"chars": 9865,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/register.py",
"chars": 982,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/report_agent.py",
"chars": 28703,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/search_agent.py",
"chars": 21355,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/agents/top_agent.py",
"chars": 75041,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/api/__init__.py",
"chars": 685,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/api/custom_fastapi_worker.py",
"chars": 5360,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/api/health_endpoint.py",
"chars": 2278,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/api/register.py",
"chars": 847,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/api/rtsp_stream_api.py",
"chars": 26462,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/api/video_delete.py",
"chars": 14971,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/api/video_search_ingest.py",
"chars": 18410,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/api/video_upload_url.py",
"chars": 6113,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/data_models/__init__.py",
"chars": 1119,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/data_models/vss.py",
"chars": 3834,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/embed/__init__.py",
"chars": 874,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/embed/cosmos_embed.py",
"chars": 4538,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/embed/embed.py",
"chars": 1276,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/embed/rtvi_cv_embed.py",
"chars": 3383,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/__init__.py",
"chars": 685,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/customized_qa_evaluator/__init__.py",
"chars": 687,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/customized_qa_evaluator/evaluate.py",
"chars": 7514,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/customized_qa_evaluator/register.py",
"chars": 3269,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/customized_trajectory_evaluator/__init__.py",
"chars": 685,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/customized_trajectory_evaluator/evaluate.py",
"chars": 15136,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/customized_trajectory_evaluator/register.py",
"chars": 4697,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/evaluate_patch.py",
"chars": 14925,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-Ident"
},
{
"path": "agent/src/vss_agents/evaluators/register.py",
"chars": 1159,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/report_evaluator/__init__.py",
"chars": 686,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/report_evaluator/data_models.py",
"chars": 2138,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/report_evaluator/eval_config_models.py",
"chars": 4275,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/report_evaluator/evaluate.py",
"chars": 22490,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/report_evaluator/field_evaluators/__init__.py",
"chars": 851,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/report_evaluator/field_evaluators/base.py",
"chars": 2441,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/report_evaluator/field_evaluators/common.py",
"chars": 3540,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/report_evaluator/field_evaluators/llm_judge.py",
"chars": 11729,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/report_evaluator/register.py",
"chars": 3391,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/evaluators/utils.py",
"chars": 8807,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/prompt.py",
"chars": 6825,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/py.typed",
"chars": 0,
"preview": ""
},
{
"path": "agent/src/vss_agents/tools/__init__.py",
"chars": 685,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/attribute_search.py",
"chars": 55954,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/chart_generator.py",
"chars": 9745,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/code_executor/__init__.py",
"chars": 728,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/code_executor/docker_backend/__init__.py",
"chars": 1532,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/code_executor/docker_backend/docker_executor.py",
"chars": 6494,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/code_executor/docker_backend/image_builder.py",
"chars": 9490,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/code_executor/python_executor.py",
"chars": 4680,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/embed_search.py",
"chars": 28441,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/evaluation_compressor.py",
"chars": 8025,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/fov_counts_with_chart.py",
"chars": 9170,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/geolocation.py",
"chars": 7043,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/incidents.py",
"chars": 23951,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/lvs_video_understanding.py",
"chars": 26315,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/multi_incident_formatter.py",
"chars": 26289,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/prompt_gen.py",
"chars": 4018,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/register.py",
"chars": 1726,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/report_gen.py",
"chars": 14414,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/rtvi_vlm_alert.py",
"chars": 18367,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/s3_picture_url.py",
"chars": 5082,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/search.py",
"chars": 63983,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/template_report_gen.py",
"chars": 44658,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/video_caption.py",
"chars": 16817,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/video_detailed_caption.py",
"chars": 5854,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/video_frame_timestamp.py",
"chars": 4090,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/video_report_gen.py",
"chars": 72865,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/video_skim_caption.py",
"chars": 5019,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/video_understanding.py",
"chars": 28115,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/vss_summarize.py",
"chars": 10465,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/vst/__init__.py",
"chars": 685,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/vst/duration.py",
"chars": 3089,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/vst/register.py",
"chars": 948,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/vst/sensor_list.py",
"chars": 2944,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/vst/snapshot.py",
"chars": 9995,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/vst/timeline.py",
"chars": 6032,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/vst/utils.py",
"chars": 27961,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/vst/video_clip.py",
"chars": 13718,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/vst/video_list.py",
"chars": 3062,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/vst_download.py",
"chars": 7605,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/tools/vst_files.py",
"chars": 7598,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/utils/asyncmixin.py",
"chars": 1695,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/utils/file_mapping.py",
"chars": 9366,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/utils/frame_select.py",
"chars": 3012,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/utils/markdown_parser.py",
"chars": 6401,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/utils/parser.py",
"chars": 4898,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/utils/reasoning_parsing.py",
"chars": 4807,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/utils/reasoning_utils.py",
"chars": 4013,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/utils/retry.py",
"chars": 1688,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/utils/time_convert.py",
"chars": 1829,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/utils/time_measure.py",
"chars": 3143,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/utils/url_translation.py",
"chars": 8988,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/utils/video_file.py",
"chars": 2534,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/video_analytics/README.md",
"chars": 3610,
"preview": "<!--\n SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n SPDX-Lic"
},
{
"path": "agent/src/vss_agents/video_analytics/__init__.py",
"chars": 685,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/video_analytics/embeddings.py",
"chars": 6260,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/video_analytics/es_client.py",
"chars": 7371,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/video_analytics/interface.py",
"chars": 8805,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/video_analytics/nvschema.py",
"chars": 3679,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/video_analytics/query_builders.py",
"chars": 9918,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/video_analytics/tools.py",
"chars": 41078,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/src/vss_agents/video_analytics/utils.py",
"chars": 12152,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/stubs/nat/__init__.pyi",
"chars": 685,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/stubs/nat/data_models/__init__.pyi",
"chars": 887,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/stubs/nat/data_models/common.pyi",
"chars": 871,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/stubs/nat/data_models/evaluator.pyi",
"chars": 832,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/stubs/nat/data_models/function.pyi",
"chars": 904,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/__init__.py",
"chars": 726,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/agents/__init__.py",
"chars": 733,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/agents/postprocessing/__init__.py",
"chars": 685,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/agents/postprocessing/test_llm_based_rule_validator.py",
"chars": 7644,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/agents/postprocessing/test_non_empty_response_validator.py",
"chars": 2157,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/agents/postprocessing/test_postprocessing_node.py",
"chars": 7656,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/agents/postprocessing/test_url_validator.py",
"chars": 12673,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/agents/test_data_models.py",
"chars": 6961,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/agents/test_multi_report_agent.py",
"chars": 4410,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/agents/test_report_agent.py",
"chars": 3369,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/agents/test_search_agent.py",
"chars": 10473,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/agents/test_top_agent.py",
"chars": 4631,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/api/__init__.py",
"chars": 685,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/api/conftest.py",
"chars": 1297,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/api/test_health_endpoint_coverage.py",
"chars": 1748,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/api/test_rtsp_stream_api.py",
"chars": 28784,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/api/test_video_search_ingest.py",
"chars": 14836,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/api/test_video_upload_url.py",
"chars": 6033,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/api/test_video_upload_url_converters.py",
"chars": 3763,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/api/test_video_upload_url_coverage.py",
"chars": 2723,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/api/test_video_upload_url_inner.py",
"chars": 3894,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/conftest.py",
"chars": 4416,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/data_models/__init__.py",
"chars": 738,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/data_models/test_vss.py",
"chars": 6765,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/embed/test_cosmos_embed.py",
"chars": 8654,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/evaluators/__init__.py",
"chars": 737,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/evaluators/test_custom_qa.py",
"chars": 6443,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/evaluators/test_custom_trajectory.py",
"chars": 29270,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/evaluators/test_data_models.py",
"chars": 4616,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/evaluators/test_eval_config_models.py",
"chars": 8115,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/evaluators/test_evaluate.py",
"chars": 1583,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/evaluators/test_evaluate_patch.py",
"chars": 14958,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/evaluators/test_field_evaluators.py",
"chars": 9098,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/evaluators/test_llm_judge.py",
"chars": 6580,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/evaluators/test_llm_judge_coverage.py",
"chars": 11719,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/evaluators/test_llm_judge_field_discovery.py",
"chars": 6580,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/evaluators/test_register_coverage.py",
"chars": 3664,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/evaluators/test_report_evaluator.py",
"chars": 29228,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/evaluators/test_utils.py",
"chars": 11936,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/test_prompt.py",
"chars": 3022,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/test_sitecustomize.py",
"chars": 4199,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/tools/__init__.py",
"chars": 732,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/tools/test_build_vst_url.py",
"chars": 3147,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/tools/test_chart_generator.py",
"chars": 11534,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/tools/test_chart_generator_converters.py",
"chars": 3034,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/tools/test_chart_generator_coverage.py",
"chars": 9038,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/tools/test_chart_generator_inner.py",
"chars": 4360,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/tools/test_code_executor.py",
"chars": 4598,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/tools/test_embed_search.py",
"chars": 7106,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/tools/test_embed_search_coverage.py",
"chars": 4378,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/tools/test_embed_search_edge_cases.py",
"chars": 8875,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
},
{
"path": "agent/tests/unit_test/tools/test_embed_search_inner.py",
"chars": 20424,
"preview": "# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n# SPDX-License-"
}
]
// ... and 623 more files (download for full content)
About this extraction
This page contains the full source code of the NVIDIA-AI-Blueprints/video-search-and-summarization GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 823 files (5.5 MB), approximately 1.5M tokens, and a symbol index with 3430 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.